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.我們先試著在服務端進行緩衝,我們試著將乙個已經返回的長鏈結傳送內容不作釋放...