Что касается TCP-соединений с использованием NetGui (и wireshark для анализа):

Я установил TCP-соединение между двумя компьютерами, используя команду nc -p 11111 и т.д. ... для сервера и соответствующую для клиента, чтобы они действительно могли отправлять и читать (в pc2 (сервер)) сообщения.

После этого я нажал Ctrl Z в pc2 (сервер должен быть приостановлен) и отправил несколько сообщений с помощью pc1 (клиент). С помощью команды netstat -tna я могу видеть сообщения, ожидающие в буфере. Прежде чем вернуть сервер на передний план, я прекращаю захват tcpdump в маршрутизаторе между этими двумя устройствами и понимаю, что эти сообщения были отправлены (как и ожидалось), но также были подтверждены сервером.

Теперь, если сообщения ACK сервера выходят из буфера (т. Е. Когда они обрабатываются и перемещаются на другой уровень), были ли эти сообщения действительно «захвачены» из буфера сервером? Если так, что означает быть отстраненным?

Однако если сообщения перед отправкой обрабатываются ACK, то не будет ли pc1 думать, что эти сообщения обработаны, и поэтому буфер свободен и продолжает отправлять сообщения до тех пор, пока окно не получит нулевое значение? Если это так, что означает следующая формула?

rwnd = ReceiveBuffer - (LastByteReceived – LastByteReadByApplication)

Где я не прав?

1 ответ1

0

Сегменты TCP подтверждаются стеком TCP в ядре, когда стек TCP ядра получает их от драйвера NIC. Так что да, окно приема TCP представляет собой буфер в ядре, и если процесс назначения никогда не читает входящие данные, которые были буферизованы в ядре, окно приема заполнится, и отправитель прекратит отправку.

Затем отправитель начнет выполнять «проверки нулевого окна»; то есть он будет отправлять пустые сегменты TCP только для того, чтобы заставить стек TCP получателя отправлять обратно Acks с обновлениями окна приема, чтобы увидеть, открылась ли какая-либо комната в окне приема, чтобы отправитель мог начать отправку снова. Как только процесс назначения наконец прочитает некоторые данные, которые ядро буферизировало для него, следующая проверка отправителя с нулевым окном приведет к Ack с обновлением окна приема, показывающего пространство в окне приема, поэтому отправитель возобновит отправку несущих полезную нагрузку TCP сегменты.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .