TCP_NODELAY和TCP_CORK

TCP_NODELAY和TCP_CORK都是禁用Nagle算法,只不过NODELAY完全关闭而TCP_CORK完全由自己决定发送时机。两者不要同时设置。

问题的背景

了解一下问题的背景就好理解了
1.历史上TCP是每发送一次包等待一个ACK然后下一个。

2.但是在一些交互式应用下比如Telnet,结果就是我们每按一次键就会发送一个packet.每一个字符配一个TCP头效率不高,那个Nagle算法出来了。发送方法送数据A时然后再等待接受方的ACK时,积累本地收集到的所有TCP数据包然后一次性发送。但是很明显Nagle算法不利于交互式情景。

3.但是现代应用下面还是存在交互式应用的,所以有时候我们需要关闭Nagle那么可以设置TCP_NODELAY。

4.但是Nagle组织包的长度是由系统决定的,有时候我们知道我们会每个1分钟产生1字节,共1000字节。如果完全由Nagle算法来发送的话,可能还是会1字节1字节发送[这是一种极端情况,假设返回ACK时间不是很长]。这个时候首先设置TCP_CORK能够阻塞住TCP[尽量阻塞住],等我们write完1000字节之后,取消TCP_CORK,这个时候就能够将1000字节一次发出。

TCP_NODELAY

 默认情况下, 发送数据采用Negale 算法. Negale 算法是指发送方发送的数据不会立即发出,

而是先放在缓冲区, 等缓存区满了再发出. 发送完一批数据后, 会等待接收方对这批数据的回应,

然后再发送下一批数据. Negale 算法适用于发送方需要发送大批量数据, 并且接收方会及时作出

回应的场合, 这种算法通过减少传输数据的次数来提高通信效率.

     如果发送方持续地发送小批量的数据, 并且接收方不一定会立即发送响应数据, 那么Negale

算法会使发送方运行很慢. 对于GUI 程序, 如网络游戏程序(服务器需要实时跟踪客户端鼠标的移

动), 这个问题尤其突出. 客户端鼠标位置改动的信息需要实时发送到服务器上, 由于Negale 算法

采用缓冲, 大大减低了实时响应速度, 导致客户程序运行很慢.

TCP_CORK

TCP链接的过程中,默认开启Nagle算法,进行小包发送的优化(优化网络传输,兼顾网络延时和网络拥塞)。这个时候可以置位TCP_NODELAY关闭Nagle算法,有数据包的话直接发送保证网络时效性。在进行大量数据发送的时候可以置位TCP_CORK关闭Nagle算法保证网络利用性。尽可能的进行数据的组包,以最大mtu传输,如果发送的数据包大小过小,则如果在0.6~0.8s范围内都没能组装成一个MTU时,直接发送;如果发送的数据包大小足够间隔在0.4s内时,每次组装一个MTU进行发送;如果间隔大于0.4~0.8s则,每过来一个数据包就直接发送。


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值