Каждый байт, отправляемый по 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. Он рассказывает о различных параметрах, которые вы можете установить. Обратите внимание, что многие имена значений в настоящее время не существуют в реестре! Вы должны будете добавить их, чтобы установить их.