TCP 协议栈在决定何时发送下一个报文时,默认采用nagel算法,即在发送数据量达到一个MSS或者收到对方的
回应时才发送数据包。而且,接收方一般采用delayed ack算法进行回应,也就是接收方在收到报文后并不立即
发送ack,而是等待一定时间, 期待还会收到来自对端的数据包,然后发送ack,从而用更少数量的ack回应的相同的数
据量,减小了网络拥堵的可能性。这种算法适合于发送块数据时。
negel算法并不适合于像telnet这样用小数据量数据进行交互的网络应用程序,此时需要禁用nagel算法,使数据
一旦进入发送队列,有机会就立即发送,从而提高交互性。我们使用TCP_NODELAY选项达到这个目的。
前面讨论的两种情况是两个极端,像web服务器和客户端这种应用介于两者之间。举个例子,客户端向服务器POST
数据,假设request_header=16B,request_data=396B,同时假设MSS=512B,客户端调用两次write发送数据:
(1)启用nagel算法,先发送16B的header,然后等待RTT时间,再发送请求数据。
(2)采用TCP_NODELAY, 连续发送两个数据包,但是容易引起网络拥堵。
我们期望的是一次把全部数据发送出去,如果不用writev,怎么办呢?
如是,TCP_CORK横空出世,貌似内核对该选项采用优化的nagel算法,即设置一个定时器,当超时时, 即使发送数
据量尚未达到一个MSS而且还没收到对方的回应,也发送数据。如是可以取得介于设置TCP_NODELAY和采用默认nagel算法时的效果。
阅读(7043) | 评论(0) | 转发(0) |