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,到底应该是多少呢?
------解决方案--------------------
这个说法表示认同,TCP中有很多种定时器,最常见的超时机制,也是基于定时器的。至于这个200ms,不好深究,这本书90年代出的,WinSock都不只一个版本,windows与linux等系统内核也不尽相同
虽然从结果上看,“Nagle算法完全由TCP协议的ACK机制决定”,但是ACK与Nagle并没有直接关系,前者主要是接收方用来控制收发停等的,后者主要是发送方用来规避过多的小包,提高效率的(但同时也会因为包的拼接带来一点发送延迟)
如果发送方send时给了TCP_NODELAY选项,则禁用Nagle,反之默认情况下是启用的