大并发服务器不得不说的技术--tcp cork

from:http://blog.csdn.net/xiaofei_hah0000/article/details/8682245

如果把tcp当成服务端与客户端的管道,cork 就是给管道加个塞子。

为什么 要加个塞子呢?

先来举个例子:

  1. int times = 10;  
  2. while( times--)  
  3. {  
  4.      send( sock_fd, buf,  1, 0 )  
  5. }  
int times = 10;
while( times--)
{
     send( sock_fd, buf,  1, 0 )
}


这段program会发送数据10次,每次就发送1个字节,这样会不会什么问题呢?

记得以前农忙的时候,田里的稻子收割完了,要打成稻谷,就放一个打稻机子,父亲在机子旁打稻,而我则负责抱起稻子送给他。父亲打稻的速度很快,很小的时候我每次只抱一捆稻子,就会不停 地奔跑,很忙很累。。。等我稍大一点,能一次抱几捆的时候绝不会只抱一捆,这个道理是不是很浅显。

话说回来,如果发送数据的包很小,而次数又很多,网络也会很累,这个累也有学名的,叫网络拥塞。

我们需要将稻子收集多一点再送,意思就是将网络包整大一点,怎么做到 呢?

当包很小的时候先停一停,等到 一定的数量的包产生了再一起发,是不是有点像给水流管道加个塞子塞住,等水够多的时候才放出,其实我觉得更像一个水闸,什么时候放水由闸门开关决定。

上面的代码稍改一下:

  1. int times = 10;  
  2. int on = 1;  
  3. 3 setsockopt ( sock_fd, SOL_TCP, TCP_CORK, &on, sizeof (on));  
  4. while( times--)  
  5. 5 {  
  6. 6    send( sock_fd, buf,  1, 0 )  
  7. 7 }  
  8. 8 on = 0;  
  9. 9 setsockopt ( sock_fd, SOL_TCP, TCP_CORK, &on, sizeof (on));  
1 int times = 10;
2 int on = 1;
3 setsockopt ( sock_fd, SOL_TCP, TCP_CORK, &on, sizeof (on));
4 while( times--)
5 {
6    send( sock_fd, buf,  1, 0 )
7 }
8 on = 0;
9 setsockopt ( sock_fd, SOL_TCP, TCP_CORK, &on, sizeof (on));


2-3行相当于塞上塞子(关掉闸门),4-7行相当于收集更多的水,8-9行相当于拨去塞子(打开闸门),这样就解决了网络拥塞的问题。

后面的学习我们会发现第9行其实有时候可以省掉。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值