Это вроде как:
+-------------------------------------------------------+
| client network server |
+-----------------+ +--------------------|
| (connect) | ---- SYN ----> | |
| | <-- SYN,ACK -- | (accepted) |
| (connected) | ---- ACK ----> | |
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/
when client sends...
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/
| | | |
| (send) | ---- data ---> | |
| | <---- ACK ---- | (data received) |
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/
when server sends...
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/
| | | |
| | <--- data ---- | (send) |
| (data received) | ---- ACK ----> | |
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/
...and so on, til the connection is shut down or reset
SYN запускает соединение; вы обычно увидите это только при установлении соединения. Но все данные, отправляемые через TCP, требуют ACK. Каждый отправленный байт должен быть учтен, или он будет повторно передан (или сброс соединения (закрыт) в тяжелых случаях).
Фактические соединения обычно не являются точно , как диаграмма выше, однако, по двум причинам:
Большинство стеков TCP / IP пытаются уменьшить количество голых ACK без чрезмерного риска повторной передачи или сброса соединения. Таким образом, такой разговор вполне возможен:
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/
| | | |
| | <--- data ---- | (send) |
| (data received) | | |
| (send) | -- data,ACK -> | |
| | | (data received) |
| | <- data,ACK -- | (send) |
| (data received) | | |
| (wait a bit) | <--- data ---- | (send) |
| (data received) | | |
| (send) | -- data,ACK -> | |
| | | (data received) |
| (send) | ---- data ---> | (wait a bit) |
| | | (data received) |
| | <- data,ACK -- | (send) |
| (data received) | | |
| (wait a bit) | (dead air) | |
| | ---- ACK ----> | |
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/
Что касается UDP, нет встроенной концепции SYN и ACK - UDP по своей природе «ненадежный», а не соединение ориентированы, поэтому понятия не применяются так сильно. Ваше подтверждение обычно будет ответом сервера. Но некоторые протоколы на уровне приложений, построенные поверх UDP, будут иметь определенный протокол для подтверждения отправленных и полученных данных.
SYN только в начале.
ACK находится на последующих сегментах в любом направлении. [edit] ACK также определит размер окна. Если, например, размер окна равен 100, отправитель может отправить 100 сегментов, прежде чем он ожидает получить ACK. Например, если отправитель отправляет 100 сегментов, но сегмент номер 50 теряется, тогда получатель получит 1-49 & amp; 51 -100. Затем приемник будет ACK на 50 (следующий сегмент, который он ожидает), и установит размер окна на 1. Отправитель отправит 1 сегмент с порядковым номером 50. Приемник затем ACK на 101 и установит размер окна обратно на большее число [edit]
Оба являются фактически полями в заголовке TCP и могут быть отправлены с данными, хотя SYN и первый ACK обычно не имеют данных.
Таким образом, ни один из сценариев, которые вы описываете, верный. Первое на самом деле ближе к реальности, но все пакеты данных после SYN должны включать ACK, а также поле номера подтверждения, которое определяет количество ожидаемого следующего пакета.
Конец сеанса также включает рукопожатия с пакетами, помеченными FIN, и ACK, относящимися к ним.
Обменные порядковые номера используются для идентификации потерянных пакетов и включения механизма повтора, а также чтобы собрать весь поток пакетов в правильном порядке.
Кроме того, если это первый случай, есть ли преимущества UDP через TCP, если вы просто поддерживаете соединение открытым в течение длительного периода времени время?
С помощью UDP вы не можете просто поддерживать соединение открытым в течение длительного периода времени.
Эта последовательность флагов SYN / ACK / FIN - это то, что делает соединение.
С UDP нет SYN или ACK, поэтому связь является односторонней , доставка не гарантируется, и заказ не сохраняется. Но он имеет меньше накладных расходов, поэтому он полезен, когда скорость важнее надежности, например, в потоковых медиа.
Это еще немного упрощено, но это лучшее, что я могу сделать в данный момент.
В записи wikipedia на TCP есть намного больше, и, конечно, в RFC.
Изображение: исходный TCP-стандарт RFC 793 разрешил передачу данных с первым пакетом SYN. Однако сегодня это не так. Вы получаете отдельный SYN-пакет во время инициирования трехстороннего рукопожатия у запрашивающего соединения. Предположим, что A запрашивает соединение с B, таким образом, A отправляет пакет с установленным битом SYN. B отвечает ACK, чтобы подтвердить получение и отправляет A ACK + SYN-пакеты. Затем данные могут передаваться в дальнейшем.
Дордал имеет очень хорошее объяснение по этому вопросу. Нажмите эту ссылку здесь.