在客户端发送ACK之前,是什么决定了客户端/客户端接收的数据包数量?有没有办法在服务器端或客户端配置它以在ACK之前发送更多数据?如果没有收到ACK,服务器会持续多长时间发送数据包?这是可配置的吗?服务器是否请求ACK或客户端是否只发送它们?
谢谢,
山姆
通过TCP连接发送的每个字节都需要确认.这是规则.服务器没有显式请求ACK,因为它没有 - 它只是希望你按规则播放,并且当它发送数据时,你会确认它.如果您不发送超过一定数量字节的ACK,则可能发生以下三种情况中的任何一种 - 服务器将等待一段时间用于ACK(读取:死机),重新发送您尚未确认的所有数据(读取:更多网络流量),或者如果尝试但未能这样做,它将重置连接(读取:"通过对等方重置连接").
尽管如此,您不必立即确认每个数据包.在需要ACK之前,服务器将发送一些字节数 - 这些字节数不会超过客户端公布的"接收窗口".您可以等待并收集几个段并一次性确认它们,如果您愿意...或者将它们与您发送到服务器的数据一起发送.(数据的确认实际上是免费的.) Windows已经这样做了 ; 它在发送ACK之前收到一个段后等待大约200ms.如果此时有另一个段进入,或者Windows已准备好发送数据,则会立即发送包含两个段的ACK.效果是在一般情况下(一堆数据立即进入),裸ACK的数量减少了一半.
如果你真的认为你可以做得比这更好,显然有一个注册表设置TcpAckFrequency,这是"在忽略延迟的ACK定时器之前将会出现的TCP确认数"(读取:在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.它会告诉您可以设置的各种选项.请注意,注册表中当前不存在许多值名称!您必须添加它们才能设置它们.