TCP娑堟伅鐨勫彂閫?杞

TCP娑堟伅鐨勫彂閫?杞?

鎴戜滑宸茬粡寤虹珛濂界殑TCP杩炴帴锛屽搴旂潃鎿嶄綔绯荤粺鍒嗛厤鐨?涓鎺ュ瓧銆傛搷浣淭CP鍗忚鍙戦€佹暟鎹椂锛岄潰瀵圭殑鏄暟鎹祦銆傞€氬父璋冪敤璇稿send鎴栬€厀rite鏂规硶鏉ュ彂閫佹暟鎹埌鍙︿竴鍙颁富鏈猴紝閭d箞锛岃皟鐢ㄨ繖鏍风殑鏂规硶鏃讹紝鍦ㄦ搷浣滅郴缁熷唴鏍镐腑鍙戠敓浜嗕粈涔堜簨鎯呭憿锛熸垜浠甫鐫€浠ヤ笅3涓棶棰樻潵缁嗙粏鍒嗘瀽锛氬彂閫佹柟娉曟垚鍔熻繑鍥炴椂锛岃兘淇濊瘉TCP鍙︿竴绔殑涓绘満鎺ユ敹鍒板悧锛熻兘淇濊瘉鏁版嵁宸茬粡鍙戦€佸埌缃戠粶涓婁簡鍚楋紵濂楁帴瀛椾负闃诲鎴栬€呴潪闃诲鏃讹紝鍙戦€佹柟娉曞仛鐨勪簨鎯呮湁浣曚笉鍚岋紵

