大并发服务器只好说的技术-tcp cork

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

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

为什么 要加个塞子呢?

先来举个例子:

int times = 10;

while( times--)

{

     send( sock_fd, buf,  1, 0 )

}

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

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

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

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

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

上面的代码稍改一下:

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行其实有时候可以省掉。。。