Возможно ли для функции уровня сеанса приложения создать исходный порт, который уже используется другим приложением для текущего соединения TCP? Как они сохраняются уникальными? Единственный способ, о котором я могу думать, - это если Windows имеет центральный уровень сеанса, универсальный для всех приложений, чьи функции они могут вызывать, или, по крайней мере, для управления центральным портом источника, это так?

1 ответ1

3

TCP работает на транспортном уровне; не сессионный уровень.

TCP действительно обрабатывается операционной системой. Отдельные приложения (независимо от того, имеют ли они сеансовый уровень или нет) напрямую не создают свои собственные пакеты TCP. Приложения только обращаются к ОС с просьбой открыть сокет TCP, подключить его к удаленному адресу: порту и отправить / получить данные через него. В настоящее время это почти всегда делается с помощью BSD Sockets API или чего-то похожего на него.

По умолчанию локальный порт для TCP-сокетов назначается ОС случайным образом. Приложения могут запросить определенный локальный порт (он же "привязать" к нему), но ОС может отклонить запрос, если это сделает сокет неуникальным. То же самое относится и к "клиентским", и "серверным" приложениям в равной степени.

Удаленный порт не обязательно должен быть уникальным (поэтому вы можете иметь много HTTP-клиентов одновременно) - только кортеж {localaddr, localport, remoteaddr, remoteport} должен быть уникальным.

(Однако, несмотря на то, что TCP-соединения идентифицируются 4-мя кортежами, ОС может на самом деле иметь более строгие правила и отклонять запрос на связывание, если локальный порт уже используется каким-либо соединением, даже если другие параметры этого соединения отличаются.)




Примечание стороны: Существует на самом деле функция, называемая « сырые сокеты » и ограничивается только привилегированных приложений, что позволяет им генерировать IP - пакеты с любым ID протокола и любые заголовки , которые им нравятся.

Так что же произойдет, если приложение попытается сгенерировать свои собственные TCP-пакеты через необработанные сокеты? Операционная система не будет препятствовать отправке пакетов. Однако приложение не может предотвратить реакцию ОС на входящие ответы.

Например, приложение может отправить TCP SYN, созданный вручную, и получить SYN/ACK, но ОС также получает тот же SYN/ACK TCP, и, поскольку оно принадлежит неизвестному соединению, ОС отправит TCP RST, завершающий квитирование.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .