在发送ACK之前,什么决定了数据包的数量?服务器上的.NET套接字

时间:2012-03-08 05:11:16

标签: .net sockets tcp

在客户端发送ACK之前,客户端接收服务器/接收的数据包的数量是多少?有没有办法在服务器端或客户端配置它以在ACK之前发送更多数据?如果没有收到ACK,服务器会持续多长时间发送数据包?这是可配置的吗?服务器是否请求ACK或客户端是否只发送它们?

谢谢,

萨姆

1 个答案:

答案 0 :(得分:9)

通过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。它会告诉您可以设置的各种选项。请注意,注册表中当前不存在许多值名称!您必须添加它们才能设置它们。