флаги
адрес отправителя
адреса получателей
адрес провайдера
маршрут
длина зашифрованных данных
зашифрованные данные
#include <stdio.h>
#include <stdlib.h>
#include <pcap/pcap.h>
u8* device = "wlxXXXXXX";
u8 reciever[6] = {XXXXXX};//first
u8 sender[6] = {XXXXXX};//second
int main(s32 argc,s8** argv) {
if (argc == 1) {
printf("usage: %s r/s\n",argv[0]);
}
u8 err[256] = {0};
pcap_t* d = pcap_open_live(device,65536,0,1000,err);
//printf("%p\n%s\n",d,err);
struct pcap_pkthdr* packet;
const u8* data;
if (argv[1][0] == 'r') {
for (u32 it = 0; it < 20; it++) {
s32 res = pcap_next_ex(d,&packet,&data);
printf("%i\n",packet->caplen);
for (u32 i = 0; i < packet->caplen; i++) {
printf("%0X",data[i]);
}
printf("\n");
}
}
else if (argv[1][0] == 's') {
u8 data[256] = {0xAA};
for (u32 rs = 0; rs < 6; rs++) {
data[rs] = reciever[rs];
}
for (u32 rs = 0; rs < 6; rs++) {
data[6 + rs] = sender[rs];
}
for (u32 it = 0; it < 20; it++) {
s32 num = pcap_inject(d,data,256);
printf("%i\n",num);
}
}
pcap_close(d);
}
Поэтому надо создать свою систему, протокол для уровня Network в модели https://en.wikipedia.org/wiki/OSI_model OSI.
Я предлагаю сделать так:
Адреса — открытые ключи, шифрование данных происходит с помощью закрытых ключей.
Каждая "машина" это и клиент, и сервер. При передаче данных с одного пользователя другому, по аналогии с IP, создаётся псевдозаголовок с ключём отправителя и ключём получателя. Также, возможно, стоит сделать так, чтобы ключи были переменного размера, а то вдруг появятся какие-нибудь мощные технологии и их всех можно будет взламывать за 10 секунд? Добавим пару десятков бит и всё будет ок. Почти.
Кроме того, можно запилить протокол Application уровня, который позволяет получить доменное имя некоторого сервиса, так как это будет удобно. Однако, любой может поставить себе уже занятое доменное имя, так что надо быть осторожным и лучше прописать в аналоге hosts ключ настоящего сайта.
И тут у меня возникают парочка вопросов.
Как будет происходить маршрутизация?
Можно сделать так, чтобы некоторые машины становились провайдерами и использовать для этого протокол верхнего уровня. Или нет.
Допустим одна машина стала провайдером. Она пошла сканить все машины, которые к ней подключены, а если отсканенная машина является провайдером, то та запрашивает список клиентов, которые к ней подключены и в итоге, по цепочке, можно собрать все маршруты и когда клиент делает запрос какому-то удалённому сервису, то он посылает этот запрос провайдеру, а тот ищет данный адрес/ключ в своей системе маршрутизации, если находит, то по ещё каким-то данные определяет, какой маршрут лучше, если их несколько. И посылает данный запрос + продуманный путь маршрутизации чтобы зря не нагружать другого провайдера по сети провайдеров.
Есть ещё проблема. Будет ли такая система устойчива ко всяким ддос-атакам и подобному?
Может сюда стоит ещё блокчейн куда-то припихнуть?
Вот пример прикладного примера использования данной сети:
Дядя Василий написал свой сайт со статьями по палеоботанике и позвонил своему другу, анону Сергею, что он может их прочитать, ведь сам хотел. Продиктовал 512-битный ключ и Сергей вбил его в браузер.
Браузер вызывает функцию аналога курла для установки соединения. Wifi-передатчик связывается с ближайшим провайдером и просит его посмотреть, есть ли у него путь к такому-то адресу. Провайдер говорит "Нет", потому что он сломался. Передатчик связывается со следующим провайдером, тот отвечает "Да" и передаёт в клиентскую программу, что ошибки нет, а связь установлена с провайдером. Браузер Сергея шлёт GET-запрос по TCP, к которому прикрепляется псевдозаголовок. Однако, данные шифруются открытым ключём получателя. Wifi-передатчик связывается с провайдером и даёт ему псевдозаголовок, содержащий адрес отправителя и получателя и TCP-данные. Провайдер уже успел подготовить маршрут к адресу получателя, ищет его среди всех готовых маршрутов, срезает с него свой адрес и передаёт следующему провайдеру маршрут + данные. Этот провайдер срезает себя с маршрута и передаёт следующему. Оказалось, что следующего провайдера только что взорвали террористы. Ну ничего, раз таймаут в N секунд прошёл, значит какие-то проблемы, подумал провайдер. И перестроил маршрут через другого провайдера. Ну и в конце конечный провайдер посылает данные серверу и тот в ответ на расшифрованный своим закрытым ключём GET-запрос меняет местами адрес отправителя и получателя в псевдозаголовке и шлёт HTTP/1.1 200 OK и HTML-страницу получателю. И там уже клиент получает нужные данные.
Вообще мне очень нравится, что с сетями всё так хорошо получилось. 7 уровней абстракции. Представьте, каково было бы и разработчикам, и клиентам, да и самому интернету, если бы всё оказалось монолитным? Думаю, вряд ли такое могло случиться.