大併發伺服器不得不說的技術 tcp cork

2021-06-21 22:59:31 字數 1355 閱讀 7684

from:

如果把tcp當成服務端與客戶端的管道,cork 就是給管道加個塞子。

為什麼 要加個塞子呢?

先來舉個例子:

[cpp]view plain

copy

print?

int times = 10;  

while( times--)    

int times = 10;

while( times--)

這段program會傳送資料10次,每次就傳送1個位元組,這樣會不會什麼問題呢?

記得以前農忙的時候,田裡的稻子收割完了,要打成稻穀,就放乙個打稻機子,父親在機子旁打稻,而我則負責抱起稻子送給他。父親打稻的速度很快,很小的時候我每次只抱一捆稻子,就會不停 地奔跑,很忙很累。。。等我稍大一點,能一次抱幾綑的時候絕不會只抱一捆,這個道理是不是很淺顯。

話說回來,如果傳送資料的包很小,而次數又很多,網路也會很累,這個累也有學名的,叫網路擁塞。

我們需要將稻子收集多一點再送,意思就是將網路包整大一點,怎麼做到 呢?

當包很小的時候先停一停,等到 一定的數量的包產生了再一起發,是不是有點像給水流管道加個塞子塞住,等水夠多的時候才放出,其實我覺得更像乙個水閘,什麼時候放水由閘門開關決定。

上面的**稍改一下:

[cpp]view plain

copy

print?

1 int times = 10;  

2 int on = 1;  

3 setsockopt ( sock_fd, sol_tcp, tcp_cork, &on, sizeof (on));  

4 while( times--)  

5   

8 on = 0;  

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 8 on = 0;

9 setsockopt ( sock_fd, sol_tcp, tcp_cork, &on, sizeof (on));

2-3行相當於塞上塞子(關掉閘門),4-7行相當於收集更多的水,8-9行相當於撥去塞子(開啟閘門),這樣就解決了網路擁塞的問題。

後面的學習我們會發現第9行其實有時候可以省掉。。。

大併發伺服器不得不說的技術 tcp cork

如果把tcp當成服務端與客戶端的管道,cork 就是給管道加個塞子。為什麼 要加個塞子呢?先來舉個例子 int times 10 while times 這段program會傳送資料10次,每次就傳送1個位元組,這樣會不會什麼問題呢?記得以前農忙的時候,田裡的稻子收割完了,要打成稻穀,就放乙個打稻機...

大併發伺服器不得不說的技術 TCP CORK

sol tcp,tcp cork 的標頭檔案 include cork選項提高了網路的利用率,因為它直接禁止了小包的傳送。nagle演算法沒有禁止小包傳送,只是禁止了大量小包的傳送。如果把tcp當成服務端與客戶端的管道,cork 就是給管道加個塞子。為什麼 要加個塞子呢?先來舉個例子 int tim...

大併發伺服器不得不說的技術 http 快取

前面所說技術訂都是伺服器端乙個人在努力,有時候也需要客戶端配合。乙個鏈結請求過程大致可以分成幾個階段 如果客戶端傳送同樣的請求,且結果都一樣,我們是不是可以緩衝一下呢?是不是可以減少幾步呢?的確可以,一般來說以下幾種方法 1.我們先試著在服務端進行緩衝,我們試著將乙個已經返回的長鏈結傳送內容不作釋放...