Chinaunix首页 | 论坛 | 博客
  • 博客访问: 107520
  • 博文数量: 57
  • 博客积分: 1200
  • 博客等级: 中尉
  • 技术积分: 555
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-26 21:13
文章分类

全部博文(57)

文章存档

2012年(14)

2011年(43)

分类: LINUX

2011-04-30 22:41:32

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算法时的效果。
 
阅读(6941) | 评论(0) | 转发(0) |
0

上一篇:没有了

下一篇:转:浅析linux内核内存管理之高端内存

给主人留下些什么吧!~~