瑕佸洖绛斾笂闈?涓棶棰樻秹鍙婁簡涓嶅皯鐭ヨ瘑鐐癸紝鎴戜滑鍏堝湪TCP灞傞潰涓婄湅鐪嬶紝鍙戦€佹柟娉曡皟鐢ㄦ椂鍐呮牳鍋氫簡鍝簺浜嬨€傛垜涓嶆兂鍘荤綏鍒楀唴鏍镐腑鐨勬暟鎹粨鏋勩€佹柟娉曠瓑锛屾瘯绔熷ぇ閮ㄥ垎搴旂敤绋嬪簭寮€鍙戣€呬笉闇€瑕佷簡瑙h繖浜涳紝浠呬互涓€骞呯ず鎰忓浘绮楃暐琛ㄧず锛屽涓嬶細
TCP娑堟伅鐨勫彂閫?杞
鍥? 涓€绉嶅吀鍨嬪満鏅笅鍙戦€乀CP娑堟伅鐨勬祦绋?/div>
鍐嶈杩颁笂鍥?0涓楠ゅ墠锛屽厛瑕佹緞娓呭嚑涓蹇碉細MTU銆丮SS銆?span style="font-family: inherit;">tcp_write_queue鍙戦€侀槦鍒椼€侀樆濉炰笌闈為樆濉炲鎺ュ瓧銆佹嫢濉炵獥鍙c€佹粦鍔ㄧ獥鍙c€?span style="font-family: inherit;">Nagle绠楁硶銆?/div>
褰撴垜浠皟鐢ㄥ彂閫佹柟娉曟椂锛屼細鎶婃垜浠唬鐮佷腑鏋勯€犲ソ鐨勬秷鎭祦浣滀负鍙傛暟浼犻€掋€傝繖涓秷鎭祦鍙ぇ鍙皬锛屼緥濡傚嚑涓瓧鑺傦紝鎴栬€呭嚑鍏嗗瓧鑺傘€傚綋娑堟伅娴佽緝澶ф椂锛屽皢鏈夊彲鑳藉嚭鐜板垎鐗囥€傛垜浠厛鏉ヨ璁哄垎鐗囬棶棰樸€?/div>
1銆丮SS涓嶵CP鐨勫垎鐗?/div>
鐢变笂涓€绡囨枃涓彲鐭ワ紝TCP灞傛槸绗?灞備紶杈撳眰锛岀3灞侷P缃戠粶灞傘€佺2灞傛暟鎹摼璺眰鍏峰鐨勭害鏉熸潯浠跺悓鏍峰TCP灞傜敓鏁堛€備笅闈㈡潵鐪嬬湅鏁版嵁閾捐矾灞備腑鐨勪竴涓蹇碉細鏈€澶т紶杈撳崟鍏僊TU銆?/div>
鏃犺浣曠绫诲瀷鐨勬暟鎹摼璺眰锛岄兘浼氬缃戠粶鍒嗙粍鐨勯暱搴︽湁涓€涓檺鍒躲€備緥濡備互澶綉闄愬埗涓?500瀛楄妭锛?02.3闄愬埗涓?492瀛楄妭銆傚綋鍐呮牳鐨処P缃戠粶灞傝瘯鍥惧彂閫佹姤鏂囨椂锛岃嫢涓€涓姤鏂囩殑闀垮害澶т簬MTU闄愬埗锛屽氨浼氳鍒嗘垚鑻ュ共涓皬浜嶮TU鐨勬姤鏂囷紝姣忎釜鎶ユ枃閮戒細鏈夌嫭绔嬬殑IP澶撮儴銆?/div>
鐪嬬湅IP澶撮儴鐨勬牸寮忥細
TCP娑堟伅鐨勫彂閫?杞
鍥? IP澶撮儴鏍煎紡
鍙互鐪嬪埌锛屽叾鎸囧畾IP鍖呮€婚暱搴︾殑鏄竴涓?6浣嶏紙2瀛楄妭锛夌殑瀛楁锛岃繖鎰忓懗涓€涓狪P鍖呮渶澶у彲浠ユ槸65535瀛楄妭銆?/div>
鑻CP灞傚湪浠ュお缃戜腑璇曞浘鍙戦€佷竴涓ぇ浜?500瀛楄妭鐨勬秷鎭紝璋冪敤IP缃戠粶灞傛柟娉曞彂閫佹秷鎭椂锛孖P灞備細鑷姩鐨勮幏鍙栨墍鍦ㄥ眬鍩熺綉鐨凪TU鍊硷紝骞舵寜鐓ф墍鍦ㄧ綉缁滅殑MTU澶у皬鏉ュ垎鐗囥€侷P灞傚悓鏃跺笇鏈涜繖涓垎鐗囧浜庝紶杈撳眰鏉ヨ鏄€忔槑鐨勶紝鎺ユ敹鏂圭殑IP灞備細鏍规嵁鏀跺埌鐨勫涓狪P鍖呭ご閮紝灏嗗彂閫佹柟IP灞傚垎鐗囧嚭鐨処P鍖呴噸缁勪负涓€涓秷鎭€?/div>
杩欑IP灞傜殑鍒嗙墖鏁堢巼鏄緢宸殑锛屽洜涓哄繀椤绘墍鏈夊垎鐗囬兘鍒拌揪鎵嶈兘閲嶇粍鎴愪竴涓寘锛屽叾涓换浣曚竴涓垎鐗囦涪澶变簡锛岄兘蹇呴』閲嶅彂鎵€鏈夊垎鐗囥€傛墍浠ワ紝TCP灞備細璇曞浘閬垮厤IP灞傛墽琛屾暟鎹姤鍒嗙墖銆?/div>
涓轰簡閬垮厤IP灞傜殑鍒嗙墖锛孴CP鍗忚瀹氫箟浜嗕竴涓柊鐨勬蹇碉細鏈€澶ф姤鏂囨闀垮害MSS銆傚畠瀹氫箟浜嗕竴涓猅CP杩炴帴涓婏紝涓€涓富鏈烘湡鏈涘绔富鏈哄彂閫佸崟涓姤鏂囩殑鏈€澶ч暱搴︺€俆CP3娆℃彙鎵嬪缓绔嬭繛鎺ユ椂锛岃繛鎺ュ弻鏂归兘瑕佷簰鐩稿憡鐭ヨ嚜宸辨湡鏈涙帴鏀跺埌鐨凪SS澶у皬銆備緥濡傦紙浣跨敤tcpdump鎶撳寘锛夛細
15:05:08.230782 IP 10.7.80.57.64569 > houyi-vm02.dev.sd.aliyun.com.tproxy: S 3027092051:3027092051(0) win 8192 <mss 1460,nop,wscale 8,nop,nop,sackOK>
15:05:08.234267 IP houyi-vm02.dev.sd.aliyun.com.tproxy > 10.7.80.57.64569: S 26006838:26006838(0) ack 3027092052 win 5840 <mss 1460,nop,nop,sackOK,nop,wscale 9>
15:05:08.233320 IP 10.7.80.57.64543 > houyi-vm02.dev.sd.aliyun.com.tproxy: P 78972532:78972923(391) ack 12915963 win 255
鐢变簬渚嬪瓙涓袱鍙颁富鏈洪兘鍦ㄤ互澶綉鍐咃紝浠ュお缃戠殑MTU涓?500锛屽噺鍘籌P鍜孴CP澶撮儴鐨勯暱搴︼紝MSS灏辨槸1460锛屼笁娆℃彙鎵嬩腑锛孲YN鍖呴兘浼氭惡甯︽湡鏈涚殑MSS澶у皬銆?/div>
褰撳簲鐢ㄥ眰璋冪敤TCP灞傛彁渚涚殑鍙戦€佹柟娉曟椂锛屽唴鏍哥殑TCP妯″潡鍦╰cp_sendmsg鏂规硶閲岋紝浼氭寜鐓у鏂瑰憡鐭ョ殑MSS鏉ュ垎鐗囷紝鎶婃秷鎭祦鍒嗕负澶氫釜缃戠粶鍒嗙粍锛堝鍥?涓殑3涓綉缁滃垎缁勶級锛屽啀璋冪敤IP灞傜殑鏂规硶鍙戦€佹暟鎹€?/div>
杩欎釜MSS灏变笉浼氭敼鍙樹簡鍚楋紵
浼氱殑銆備笂鏂囪杩囷紝MSS灏辨槸涓轰簡閬垮厤IP灞傚垎鐗囷紝鍦ㄥ缓绔嬫彙鎵嬫椂鍛婄煡瀵规柟鏈熸湜鎺ユ敹鐨凪SS鍊煎苟涓嶄竴瀹氶潬寰椾綇銆傚洜涓鸿繖涓€兼槸棰勪及鐨勶紝TCP杩炴帴涓婄殑涓ゅ彴涓绘満鑻ュ浜庝笉鍚岀殑缃戠粶涓紝閭d箞锛岃繛鎺ヤ笂鍙兘鏈夎澶氫腑闂寸綉缁滐紝杩欎簺缃戠粶鍒嗗埆鍏锋湁涓嶅悓鐨勬暟鎹摼璺眰锛岃繖鏍凤紝TCP杩炴帴涓婃湁璁稿涓狹TU銆傜壒鍒槸锛岃嫢涓棿閫斿緞鐨凪TU灏忎簬涓ゅ彴涓绘満鎵€鍦ㄧ殑缃戠粶MTU鏃讹紝閫夊畾鐨凪SS浠嶇劧澶ぇ浜嗭紝浼氬鑷翠腑闂磋矾鐢卞櫒鍑虹幇IP灞傜殑鍒嗙墖銆?/div>
鎬庢牱閬垮厤涓棿缃戠粶鍙兘鍑虹幇鐨勫垎鐗囧憿锛?/div>
閫氳繃IP澶撮儴鐨凞F鏍囧織浣嶏紝杩欎釜鏍囧織浣嶆槸鍛婅瘔IP鎶ユ枃鎵€閫旂粡鐨勬墍鏈塈P灞備唬鐮侊細涓嶈瀵硅繖涓姤鏂囧垎鐗囥€傚鏋滀竴涓狪P鎶ユ枃澶ぇ蹇呴』瑕佸垎鐗囷紝鍒欑洿鎺ヨ繑鍥炰竴涓狪CMP閿欒锛岃鏄庡繀椤昏鍒嗙墖浜嗭紝涓斿緟鍒嗙墖璺敱鍣ㄧ綉缁滄帴鍙楃殑MTU鍊笺€傝繖鏍凤紝杩炴帴涓婄殑鍙戦€佹柟涓绘満灏卞彲浠ラ噸鏂扮‘瀹歁SS銆?/div>
2銆佸彂閫佹柟娉曡繑鍥炴垚鍔熷悗锛屾暟鎹竴瀹氬彂閫佸埌浜員CP鐨勫彟涓€绔悧锛?/span>
绛旀褰撶劧鏄惁瀹氱殑銆傝В閲婅繖涓棶棰樺墠锛屽厛鏉ョ湅鐪婽CP鏄浣曚繚璇佸彲闈犱紶杈撶殑銆?/span>
TCP鎶婅嚜宸辫鍙戦€佺殑鏁版嵁娴侀噷鐨勬瘡涓€涓瓧鑺傞兘鐪嬫垚涓€涓簭鍙凤紝鍙潬鎬ф槸瑕佹眰杩炴帴瀵圭鍦ㄦ帴鏀跺埌鏁版嵁鍚庯紝瑕佸彂閫丄CK纭锛屽憡璇夊畠宸茬粡鎺ユ敹鍒颁簡澶氬皯瀛楄妭鐨勬暟鎹€備篃灏辨槸璇达紝鎬庢牱纭繚鏁版嵁涓€瀹氬彂閫佹垚鍔熶簡鍛紵蹇呴』绛夊緟鍙戦€佹暟鎹搴斿簭鍙风殑ACK鍒拌揪锛屾墠鑳界‘淇濇暟鎹竴瀹氬彂閫佹垚鍔熴€?/span>TCP灞傛彁渚涚殑send鎴栬€厀rite杩欐牱鐨勬柟娉曟槸涓嶄細鍋氳繖浠朵簨鐨勶紝鐪嬬湅鍥?锛屽畠绌剁珶鍋氫簡鍝簺浜嬨€?/span>
鍥?涓垎涓?0姝ャ€?/span>
锛?锛夊簲鐢ㄧ▼搴忚瘯鍥捐皟鐢╯end鏂规硶鏉ュ彂閫佷竴娈佃緝闀跨殑鏁版嵁銆?/span>
锛?锛夊唴鏍镐富瑕侀€氳繃tcp_sendmsg鏂规硶鏉ュ畬鎴愩€?/span>
锛?锛夛紙4锛夊唴鏍哥湡姝f墽琛屾姤鏂囩殑鍙戦€侊紝涓巗end鏂规硶鐨勮皟鐢ㄥ苟涓嶆槸鍚屾鐨勩€傚嵆锛宻end鏂规硶杩斿洖鎴愬姛浜嗭紝涔熶笉涓€瀹氭妸IP鎶ユ枃閮藉彂閫佸埌缃戠粶涓簡銆傚洜姝わ紝闇€瑕佹妸鐢ㄦ埛闇€瑕佸彂閫佺殑鐢ㄦ埛鎬佸唴瀛樹腑鐨勬暟鎹紝鎷疯礉鍒板唴鏍告€佸唴瀛樹腑锛屼笉渚濊禆浜庣敤鎴锋€佸唴瀛橈紝涔熶娇寰楄繘绋嬪彲浠ュ揩閫熼噴鏀惧彂閫佹暟鎹崰鐢ㄧ殑鐢ㄦ埛鎬佸唴瀛樸€備絾杩欎釜鎷疯礉鎿嶄綔骞朵笉鏄畝鍗曠殑澶嶅埗锛岃€屾槸鎶婂緟鍙戦€佹暟鎹紝鎸夌収MSS鏉ュ垝鍒嗘垚澶氫釜灏介噺杈惧埌MSS澶у皬鐨勫垎鐗囨姤鏂囨锛屽鍒跺埌鍐呮牳涓殑sk_buff缁撴瀯鏉ュ瓨鏀撅紝鍚屾椂鎶婅繖浜涘垎鐗囩粍鎴愰槦鍒楋紝鏀惧埌杩欎釜TCP杩炴帴瀵瑰簲鐨?/span>tcp_write_queue鍙戦€侀槦鍒椾腑銆?/span>
锛?锛夊唴鏍镐腑涓鸿繖涓猅CP杩炴帴鍒嗛厤鐨勫唴鏍哥紦瀛樻槸鏈夐檺鐨勶紙/proc/sys/net/core/wmem_default锛夈€傚綋娌℃湁澶氫綑鐨勫唴鏍告€佺紦瀛樻潵澶嶅埗鐢ㄦ埛鎬佺殑寰呭彂閫佹暟鎹椂锛屽氨闇€瑕佽皟鐢ㄤ竴涓柟娉?/span>sk_stream_wait_memory鏉ョ瓑寰呮粦鍔ㄧ獥鍙gЩ鍔紝閲婃斁鍑轰竴浜涚紦瀛樺嚭鏉ワ紙鏀跺埌ACK鍚庯紝涓嶉渶瑕佸啀缂撳瓨鍘熸潵宸茬粡鍙戦€佸嚭鐨勬姤鏂囷紝鍥犱负鏃㈢劧宸茬粡纭瀵规柟鏀跺埌锛屽氨涓嶉渶瑕佸畾鏃堕噸鍙戯紝鑷劧灏遍噴鏀剧紦瀛樹簡锛夈€備緥濡傦細
[cpp]聽view plaincopy
  1. wait_for_memory:聽聽
  2. 聽聽聽聽聽聽聽聽聽聽聽聽if聽(copied)聽聽
  3. 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽tcp_push(sk,聽tp,聽flags聽&聽~MSG_MORE,聽mss_now,聽TCP_NAGLE_PUSH);聽聽
  4. 聽聽
  5. 聽聽聽聽聽聽聽聽聽聽聽聽if聽((err聽=聽sk_stream_wait_memory(sk,聽&timeo))聽!=聽0)聽聽
  6. 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽goto聽do_error;聽聽

杩欓噷鐨?/span>sk_stream_wait_memory鏂规硶鎺ュ彈涓€涓弬鏁皌imeo锛屽氨鏄瓑寰呰秴鏃剁殑鏃堕棿銆傝繖涓椂闂存槸tcp_sendmsg鏂规硶鍒氬紑濮嬪氨鎷垮埌鐨勶紝濡備笅锛?/span>
[cpp]聽view plaincopy
  1. timeo聽=聽sock_sndtimeo(sk,聽flags聽&聽MSG_DONTWAIT);聽聽

鐪嬬湅鍏跺疄鐜帮細
[cpp]聽view plaincopy
  1. staticinlinelong聽sock_sndtimeo(conststruct聽sock聽*sk,聽int聽noblock)聽聽
  2. {聽聽
  3. 聽聽聽聽return聽noblock聽?聽0聽:聽sk->sk_sndtimeo;聽聽
  4. }聽聽

涔熷氨鏄锛屽綋杩欎釜濂楁帴瀛楁槸闃诲濂楁帴瀛楁椂锛宼imeo灏辨槸SO_SNDTIMEO閫夐」鎸囧畾鐨勫彂閫佽秴鏃舵椂闂淬€傚鏋滆繖涓鎺ュ瓧鏄潪闃诲濂楁帴瀛楋紝 timeo鍙橀噺灏变細鏄?銆?/div>
瀹為檯涓婏紝sk_stream_wait_memory瀵逛簬闈為樆濉炲鎺ュ瓧浼氱洿鎺ヨ繑鍥烇紝骞跺皢 errno閿欒鐮佺疆涓篍AGAIN銆?/div>
锛?锛夊湪鍥?鐨勪緥瀛愪腑锛屾垜浠亣瀹氫娇鐢ㄤ簡闃诲濂楁帴瀛楋紝涓旂瓑寰呬簡瓒冲涔呯殑鏃堕棿锛屾敹鍒颁簡瀵规柟鐨凙CK锛屾粦鍔ㄧ獥鍙i噴鏀惧嚭浜嗙紦瀛樸€?/div>
锛?锛夊皢鍓╀笅鐨勭敤鎴锋€佹暟鎹兘缁勬垚MSS鎶ユ枃鎷疯礉鍒板唴鏍告€佺殑sk_buff涓€?/div>
锛?锛夋渶鍚庯紝璋冪敤tcp_push绛夋柟娉曪紝瀹冩渶缁堜細璋冪敤IP灞傜殑鏂规硶鏉ュ彂閫乼cp_write_queue闃熷垪涓殑鎶ユ枃銆?/div>
娉ㄦ剰锛孖P灞傝繑鍥炴椂锛屽苟涓嶄竴瀹氭槸鎶婃姤鏂囧彂閫佷簡鍑哄幓銆?/div>
锛?锛夛紙10锛夊彂閫佹柟娉曡繑鍥炪€?/div>
浠庡浘1鐨?0涓楠や腑鍙煡锛屾棤璁烘槸浣跨敤闃诲杩樻槸闈為樆濉炲鎺ュ瓧锛屽彂閫佹柟娉曟垚鍔熻繑鍥炴椂锛堟棤璁哄叏閮ㄦ垚鍔熸垨鑰呴儴鍒嗘垚鍔燂級锛屾棦涓嶄唬琛═CP杩炴帴鐨勫彟涓€绔富鏈烘帴鏀跺埌浜嗘秷鎭紝涔熶笉浠h〃鏈満鎶婃秷鎭彂閫佸埌浜嗙綉缁滀笂锛屽彧鏄鏄庯紝鍐呮牳灏嗕細璇曞浘淇濊瘉鎶婃秷鎭€佽揪瀵规柟銆?/span>
3銆?/span>Nagle绠楁硶銆?/span>婊戝姩绐楀彛銆佹嫢濉炵獥鍙e鍙戦€佹柟娉曠殑褰卞搷
鍥?绗?姝cp_push鏂规硶鍋氫簡浜涗粈涔堝憿锛熷厛鏉ョ湅鐪嬩富瑕佺殑娴佺▼锛?/span>
TCP娑堟伅鐨勫彂閫?杞
鍥? 鍙戦€乀CP娑堟伅鐨勭畝鏄撴祦绋?/div>
涓嬮潰绠€鍗曠湅鐪嬭繖鍑犱釜姒傚康锛?/div>
锛?锛夋粦鍔ㄧ獥鍙?/div>
婊戝姩绐楀彛澶у閮芥瘮杈冪啛鎮夛紝灏变笉璇︾粏浠嬬粛浜嗐€俆CP杩炴帴涓婄殑鍙屾柟閮戒細閫氱煡瀵规柟鑷繁鐨勬帴鏀剁獥鍙eぇ灏忋€傝€屽鏂圭殑鎺ユ敹绐楀彛澶у皬灏辨槸鑷繁鐨勫彂閫佺獥鍙eぇ灏忋€倀cp_push鍦ㄥ彂閫佹暟鎹椂褰撶劧闇€瑕佷笌鍙戦€佺獥鍙f墦浜ら亾銆傚彂閫佺獥鍙f槸涓€涓椂鍒诲彉鍖栫殑鍊硷紝闅忕潃ACK鐨勫埌杈句細鍙樺ぇ锛岄殢鐫€鍙戝嚭鏂扮殑鏁版嵁鍖呬細鍙樺皬銆傚綋鐒讹紝鏈€澶т篃鍙兘鍒颁笁娆℃彙鎵嬫椂瀵规柟閫氬憡鐨勭獥鍙eぇ灏忋€倀cp_push鍦ㄥ彂閫佹暟鎹椂锛屾渶缁堜細浣跨敤tcp_snd_wnd_test鏂规硶鏉ュ垽鏂綋鍓嶅緟鍙戦€佺殑鏁版嵁锛屽叾搴忓彿鏄惁瓒呭嚭浜嗗彂閫佹粦鍔ㄧ獥鍙g殑澶у皬锛屼緥濡傦細
[cpp]聽view plaincopy
  1. //妫€鏌ヨ繖涓€娆¤鍙戦€佺殑鎶ユ枃鏈€澶у簭鍙锋槸鍚﹁秴鍑轰簡鍙戦€佹粦鍔ㄧ獥鍙eぇ灏?/span>聽聽
  2. staticinlineint聽tcp_snd_wnd_test(struct聽tcp_sock聽*tp,聽struct聽sk_buff聽*skb,聽unsigned聽int聽cur_mss)聽聽
  3. {聽聽
  4. 聽聽聽聽聽聽聽聽//end_seq寰呭彂閫佺殑鏈€澶у簭鍙?/span>聽聽
  5. 聽聽聽聽u32聽end_seq聽=聽TCP_SKB_CB(skb)->end_seq;聽聽
  6. 聽聽
  7. 聽聽聽聽if聽(skb->len聽>聽cur_mss)聽聽
  8. 聽聽聽聽聽聽聽聽end_seq聽=聽TCP_SKB_CB(skb)->seq聽+聽cur_mss;聽聽
  9. 聽聽
  10. 聽聽聽聽聽聽聽聽//snd_una鏄凡缁忓彂閫佽繃鐨勬暟鎹腑锛屾渶灏忕殑娌¤纭鐨勫簭鍙凤紱鑰宻nd_wnd灏辨槸鍙戦€佺獥鍙g殑澶у皬聽聽
  11. 聽聽聽聽return聽!after(end_seq,聽tp->snd_una聽+聽tp->snd_wnd);聽聽
  12. }聽聽

