日期:2014-05-17  浏览次数:20797 次

C#深刻理解TCP通信(总有你懂的)
使用C#和TCP已经可以传输数据甚至文件了,但是对于如何提高传输性能,一直感到很困惑(不是计算机网络通信相关专业的)。提出来,请大家一直帮助讨论一下!

TCP传输有两个策略,一个是发送端的Nagle算法,一个是ACK延迟反馈机制。网上虽然有很多资料,但都将讲的不深,所以我对这两个理解也就有了问题。

1、发送端在发送数据时,c#默认是启用Nagle算法的,说是要等到数据包达到一定大小或超过一定时间才会发送出去。
     a.请问一下,这个数据包大小到底是多大?这个超时时间是多长呢?
     b.再一个,在有些数据采集系统中,可能采集的数据才几十字节,比如30个字节。用TCP协议传送,额外好像需要多出44个字节。那如果在没超时的情况下,数据采集系统采集了10次,用Nagel算法组合的数据包长度时应该44+30*10,还是(44+30)*10呢?
     c.如果取消Nagle算法,应该就是有数据就直接发出去,没有延迟的吧!数据长度时44+30个字节?

2、接收端ACK的延迟反馈,一个是随着数据顺带反馈回去,一个是超时反馈回去
     a.随着数据顺带反馈回去的时候,接收端实际上也变成了发送端,在默认情况下,是否也会起动Nagle算法?
     b.如果是超时反馈的话,这个时间阈值时多少呢?我看有点说是200ms,有的说是40ms,到底应该是多少呢?

------解决方案--------------------
引用:
200ms就是TCP/IP详解中讲到的,《19TCP的交互数据》!
我的理解是:这个超时时间是固定的,只是并不是在数据到达后才触发,所以ACK回馈的时间是不一定的。

如下是引文:“这些时间之间的差则是200 ms的整数倍,这里所发生的情况是因为T C P使用了一个200 ms的定时器,该定时器以相对于内核引导的200 ms固定时间溢出。由于将要确认的数据是随机到达的(在时刻16.4, 474.3, 831.1等),T C P在内核的200 ms定时器的下一次溢出时得到通知。
这有可能是将来1~200 ms中的任何一刻。”


这个说法表示认同,TCP中有很多种定时器,最常见的超时机制,也是基于定时器的。至于这个200ms,不好深究,这本书90年代出的,WinSock都不只一个版本,windows与linux等系统内核也不尽相同

虽然从结果上看,“Nagle算法完全由TCP协议的ACK机制决定”,但是ACK与Nagle并没有直接关系,前者主要是接收方用来控制收发停等的,后者主要是发送方用来规避过多的小包,提高效率的(但同时也会因为包的拼接带来一点发送延迟)

如果发送方send时给了TCP_NODELAY选项,则禁用Nagle,反之默认情况下是启用的