Что, если 2 слоя сеанса генерируют один и тот же порт источника?

367
Lewis Kelsey

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

0

1 ответ на вопрос

3
grawity

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

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

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

Удаленный порт не должен быть уникальным (так что вы можете иметь много HTTP - клиентов одновременно) - только кортеж должен быть уникальным.

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




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

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

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

Похожие вопросы