如果把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行其实有时候可以省掉。
查看本栏目更多精彩内容:http://www.bianceng.cn/Servers/zs/
以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索网络
, times
管道
cork 爱尔兰、cock、corkscrew、cork港口、cork鞋,以便于您获取更多的相关知识。