Я всегда считал, что нужно держать фазу установления сеанса отдельно от фазы передачи данных, чтобы нет реальных данных передавалось до тех пор, пока оба конца сеанса не согласовали порядковые номера и параметры сеанса тем более, что поступающие пакеты могут быть из совершенно другого, предыдущего сеанса, который, как оказалось, имеет одинаковые конечные точки.
Однако при дальнейшем расследовании я не совсем уверен, что передача данных с пакетами рукопожатия запрещена. Раздел об установлении TCP-соединения в моей книге Internetworking with TCP / IP 1 содержит следующий фрагмент:
Из-за структуры протокола можно отправлять данные вместе с начальными порядковыми номерами в сегментах рукопожатия. В таких случаях программное обеспечение TCP должно хранить данные до тех пор, пока рукопожатие не завершится. Как только соединение установлено, программное обеспечение TCP может освободить удерживаемые данные и быстро доставить их ожидающей прикладной программе.
Поскольку, безусловно, можно создать пакет TCP с данными SYN
(или ACK
) и , это вполне может быть разрешено. Я никогда не видел, чтобы это происходило в дикой природе, но, опять же, я никогда не видел и волосатого ушастого карликового лемура в дикой природе, хотя я уверен, что они существуют.
Возможно, именно программное обеспечение сокетов предотвращает выход данных до того, как сеанс будет полностью установлен, но, похоже, TCP считает его действительным. Похоже, вы можете отправлять данные с пакетом SYN-ACK
(фаза 2 установления соединения), поскольку у вас есть порядковый номер и опции другого конца. Также возможна отправка данных с пакетом фазы 3 ACK
.
Причина, по которой программное обеспечение TCP удерживает данные до тех пор, пока рукопожатие не будет полностью завершено, возможно, вызвана упомянутой выше причиной - только после того, как оба конца согласовали порядковые номера, вы можете быть уверены, что данные не из предыдущего сессия.
1 Internetworking with TCP/IP Volume 1 Principles, Protocols and Architecture, 3rd edition, Douglas E. Comer, ISBN 0-13-216987-8.