锛?锛夋參鍚姩鍜屾嫢濉炵獥鍙?/span>
鐢变簬涓ゅ彴涓绘満闂寸殑缃戠粶鍙兘寰堝鏉傦紝閫氳繃骞垮煙缃戞椂锛屼腑闂寸殑璺敱鍣ㄨ浆鍙戣兘鍔涘彲鑳芥槸鐡堕銆備篃灏辨槸璇达紝濡傛灉涓€鏂圭畝鍗曠殑鎸夌収鍙︿竴鏂逛富鏈轰笁娆℃彙鎵嬫椂閫氬憡鐨勬粦鍔ㄧ獥鍙eぇ灏忔潵鍙戦€佹暟鎹殑璇濓紝鍙兘浼氫娇寰楃綉缁滀笂鐨勮浆鍙戣矾鐢卞櫒鎬ц兘闆笂鍔犻湝锛屾渶缁堜涪澶辨洿澶氱殑鍒嗙粍銆傝繖鏃讹紝鍚勪釜鎿嶄綔绯荤粺鍐呮牳閮戒細瀵筎CP鐨勫彂閫侀樁娈靛姞鍏ユ參鍚姩鍜屾嫢濉為伩鍏嶇畻娉曘€傛參鍚姩绠楁硶璇寸櫧浜嗭紝灏辨槸瀵规柟閫氬憡鐨勭獥鍙eぇ灏忓彧琛ㄧず瀵规柟鎺ユ敹TCP鍒嗙粍鐨勮兘鍔涳紝涓嶈〃绀轰腑闂寸綉缁滆兘澶熷鐞嗗垎缁勭殑鑳藉姏銆傛墍浠ワ紝鍙戦€佹柟璇锋偁鐫€鐐瑰彂锛岀‘淇濈綉缁滈潪甯搁€氱晠浜嗗悗锛屽啀鎸夌収瀵规柟閫氬憡绐楀彛鏉ユ暈寮€浜嗗彂銆?/span>
鎷ュ绐楀彛灏辨槸涓嬮潰鐨刢wnd锛屽畠鐢ㄦ潵甯姪鎱㈠惎鍔ㄧ殑瀹炵幇銆傝繛鎺ュ垰寤虹珛鏃讹紝鎷ュ绐楀彛鐨勫ぇ灏忚繙灏忎簬鍙戦€佺獥鍙o紝瀹冨疄闄呬笂鏄竴涓狹SS銆傛瘡鏀跺埌涓€涓狝CK锛屾嫢濉炵獥鍙f墿澶т竴涓狹SS澶у皬锛屽綋鐒讹紝鎷ュ绐楀彛鏈€澶у彧鑳藉埌瀵规柟閫氬憡鐨勬帴鏀剁獥鍙eぇ灏忋€傚綋鐒讹紝涓轰簡閬垮厤鎸囨暟寮忓闀匡紝鎷ュ绐楀彛澶у皬鐨勫闀夸細鏇存參涓€浜涳紝鏄嚎鎬х殑骞虫粦鐨勫闀胯繃绋嬨€?/span>
鎵€浠ワ紝鍦╰cp_push鍙戦€佹秷鎭椂锛岃繕浼氭鏌ユ嫢濉炵獥鍙o紝椋炶涓殑鎶ユ枃鏁拌灏忎簬鎷ュ绐楀彛涓暟锛岃€屽彂閫佹暟鎹殑闀垮害涔熻灏忎簬鎷ュ绐楀彛鐨勯暱搴︺€?/span>
濡備笅鎵€绀猴紝棣栧厛鐢?/span>unsigned int tcp_cwnd_test鏂规硶妫€鏌ラ琛岀殑鎶ユ枃鏁版槸鍚﹀皬浜庢嫢濉炵獥鍙d釜鏁帮紙澶氬皯涓狹SS鐨勪釜鏁帮級锛?/span>
[cpp]聽view plaincopy
  1. staticinline聽unsigned聽int聽tcp_cwnd_test(struct聽tcp_sock聽*tp,聽struct聽sk_buff聽*skb)聽聽
  2. {聽聽
  3. 聽聽聽聽u32聽in_flight,聽cwnd;聽聽
  4. 聽聽
  5. 聽聽聽聽/*聽Don't聽be聽strict聽about聽the聽congestion聽window聽for聽the聽final聽FIN.聽聽*/聽聽
  6. 聽聽聽聽if聽(TCP_SKB_CB(skb)->flags聽&聽TCPCB_FLAG_FIN)聽聽
  7. 聽聽聽聽聽聽聽聽return聽1;聽聽
  8. 聽聽
  9. 聽聽聽聽聽聽聽聽//椋炶涓殑鏁版嵁锛屼篃灏辨槸娌℃湁ACK鐨勫瓧鑺傛€绘暟聽聽
  10. 聽聽聽聽in_flight聽=聽tcp_packets_in_flight(tp);聽聽
  11. 聽聽聽聽cwnd聽=聽tp->snd_cwnd;聽聽
  12. 聽聽聽聽聽聽聽聽//濡傛灉鎷ュ绐楀彛鍏佽锛岄渶瑕佽繑鍥炰緷鎹嫢濉炵獥鍙g殑澶у皬锛岃繕鑳藉彂閫佸灏戝瓧鑺傜殑鏁版嵁聽聽
  13. 聽聽聽聽if聽(in_flight聽<聽cwnd)聽聽
  14. 聽聽聽聽聽聽聽聽return聽(cwnd聽-聽in_flight);聽聽
  15. 聽聽
  16. 聽聽聽聽return聽0;聽聽
  17. }聽聽

