Я работаю со стеком lwip tcp/ip на встроенном устройстве и пытаюсь понять, как все это работает. Я просматривал документацию и код, но меня смущает то, как порты и схемы URI обрабатываются стеком tcp/ip.
Первое, что сбивает с толку, это то, что они оба, кажется, определяют протокол. Это избыточно?
Для lwip, чтобы установить соединение TCP, создается "Блок управления протоколом" (PCB). Это определяется локальным IP-адресом и портом. Кажется, это имеет смысл - эта плата прослушивает указанный порт. Как схема URI влияет на это тогда? Эта PCB получает какую-либо схему URI? Я также не вижу схемы URI, передаваемой функции обратного вызова для приема пакетов.
Как это работает, если я хочу изменить протоколы - например, обновить HTTP-соединение до соединения Websocket? Если начальное рукопожатие выполняется через HTTP: порт 80, то как дальнейшая связь осуществляется через WS: порт X?
В качестве примера, вот подпись функции для связывания печатной платы в lwip (в коде C):
tcp_bind(struct tcp_pcb *pcb, struct ip_addr *ipaddr, u16_t port)
Это связывает PCB с IP-адресом и номером порта. Однако схема URI не указана. Поэтому я бы предположил, что PCB не зависит от схемы URI. Если мы посмотрим на прототип обратного вызова для получения пакетов:
err_t (* accept)(void *arg, struct tcp_pcb *newpcb, err_t err)
Опять же схема URI не появляется. У меня также есть исходный код для реализации HTTP-сервера с использованием lwip. Нигде схема URI не появляется. Итак, как же различные схемы URI обрабатываются стеком IP? Я не могу найти, где это даже передается в качестве аргумента в обратные вызовы для обработки IP-трафика. Я думаю, что я должен пропустить что-то фундаментальное тогда.
Любая помощь приветствуется!