Возможный дубликат:
Почему это трехстороннее рукопожатие, а не более?
Пример: если клиент хочет поговорить с сервером, он просто сообщает серверу, что хочет установить соединение, а затем сервер подтверждает. Люди говорят, что третий шаг нужен для того, чтобы сервер знал, что он может успешно отправлять данные клиенту. Однако я думаю, что сервер может реализовать что-то вроде тайм-аута. Если клиент слишком долго отвечает, сервер может выполнить следующие действия: 1. повторно отправить этот сегмент или 2. разорвать соединение.
Итак, действительно ли нам нужен третий шаг? На мой взгляд, так много накладных расходов.
Первый пакет, очевидно, необходим клиент-сервер, чтобы сообщить серверу о создании соединения.
Второй пакет необходим от сервера к клиенту, чтобы сообщить клиенту, что сервер принял соединение.
Третий пакет необходим для передачи от клиента к серверу, чтобы сообщить серверу, что клиент получил второй пакет. В противном случае у сервера не было бы возможности узнать об этом, и он мог бы просто задаться вопросом, почему клиент не отправил никаких данных.
Четвертый пакет не требуется. Если третий пакет проходит, обе стороны знают, что соединение открыто, и готовы отправить данные, если захотят. Если третий пакет не проходит, второй пакет будет передан повторно, что побудит повторить отправку третьего пакета.
К тому времени, когда клиент получает пакет SYN ACK от сервера, он считает соединение полностью открытым (и также вставляет информацию ACK в заголовок своего первого пакета данных).
Таким образом, в приложении, в котором клиент говорит первым, третьим этапом рукопожатия добавляется нулевая задержка. В приложении, в котором сервер общается первым, последний шаг ACK действительно необходим - сервер не может начать отправку пакетов данных, пока не узнает, что клиент их ожидает.