鍐嶉€氳繃tcp_window_allows鏂规硶鑾峰彇鎷ュ绐楀彛涓庢粦鍔ㄧ獥鍙g殑鏈€灏忛暱搴︼紝妫€鏌ュ緟鍙戦€佺殑鏁版嵁鏄惁瓒呭嚭锛?/div>
[cpp]聽view plaincopy
  1. static聽unsigned聽int聽tcp_window_allows(struct聽tcp_sock聽*tp,聽struct聽sk_buff聽*skb,聽unsigned聽int聽mss_now,聽unsigned聽int聽cwnd)聽聽
  2. {聽聽
  3. 聽聽聽聽u32聽window,聽cwnd_len;聽聽
  4. 聽聽
  5. 聽聽聽聽window聽=聽(tp->snd_una聽+聽tp->snd_wnd聽-聽TCP_SKB_CB(skb)->seq);聽聽
  6. 聽聽聽聽cwnd_len聽=聽mss_now聽*聽cwnd;聽聽
  7. 聽聽聽聽return聽min(window,聽cwnd_len);聽聽
  8. }聽聽

锛?锛夋槸鍚︾鍚圢AGLE绠楁硶锛?/span>
Nagle绠楁硶鐨勫垵琛锋槸杩欐牱鐨勶細搴旂敤杩涚▼璋冪敤鍙戦€佹柟娉曟椂锛屽彲鑳芥瘡娆″彧鍙戦€佸皬鍧楁暟鎹紝閫犳垚杩欏彴鏈哄櫒鍙戦€佷簡璁稿灏忕殑TCP鎶ユ枃銆傚浜庢暣涓綉缁滅殑鎵ц鏁堢巼鏉ヨ锛屽皬鐨凾CP鎶ユ枃浼氬鍔犵綉缁滄嫢濉炵殑鍙兘锛屽洜姝わ紝濡傛灉鏈夊彲鑳斤紝搴旇灏嗙浉涓寸殑TCP鎶ユ枃鍚堝苟鎴愪竴涓緝澶х殑TCP鎶ユ枃锛堝綋鐒惰繕鏄皬浜嶮SS鐨勶級鍙戦€併€?/span>
Nagle绠楁硶瑕佹眰涓€涓猅CP杩炴帴涓婃渶澶氬彧鑳芥湁涓€涓彂閫佸嚭鍘昏繕娌¤纭鐨勫皬鍒嗙粍锛屽湪璇ュ垎缁勭殑纭鍒拌揪涔嬪墠涓嶈兘鍙戦€佸叾浠栫殑灏忓垎缁勩€?/div>
鍐呮牳涓槸閫氳繃tcp_nagle_test鏂规硶瀹炵幇璇ョ畻娉曠殑銆傛垜浠畝鍗曠殑鐪嬩笅锛?/span>
[cpp]聽view plaincopy
  1. 聽聽
