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

2021-06-13 03:12:54 字數 905 閱讀 2535

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

為什麼 要加個塞子呢?

先來舉個例子:

int times = 10;

while( times--)

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

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

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

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

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

from 如果把tcp當成服務端與客戶端的管道,cork 就是給管道加個塞子。為什麼 要加個塞子呢?先來舉個例子 cpp view plain copy print?int times 10 while times int times 10 while times 這段program會傳送資料10次...

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

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

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

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