TCP работает на транспортном уровне; не сессионный уровень.
TCP действительно обрабатывается операционной системой. Отдельные приложения (независимо от того, имеют ли они сеансовый уровень или нет) напрямую не создают свои собственные пакеты TCP. Приложения только обращаются к ОС с просьбой открыть сокет TCP, подключить его к удаленному адресу: порту и отправить / получить данные через него. В настоящее время это почти всегда делается с помощью BSD Sockets API или чего-то похожего на него.
По умолчанию локальный порт для TCP-сокетов назначается ОС случайным образом. Приложения могут запросить определенный локальный порт (он же «привязать» к нему), но ОС может отклонить запрос, если это сделает сокет неуникальным. То же самое относится и к «клиентским», и «серверным» приложениям в равной степени.
Удаленный порт не должен быть уникальным (так что вы можете иметь много HTTP - клиентов одновременно) - только кортеж должен быть уникальным.
(Однако, несмотря на то, что TCP-соединения идентифицируются 4-мя кортежами, ОС может на самом деле иметь более строгие правила и отклонять запрос на связывание, если локальный порт уже используется каким-либо соединением, даже если другие параметры этого соединения отличаются.)
Примечание стороны: Там является фактически функция, называемая « сырые сокеты » и ограничивается только привилегированных приложений, что позволяет им генерировать IP - пакеты с любым ID протокола и любые заголовки, которые им нравятся.
Так что же произойдет, если приложение попытается сгенерировать свои собственные TCP-пакеты через необработанные сокеты? Операционная система не будет препятствовать отправке пакетов. Однако приложение не может предотвратить реакцию ОС на входящие ответы.
Например, приложение может отправить TCP SYN, созданный вручную, и получить SYN / ACK, но ОС также получает тот же SYN / ACK TCP, и, поскольку оно принадлежит неизвестному соединению, ОС отправит TCP RST, завершающий квитирование.