[cpp]聽view plaincopy
  1. staticinlineint聽tcp_nagle_test(struct聽tcp_sock聽*tp,聽struct聽sk_buff聽*skb,聽聽
  2. 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽unsigned聽int聽cur_mss,聽int聽nonagle)聽聽
  3. {聽聽
  4. 聽聽聽聽//nonagle鏍囧織浣嶈缃簡锛岃繑鍥?琛ㄧず鍏佽杩欎釜鍒嗙粍鍙戦€佸嚭鍘?/span>聽聽
  5. 聽聽聽聽if聽(nonagle聽&聽TCP_NAGLE_PUSH)聽聽
  6. 聽聽聽聽聽聽聽聽return聽1;聽聽
  7. 聽聽
  8. 聽聽聽聽//濡傛灉杩欎釜鍒嗙粍鍖呭惈浜嗗洓娆℃彙鎵嬪叧闂繛鎺ョ殑FIN鍖咃紝涔熷彲浠ュ彂閫佸嚭鍘?/span>聽聽
  9. 聽聽聽聽if聽(tp->urg_mode聽||聽聽
  10. 聽聽聽聽聽聽聽聽(TCP_SKB_CB(skb)->flags聽&聽TCPCB_FLAG_FIN))聽聽
  11. 聽聽聽聽聽聽聽聽return聽1;聽聽
  12. 聽聽
  13. 聽聽聽聽聽聽聽聽//妫€鏌agle绠楁硶聽聽
  14. 聽聽聽聽if聽(!tcp_nagle_check(tp,聽skb,聽cur_mss,聽nonagle))聽聽
  15. 聽聽聽聽聽聽聽聽return聽1;聽聽
  16. 聽聽
  17. 聽聽聽聽return聽0;聽聽
  18. }聽聽

