Что определяет количество пакетов данных перед отправкой ACK? .NET Sockets на сервере - PullRequest
4 голосов
/ 08 марта 2012

Что определяет, сколько пакетов данных отправлено сервером / получено клиентом до того, как клиент отправит ACK?Есть ли способ настроить это на стороне сервера или клиента, чтобы отправить больше данных перед ACK?Как долго сервер продолжает отправлять пакеты, если ACK не получен?Это настраивается?Сервер запрашивает ACK или клиент просто отправляет их?

Спасибо,

Сэм

1 Ответ

9 голосов
/ 08 марта 2012

Каждый байт, отправляемый по TCP-соединению, требует подтверждения. Это правила. Сервер явно не запрашивает ACK, потому что ему не нужно - он просто ожидает, что вы будете играть по правилам, и что, когда он отправляет данные, вы его подтвердите. Если вы не отправляете ACK более чем на определенное количество байтов, может произойти любое из трех: сервер некоторое время будет ждать ACK (читай: dead air), повторно отправит все эти данные, которые вы не подтвердили пока (читай: больше сетевой трафик), или, если он попытался и не смог сделать это, он сбросит соединение (читай: «Сброс соединения по пиру»).

С учетом всего вышесказанного вам не нужно подтверждать каждый пакет сразу. Сервер отправит некоторое количество байтов - которое не будет больше, и обычно будет меньше, чем объявленное клиентом «окно получения», - прежде чем ему потребуется ACK. Вы можете подождать, собрать несколько сегментов и сразу получить ACK, если хотите ... или отправить их с данными, которые вы отправляете на сервер. (ACK с данными фактически бесплатны.) Windows уже делает это ; он ожидает около 200 мс после получения сегмента, прежде чем отправит ACK. Если в это время появляется другой сегмент или в Windows есть данные, готовые к отправке, немедленно отправляется ACK, который охватывает оба сегмента. Эффект заключается в том, что в общем случае (набор данных поступает сразу), количество голых ACK сокращается вдвое.

Если вы действительно думаете, что можете добиться большего, чем это, очевидно, есть параметр реестра для TcpAckFrequency, который представляет собой «количество подтверждений TCP, которые будут обработаны до того, как задержанный таймер ACK будет проигнорирован» (читай: перед Windows немедленно отправляет ACK). По умолчанию это 2. Вы можете увеличить это значение, если хотите, но вы рискуете вызвать задержки, если оно слишком велико.

Существует также TcpDelAckTicks, который указывает, как долго будет задержка (в 100-миллисекундных «тиках»). По умолчанию это 2. Опять же, если оно слишком высокое, вы можете вызвать задержки, которые замедляют вашу сеть для сканирования.

Если вы настаиваете на этом, проверьте HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces. Есть несколько ключей с именами GUID; один соответствует вашему текущему сетевому соединению. (Если вы подключены к WiFi, там также будут подключы - по одному для каждой сети?) Вам нужно будет добавить туда значения - по умолчанию они не существуют.

Кроме того, взгляните на http://download.microsoft.com/download/c/2/6/c26893a6-46c7-4b5c-b287-830216597340/TCPIP_Reg.doc. Он рассказывает о различных параметрах, которые вы можете установить. Обратите внимание, что многие имена значений в настоящее время не существуют в реестре! Вы должны будете добавить их, чтобы установить их.

...