#sockets #networking #tcp
#сокеты #сеть #tcp
Вопрос:
В моем классе мы узнали, что сокет TCP однозначно идентифицируется 4-мя кортежами, состоящими из IP-адреса источника, IP-адреса назначения, порта источника и порта назначения.
Теперь предположим, что у меня есть веб-сервер, работающий на порту 80. У него есть 2 TCP-сокета, установленных для двух клиентов, которые имеют разные IP-адреса, но каким-то образом оба используют один и тот же исходный порт, скажем, 12345.
Мы также узнали на уроке, что заголовок транспортного уровня добавляет только порты источника / назначения, тогда как сетевой уровень добавляет IP-адреса источника / назначения.
Теперь предположим, что веб-сервер получает два пакета, по одному от каждого клиента. Как уже упоминалось, порт источника, порт назначения, IP-адреса назначения в этих пакетах одинаковы, поэтому единственным отличием является IP-адрес источника.
Однако, если демультиплексирование выполняется транспортным уровнем, как можно использовать IP-адрес источника для перемещения пакета в нужный сокет? В конце концов, IP-адрес источника является только частью сетевого заголовка, и, насколько я понимаю, этот заголовок уже удален до передачи пакета с сетевого уровня на транспортный уровень на принимающей стороне.
Комментарии:
1. Что заставляет вас думать, что сетевой заголовок удален? Заголовок IP (network) предшествует заголовку TCP (transport) в пакетных данных. Байты пакета не перемещаются при передаче пакета между уровнями. Просто разные уровни просматривают разные разделы пакета по мере необходимости, пока он не будет перенаправлен в соответствующий сокет назначения, который затем сохраняет последние байты полезной нагрузки в своем буфере приема, ожидая, пока приложение-владелец прочитает из этого буфера.
2. Я вижу, это имеет смысл!