鍐嶆潵鐪嬬湅tcp_nagle_check鏂规硶锛屽畠涓庝笂涓€涓柟娉曚笉鍚岋紝杩斿洖0琛ㄧず鍙互鍙戦€侊紝杩斿洖闈?鍒欎笉鍙互锛屾濂界浉鍙嶃€?/span>
[cpp]聽view plaincopy
  1. staticinlineint聽tcp_nagle_check(conststruct聽tcp_sock聽*tp,聽聽
  2. 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽conststruct聽sk_buff聽*skb,聽聽聽
  3. 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽unsigned聽mss_now,聽int聽nonagle)聽聽
  4. {聽聽
  5. 聽聽聽聽聽聽聽聽//鍏堟鏌ユ槸鍚︿负灏忓垎缁勶紝鍗虫姤鏂囬暱搴︽槸鍚﹀皬浜嶮SS聽聽
  6. 聽聽聽聽return聽(skb->len聽<聽mss_now聽&&聽聽
  7. 聽聽聽聽聽聽聽聽((nonagle&TCP_NAGLE_CORK)聽||聽聽
  8. 聽聽聽聽聽聽聽聽//濡傛灉寮€鍚簡Nagle绠楁硶聽聽
  9. 聽聽聽聽聽聽聽聽聽(!nonagle聽&&聽聽
  10. 聽聽聽聽聽聽聽聽//鑻ュ凡缁忔湁灏忓垎缁勫彂鍑猴紙packets_out琛ㄧず鈥滈琛屸€濅腑鐨勫垎缁勶級杩樻病鏈夌‘璁?/span>聽聽
  11. 聽聽聽聽聽聽聽聽聽聽tp->packets_out聽&&聽聽
  12. 聽聽聽聽聽聽聽聽聽聽tcp_minshall_check(tp))));聽聽
  13. }聽聽

鏈€鍚庣湅鐪媡cp_minshall_check鍋氫簡浜涗粈涔堬細
[cpp]聽view plaincopy
  1. staticinlineint聽tcp_minshall_check(conststruct聽tcp_sock聽*tp)聽聽
  2. {聽聽
  3. 聽聽聽聽聽聽聽聽//鏈€鍚庝竴娆″彂閫佺殑灏忓垎缁勮繕娌℃湁琚‘璁?/span>聽聽
  4. 聽聽聽聽return聽after(tp->snd_sml,tp->snd_una)聽&&聽聽
  5. 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽//灏嗚鍙戦€佺殑搴忓彿鏄澶т簬绛変簬涓婃鍙戦€佸垎缁勫搴旂殑搴忓彿聽聽
  6. 聽聽聽聽聽聽聽聽!after(tp->snd_sml,聽tp->snd_nxt);聽聽
  7. }聽聽

鎯宠薄涓€绉嶅満鏅紝褰撳璇锋眰鐨勬椂寤堕潪甯稿湪鎰忎笖缃戠粶鐜闈炲父濂界殑鏃跺€欙紙渚嬪鍚屼竴涓満鎴垮唴锛夛紝Nagle绠楁硶鍙互鍏抽棴锛岃繖瀹炲湪涔熸病蹇呰銆備娇鐢═CP_NODELAY濂楁帴瀛楅€夐」灏卞彲浠ュ叧闂璑agle绠楁硶銆傜湅鐪媠etsockopt鏄€庝箞涓庝笂杩版柟娉曢厤鍚堝伐浣滅殑锛?/span>
[cpp]聽view plaincopy
  1. staticint聽do_tcp_setsockopt(struct聽sock聽*sk,聽int聽level,聽聽
  2. 聽聽聽聽聽聽聽聽int聽optname,聽char聽__user聽*optval,聽int聽optlen)聽聽
  3. 聽聽聽聽聽聽聽聽...聽聽
  4. 聽聽聽聽switch聽(optname)聽{聽聽
  5. 聽聽聽聽聽聽聽聽...聽聽
  6. 聽聽聽聽case聽TCP_NODELAY:聽聽
  7. 聽聽聽聽聽聽聽聽if聽(val)聽{聽聽
  8. 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽//濡傛灉璁剧疆浜員CP_NODELAY锛屽垯鏇存柊nonagle鏍囧織聽聽
  9. 聽聽聽聽聽聽聽聽聽聽聽聽tp->nonagle聽|=聽TCP_NAGLE_OFF|TCP_NAGLE_PUSH;聽聽
  10. 聽聽聽聽聽聽聽聽聽聽聽聽tcp_push_pending_frames(sk,聽tp);聽聽
  11. 聽聽聽聽聽聽聽聽}聽else聽{聽聽
  12. 聽聽聽聽聽聽聽聽聽聽聽聽tp->nonagle聽&=聽~TCP_NAGLE_OFF;聽聽
  13. 聽聽聽聽聽聽聽聽}聽聽
  14. 聽聽聽聽聽聽聽聽break;聽聽
  15. 聽聽聽聽聽聽聽聽}聽聽
  16. }聽聽

