TCP娑堟伅鐨勫彂閫?杞
TCP娑堟伅鐨勫彂閫?杞?

鎴戜滑宸茬粡寤虹珛濂界殑TCP杩炴帴锛屽搴旂潃鎿嶄綔绯荤粺鍒嗛厤鐨?涓鎺ュ瓧銆傛搷浣淭CP鍗忚鍙戦€佹暟鎹椂锛岄潰瀵圭殑鏄暟鎹祦銆傞€氬父璋冪敤璇稿send鎴栬€厀rite鏂规硶鏉ュ彂閫佹暟鎹埌鍙︿竴鍙颁富鏈猴紝閭d箞锛岃皟鐢ㄨ繖鏍风殑鏂规硶鏃讹紝鍦ㄦ搷浣滅郴缁熷唴鏍镐腑鍙戠敓浜嗕粈涔堜簨鎯呭憿锛熸垜浠甫鐫€浠ヤ笅3涓棶棰樻潵缁嗙粏鍒嗘瀽锛氬彂閫佹柟娉曟垚鍔熻繑鍥炴椂锛岃兘淇濊瘉TCP鍙︿竴绔殑涓绘満鎺ユ敹鍒板悧锛熻兘淇濊瘉鏁版嵁宸茬粡鍙戦€佸埌缃戠粶涓婁簡鍚楋紵濂楁帴瀛椾负闃诲鎴栬€呴潪闃诲鏃讹紝鍙戦€佹柟娉曞仛鐨勪簨鎯呮湁浣曚笉鍚岋紵
聽
瑕佸洖绛斾笂闈?涓棶棰樻秹鍙婁簡涓嶅皯鐭ヨ瘑鐐癸紝鎴戜滑鍏堝湪TCP灞傞潰涓婄湅鐪嬶紝鍙戦€佹柟娉曡皟鐢ㄦ椂鍐呮牳鍋氫簡鍝簺浜嬨€傛垜涓嶆兂鍘荤綏鍒楀唴鏍镐腑鐨勬暟鎹粨鏋勩€佹柟娉曠瓑锛屾瘯绔熷ぇ閮ㄥ垎搴旂敤绋嬪簭寮€鍙戣€呬笉闇€瑕佷簡瑙h繖浜涳紝浠呬互涓€骞呯ず鎰忓浘绮楃暐琛ㄧず锛屽涓嬶細
聽
鍥? 涓€绉嶅吀鍨嬪満鏅笅鍙戦€乀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澶撮儴鐨勬牸寮忥細
鍥? 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>
杩欓噷鐨?/span>sk_stream_wait_memory鏂规硶鎺ュ彈涓€涓弬鏁皌imeo锛屽氨鏄瓑寰呰秴鏃剁殑鏃堕棿銆傝繖涓椂闂存槸tcp_sendmsg鏂规硶鍒氬紑濮嬪氨鎷垮埌鐨勶紝濡備笅锛?/span>
鐪嬬湅鍏跺疄鐜帮細
涔熷氨鏄锛屽綋杩欎釜濂楁帴瀛楁槸闃诲濂楁帴瀛楁椂锛宼imeo灏辨槸SO_SNDTIMEO閫夐」鎸囧畾鐨勫彂閫佽秴鏃舵椂闂淬€傚鏋滆繖涓鎺ュ瓧鏄潪闃诲濂楁帴瀛楋紝 timeo鍙橀噺灏变細鏄?銆?/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
聽
- wait_for_memory:聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽if聽(copied)聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽tcp_push(sk,聽tp,聽flags聽&聽~MSG_MORE,聽mss_now,聽TCP_NAGLE_PUSH);聽聽
- 聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽if聽((err聽=聽sk_stream_wait_memory(sk,聽&timeo))聽!=聽0)聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽goto聽do_error;聽聽
杩欓噷鐨?/span>sk_stream_wait_memory鏂规硶鎺ュ彈涓€涓弬鏁皌imeo锛屽氨鏄瓑寰呰秴鏃剁殑鏃堕棿銆傝繖涓椂闂存槸tcp_sendmsg鏂规硶鍒氬紑濮嬪氨鎷垮埌鐨勶紝濡備笅锛?/span>
[cpp]聽view plaincopy
聽
- timeo聽=聽sock_sndtimeo(sk,聽flags聽&聽MSG_DONTWAIT);聽聽
鐪嬬湅鍏跺疄鐜帮細
[cpp]聽view plaincopy
聽
- static聽inline聽long聽sock_sndtimeo(const聽struct聽sock聽*sk,聽int聽noblock)聽聽
- {聽聽
- 聽聽聽聽return聽noblock聽?聽0聽:聽sk->sk_sndtimeo;聽聽
- }聽聽
涔熷氨鏄锛屽綋杩欎釜濂楁帴瀛楁槸闃诲濂楁帴瀛楁椂锛宼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>
聽
鍥? 鍙戦€乀CP娑堟伅鐨勭畝鏄撴祦绋?/div>
聽
涓嬮潰绠€鍗曠湅鐪嬭繖鍑犱釜姒傚康锛?/div>
锛?锛夋粦鍔ㄧ獥鍙?/div>
聽
鍐嶉€氳繃tcp_window_allows鏂规硶鑾峰彇鎷ュ绐楀彛涓庢粦鍔ㄧ獥鍙g殑鏈€灏忛暱搴︼紝妫€鏌ュ緟鍙戦€佺殑鏁版嵁鏄惁瓒呭嚭锛?/div>
聽
婊戝姩绐楀彛澶у閮芥瘮杈冪啛鎮夛紝灏变笉璇︾粏浠嬬粛浜嗐€俆CP杩炴帴涓婄殑鍙屾柟閮戒細閫氱煡瀵规柟鑷繁鐨勬帴鏀剁獥鍙eぇ灏忋€傝€屽鏂圭殑鎺ユ敹绐楀彛澶у皬灏辨槸鑷繁鐨勫彂閫佺獥鍙eぇ灏忋€倀cp_push鍦ㄥ彂閫佹暟鎹椂褰撶劧闇€瑕佷笌鍙戦€佺獥鍙f墦浜ら亾銆傚彂閫佺獥鍙f槸涓€涓椂鍒诲彉鍖栫殑鍊硷紝闅忕潃ACK鐨勫埌杈句細鍙樺ぇ锛岄殢鐫€鍙戝嚭鏂扮殑鏁版嵁鍖呬細鍙樺皬銆傚綋鐒讹紝鏈€澶т篃鍙兘鍒颁笁娆℃彙鎵嬫椂瀵规柟閫氬憡鐨勭獥鍙eぇ灏忋€倀cp_push鍦ㄥ彂閫佹暟鎹椂锛屾渶缁堜細浣跨敤tcp_snd_wnd_test鏂规硶鏉ュ垽鏂綋鍓嶅緟鍙戦€佺殑鏁版嵁锛屽叾搴忓彿鏄惁瓒呭嚭浜嗗彂閫佹粦鍔ㄧ獥鍙g殑澶у皬锛屼緥濡傦細
[cpp]聽view plaincopy
聽
- //妫€鏌ヨ繖涓€娆¤鍙戦€佺殑鎶ユ枃鏈€澶у簭鍙锋槸鍚﹁秴鍑轰簡鍙戦€佹粦鍔ㄧ獥鍙eぇ灏?/span>聽聽
- static聽inline聽int聽tcp_snd_wnd_test(struct聽tcp_sock聽*tp,聽struct聽sk_buff聽*skb,聽unsigned聽int聽cur_mss)聽聽
- {聽聽
- 聽聽聽聽聽聽聽聽//end_seq寰呭彂閫佺殑鏈€澶у簭鍙?/span>聽聽
- 聽聽聽聽u32聽end_seq聽=聽TCP_SKB_CB(skb)->end_seq;聽聽
- 聽聽
- 聽聽聽聽if聽(skb->len聽>聽cur_mss)聽聽
- 聽聽聽聽聽聽聽聽end_seq聽=聽TCP_SKB_CB(skb)->seq聽+聽cur_mss;聽聽
- 聽聽
- 聽聽聽聽聽聽聽聽//snd_una鏄凡缁忓彂閫佽繃鐨勬暟鎹腑锛屾渶灏忕殑娌¤纭鐨勫簭鍙凤紱鑰宻nd_wnd灏辨槸鍙戦€佺獥鍙g殑澶у皬聽聽
- 聽聽聽聽return聽!after(end_seq,聽tp->snd_una聽+聽tp->snd_wnd);聽聽
- }聽聽
聽
锛?锛夋參鍚姩鍜屾嫢濉炵獥鍙?/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
聽
- static聽inline聽unsigned聽int聽tcp_cwnd_test(struct聽tcp_sock聽*tp,聽struct聽sk_buff聽*skb)聽聽
- {聽聽
- 聽聽聽聽u32聽in_flight,聽cwnd;聽聽
- 聽聽
- 聽聽聽聽/*聽Don't聽be聽strict聽about聽the聽congestion聽window聽for聽the聽final聽FIN.聽聽*/聽聽
- 聽聽聽聽if聽(TCP_SKB_CB(skb)->flags聽&聽TCPCB_FLAG_FIN)聽聽
- 聽聽聽聽聽聽聽聽return聽1;聽聽
- 聽聽
- 聽聽聽聽聽聽聽聽//椋炶涓殑鏁版嵁锛屼篃灏辨槸娌℃湁ACK鐨勫瓧鑺傛€绘暟聽聽
- 聽聽聽聽in_flight聽=聽tcp_packets_in_flight(tp);聽聽
- 聽聽聽聽cwnd聽=聽tp->snd_cwnd;聽聽
- 聽聽聽聽聽聽聽聽//濡傛灉鎷ュ绐楀彛鍏佽锛岄渶瑕佽繑鍥炰緷鎹嫢濉炵獥鍙g殑澶у皬锛岃繕鑳藉彂閫佸灏戝瓧鑺傜殑鏁版嵁聽聽
- 聽聽聽聽if聽(in_flight聽<聽cwnd)聽聽
- 聽聽聽聽聽聽聽聽return聽(cwnd聽-聽in_flight);聽聽
- 聽聽
- 聽聽聽聽return聽0;聽聽
- }聽聽
鍐嶉€氳繃tcp_window_allows鏂规硶鑾峰彇鎷ュ绐楀彛涓庢粦鍔ㄧ獥鍙g殑鏈€灏忛暱搴︼紝妫€鏌ュ緟鍙戦€佺殑鏁版嵁鏄惁瓒呭嚭锛?/div>
[cpp]聽view plaincopy
聽
- static聽unsigned聽int聽tcp_window_allows(struct聽tcp_sock聽*tp,聽struct聽sk_buff聽*skb,聽unsigned聽int聽mss_now,聽unsigned聽int聽cwnd)聽聽
- {聽聽
- 聽聽聽聽u32聽window,聽cwnd_len;聽聽
- 聽聽
- 聽聽聽聽window聽=聽(tp->snd_una聽+聽tp->snd_wnd聽-聽TCP_SKB_CB(skb)->seq);聽聽
- 聽聽聽聽cwnd_len聽=聽mss_now聽*聽cwnd;聽聽
- 聽聽聽聽return聽min(window,聽cwnd_len);聽聽
- }聽聽
聽
锛?锛夋槸鍚︾鍚圢AGLE绠楁硶锛?/span>
Nagle绠楁硶鐨勫垵琛锋槸杩欐牱鐨勶細搴旂敤杩涚▼璋冪敤鍙戦€佹柟娉曟椂锛屽彲鑳芥瘡娆″彧鍙戦€佸皬鍧楁暟鎹紝閫犳垚杩欏彴鏈哄櫒鍙戦€佷簡璁稿灏忕殑TCP鎶ユ枃銆傚浜庢暣涓綉缁滅殑鎵ц鏁堢巼鏉ヨ锛屽皬鐨凾CP鎶ユ枃浼氬鍔犵綉缁滄嫢濉炵殑鍙兘锛屽洜姝わ紝濡傛灉鏈夊彲鑳斤紝搴旇灏嗙浉涓寸殑TCP鎶ユ枃鍚堝苟鎴愪竴涓緝澶х殑TCP鎶ユ枃锛堝綋鐒惰繕鏄皬浜嶮SS鐨勶級鍙戦€併€?/span>
Nagle绠楁硶瑕佹眰涓€涓猅CP杩炴帴涓婃渶澶氬彧鑳芥湁涓€涓彂閫佸嚭鍘昏繕娌¤纭鐨勫皬鍒嗙粍锛屽湪璇ュ垎缁勭殑纭鍒拌揪涔嬪墠涓嶈兘鍙戦€佸叾浠栫殑灏忓垎缁勩€?/div>
鍐嶆潵鐪嬬湅tcp_nagle_check鏂规硶锛屽畠涓庝笂涓€涓柟娉曚笉鍚岋紝杩斿洖0琛ㄧず鍙互鍙戦€侊紝杩斿洖闈?鍒欎笉鍙互锛屾濂界浉鍙嶃€?/span>
鏈€鍚庣湅鐪媡cp_minshall_check鍋氫簡浜涗粈涔堬細
鎯宠薄涓€绉嶅満鏅紝褰撳璇锋眰鐨勬椂寤堕潪甯稿湪鎰忎笖缃戠粶鐜闈炲父濂界殑鏃跺€欙紙渚嬪鍚屼竴涓満鎴垮唴锛夛紝Nagle绠楁硶鍙互鍏抽棴锛岃繖瀹炲湪涔熸病蹇呰銆備娇鐢═CP_NODELAY濂楁帴瀛楅€夐」灏卞彲浠ュ叧闂璑agle绠楁硶銆傜湅鐪媠etsockopt鏄€庝箞涓庝笂杩版柟娉曢厤鍚堝伐浣滅殑锛?/span>
鍙互鐪嬪埌锛宯onagle鏍囧織浣嶅氨鏄繖涔堟洿鏀圭殑銆?/span>
鍐呮牳涓槸閫氳繃聽tcp_nagle_test鏂规硶瀹炵幇璇ョ畻娉曠殑銆傛垜浠畝鍗曠殑鐪嬩笅锛?/span>
[cpp]聽view plaincopy
聽
- 聽聽
[cpp]聽view plaincopy
聽
- static聽inline聽int聽tcp_nagle_test(struct聽tcp_sock聽*tp,聽struct聽sk_buff聽*skb,聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽unsigned聽int聽cur_mss,聽int聽nonagle)聽聽
- {聽聽
- 聽聽聽聽//nonagle鏍囧織浣嶈缃簡锛岃繑鍥?琛ㄧず鍏佽杩欎釜鍒嗙粍鍙戦€佸嚭鍘?/span>聽聽
- 聽聽聽聽if聽(nonagle聽&聽TCP_NAGLE_PUSH)聽聽
- 聽聽聽聽聽聽聽聽return聽1;聽聽
- 聽聽
- 聽聽聽聽//濡傛灉杩欎釜鍒嗙粍鍖呭惈浜嗗洓娆℃彙鎵嬪叧闂繛鎺ョ殑FIN鍖咃紝涔熷彲浠ュ彂閫佸嚭鍘?/span>聽聽
- 聽聽聽聽if聽(tp->urg_mode聽||聽聽
- 聽聽聽聽聽聽聽聽(TCP_SKB_CB(skb)->flags聽&聽TCPCB_FLAG_FIN))聽聽
- 聽聽聽聽聽聽聽聽return聽1;聽聽
- 聽聽
- 聽聽聽聽聽聽聽聽//妫€鏌agle绠楁硶聽聽
- 聽聽聽聽if聽(!tcp_nagle_check(tp,聽skb,聽cur_mss,聽nonagle))聽聽
- 聽聽聽聽聽聽聽聽return聽1;聽聽
- 聽聽
- 聽聽聽聽return聽0;聽聽
- }聽聽
鍐嶆潵鐪嬬湅tcp_nagle_check鏂规硶锛屽畠涓庝笂涓€涓柟娉曚笉鍚岋紝杩斿洖0琛ㄧず鍙互鍙戦€侊紝杩斿洖闈?鍒欎笉鍙互锛屾濂界浉鍙嶃€?/span>
[cpp]聽view plaincopy
聽
- static聽inline聽int聽tcp_nagle_check(const聽struct聽tcp_sock聽*tp,聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽const聽struct聽sk_buff聽*skb,聽聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽unsigned聽mss_now,聽int聽nonagle)聽聽
- {聽聽
- 聽聽聽聽聽聽聽聽//鍏堟鏌ユ槸鍚︿负灏忓垎缁勶紝鍗虫姤鏂囬暱搴︽槸鍚﹀皬浜嶮SS聽聽
- 聽聽聽聽return聽(skb->len聽<聽mss_now聽&&聽聽
- 聽聽聽聽聽聽聽聽((nonagle&TCP_NAGLE_CORK)聽||聽聽
- 聽聽聽聽聽聽聽聽//濡傛灉寮€鍚簡Nagle绠楁硶聽聽
- 聽聽聽聽聽聽聽聽聽(!nonagle聽&&聽聽
- 聽聽聽聽聽聽聽聽//鑻ュ凡缁忔湁灏忓垎缁勫彂鍑猴紙packets_out琛ㄧず鈥滈琛屸€濅腑鐨勫垎缁勶級杩樻病鏈夌‘璁?/span>聽聽
- 聽聽聽聽聽聽聽聽聽聽tp->packets_out聽&&聽聽
- 聽聽聽聽聽聽聽聽聽聽tcp_minshall_check(tp))));聽聽
- }聽聽
鏈€鍚庣湅鐪媡cp_minshall_check鍋氫簡浜涗粈涔堬細
[cpp]聽view plaincopy
聽
- static聽inline聽int聽tcp_minshall_check(const聽struct聽tcp_sock聽*tp)聽聽
- {聽聽
- 聽聽聽聽聽聽聽聽//鏈€鍚庝竴娆″彂閫佺殑灏忓垎缁勮繕娌℃湁琚‘璁?/span>聽聽
- 聽聽聽聽return聽after(tp->snd_sml,tp->snd_una)聽&&聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽//灏嗚鍙戦€佺殑搴忓彿鏄澶т簬绛変簬涓婃鍙戦€佸垎缁勫搴旂殑搴忓彿聽聽
- 聽聽聽聽聽聽聽聽!after(tp->snd_sml,聽tp->snd_nxt);聽聽
- }聽聽
鎯宠薄涓€绉嶅満鏅紝褰撳璇锋眰鐨勬椂寤堕潪甯稿湪鎰忎笖缃戠粶鐜闈炲父濂界殑鏃跺€欙紙渚嬪鍚屼竴涓満鎴垮唴锛夛紝Nagle绠楁硶鍙互鍏抽棴锛岃繖瀹炲湪涔熸病蹇呰銆備娇鐢═CP_NODELAY濂楁帴瀛楅€夐」灏卞彲浠ュ叧闂璑agle绠楁硶銆傜湅鐪媠etsockopt鏄€庝箞涓庝笂杩版柟娉曢厤鍚堝伐浣滅殑锛?/span>
[cpp]聽view plaincopy
聽
- static聽int聽do_tcp_setsockopt(struct聽sock聽*sk,聽int聽level,聽聽
- 聽聽聽聽聽聽聽聽int聽optname,聽char聽__user聽*optval,聽int聽optlen)聽聽
- 聽聽聽聽聽聽聽聽...聽聽
- 聽聽聽聽switch聽(optname)聽{聽聽
- 聽聽聽聽聽聽聽聽...聽聽
- 聽聽聽聽case聽TCP_NODELAY:聽聽
- 聽聽聽聽聽聽聽聽if聽(val)聽{聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽聽//濡傛灉璁剧疆浜員CP_NODELAY锛屽垯鏇存柊nonagle鏍囧織聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽tp->nonagle聽|=聽TCP_NAGLE_OFF|TCP_NAGLE_PUSH;聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽tcp_push_pending_frames(sk,聽tp);聽聽
- 聽聽聽聽聽聽聽聽}聽else聽{聽聽
- 聽聽聽聽聽聽聽聽聽聽聽聽tp->nonagle聽&=聽~TCP_NAGLE_OFF;聽聽
- 聽聽聽聽聽聽聽聽}聽聽
- 聽聽聽聽聽聽聽聽break;聽聽
- 聽聽聽聽聽聽聽聽}聽聽
- }聽聽
鍙互鐪嬪埌锛宯onagle鏍囧織浣嶅氨鏄繖涔堟洿鏀圭殑銆?/span>
聽
聽
褰撶劧锛岃皟鐢ㄤ簡IP灞傜殑鏂规硶杩斿洖鍚庯紝涔熸湭蹇呭氨淇濊瘉姝ゆ椂鏁版嵁涓€瀹氬彂閫佸埌缃戠粶涓幓浜嗐€?/span>
涓嬩竴绡囨垜浠帰璁ㄥ浣曟帴鏀禩CP娑堟伅锛屼互鍙婃帴鏀跺埌ack鍚庡唴鏍稿仛浜嗕簺浠€涔堛€?/span>
文章评论
相关解决方案