Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Modeler   Code  
»áÔ±   
 
   
 
 
     
   
 ¶©ÔÄ
  ¾èÖú
TCP µÄÄÇЩʶù£¨Ï£©
 
»ðÁú¹ûÈí¼þ    ·¢²¼ÓÚ 2014-07-07
  2191  次浏览      31

ÕâÆªÎÄÕÂÊÇÏÂÆª£¬ËùÒÔÈç¹ûÄã¶ÔTCP²»ÊìϤµÄ»°£¬»¹ÇëÄãÏÈ¿´¿´ÉÏÆª¡¶TCPµÄÄÇЩʶù£¨ÉÏ£©¡· ÉÏÆªÖУ¬ÎÒÃǽéÉÜÁËTCPµÄЭÒéÍ·¡¢×´Ì¬»ú¡¢Êý¾ÝÖØ´«ÖеĶ«Î÷¡£µ«ÊÇTCPÒª½â¾öÒ»¸öºÜ´óµÄÊ£¬ÄǾÍÊÇÒªÔÚÒ»¸öÍøÂç¸ù¾Ý²»Í¬µÄÇé¿öÀ´¶¯Ì¬µ÷Õû×Ô¼ºµÄ·¢°üµÄËÙ¶È£¬Ð¡ÔòÈÃ×Ô¼ºµÄÁ¬½Ó¸üÎȶ¨£¬´óÔòÈÃÕû¸öÍøÂç¸üÎȶ¨¡£ÔÚÄãÔĶÁÏÂÆªÖ®Ç°£¬ÄãÐèÒª×öºÃ×¼±¸£¬±¾ÆªÎÄÕÂÓкÃЩËã·¨ºÍ²ßÂÔ£¬¿ÉÄÜ»áÒý·¢ÄãµÄ¸÷ÖÖ˼¿¼£¬ÈÃÄãµÄ´óÄÔ·ÖÅäºÜ¶àÄÚ´æºÍ¼ÆËã×ÊÔ´£¬ËùÒÔ£¬²»ÊʺÏÔÚ²ÞËùÖÐÔĶÁ¡£

TCPµÄRTTËã·¨

´ÓÇ°ÃæµÄTCPÖØ´«»úÖÆÎÒÃÇÖªµÀTimeoutµÄÉèÖöÔÓÚÖØ´«·Ç³£ÖØÒª¡£

1.É賤ÁË£¬ÖØ·¢¾ÍÂý£¬¶ªÁËÀϰëÌì²ÅÖØ·¢£¬Ã»ÓÐЧÂÊ£¬ÐÔÄܲ

2.Éè¶ÌÁË£¬»áµ¼Ö¿ÉÄܲ¢Ã»Óжª¾ÍÖØ·¢¡£ÓÚÊÇÖØ·¢µÄ¾Í¿ì£¬»áÔö¼ÓÍøÂçÓµÈû£¬µ¼Ö¸ü¶àµÄ³¬Ê±£¬¸ü¶àµÄ³¬Ê±µ¼Ö¸ü¶àµÄÖØ·¢¡£

¶øÇÒ£¬Õâ¸ö³¬Ê±Ê±¼äÔÚ²»Í¬µÄÍøÂçµÄÇé¿öÏ£¬¸ù±¾Ã»Óа취ÉèÖÃÒ»¸öËÀµÄÖµ¡£Ö»Äܶ¯Ì¬µØÉèÖᣠΪÁ˶¯Ì¬µØÉèÖã¬TCPÒýÈëÁËRTT¡ª¡ªRound Trip Time£¬Ò²¾ÍÊÇÒ»¸öÊý¾Ý°ü´Ó·¢³öÈ¥µ½»ØÀ´µÄʱ¼ä¡£ÕâÑù·¢ËͶ˾ʹóÔ¼ÖªµÀÐèÒª¶àÉÙµÄʱ¼ä£¬´Ó¶ø¿ÉÒÔ·½±ãµØÉèÖÃTimeout¡ª¡ªRTO£¨Retransmission TimeOut£©£¬ÒÔÈÃÎÒÃǵÄÖØ´«»úÖÆ¸ü¸ßЧ¡£ ÌýÆðÀ´ËƺõºÜ¼òµ¥£¬ºÃÏñ¾ÍÊÇÔÚ·¢ËͶ˷¢°üʱ¼ÇÏÂt0£¬È»ºó½ÓÊÕ¶ËÔÙ°ÑÕâ¸öack»ØÀ´Ê±ÔÙ¼ÇÒ»¸öt1£¬ÓÚÊÇRTT = t1 ¨C t0¡£Ã»ÄÇô¼òµ¥£¬ÕâÖ»ÊÇÒ»¸ö²ÉÑù£¬²»ÄÜ´ú±íÆÕ±éÇé¿ö¡£

¾­µäËã·¨

RFC793 Öж¨ÒåµÄ¾­µäËã·¨ÊÇÕâÑùµÄ£º

1£©Ê×ÏÈ£¬ÏȲÉÑùRTT£¬¼ÇÏÂ×î½üºÃ¼¸´ÎµÄRTTÖµ¡£

2£©È»ºó×öƽ»¬¼ÆËãSRTT£¨ Smoothed RTT£©¡£¹«Ê½Îª£º£¨ÆäÖÐµÄ ¦Á ȡֵÔÚ0.8 µ½ 0.9Ö®¼ä£¬Õâ¸öËã·¨Ó¢ÎĽÐExponential weighted moving average£¬ÖÐÎĽУº¼ÓÈ¨ÒÆ¶¯Æ½¾ù£©

SRTT = ( ¦Á * SRTT ) + ((1- ¦Á) * RTT)

3£©¿ªÊ¼¼ÆËãRTO¡£¹«Ê½ÈçÏ£º

RTO = min [ UBOUND, max [ LBOUND, (¦Â * SRTT) ] ]

ÆäÖУº

1.UBOUNDÊÇ×î´óµÄtimeoutʱ¼ä£¬ÉÏÏÞÖµ

2.LBOUNDÊÇ×îСµÄtimeoutʱ¼ä£¬ÏÂÏÞÖµ

3.¦Â ÖµÒ»°ãÔÚ1.3µ½2.0Ö®¼ä¡£

Karn / Partridge Ëã·¨

µ«ÊÇÉÏÃæµÄÕâ¸öËã·¨ÔÚÖØ´«µÄʱºò»á³öÓÐÒ»¸öÖÕ¼«ÎÊÌ⡪¡ªÄãÊÇÓõÚÒ»´Î·¢Êý¾ÝµÄʱ¼äºÍack»ØÀ´µÄʱ¼ä×öRTTÑù±¾Öµ£¬»¹ÊÇÓÃÖØ´«µÄʱ¼äºÍACK»ØÀ´µÄʱ¼ä×öRTTÑù±¾Öµ£¿

Õâ¸öÎÊÌâÎÞÂÛÄãÑ¡ÄÇÍ·¶¼Êǰ´Ïºù«ÆðÁËÆ°¡£ ÈçÏÂͼËùʾ£º

1.Çé¿ö£¨a£©ÊÇackû»ØÀ´£¬ËùÒÔÖØ´«¡£Èç¹ûÄã¼ÆËãµÚÒ»´Î·¢ËͺÍACKµÄʱ¼ä£¬ÄÇô£¬Ã÷ÏÔËã´óÁË¡£

2.Çé¿ö£¨b£©ÊÇack»ØÀ´ÂýÁË£¬µ«Êǵ¼ÖÂÁËÖØ´«£¬µ«¸ÕÖØ´«²»Ò»»á¶ù£¬Ö®Ç°ACK¾Í»ØÀ´ÁË¡£Èç¹ûÄãÊÇËãÖØ´«µÄʱ¼äºÍACK»ØÀ´µÄʱ¼äµÄ²î£¬¾Í»áËã¶ÌÁË¡£

ËùÒÔ1987ÄêµÄʱºò£¬¸ãÁËÒ»¸ö½ÐKarn / Partridge Algorithm£¬Õâ¸öËã·¨µÄ×î´óÌØµãÊÇ¡ª¡ªºöÂÔÖØ´«£¬²»°ÑÖØ´«µÄRTT×ö²ÉÑù£¨Äã¿´£¬Äã²»ÐèҪȥ½â¾ö²»´æÔÚµÄÎÊÌ⣩¡£

µ«ÊÇ£¬ÕâÑùÒ»À´£¬ÓÖ»áÒý·¢Ò»¸ö´óBUG¡ª¡ªÈç¹ûÔÚijһʱ¼ä£¬ÍøÂçÉÁ¶¯£¬Í»È»±äÂýÁË£¬²úÉúÁ˱ȽϴóµÄÑÓʱ£¬Õâ¸öÑÓʱµ¼ÖÂÒªÖØ×ªËùÓеİü£¨ÒòΪ֮ǰµÄRTOºÜС£©£¬ÓÚÊÇ£¬ÒòÎªÖØ×ªµÄ²»Ë㣬ËùÒÔ£¬RTO¾Í²»»á±»¸üУ¬ÕâÊÇÒ»¸öÔÖÄÑ¡£ ÓÚÊÇKarnËã·¨ÓÃÁËÒ»¸öÈ¡Çɵķ½Ê½¡ª¡ªÖ»ÒªÒ»·¢ÉúÖØ´«£¬¾Í¶ÔÏÖÓеÄRTOÖµ·­±¶£¨Õâ¾ÍÊÇËùνµÄ Exponential backoff£©£¬ºÜÃ÷ÏÔ£¬ÕâÖÖËÀ¹æ¾Ø¶ÔÓÚÒ»¸öÐèÒª¹À¼Æ±È½Ï׼ȷµÄRTTÒ²²»¿¿Æ×¡£

Jacobson / Karels Ëã·¨

Ç°ÃæÁ½ÖÖËã·¨ÓõͼÊÇ¡°¼ÓÈ¨ÒÆ¶¯Æ½¾ù¡±£¬ÕâÖÖ·½·¨×î´óµÄ벡¾ÍÊÇÈç¹ûRTTÓÐÒ»¸ö´óµÄ²¨¶¯µÄ»°£¬ºÜÄѱ»·¢ÏÖ£¬ÒòΪ±»Æ½»¬µôÁË¡£ËùÒÔ£¬1988Ä꣬ÓÖÓÐÈËÍÆ³öÀ´ÁËÒ»¸öеÄËã·¨£¬Õâ¸öËã·¨½ÐJacobson / Karels Algorithm£¨²Î¿´RFC6289£©¡£Õâ¸öËã·¨ÒýÈëÁË×îеÄRTTµÄ²ÉÑùºÍƽ»¬¹ýµÄSRTTµÄ²î¾à×öÒò×ÓÀ´¼ÆËã¡£ ¹«Ê½ÈçÏ£º£¨ÆäÖеÄDevRTTÊÇDeviation RTTµÄÒâ˼£©

SRTT = SRTT + ¦Á (RTT ¨C SRTT) ¡ª¡ª ¼ÆËãÆ½»¬RTT

DevRTT = (1-¦Â)*DevRTT + ¦Â*(|RTT-SRTT|) ¡ª¡ª¼ÆËãÆ½»¬RTTºÍÕæÊµµÄ²î¾à£¨¼ÓÈ¨ÒÆ¶¯Æ½¾ù£©

RTO= ¦Ì * SRTT + ? *DevRTT ¡ª¡ª ÉñÒ»ÑùµÄ¹«Ê½

£¨ÆäÖУºÔÚLinuxÏ£¬¦Á = 0.125£¬¦Â = 0.25£¬ ¦Ì = 1£¬? = 4 ¡ª¡ªÕâ¾ÍÊÇËã·¨Öеġ°µ÷µÃÒ»ÊֺòÎÊý¡±£¬nobody knows why, it just works¡­£© ×îºóµÄÕâ¸öËã·¨ÔÚ±»ÓÃÔÚ½ñÌìµÄTCPЭÒéÖУ¨LinuxµÄÔ´´úÂëÔÚ£ºtcp_rtt_estimator£©¡£

TCP»¬¶¯´°¿Ú

ÐèҪ˵Ã÷һϣ¬Èç¹ûÄã²»Á˽âTCPµÄ»¬¶¯´°¿ÚÕâ¸öÊ£¬ÄãµÈÓÚ²»Á˽âTCPЭÒé¡£ÎÒÃǶ¼ÖªµÀ£¬TCP±ØÐèÒª½â¾öµÄ¿É¿¿´«ÊäÒÔ¼°°üÂÒÐò£¨reordering£©µÄÎÊÌ⣬ËùÒÔ£¬TCP±ØÐèÒªÖªµÀÍøÂçʵ¼ÊµÄÊý¾Ý´¦Àí´ø¿í»òÊÇÊý¾Ý´¦ÀíËÙ¶È£¬ÕâÑù²Å²»»áÒýÆðÍøÂçÓµÈû£¬µ¼Ö¶ª°ü¡£

ËùÒÔ£¬TCPÒýÈëÁËһЩ¼¼ÊõºÍÉè¼ÆÀ´×öÍøÂçÁ÷¿Ø£¬Sliding WindowÊÇÆäÖÐÒ»¸ö¼¼Êõ¡£ Ç°ÃæÎÒÃÇ˵¹ý£¬TCPÍ·ÀïÓÐÒ»¸ö×ֶνÐWindow£¬ÓÖ½ÐAdvertised-Window£¬Õâ¸ö×Ö¶ÎÊǽÓÊն˸æËß·¢ËͶË×Ô¼º»¹ÓжàÉÙ»º³åÇø¿ÉÒÔ½ÓÊÕÊý¾Ý¡£ÓÚÊÇ·¢ËͶ˾ͿÉÒÔ¸ù¾ÝÕâ¸ö½ÓÊն˵Ĵ¦ÀíÄÜÁ¦À´·¢ËÍÊý¾Ý£¬¶ø²»»áµ¼Ö½ÓÊÕ¶Ë´¦Àí²»¹ýÀ´¡£ ΪÁË˵Ã÷»¬¶¯´°¿Ú£¬ÎÒÃÇÐèÒªÏÈ¿´Ò»ÏÂTCP»º³åÇøµÄһЩÊý¾Ý½á¹¹£º

ÉÏͼÖУ¬ÎÒÃÇ¿ÉÒÔ¿´µ½£º

1.½ÓÊÕ¶ËLastByteReadÖ¸ÏòÁËTCP»º³åÇøÖжÁµ½µÄλÖã¬NextByteExpectedÖ¸ÏòµÄµØ·½ÊÇÊÕµ½µÄÁ¬Ðø°üµÄ×îºóÒ»¸öλÖã¬LastByteRcvedÖ¸ÏòµÄÊÇÊÕµ½µÄ°üµÄ×îºóÒ»¸öλÖã¬ÎÒÃÇ¿ÉÒÔ¿´µ½ÖмäÓÐЩÊý¾Ý»¹Ã»Óе½´ï£¬ËùÒÔÓÐÊý¾Ý¿Õ°×Çø¡£

2.·¢ËͶ˵ÄLastByteAckedÖ¸ÏòÁ˱»½ÓÊÕ¶ËAck¹ýµÄλÖ㨱íʾ³É¹¦·¢ËÍÈ·ÈÏ£©£¬LastByteSent±íʾ·¢³öÈ¥ÁË£¬µ«»¹Ã»ÓÐÊÕµ½³É¹¦È·ÈϵÄAck£¬LastByteWrittenÖ¸ÏòµÄÊÇÉϲãÓ¦ÓÃÕýÔÚдµÄµØ·½¡£

ÓÚÊÇ£º

1.½ÓÊÕ¶ËÔÚ¸ø·¢ËͶ˻ØACKÖлá»ã±¨×Ô¼ºµÄAdvertisedWindow = MaxRcvBuffer ¨C LastByteRcvd ¨C 1;

2.¶ø·¢ËÍ·½»á¸ù¾ÝÕâ¸ö´°¿ÚÀ´¿ØÖÆ·¢ËÍÊý¾ÝµÄ´óС£¬ÒÔ±£Ö¤½ÓÊÕ·½¿ÉÒÔ´¦Àí¡£

ÏÂÃæÎÒÃÇÀ´¿´Ò»Ï·¢ËÍ·½µÄ»¬¶¯´°¿ÚʾÒâͼ£º

ÉÏͼÖзֳÉÁËËĸö²¿·Ö£¬·Ö±ðÊÇ£º£¨ÆäÖÐÄǸöºÚÄ£Ð;ÍÊÇ»¬¶¯´°¿Ú£©

1¡¢#1ÒÑÊÕµ½ackÈ·ÈϵÄÊý¾Ý¡£

2¡¢#2·¢»¹Ã»ÊÕµ½ackµÄ¡£

3¡¢#3ÔÚ´°¿ÚÖл¹Ã»Óз¢³öµÄ£¨½ÓÊÕ·½»¹Óпռ䣩¡£

4¡¢#4´°¿ÚÒÔÍâµÄÊý¾Ý£¨½ÓÊÕ·½Ã»¿Õ¼ä£©

ÏÂÃæÊǸö»¬¶¯ºóµÄʾÒâͼ£¨ÊÕµ½36µÄack£¬²¢·¢³öÁË46-51µÄ×Ö½Ú£©£º

ÏÂÃæÎÒÃÇÀ´¿´Ò»¸ö½ÓÊܶ˿ØÖÆ·¢ËͶ˵Äͼʾ£º

Zero Window

ÉÏͼ£¬ÎÒÃÇ¿ÉÒÔ¿´µ½Ò»¸ö´¦Àí»ºÂýµÄServer£¨½ÓÊÕ¶Ë£©ÊÇÔõô°ÑClient£¨·¢ËͶˣ©µÄTCP Sliding Window¸ø½µ³É0µÄ¡£´Ëʱ£¬ÄãÒ»¶¨»áÎÊ£¬Èç¹ûWindow±ä³É0ÁË£¬TCP»áÔõôÑù£¿ÊDz»ÊÇ·¢ËͶ˾Ͳ»·¢Êý¾ÝÁË£¿Êǵ쬷¢ËͶ˾Ͳ»·¢Êý¾ÝÁË£¬Äã¿ÉÒÔÏëÏñ³É¡°Window Closed¡±£¬ÄÇÄãÒ»¶¨»¹»áÎÊ£¬Èç¹û·¢ËͶ˲»·¢Êý¾ÝÁË£¬½ÓÊÕ·½Ò»»á¶ùWindow size ¿ÉÓÃÁË£¬Ôõô֪ͨ·¢ËͶËÄØ£¿

½â¾öÕâ¸öÎÊÌ⣬TCPʹÓÃÁËZero Window Probe¼¼Êõ£¬ËõдΪZWP£¬Ò²¾ÍÊÇ˵£¬·¢ËͶËÔÚ´°¿Ú±ä³É0ºó£¬»á·¢ZWPµÄ°ü¸ø½ÓÊÕ·½£¬ÈýÓÊÕ·½À´ackËûµÄWindow³ß´ç£¬Ò»°ãÕâ¸öÖµ»áÉèÖóÉ3´Î£¬µÚ´Î´óÔ¼30-60Ã루²»Í¬µÄʵÏÖ¿ÉÄܻ᲻һÑù£©¡£Èç¹û3´Î¹ýºó»¹ÊÇ0µÄ»°£¬ÓеÄTCPʵÏ־ͻᷢRST°ÑÁ´½Ó¶ÏÁË¡£

×¢Ò⣺ֻҪÓеȴýµÄµØ·½¶¼¿ÉÄܳöÏÖDDoS¹¥»÷£¬Zero WindowÒ²²»ÀýÍ⣬һЩ¹¥»÷Õß»áÔÚºÍHTTP½¨ºÃÁ´·¢ÍêGETÇëÇóºó£¬¾Í°ÑWindowÉèÖÃΪ0£¬È»ºó·þÎñ¶Ë¾ÍÖ»Äܵȴý½øÐÐZWP£¬ÓÚÊǹ¥»÷Õ߻Ტ·¢´óÁ¿µÄÕâÑùµÄÇëÇ󣬰ѷþÎñÆ÷¶ËµÄ×ÊÔ´ºÄ¾¡¡££¨¹ØÓÚÕâ·½ÃæµÄ¹¥»÷£¬´ó¼Ò¿ÉÒÔÒÆ²½¿´Ò»ÏÂWikipediaµÄSockStress´ÊÌõ£©

ÁíÍ⣬WiresharkÖУ¬Äã¿ÉÒÔʹÓÃtcp.analysis.zero_windowÀ´¹ýÂ˰ü£¬È»ºóʹÓÃÓÒ¼ü²Ëµ¥ÀïµÄfollow TCP stream£¬Äã¿ÉÒÔ¿´µ½ZeroWindowProbe¼°ZeroWindowProbeAckµÄ°ü¡£

Silly Window Syndrome

Silly Window Syndrome·­Òë³ÉÖÐÎľÍÊÇ¡°ºýÍ¿´°¿Ú×ÛºÏÖ¢¡±¡£ÕýÈçÄãÉÏÃæ¿´µ½µÄÒ»Ñù£¬Èç¹ûÎÒÃǵĽÓÊÕ·½Ì«Ã¦ÁË£¬À´²»¼°È¡×ßReceive WindowsÀïµÄÊý¾Ý£¬ÄÇô£¬¾Í»áµ¼Ö·¢ËÍ·½Ô½À´Ô½Ð¡¡£µ½×îºó£¬Èç¹û½ÓÊÕ·½ÌÚ³ö¼¸¸ö×Ö½Ú²¢¸æËß·¢ËÍ·½ÏÖÔÚÓм¸¸ö×Ö½ÚµÄwindow£¬¶øÎÒÃǵķ¢ËÍ·½»áÒåÎÞ·´¹ËµØ·¢ËÍÕ⼸¸ö×Ö½Ú¡£

ÒªÖªµÀ£¬ÎÒÃǵÄTCP+IPÍ·ÓÐ40¸ö×Ö½Ú£¬ÎªÁ˼¸¸ö×Ö½Ú£¬Òª´ïÉÏÕâô´óµÄ¿ªÏú£¬ÕâÌ«²»¾­¼ÃÁË¡£

ÁíÍ⣬ÄãÐèÒªÖªµÀÍøÂçÉÏÓиöMTU£¬¶ÔÓÚÒÔÌ«ÍøÀ´Ëµ£¬MTUÊÇ1500×Ö½Ú£¬³ýÈ¥TCP+IPÍ·µÄ40¸ö×Ö½Ú£¬ÕæÕýµÄÊý¾Ý´«Êä¿ÉÒÔÓÐ1460£¬Õâ¾ÍÊÇËùνµÄMSS£¨Max Segment Size£©×¢Ò⣬TCPµÄRFC¶¨ÒåÕâ¸öMSSµÄĬÈÏÖµÊÇ536£¬ÕâÊÇÒòΪ RFC 791Àï˵ÁËÈκÎÒ»¸öIPÉ豸¶¼µÃ×îÉÙ½ÓÊÕ576³ß´çµÄ´óС£¨Êµ¼ÊÉÏÀ´Ëµ576ÊDz¦ºÅµÄÍøÂçµÄMTU£¬¶ø576¼õÈ¥IPÍ·µÄ20¸ö×Ö½Ú¾ÍÊÇ536£©¡£

Èç¹ûÄãµÄÍøÂç°ü¿ÉÒÔÈûÂúMTU£¬ÄÇôÄã¿ÉÒÔÓÃÂúÕû¸ö´ø¿í£¬Èç¹û²»ÄÜ£¬ÄÇôÄã¾Í»áÀË·Ñ´ø¿í¡££¨´óÓÚMTUµÄ°üÓÐÁ½ÖÖ½á¾Ö£¬Ò»ÖÖÊÇÖ±½Ó±»¶ªÁË£¬ÁíÒ»ÖÖÊÇ»á±»ÖØÐ·ֿé´ò°ü·¢ËÍ£© Äã¿ÉÒÔÏëÏñ³ÉÒ»¸öMTU¾ÍÏ൱ÓÚÒ»¸ö·É»úµÄ×î¶à¿ÉÒÔ×°µÄÈË£¬Èç¹ûÕâ·É»úÀïÂúÔØµÄ»°£¬´ø¿í×î¸ß£¬Èç¹ûÒ»¸ö·É»úÖ»ÔËÒ»¸öÈ˵ϰ£¬ÎÞÒɳɱ¾Ôö¼ÓÁË£¬Ò²¶øÏ൱¶þ¡£

ËùÒÔ£¬Silly Windows SyndromeÕâ¸öÏÖÏñ¾ÍÏñÊÇÄã±¾À´¿ÉÒÔ×ø200È˵ķɻúÀïÖ»×öÁËÒ»Á½¸öÈË¡£ Òª½â¾öÕâ¸öÎÊÌâÒ²²»ÄÑ£¬¾ÍÊDZÜÃâ¶ÔСµÄwindow size×ö³öÏìÓ¦£¬Ö±µ½ÓÐ×ã¹»´óµÄwindow sizeÔÙÏìÓ¦£¬Õâ¸ö˼·¿ÉÒÔͬʱʵÏÖÔÚsenderºÍreceiverÁ½¶Ë¡£

Èç¹ûÕâ¸öÎÊÌâÊÇÓÉReceiver¶ËÒýÆðµÄ£¬ÄÇô¾Í»áʹÓà David D Clark¡¯s ·½°¸¡£ÔÚreceiver¶Ë£¬Èç¹ûÊÕµ½µÄÊý¾Ýµ¼ÖÂwindow sizeСÓÚij¸öÖµ£¬¿ÉÒÔÖ±½Óack(0)»Øsender£¬ÕâÑù¾Í°Ñwindow¸ø¹Ø±ÕÁË£¬Ò²×èÖ¹ÁËsenderÔÙ·¢Êý¾Ý¹ýÀ´£¬µÈµ½receiver¶Ë´¦ÀíÁËһЩÊý¾Ýºówindows size ´óÓÚµÈÓÚÁËMSS£¬»òÕߣ¬receiver bufferÓÐÒ»°ëΪ¿Õ£¬¾Í¿ÉÒÔ°Ñwindow´ò¿ªÈÃsend ·¢ËÍÊý¾Ý¹ýÀ´¡£

Èç¹ûÕâ¸öÎÊÌâÊÇÓÉSender¶ËÒýÆðµÄ£¬ÄÇô¾Í»áʹÓÃÖøÃûµÄ Nagle¡¯s algorithm¡£Õâ¸öËã·¨µÄ˼·ҲÊÇÑÓʱ´¦Àí£¬ËûÓÐÁ½¸öÖ÷ÒªµÄÌõ¼þ£¨¸ü¶àµÄÌõ¼þ¿ÉÒÔ¿´Ò»ÏÂtcp_nagle_checkº¯Êý£©£º1£©ÒªµÈµ½ Window Size>=MSS »òÊÇ Data Size >=MSS£¬2£©µÈ´ýʱ¼ä»òÊdz¬Ê±200ms£¬ÕâÁ½¸öÌõ¼þÓÐÒ»¸öÂú×㣬Ëû²Å»á·¢Êý¾Ý£¬·ñÔò¾ÍÊÇÔÚÔÜÊý¾Ý¡£

ÁíÍ⣬NagleË㷨ĬÈÏÊÇ´ò¿ªµÄ£¬ËùÒÔ£¬¶ÔÓÚһЩÐèҪС°ü³¡¾°µÄ³ÌÐò¡ª¡ª±ÈÈçÏñtelnet»òsshÕâÑùµÄ½»»¥ÐԱȽÏÇ¿µÄ³ÌÐò£¬ÄãÐèÒª¹Ø±ÕÕâ¸öËã·¨¡£Äã¿ÉÒÔÔÚSocketÉèÖÃTCP_NODELAYÑ¡ÏîÀ´¹Ø±ÕÕâ¸öËã·¨£¨¹Ø±ÕNagleË㷨ûÓÐÈ«¾Ö²ÎÊý£¬ÐèÒª¸ù¾Ýÿ¸öÓ¦ÓÃ×Ô¼ºµÄÌØµãÀ´¹Ø±Õ£©

setsockopt(sock_fd, IPPROTO_TCP, TCP_NODELAY, (char   *)&value,sizeof(int));

ÁíÍâ£¬ÍøÉÏÓÐЩÎÄÕÂ˵TCP_CORKµÄsocket optionÊÇÒ²¹Ø±ÕNagleËã·¨£¬Õâ¸ö»¹²»¹»×¼È·¡£TCP_CORKÊǽûֹС°ü·¢ËÍ£¬¶øNagleË㷨ûÓнûֹС°ü·¢ËÍ£¬Ö»ÊǽûÖ¹ÁË´óÁ¿µÄС°ü·¢ËÍ¡£×îºÃ²»ÒªÁ½¸öÑ¡Ïî¶¼ÉèÖᣠÀÏʵ˵£¬ÎÒ¾õµÃNagleËã·¨Æäʵֻ¼ÓÁ˸öÑÓʱ£¬Ã»ÓбðµÄʲô£¬ÎÒ¾õµÃ×îºÃ»¹ÊǰÑËû¹Ø±Õ£¬È»ºóÓÉ×Ô¼ºµÄÓ¦ÓòãÀ´¿ØÖÆÊý¾Ý£¬ÎÒ¸ö¾õµÃ²»Ó¦¸Ãʲôʶ¼È¥ÒÀÀµÄÚºËËã·¨¡£

TCPµÄÓµÈû´¦Àí - Congestion Handling

ÉÏÃæÎÒÃÇÖªµÀÁË£¬TCPͨ¹ýSliding WindowÀ´×öÁ÷¿Ø£¨Flow Control£©£¬µ«ÊÇTCP¾õµÃÕ⻹²»¹»£¬ÒòΪSliding WindowÐèÒªÒÀÀµÓÚÁ¬½ÓµÄ·¢ËͶ˺ͽÓÊÕ¶Ë£¬Æä²¢²»ÖªµÀÍøÂçÖм䷢ÉúÁËʲô¡£TCPµÄÉè¼ÆÕß¾õµÃ£¬Ò»¸öΰ´ó¶øÅ£±ÆµÄЭÒé½ö½ö×öµ½Á÷¿Ø²¢²»¹»£¬ÒòΪÁ÷¿ØÖ»ÊÇÍøÂçÄ£ÐÍ4²ãÒÔÉϵÄÊ£¬TCPµÄ»¹Ó¦¸Ã¸ü´ÏÃ÷µØÖªµÀÕû¸öÍøÂçÉϵÄÊ¡£

¾ßÌåÒ»µã£¬ÎÒÃÇÖªµÀTCPͨ¹ýÒ»¸ötimer²ÉÑùÁËRTT²¢¼ÆËãRTO£¬µ«ÊÇ£¬Èç¹ûÍøÂçÉϵÄÑÓʱͻȻÔö¼Ó£¬ÄÇô£¬TCP¶ÔÕâ¸öÊÂ×ö³öµÄÓ¦¶ÔÖ»ÓÐÖØ´«Êý¾Ý£¬µ«ÊÇ£¬ÖØ´«»áµ¼ÖÂÍøÂçµÄ¸ºµ£¸üÖØ£¬ÓÚÊǻᵼÖ¸ü´óµÄÑÓ³ÙÒÔ¼°¸ü¶àµÄ¶ª°ü£¬ÓÚÊÇ£¬Õâ¸öÇé¿ö¾Í»á½øÈë¶ñÐÔÑ­»·±»²»¶ÏµØ·Å´ó¡£ÊÔÏëһϣ¬Èç¹ûÒ»¸öÍøÂçÄÚÓгÉǧÉÏÍòµÄTCPÁ¬½Ó¶¼ÕâôÐÐÊ£¬ÄÇôÂíÉϾͻáÐγɡ°ÍøÂç·ç±©¡±£¬TCPÕâ¸öЭÒé¾Í»áÍÏ¿åÕû¸öÍøÂç¡£ÕâÊÇÒ»¸öÔÖÄÑ¡£

ËùÒÔ£¬TCP²»ÄܺöÂÔÍøÂçÉÏ·¢ÉúµÄÊÂÇ飬¶øÎÞÄÔµØÒ»¸ö¾¢µØÖØ·¢Êý¾Ý£¬¶ÔÍøÂçÔì³É¸ü´óµÄÉ˺¦¡£¶Ô´ËTCPµÄÉè¼ÆÀíÄîÊÇ£ºTCP²»ÊÇÒ»¸ö×Ô˽µÄЭÒ飬µ±ÓµÈû·¢ÉúµÄʱºò£¬Òª×ö×ÔÎÒÎþÉü¡£¾ÍÏñ½»Í¨×èÈûÒ»Ñù£¬Ã¿¸ö³µ¶¼Ó¦¸Ã°Ñ·ÈóöÀ´£¬¶ø²»ÒªÔÙÈ¥ÇÀ·ÁË¡£

¹ØÓÚÓµÈû¿ØÖƵÄÂÛÎÄÇë²Î¿´¡¶Congestion Avoidance and Control¡·(PDF)

ÓµÈû¿ØÖÆÖ÷ÒªÊÇËĸöËã·¨£º1£©ÂýÆô¶¯£¬2£©ÓµÈû±ÜÃ⣬3£©ÓµÈû·¢Éú£¬4£©¿ìËÙ»Ö¸´¡£ÕâËĸöËã·¨²»ÊÇÒ»Ìì¶¼¸ã³öÀ´µÄ£¬Õâ¸öËÄËã·¨µÄ·¢Õ¹¾­ÀúÁ˺ܶàʱ¼ä£¬µ½½ñÌì¶¼»¹ÔÚÓÅ»¯ÖС£ ±¸×¢:

1988Ä꣬TCP-Tahoe Ìá³öÁË1£©ÂýÆô¶¯£¬2£©ÓµÈû±ÜÃ⣬3£©ÓµÈû·¢ÉúʱµÄ¿ìËÙÖØ´«

1990Ä꣬TCP Reno ÔÚTahoeµÄ»ù´¡ÉÏÔö¼ÓÁË4£©¿ìËÙ»Ö¸´

ÂýÈÈÆô¶¯Ëã·¨ ¨C Slow Start

Ê×ÏÈ£¬ÎÒÃÇÀ´¿´Ò»ÏÂTCPµÄÂýÈÈÆô¶¯¡£ÂýÆô¶¯µÄÒâ˼ÊÇ£¬¸Õ¸Õ¼ÓÈëÍøÂçµÄÁ¬½Ó£¬Ò»µãÒ»µãµØÌáËÙ£¬²»ÒªÒ»ÉÏÀ´¾ÍÏñÄÇÐ©ÌØÈ¨³µÒ»Ñù°ÔµÀµØ°Ñ·ռÂú¡£ÐÂͬѧÉϸßËÙ»¹ÊÇÒªÂýÒ»µã£¬²»Òª°ÑÒѾ­ÔÚ¸ßËÙÉϵÄÖÈÐò¸ø¸ãÂÒÁË¡£

ÂýÆô¶¯µÄËã·¨ÈçÏÂ(cwndÈ«³ÆCongestion Window)£º

1£©Á¬½Ó½¨ºÃµÄ¿ªÊ¼Ïȳõʼ»¯cwnd = 1£¬±íÃ÷¿ÉÒÔ´«Ò»¸öMSS´óСµÄÊý¾Ý¡£

2£©Ã¿µ±ÊÕµ½Ò»¸öACK£¬cwnd++; ³ÊÏßÐÔÉÏÉý

3£©Ã¿µ±¹ýÁËÒ»¸öRTT£¬cwnd = cwnd*2; ³ÊÖ¸ÊýÈÃÉý

4£©»¹ÓÐÒ»¸össthresh£¨slow start threshold£©£¬ÊÇÒ»¸öÉÏÏÞ£¬µ±cwnd >= ssthreshʱ£¬¾Í»á½øÈë¡°ÓµÈû±ÜÃâËã·¨¡±£¨ºóÃæ»á˵Õâ¸öËã·¨£©

ËùÒÔ£¬ÎÒÃÇ¿ÉÒÔ¿´µ½£¬Èç¹ûÍøËٺܿìµÄ»°£¬ACKÒ²»á·µ»ØµÃ¿ì£¬RTTÒ²»á¶Ì£¬ÄÇô£¬Õâ¸öÂýÆô¶¯¾ÍÒ»µãÒ²²»Âý¡£ÏÂͼ˵Ã÷ÁËÕâ¸ö¹ý³Ì¡£

ÕâÀÎÒÐèÒªÌáһϵÄÊÇһƪGoogleµÄÂÛÎÄ¡¶An Argument for Increasing TCP¡¯s Initial Congestion Window¡·Linux 3.0ºó²ÉÓÃÁËÕâÆªÂÛÎĵĽ¨Ò顪¡ª°Ñcwnd ³õʼ»¯³ÉÁË 10¸öMSS¡£ ¶øLinux 3.0ÒÔǰ£¬±ÈÈç2.6£¬Linux²ÉÓÃÁËRFC3390£¬cwndÊǸúMSSµÄÖµÀ´±äµÄ£¬Èç¹ûMSS< 1095£¬Ôòcwnd = 4£»Èç¹ûMSS>2190£¬Ôòcwnd=2£»ÆäËüÇé¿öÏ£¬ÔòÊÇ3¡£

ÓµÈû±ÜÃâËã·¨ - Congestion Avoidance

Ç°ÃæËµ¹ý£¬»¹ÓÐÒ»¸össthresh£¨slow start threshold£©£¬ÊÇÒ»¸öÉÏÏÞ£¬µ±cwnd >= ssthreshʱ£¬¾Í»á½øÈë¡°ÓµÈû±ÜÃâËã·¨¡±¡£Ò»°ãÀ´ËµssthreshµÄÖµÊÇ65535£¬µ¥Î»ÊÇ×Ö½Ú£¬µ±cwnd´ïµ½Õâ¸öֵʱºó£¬Ëã·¨ÈçÏ£º

1£©ÊÕµ½Ò»¸öACKʱ£¬cwnd = cwnd + 1/cwnd

2£©µ±Ã¿¹ýÒ»¸öRTTʱ£¬cwnd = cwnd + 1

ÕâÑù¾Í¿ÉÒÔ±ÜÃâÔö³¤¹ý¿ìµ¼ÖÂÍøÂçÓµÈû£¬ÂýÂýµÄÔö¼Óµ÷Õûµ½ÍøÂçµÄ×î¼ÑÖµ¡£ºÜÃ÷ÏÔ£¬ÊÇÒ»¸öÏßÐÔÉÏÉýµÄËã·¨¡£

ÓµÈû״̬ʱµÄËã·¨

Ç°ÃæÎÒÃÇ˵¹ý£¬µ±¶ª°üµÄʱºò£¬»áÓÐÁ½ÖÖÇé¿ö£º

1£©µÈµ½RTO³¬Ê±£¬ÖØ´«Êý¾Ý°ü¡£TCPÈÏΪÕâÖÖÇé¿öÌ«Ôã¸â£¬·´Ó¦Ò²ºÜÇ¿ÁÒ¡£

sshthresh = cwnd /2

cwnd ÖØÖÃΪ 1

½øÈëÂýÆô¶¯¹ý³Ì

2£©Fast RetransmitËã·¨£¬Ò²¾ÍÊÇÔÚÊÕµ½3¸öduplicate ACKʱ¾Í¿ªÆôÖØ´«£¬¶ø²»Óõȵ½RTO³¬Ê±¡£

TCP TahoeµÄʵÏÖºÍRTO³¬Ê±Ò»Ñù¡£

TCP RenoµÄʵÏÖÊÇ£º

cwnd = cwnd /2

sshthresh = cwnd

½øÈë¿ìËÙ»Ö¸´Ëã·¨¡ª¡ªFast Recovery

ÉÏÃæÎÒÃÇ¿ÉÒÔ¿´µ½RTO³¬Ê±ºó£¬sshthresh»á±ä³ÉcwndµÄÒ»°ë£¬ÕâÒâζ×Å£¬Èç¹ûcwnd<=sshthreshʱ³öÏֵĶª°ü£¬ÄÇôTCPµÄsshthresh¾Í»á¼õÁËÒ»°ë£¬È»ºóµÈcwndÓÖºÜ¿ìµØÒÔÖ¸Êý¼¶ÔöÕÇÅÀµ½Õâ¸öµØ·½Ê±£¬¾Í»á³ÉÂýÂýµÄÏßÐÔÔöÕÇ¡£ÎÒÃÇ¿ÉÒÔ¿´µ½£¬TCPÊÇÔõôͨ¹ýÕâÖÖÇ¿ÁÒµØÕðµ´¿ìËÙ¶øÐ¡ÐĵÃÕÒµ½ÍøÕ¾Á÷Á¿µÄƽºâµãµÄ¡£

¿ìËÙ»Ö¸´Ëã·¨ ¨C Fast Recovery

TCP Reno

Õâ¸öËã·¨¶¨ÒåÔÚRFC5681¡£¿ìËÙÖØ´«ºÍ¿ìËÙ»Ö¸´Ëã·¨Ò»°ãͬʱʹÓ᣿ìËÙ»Ö¸´Ëã·¨ÊÇÈÏΪ£¬Ä㻹ÓÐ3¸öDuplicated Acks˵Ã÷ÍøÂçÒ²²»ÄÇôÔã¸â£¬ËùÒÔûÓбØÒªÏñRTO³¬Ê±ÄÇôǿÁÒ¡£ ×¢Ò⣬ÕýÈçÇ°ÃæËù˵£¬½øÈëFast Recovery֮ǰ£¬cwnd ºÍ sshthreshÒѱ»¸üУº

cwnd = cwnd /2

sshthresh = cwnd

È»ºó£¬ÕæÕýµÄFast RecoveryËã·¨ÈçÏ£º

cwnd = sshthresh + 3 * MSS £¨3µÄÒâ˼ÊÇÈ·ÈÏÓÐ3¸öÊý¾Ý°ü±»ÊÕµ½ÁË£©

ÖØ´«Duplicated ACKsÖ¸¶¨µÄÊý¾Ý°ü

Èç¹ûÔÙÊÕµ½ duplicated Acks£¬ÄÇôcwnd = cwnd +1

Èç¹ûÊÕµ½ÁËеÄAck£¬ÄÇô£¬cwnd = sshthresh £¬È»ºó¾Í½øÈëÁËÓµÈû±ÜÃâµÄËã·¨ÁË¡£

Èç¹ûÄã×Ðϸ˼¿¼Ò»ÏÂÉÏÃæµÄÕâ¸öËã·¨£¬Äã¾Í»áÖªµÀ£¬ÉÏÃæÕâ¸öËã·¨Ò²ÓÐÎÊÌ⣬ÄǾÍÊÇ¡ª¡ªËüÒÀÀµÓÚ3¸öÖØ¸´µÄAcks¡£×¢Ò⣬3¸öÖØ¸´µÄAcks²¢²»´ú±íÖ»¶ªÁËÒ»¸öÊý¾Ý°ü£¬ºÜÓпÉÄÜÊǶªÁ˺öà°ü¡£µ«Õâ¸öËã·¨Ö»»áÖØ´«Ò»¸ö£¬¶øÊ£ÏµÄÄÇЩ°üÖ»Äܵȵ½RTO³¬Ê±£¬ÓÚÊÇ£¬½øÈëÁ˶ñÃÎģʽ¡ª¡ª³¬Ê±Ò»¸ö´°¿Ú¾Í¼õ°ëһϣ¬¶à¸ö³¬Ê±»á³¬³ÉTCPµÄ´«ÊäËٶȳʼ¶ÊýϽµ£¬¶øÇÒÒ²²»»á´¥·¢Fast RecoveryËã·¨ÁË¡£

ͨ³£À´Ëµ£¬ÕýÈçÎÒÃÇÇ°ÃæËù˵µÄ£¬SACK»òD-SACKµÄ·½·¨¿ÉÒÔÈÃFast Recovery»òSenderÔÚ×ö¾ö¶¨Ê±¸ü´ÏÃ÷һЩ£¬µ«ÊDz¢²»ÊÇËùÓеÄTCPµÄʵÏÖ¶¼Ö§³ÖSACK£¨SACKÐèÒªÁ½¶Ë¶¼Ö§³Ö£©£¬ËùÒÔ£¬ÐèÒªÒ»¸öûÓÐSACKµÄ½â¾ö·½°¸¡£¶øÍ¨¹ýSACK½øÐÐÓµÈû¿ØÖƵÄËã·¨ÊÇFACK£¨ºóÃæ»á½²£©

TCP New Reno

ÓÚÊÇ£¬1995Ä꣬TCP New Reno£¨²Î¼û RFC 6582 £©Ëã·¨Ìá³öÀ´£¬Ö÷Òª¾ÍÊÇÔÚûÓÐSACKµÄÖ§³ÖϸĽøFast RecoveryËã·¨µÄ¡ª¡ª

µ±senderÕâ±ßÊÕµ½ÁË3¸öDuplicated Acks£¬½øÈëFast Retransimitģʽ£¬¿ª·¢ÖØ´«Öظ´AcksָʾµÄÄǸö°ü¡£Èç¹ûÖ»ÓÐÕâÒ»¸ö°ü¶ªÁË£¬ÄÇô£¬ÖØ´«Õâ¸ö°üºó»ØÀ´µÄAck»á°ÑÕû¸öÒѾ­±»sender´«Êä³öÈ¥µÄÊý¾Ýack»ØÀ´¡£Èç¹ûûÓеϰ£¬ËµÃ÷Óжà¸ö°ü¶ªÁË¡£ÎÒÃǽÐÕâ¸öACKΪPartial ACK¡£

Ò»µ©SenderÕâ±ß·¢ÏÖÁËPartial ACK³öÏÖ£¬ÄÇô£¬sender¾Í¿ÉÒÔÍÆÀí³öÀ´Óжà¸ö°ü±»¶ªÁË£¬ÓÚÊǺõ¼ÌÐøÖØ´«sliding windowÀïδ±»ackµÄµÚÒ»¸ö°ü¡£Ö±µ½ÔÙÒ²ÊÕ²»µ½ÁËPartial Ack£¬²ÅÕæÕý½áÊøFast RecoveryÕâ¸ö¹ý³Ì

ÎÒÃÇ¿ÉÒÔ¿´µ½£¬Õâ¸ö¡°Fast RecoveryµÄ±ä¸ü¡±ÊÇÒ»¸ö·Ç³£¼¤½øµÄÍæ·¨£¬ËûͬʱÑÓ³¤ÁËFast RetransmitºÍFast RecoveryµÄ¹ý³Ì¡£

Ë㷨ʾÒâͼ

ÏÂÃæÎÒÃÇÀ´¿´Ò»¸ö¼òµ¥µÄͼʾÒÔͬʱ¿´Ò»ÏÂÉÏÃæµÄ¸÷ÖÖËã·¨µÄÑù×Ó£º

FACKËã·¨

FACKÈ«³ÆForward Acknowledgment Ëã·¨£¬ÂÛÎĵØÖ·ÔÚÕâÀPDF£©Forward Acknowledgement: Refining TCP Congestion Control Õâ¸öËã·¨ÊÇÆäÓÚSACKµÄ£¬Ç°ÃæÎÒÃÇ˵¹ýSACKÊÇʹÓÃÁËTCPÀ©Õ¹×Ö¶ÎAckÁËÓÐÄÄЩÊý¾ÝÊÕµ½£¬ÄÄЩÊý¾ÝûÓÐÊÕµ½£¬Ëû±ÈFast RetransmitµÄ3 ¸öduplicated acksºÃ´¦ÔÚÓÚ£¬Ç°ÕßÖ»ÖªµÀÓаü¶ªÁË£¬²»ÖªµÀÊÇÒ»¸ö»¹ÊǶà¸ö£¬¶øSACK¿ÉÒÔ׼ȷµÄÖªµÀÓÐÄÄЩ°ü¶ªÁË¡£ ËùÒÔ£¬SACK¿ÉÒÔÈ÷¢ËͶËÕâ±ßÔÚÖØ´«¹ý³ÌÖУ¬°ÑÄÇЩ¶ªµôµÄ°üÖØ´«£¬¶ø²»ÊÇÒ»¸öÒ»¸öµÄ´«£¬µ«ÕâÑùµÄÒ»À´£¬Èç¹ûÖØ´«µÄ°üÊý¾Ý±È½Ï¶àµÄ»°£¬ÓֻᵼÖ±¾À´¾ÍºÜæµÄÍøÂç¾Í¸üæÁË¡£ËùÒÔ£¬FACKÓÃÀ´×öÖØ´«¹ý³ÌÖеÄÓµÈûÁ÷¿Ø¡£

Õâ¸öËã·¨»á°ÑSACKÖÐ×î´óµÄSequence Number ±£´æÔÚsnd.fackÕâ¸ö±äÁ¿ÖУ¬snd.fackµÄ¸üÐÂÓÉack´øÇÈç¹ûÍøÂçÒ»Çа²ºÃÔòºÍsnd.unaÒ»Ñù£¨snd.una¾ÍÊÇ»¹Ã»ÓÐÊÕµ½ackµÄµØ·½£¬Ò²¾ÍÊÇÇ°Ãæsliding windowÀïµÄcategory #2µÄµÚÒ»¸öµØ·½£©

È»ºó¶¨ÒåÒ»¸öawnd = snd.nxt ¨C snd.fack£¨snd.nxtÖ¸Ïò·¢ËͶËsliding windowÖÐÕýÔÚÒª±»·¢Ë͵ĵط½¡ª¡ªÇ°Ãæsliding windowsͼʾµÄcategory#3µÚÒ»¸öλÖã©£¬ÕâÑùawndµÄÒâ˼¾ÍÊÇÔÚÍøÂçÉϵÄÊý¾Ý¡££¨ËùνawndÒâΪ£ºactual quantity of data outstanding in the network£©

Èç¹ûÐèÒªÖØ´«Êý¾Ý£¬ÄÇô£¬awnd = snd.nxt ¨C snd.fack + retran_data£¬Ò²¾ÍÊÇ˵£¬awndÊÇ´«³öÈ¥µÄÊý¾Ý + ÖØ´«µÄÊý¾Ý¡£

È»ºó´¥·¢Fast Recovery µÄÌõ¼þÊÇ£º ( ( snd.fack ¨C snd.una ) > (3*MSS) ) || (dupacks == 3) ) ¡£ÕâÑùÒ»À´£¬¾Í²»ÐèÒªµÈµ½3¸öduplicated acks²ÅÖØ´«£¬¶øÊÇÖ»ÒªsackÖеÄ×î´óµÄÒ»¸öÊý¾ÝºÍackµÄÊý¾Ý±È½Ï³¤ÁË£¨3¸öMSS£©£¬ÄǾʹ¥·¢ÖØ´«¡£ÔÚÕû¸öÖØ´«¹ý³ÌÖÐcwnd²»±ä¡£Ö±µ½µ±µÚÒ»´Î¶ª°üµÄsnd.nxt<=snd.una£¨Ò²¾ÍÊÇÖØ´«µÄÊý¾Ý¶¼±»È·ÈÏÁË£©£¬È»ºó½øÀ´ÓµÈû±ÜÃâ»úÖÆ¡ª¡ªcwndÏßÐÔÉÏÕÇ¡£

ÎÒÃÇ¿ÉÒÔ¿´µ½Èç¹ûûÓÐFACKÔÚ£¬ÄÇôÔÚ¶ª°ü±È½Ï¶àµÄÇé¿öÏ£¬Ô­À´±£ÊصÄËã·¨»áµÍ¹ÀÁËÐèҪʹÓõÄwindowµÄ´óС£¬¶øÐèÒª¼¸¸öRTTµÄʱ¼ä²Å»áÍê³É»Ö¸´£¬¶øFACK»á±È½Ï¼¤½øµØÀ´¸ÉÕâÊ¡£ µ«ÊÇ£¬FACKÈç¹ûÔÚÒ»¸öÍøÂç°ü»á±» reorderingµÄÍøÂçÀï»áÓкܴóµÄÎÊÌâ¡£

ÆäËüÓµÈû¿ØÖÆËã·¨¼ò½é

TCP Vegas ÓµÈû¿ØÖÆËã·¨

Õâ¸öËã·¨1994Äê±»Ìá³ö£¬ËüÖ÷Òª¶ÔTCP Reno ×öÁËЩÐ޸ġ£Õâ¸öË㷨ͨ¹ý¶ÔRTTµÄ·Ç³£ÖØµÄ¼à¿ØÀ´¼ÆËãÒ»¸ö»ù×¼RTT¡£È»ºóͨ¹ýÕâ¸ö»ù×¼RTTÀ´¹À¼Æµ±Ç°µÄÍøÂçʵ¼Ê´ø¿í£¬Èç¹ûʵ¼Ê´ø¿í±ÈÎÒÃÇµÄÆÚÍûµÄ´ø¿íҪС»òÊÇÒª¶àµÄ»î£¬ÄÇô¾Í¿ªÊ¼ÏßÐԵؼõÉÙ»òÔö¼ÓcwndµÄ´óС¡£Èç¹ûÕâ¸ö¼ÆËã³öÀ´µÄRTT´óÓÚÁËTimeoutºó£¬ÄÇô£¬²»µÈack³¬Ê±¾ÍÖ±½ÓÖØ´«¡££¨Vegas µÄºËÐÄ˼ÏëÊÇÓÃRTTµÄÖµÀ´Ó°ÏìÓµÈû´°¿Ú£¬¶ø²»ÊÇͨ¹ý¶ª°ü£© Õâ¸öËã·¨µÄÂÛÎÄÊÇ¡¶TCP Vegas: End to End Congestion Avoidance on a Global Internet¡·ÕâÆªÂÛÎĸøÁËVegasºÍ New RenoµÄ¶Ô±È£º

¹ØÓÚÕâ¸öË㷨ʵÏÖ£¬Äã¿ÉÒԲο´LinuxÔ´Â룺/net/ipv4/tcp_vegas.h£¬ /net/ipv4/tcp_vegas.c

HSTCP(High Speed TCP) Ëã·¨

Õâ¸öËã·¨À´×ÔRFC 3649£¨Wikipedia´ÊÌõ£©¡£Æä¶Ô×î»ù´¡µÄËã·¨½øÐÐÁ˸ü¸Ä£¬ËûʹµÃCongestion WindowÕǵÿ죬¼õµÃÂý¡£ÆäÖУº

ÓµÈû±ÜÃâʱµÄ´°¿ÚÔö³¤·½Ê½£º cwnd = cwnd + ¦Á(cwnd) / cwnd

¶ª°üºó´°¿ÚϽµ·½Ê½£ºcwnd = (1- ¦Â(cwnd))*cwnd

×¢£º¦Á(cwnd)ºÍ¦Â(cwnd)¶¼ÊǺ¯Êý£¬Èç¹ûÄãÒªÈÃËûÃǺͱê×¼µÄTCPÒ»Ñù£¬ÄÇôÈæÁ(cwnd)=1£¬¦Â(cwnd)=0.5¾Í¿ÉÒÔÁË¡£ ¶ÔÓÚ¦Á(cwnd)ºÍ¦Â(cwnd)µÄÖµÊǸö¶¯Ì¬µÄ±ä»»µÄ¶«Î÷¡£ ¹ØÓÚÕâ¸öËã·¨µÄʵÏÖ£¬Äã¿ÉÒԲο´LinuxÔ´Â룺/net/ipv4/tcp_highspeed.c

TCP BIC Ëã·¨

2004Ä꣬²úÄÚ³öBICËã·¨¡£ÏÖÔÚÄ㻹¿ÉÒÔ²éµÃµ½Ïà¹ØµÄÐÂÎÅ¡¶Google£ºÃÀ¿ÆÑ§¼ÒÑз¢BIC-TCPЭÒé ËÙ¶ÈÊÇDSLÁùǧ±¶¡· BICÈ«³ÆBinary Increase Congestion control£¬ÔÚLinux 2.6.8ÖÐÊÇĬÈÏÓµÈû¿ØÖÆËã·¨¡£BICµÄ·¢Ã÷Õß·¢Õâô¶àµÄÓµÈû¿ØÖÆËã·¨¶¼ÔÚŬÁ¦ÕÒÒ»¸öºÏÊʵÄcwnd ¨C Congestion Window£¬¶øÇÒBIC-TCPµÄÌá³öÕßÃÇ¿´´©ÁËÊÂÇéµÄ±¾ÖÊ£¬ÆäʵÕâ¾ÍÊÇÒ»¸öËÑË÷µÄ¹ý³Ì£¬ËùÒÔBICÕâ¸öËã·¨Ö÷ÒªÓõÄÊÇBinary Search¡ª¡ª¶þ·Ö²éÕÒÀ´¸ÉÕâ¸öÊ¡£ ¹ØÓÚÕâ¸öË㷨ʵÏÖ£¬Äã¿ÉÒԲο´LinuxÔ´Â룺/net/ipv4/tcp_bic.c

TCP WestWoodËã·¨

westwood²ÉÓúÍRenoÏàͬµÄÂýÆô¶¯Ëã·¨¡¢ÓµÈû±ÜÃâËã·¨¡£westwoodµÄÖ÷Òª¸Ä½ø·½Ã棺ÔÚ·¢ËͶË×ö´ø¿í¹À¼Æ£¬µ±Ì½²âµ½¶ª°üʱ£¬¸ù¾Ý´ø¿íÖµÀ´ÉèÖÃÓµÈû´°¿Ú¡¢ÂýÆô¶¯ãÐÖµ¡£ ÄÇô£¬Õâ¸öËã·¨ÊÇÔõô²âÁ¿´ø¿íµÄ£¿Ã¿¸öRTTʱ¼ä£¬»á²âÁ¿Ò»´Î´ø¿í£¬²âÁ¿´ø¿íµÄ¹«Ê½ºÜ¼òµ¥£¬¾ÍÊÇÕâ¶ÎRTTÄڳɹ¦±»ackÁ˶àÉÙ×Ö½Ú¡£ÒòΪ£¬Õâ¸ö´ø¿íºÍÓÃRTT¼ÆËãRTOÒ»Ñù£¬Ò²ÊÇÐèÒª´Óÿ¸öÑù±¾À´Æ½»¬µ½Ò»¸öÖµµÄ¡ª¡ªÒ²ÊÇÓÃÒ»¸ö¼ÓÈ¨ÒÆÆ½¾ùµÄ¹«Ê½¡£ ÁíÍ⣬ÎÒÃÇÖªµÀ£¬Èç¹ûÒ»¸öÍøÂçµÄ´ø¿íÊÇÿÃë¿ÉÒÔ·¢ËÍX¸ö×Ö½Ú£¬¶øRTTÊÇÒ»¸öÊý¾Ý·¢³öÈ¥ºóÈ·ÈÏÐèÒªµÄʱºò£¬ËùÒÔ£¬X * RTTÓ¦¸ÃÊÇÎÒÃÇ»º³åÇø´óС¡£ËùÒÔ£¬ÔÚÕâ¸öËã·¨ÖУ¬ssthreshµÄÖµ¾ÍÊÇest_BD * min-RTT(×îСµÄRTTÖµ)£¬Èç¹û¶ª°üÊÇDuplicated ACKsÒýÆðµÄ£¬ÄÇôÈç¹ûcwnd > ssthresh£¬Ôò cwin = ssthresh¡£Èç¹ûÊÇRTOÒýÆðµÄ£¬cwnd = 1£¬½øÈëÂýÆô¶¯¡£ ¹ØÓÚÕâ¸öË㷨ʵÏÖ£¬Äã¿ÉÒԲο´LinuxÔ´Â룺 /net/ipv4/tcp_westwood.c

ÆäËü

¸ü¶àµÄËã·¨£¬Äã¿ÉÒÔ´ÓWikipediaµÄ TCP Congestion Avoidance Algorithm ´ÊÌõÖÐÕÒµ½Ïà¹ØµÄÏßË÷

ºó¼Ç

ºÃÁË£¬µ½ÕâÀïÎÒÏë¿ÉÒÔ½áÊøÁË£¬TCP·¢Õ¹µ½½ñÌ죬ÀïÃæµÄ¶«Î÷¿ÉÒÔдÉϺü¸±¾Êé¡£±¾ÎÄÖ÷ҪĿµÄ£¬»¹ÊǰÑÄã´øÈëÕâЩ¹ÅµäµÄ»ù´¡¼¼ÊõºÍ֪ʶÖУ¬Ï£Íû±¾ÎÄÄÜÈÃÄãÁ˽âTCP£¬¸üÏ£Íû±¾ÎÄÄÜÈÃÄ㿪ʼÓÐѧϰÕâЩ»ù´¡»òµ×²ã֪ʶµÄÐËȤºÍÐÅÐÄ¡£

µ±È»£¬TCP¶«Î÷Ì«¶àÁË£¬²»Í¬µÄÈË¿ÉÄÜÓв»Í¬µÄÀí½â£¬¶øÇÒ±¾ÎÄ¿ÉÄÜÒ²»áÓÐһЩ»ÄÃýÖ®ÑÔÉõÖÁ´íÎ󣬻¹Ï£ÍûµÃµ½ÄúµÄ·´À¡ºÍÅúÆÀ¡£

   
2191 ´Îä¯ÀÀ       31
 
Ïà¹ØÎÄÕÂ

iOSÓ¦Óð²È«¿ª·¢£¬Äã²»ÖªµÀµÄÄÇЩÊÂÊõ
Web°²È«Ö®SQL×¢Èë¹¥»÷
ÒÆ¶¯APP°²È«ÔÚÉøÍ¸²âÊÔÖеÄÓ¦ÓÃ
´ÓGoogle±¸·Ý»¥ÁªÍø¿´¡°Êý¾Ý°²È«¡±
 
Ïà¹ØÎĵµ

web°²È«Éè¼ÆÓë·À»¤
»¥ÁªÍøº£Á¿ÄÚÈݰ²È«´¦Àí¼¼Êõ
ºÚ¿Í¹¥»÷Óë·À·¶¼¼Êõ
WEBºÚºÐ°²È«¼ì²â
 
Ïà¹Ø¿Î³Ì

WEBÍøÕ¾ÓëÓ¦Óð²È«Ô­ÀíÓëʵ¼ù
webÓ¦Óð²È«¼Ü¹¹Éè¼Æ
´´½¨°²È«µÄJ2EE WebÓ¦ÓôúÂë
ÐÅÏ¢°²È«ÎÊÌâÓë·À·¶
×îл¼Æ»®
DeepSeekÔÚÈí¼þ²âÊÔÓ¦ÓÃʵ¼ù 4-12[ÔÚÏß]
DeepSeek´óÄ£ÐÍÓ¦Óÿª·¢Êµ¼ù 4-19[ÔÚÏß]
UAF¼Ü¹¹ÌåϵÓëʵ¼ù 4-11[±±¾©]
AIÖÇÄÜ»¯Èí¼þ²âÊÔ·½·¨Óëʵ¼ù 5-23[ÉϺ£]
»ùÓÚ UML ºÍEA½øÐзÖÎöÉè¼Æ 4-26[±±¾©]
ÒµÎñ¼Ü¹¹Éè¼ÆÓ뽨ģ 4-18[±±¾©]

iOSÓ¦Óð²È«¿ª·¢
Web°²È«Ö®SQL×¢Èë¹¥»÷
APP°²È«ÔÚÉøÍ¸²âÊÔÖеÄÓ¦ÓÃ
³õ̽PHPµÄSQL×¢Èë¹¥»÷µÄ¼¼Êõ
´ÓGoogle±¸·Ý¿´¡°Êý¾Ý°²È«¡±


WEBÍøÕ¾ÓëÓ¦Óð²È«Ô­ÀíÓëʵ¼ù
webÓ¦Óð²È«¼Ü¹¹Éè¼Æ
´´½¨°²È«µÄJ2EE WebÓ¦ÓôúÂë
×¢²áÐÅÏ¢°²È«×¨ÒµÈËÔ±(CISP)
ÐÅÏ¢°²È«¹ÜÀí
ÐÅÏ¢°²È«ÎÊÌâÓë·À·¶


ÖйúÒøÐÐ ÐÅÏ¢°²È«¼¼Êõ¼°Éî¶È·ÀÓù
WebÓ¦Óð²È«¼Ü¹¹¡¢ÈëÇÖ¼ì²âÓë·À»¤
ij²ÆË°ÁìÓòÖªÃûIT·þÎñÉÌ Web°²È«²âÊÔ
ÆÕÈð¿Ë˹ web°²È«Éè¼Æ¡¢²âÊÔÓëÓÅ»¯
±±¾©ºÍÀûʱ ÐÔÄܺͰ²È«ÐÔ²âÊÔ
SUNÖйú¹¤³ÌÑо¿Ôº JSF¿ò¼Ü¡¢°²È«