鍙互鐪嬪埌锛宯onagle鏍囧織浣嶅氨鏄繖涔堟洿鏀圭殑銆?/span>
褰撶劧锛岃皟鐢ㄤ簡IP灞傜殑鏂规硶杩斿洖鍚庯紝涔熸湭蹇呭氨淇濊瘉姝ゆ椂鏁版嵁涓€瀹氬彂閫佸埌缃戠粶涓幓浜嗐€?/span>
涓嬩竴绡囨垜浠帰璁ㄥ浣曟帴鏀禩CP娑堟伅锛屼互鍙婃帴鏀跺埌ack鍚庡唴鏍稿仛浜嗕簺浠€涔堛€?/span>

文章评论

TCP娑堟伅鐨勫彂閫?杞
程序员应该关注的一些事儿
TCP娑堟伅鐨勫彂閫?杞
初级 vs 高级开发者 哪个性价比更高?
TCP娑堟伅鐨勫彂閫?杞
程序员最害怕的5件事 你中招了吗?
TCP娑堟伅鐨勫彂閫?杞
老美怎么看待阿里赴美上市
TCP娑堟伅鐨勫彂閫?杞
每天工作4小时的程序员
TCP娑堟伅鐨勫彂閫?杞
写给自己也写给你 自己到底该何去何从
TCP娑堟伅鐨勫彂閫?杞
Java 与 .NET 的平台发展之争
TCP娑堟伅鐨勫彂閫?杞
程序员的一天:一寸光阴一寸金
TCP娑堟伅鐨勫彂閫?杞
10个帮程序员减压放松的网站
TCP娑堟伅鐨勫彂閫?杞
10个调试和排错的小建议
TCP娑堟伅鐨勫彂閫?杞
5款最佳正则表达式编辑调试器
TCP娑堟伅鐨勫彂閫?杞
我是如何打败拖延症的
TCP娑堟伅鐨勫彂閫?杞
漫画:程序员的工作
TCP娑堟伅鐨勫彂閫?杞
旅行,写作,编程
TCP娑堟伅鐨勫彂閫?杞
程序员和编码员之间的区别
TCP娑堟伅鐨勫彂閫?杞
团队中“技术大拿”并非越多越好
TCP娑堟伅鐨勫彂閫?杞
程序员周末都喜欢做什么?
TCP娑堟伅鐨勫彂閫?杞
代码女神横空出世
TCP娑堟伅鐨勫彂閫?杞
做程序猿的老婆应该注意的一些事情
TCP娑堟伅鐨勫彂閫?杞
看13位CEO、创始人和高管如何提高工作效率
TCP娑堟伅鐨勫彂閫?杞
编程语言是女人
TCP娑堟伅鐨勫彂閫?杞
程序猿的崛起——Growth Hacker
TCP娑堟伅鐨勫彂閫?杞
为什么程序员都是夜猫子
TCP娑堟伅鐨勫彂閫?杞
不懂技术不要对懂技术的人说这很容易实现
TCP娑堟伅鐨勫彂閫?杞
Web开发人员为什么越来越懒了?
TCP娑堟伅鐨勫彂閫?杞
程序员眼里IE浏览器是什么样的
TCP娑堟伅鐨勫彂閫?杞
Java程序员必看电影
TCP娑堟伅鐨勫彂閫?杞
老程序员的下场
TCP娑堟伅鐨勫彂閫?杞
为啥Android手机总会越用越慢?
TCP娑堟伅鐨勫彂閫?杞
程序员都该阅读的书
TCP娑堟伅鐨勫彂閫?杞
要嫁就嫁程序猿—钱多话少死的早
TCP娑堟伅鐨勫彂閫?杞
程序员的样子
TCP娑堟伅鐨勫彂閫?杞
“肮脏的”IT工作排行榜
TCP娑堟伅鐨勫彂閫?杞
如何成为一名黑客
TCP娑堟伅鐨勫彂閫?杞
60个开发者不容错过的免费资源库
TCP娑堟伅鐨勫彂閫?杞
十大编程算法助程序员走上高手之路
TCP娑堟伅鐨勫彂閫?杞
一个程序员的时间管理
TCP娑堟伅鐨勫彂閫?杞
亲爱的项目经理,我恨你
TCP娑堟伅鐨勫彂閫?杞
程序员的鄙视链
TCP娑堟伅鐨勫彂閫?杞
我的丈夫是个程序员
TCP娑堟伅鐨勫彂閫?杞
聊聊HTTPS和SSL/TLS协议
TCP娑堟伅鐨勫彂閫?杞
程序员必看的十大电影
TCP娑堟伅鐨勫彂閫?杞
如何区分一个程序员是“老手“还是“新手“?
TCP娑堟伅鐨勫彂閫?杞
当下全球最炙手可热的八位少年创业者
TCP娑堟伅鐨勫彂閫?杞
鲜为人知的编程真相
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有