Ответ 1
Это вроде как:
+-------------------------------------------------------+
| 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. Каждый отправленный байт должен быть учтен, или он будет повторно передан (или соединение reset (закрыто) в тяжелых случаях).
Фактические соединения обычно не похожи на диаграмму выше, хотя по двум причинам:
- ACK могут наращиваться, поэтому один ACK может подтвердить все полученные до этого момента. Это означает, что вы можете подтвердить два или более сообщений одним ACK.
- ACK - это просто флаг и поле в заголовке TCP. Для отправки требуется, по крайней мере, пропускная способность заголовка, плюс все, что касается нижних слоев. Но сегменты данных уже включают все это... поэтому, если вы отправляете данные, вы можете отправить ACK в то же время бесплатно.
Большинство стеков TCP/IP пытаются уменьшить количество голых ACK без чрезмерной опасности повторной передачи или соединения reset. Поэтому такой разговор вполне возможен:
\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/\_/
| | | |
| | <--- 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, будут иметь определенный протокол для подтверждения данных, отправленных и полученных.