Что такое обновление окна TCP?

Это зависит от того, под чем Вы подразумеваете "отброшенный". Для сокетов TCP, если другой конец закрывает соединение любой через завершение () или завершение процесса, Вы узнаете путем чтения конца файла или получения ошибки чтения, обычно errno, устанавливаемый на любое 'соединение, сброшенное одноранговым узлом', операционной системой. Для Python Вы считаете строку нулевой длины, или socket.error будет брошен, когда Вы попытаетесь читать или записать из сокета.

17
задан phpscriptcoder 23 September 2009 в 14:22
поделиться

6 ответов

Окна TCP используются для управления потоком между одноранговыми узлами в соединении. С каждым пакетом ACK хост будет отправлять поле «размер окна». В этом поле указано, сколько байтов данных хост может получить до заполнения. Отправитель не должен отправлять больше этого количества данных.

Окно может заполниться, если клиент не получает данные достаточно быстро. Другими словами, буферы TCP могут заполняться, пока приложение не выполняет какие-либо действия, кроме чтения из своего сокета. Когда это произойдет, клиент отправит пакет ACK с установленным битом «полное окно». В этот момент сервер должен прекратить отправку данных. Любые пакеты, отправленные на машину с полным окном, не будут подтверждены . (Это заставит отправителя с плохим поведением повторно передать. Хороший отправитель просто буферизует исходящие данные. Если буфер на отправляющей стороне тоже заполняется, то отправляющее приложение блокируется, когда пытается записать больше данных в сокет!)

Это задержка TCP. Это может произойти по множеству причин, но в конечном итоге это просто означает, что отправитель передает быстрее, чем считывает получатель.

Как только приложение на принимающей стороне вернется к чтению из сокета, оно истощит часть буферизованные данные, что освобождает место. Затем получатель отправит пакет «обновления окна», чтобы сообщить отправителю, сколько данных он может передать. Отправитель начинает передавать свои буферизованные данные, и трафик должен течь нормально.

Конечно, вы можете получить повторяющиеся срывы, если получатель постоянно работает медленно.

Я сформулировал это так, как будто отправитель и получатель разные, но на самом деле оба одноранговых узла обмениваются обновлениями окон с каждым пакетом ACK, и любая из сторон может заполнить свое окно.

Общее сообщение состоит в том, что вам не нужно напрямую отправлять пакеты обновления окна. На самом деле было бы плохой идеей подделать одно.

Что касается исключения, которое вы видите ... оно вряд ли будет вызвано или предотвращено пакетом обновления окна. Однако, если клиент читает недостаточно быстро, вы можете терять данные. На своем сервере вы должны проверить возвращаемое значение из вызовов Socket.write (). Это может быть меньше, чем количество байтов, которое вы пытаетесь записать. Это происходит, если буфер передачи отправителя переполняется, что может произойти во время остановки TCP. Возможно, вы теряете байты.

Например, если вы пытаетесь записать 8192 байта при каждом вызове записи, но один из вызовов возвращает 5691, тогда вам нужно отправить оставшиеся 2501 байт при следующем вызове. В противном случае клиент не увидит оставшуюся часть этого блока размером 8 КБ, и ваш файл будет короче на стороне клиента, чем на стороне сервера.

59
ответ дан 30 November 2019 в 10:08
поделиться

Это происходит действительно глубоко в стеке TCP / IP; в вашем приложении (сервере и клиенте) вам не нужно беспокоиться об окнах TCP. Ошибка должна быть другой.

6
ответ дан 30 November 2019 в 10:08
поделиться

Обновление окна TCP связано с передачей информации о доступном размере буфера между отправителем и получателем. ArrayIndexOutOfBoundsException не является вероятной причиной этого. Скорее всего, код ожидает каких-то данных, которые он не получает (вполне возможно, задолго до этого момента, на которые он ссылается только сейчас). Не видя кода и трассировки стека, действительно сложно сказать что-либо еще.

2
ответ дан 30 November 2019 в 10:08
поделиться

Вы можете погрузиться на этот веб-сайт http://www.tcpipguide.com/free/index.htm для много информации о TCP / IP.

0
ответ дан 30 November 2019 в 10:08
поделиться

Получаете ли вы какие-нибудь подробности с исключением ?

Это вряд ли связано с пакетом обновления окна TCP
(вы видели, как это повторяется в точности для нескольких экземпляров?)

Скорее связано с вашим кодом обработки, который работает с полученными данными.

0
ответ дан 30 November 2019 в 10:08
поделиться

Обычно это просто триггер, а не причина вашей проблемы.

Например, если вы используете селектор NIO, обновление окна может вызвать активацию канала записи. Это, в свою очередь, вызывает ошибочную логику в вашем коде.

Получите трассировку стека, и она покажет вам основную причину.

0
ответ дан 30 November 2019 в 10:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: