ÕâÆªÎÄÕÂÊÇÏÂÆª£¬ËùÒÔÈç¹ûÄã¶Ô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¶«Î÷Ì«¶àÁË£¬²»Í¬µÄÈË¿ÉÄÜÓв»Í¬µÄÀí½â£¬¶øÇÒ±¾ÎÄ¿ÉÄÜÒ²»áÓÐһЩ»ÄÃýÖ®ÑÔÉõÖÁ´íÎ󣬻¹Ï£ÍûµÃµ½ÄúµÄ·´À¡ºÍÅúÆÀ¡£ |