TCPÊÇÒ»¸ö¾Þ¸´ÔÓµÄÐÒ飬ÒòΪËûÒª½â¾öºÜ¶àÎÊÌ⣬¶øÕâЩÎÊÌâÓÖ´ø³öÁ˺ܶà×ÓÎÊÌâºÍÒõ°µÃæ¡£ËùÒÔѧϰTCP±¾ÉíÊǸö±È½ÏÍ´¿àµÄ¹ý³Ì£¬µ«¶ÔÓÚѧϰµÄ¹ý³ÌÈ´ÄÜÈÃÈËÓкܶàÊÕ»ñ¡£¹ØÓÚTCPÕâ¸öÐÒéµÄϸ½Ú£¬ÎÒ»¹ÊÇÍÆ¼öÄãÈ¥¿´W.Richard
StevensµÄ¡¶TCP/IP Ïê½â ¾í1£ºÐÒé¡·£¨µ±È»£¬ÄãÒ²¿ÉÒÔÈ¥¶ÁÒ»ÏÂRFC793ÒÔ¼°ºóÃæN¶àµÄRFC£©¡£ÁíÍ⣬±¾ÎÄÎÒ»áʹÓÃÓ¢ÎÄÊõÓÕâÑù·½±ãÄãͨ¹ýÕâЩӢÎĹؼü´ÊÀ´²éÕÒÏà¹ØµÄ¼¼ÊõÎĵµ¡£
Ö®ËùÒÔÏëдÕâÆªÎÄÕ£¬Ä¿µÄÓÐÈý¸ö£¬
Ò»¸öÊÇÏë¶ÍÁ¶Ò»ÏÂ×Ô¼ºÊÇ·ñ¿ÉÒÔÓüòµ¥µÄƪ·ù°ÑÕâô¸´ÔÓµÄTCPÐÒéÃèÇå³þµÄÄÜÁ¦¡£
ÁíÒ»¸öÊǾõµÃÏÖÔڵĺöà³ÌÐòÔ±»ù±¾Éϲ»»áÈÏÈÏÕæÕæµØ¶Á±¾Ê飬ϲ»¶¿ì²ÍÎÄ»¯£¬ËùÒÔ£¬Ï£ÍûÕâÆª¿ì²ÍÎÄÕ¿ÉÒÔÈÃÄã¶ÔTCPÕâ¸ö¹Åµä¼¼ÊõÓÐËùÁ˽⣬²¢ÄÜÌå»áµ½Èí¼þÉè¼ÆÖеÄÖÖÖÖÄÑ´¦¡£²¢ÇÒÄã¿ÉÒÔ´ÓÖÐÓÐһЩÈí¼þÉè¼ÆÉϵÄÊÕ»ñ¡£
×îÖØÒªµÄÏ£ÍûÕâЩ»ù´¡ÖªÊ¶¿ÉÒÔÈÃÄã¸ãÇåºÜ¶àÒÔÇ°Ò»Ð©ËÆÊǶø·ÇµÄ¶«Î÷£¬²¢ÇÒÄãÄÜÒâʶµ½»ù´¡µÄÖØÒª¡£
ËùÒÔ£¬±¾ÎIJ»»á̾̾¾ãµ½£¬Ö»ÊǶÔTCPÐÒé¡¢Ëã·¨ºÍÔÀíµÄ¿ÆÆÕ¡£
ÎÒ±¾À´Ö»Ïëдһ¸öƪ·ùµÄÎÄյ쬵«ÊÇTCPÕæTMDµÄ¸´ÔÓ£¬±ÈC++¸´ÔÓ¶àÁË£¬Õâ30¶àÄêÀ´£¬¸÷ÖÖÓÅ»¯±äÖÖÕùÂÛºÍÐ޸ġ£ËùÒÔ£¬Ð´×Åдמͷ¢ÏÖÖ»Óп³³ÉÁ½Æª¡£
ÉÏÆªÖУ¬Ö÷ÒªÏòÄã½éÉÜTCPÐÒéµÄ¶¨ÒåºÍ¶ª°üʱµÄÖØ´«»úÖÆ¡£
ÏÂÆªÖУ¬Öصã½éÉÜTCPµÄÁ÷µü¡¢ÓµÈû´¦Àí¡£
·Ï»°ÉÙ˵£¬Ê×ÏÈ£¬ÎÒÃÇÐèÒªÖªµÀTCPÔÚÍøÂçOSIµÄÆß²ãÄ£ÐÍÖеĵÚËIJ㡪¡ªTransport²ã£¬IPÔÚµÚÈý²ã¡ª¡ªNetwork²ã£¬ARPÔÚµÚ¶þ²ã¡ª¡ªData
Link²ã£¬ÔÚµÚ¶þ²ãÉϵÄÊý¾Ý£¬ÎÒÃǽÐFrame£¬ÔÚµÚÈý²ãÉϵÄÊý¾Ý½ÐPacket£¬µÚËIJãµÄÊý¾Ý½ÐSegment¡£
Ê×ÏÈ£¬ÎÒÃÇÐèÒªÖªµÀ£¬ÎÒÃdzÌÐòµÄÊý¾ÝÊ×ÏÈ»á´òµ½TCPµÄSegmentÖУ¬È»ºóTCPµÄSegment»á´òµ½IPµÄPacketÖУ¬È»ºóÔÙ´òµ½ÒÔÌ«ÍøEthernetµÄFrameÖУ¬´«µ½¶Ô¶Ëºó£¬¸÷¸ö²ã½âÎö×Ô¼ºµÄÐÒ飬Ȼºó°ÑÊý¾Ý½»¸ø¸ü¸ß²ãµÄÐÒé´¦Àí¡£
TCPÍ·¸ñʽ
½ÓÏÂÀ´£¬ÎÒÃÇÀ´¿´Ò»ÏÂTCPÍ·µÄ¸ñʽ

TCPÍ·¸ñʽ£¨Í¼Æ¬À´Ô´£©
ÄãÐèҪעÒâÕâô¼¸µã£º
1¡¢TCPµÄ°üÊÇûÓÐIPµØÖ·µÄ£¬ÄÇÊÇIP²ãÉϵÄÊ¡£µ«ÊÇÓÐÔ´¶Ë¿ÚºÍÄ¿±ê¶Ë¿Ú¡£
2¡¢Ò»¸öTCPÁ¬½ÓÐèÒªËĸöÔª×éÀ´±íʾÊÇͬһ¸öÁ¬½Ó£¨src_ip, src_port,
dst_ip, dst_port£©×¼È·ËµÊÇÎåÔª×飬»¹ÓÐÒ»¸öÊÇÐÒé¡£µ«ÒòΪÕâÀïÖ»ÊÇ˵TCPÐÒ飬ËùÒÔ£¬ÕâÀïÎÒֻ˵ËÄÔª×é¡£
3¡¢×¢ÒâÉÏͼÖеÄËĸö·Ç³£ÖØÒªµÄ¶«Î÷£º
Sequence NumberÊǰüµÄÐòºÅ£¬ÓÃÀ´½â¾öÍøÂç°üÂÒÐò£¨reordering£©ÎÊÌâ¡£
Acknowledgement Number¾ÍÊÇACK¡ª¡ªÓÃÓÚÈ·ÈÏÊÕµ½£¬ÓÃÀ´½â¾ö²»¶ª°üµÄÎÊÌâ¡£
WindowÓÖ½ÐAdvertised-Window£¬Ò²¾ÍÊÇÖøÃûµÄ»¬¶¯´°¿Ú£¨Sliding Window£©£¬ÓÃÓÚ½â¾öÁ÷¿ØµÄ¡£
TCP Flag £¬Ò²¾ÍÊǰüµÄÀàÐÍ£¬Ö÷ÒªÊÇÓÃÓÚ²Ù¿ØTCPµÄ״̬»úµÄ¡£
¹ØÓÚÆäËüµÄ¶«Î÷£¬¿ÉÒԲο´ÏÂÃæµÄͼʾ

TCPµÄ״̬»ú
Æäʵ£¬ÍøÂçÉϵĴ«ÊäÊÇûÓÐÁ¬½ÓµÄ£¬°üÀ¨TCPÒ²ÊÇÒ»ÑùµÄ¡£¶øTCPËùνµÄ¡°Á¬½Ó¡±£¬Æäʵֻ²»¹ýÊÇÔÚͨѶµÄË«·½Î¬»¤Ò»¸ö¡°Á¬½Ó״̬¡±£¬ÈÃËü¿´ÉÏÈ¥ºÃÏñÓÐÁ¬½ÓÒ»Ñù¡£ËùÒÔ£¬TCPµÄ״̬±ä»»ÊǷdz£ÖØÒªµÄ¡£
ÏÂÃæÊÇ£º¡°TCPÐÒéµÄ״̬»ú¡±£¨Í¼Æ¬À´Ô´£© ºÍ ¡°TCP½¨Á´½Ó¡±¡¢¡°TCP¶ÏÁ´½Ó¡±¡¢¡°´«Êý¾Ý¡±
µÄ¶ÔÕÕͼ£¬ÎÒ°ÑÁ½¸öͼ²¢ÅÅ·ÅÔÚÒ»Æð£¬ÕâÑù·½±ãÔÚÄã¶ÔÕÕ×Å¿´¡£ÁíÍ⣬ÏÂÃæÕâÁ½¸öͼ·Ç³£·Ç³£µÄÖØÒª£¬ÄãÒ»¶¨Òª¼ÇÀΡ££¨Í¸ö²Û£º¿´µ½ÕâÑù¸´ÔÓµÄ״̬»ú£¬¾ÍÖªµÀÕâ¸öÐÒéÓжิÔÓ£¬¸´ÔӵĶ«Î÷×ÜÊÇÓкܶà¿ÓµùµÄÊÂÇ飬ËùÒÔTCPÐÒéÆäʵҲͦ¿ÓµùµÄ£©

ºÜ¶àÈË»áÎÊ£¬ÎªÊ²Ã´½¨Á´½ÓÒª3´ÎÎÕÊÖ£¬¶ÏÁ´½ÓÐèÒª4´Î»ÓÊÖ£¿
1¡¢¶ÔÓÚ½¨Á´½ÓµÄ3´ÎÎÕÊÖ£¬Ö÷ÒªÊÇÒª³õʼ»¯Sequence Number
µÄ³õʼֵ¡£Í¨ÐŵÄË«·½Òª»¥Ïà֪ͨ¶Ô·½×Ô¼ºµÄ³õʼ»¯µÄSequence Number£¨ËõдΪISN£ºInital
Sequence Number£©¡ª¡ªËùÒÔ½ÐSYN£¬È«³ÆSynchronize Sequence Numbers¡£Ò²¾ÍÉÏͼÖеÄ
x ºÍ y¡£Õâ¸öºÅÒª×÷ΪÒÔºóµÄÊý¾ÝͨÐŵÄÐòºÅ£¬ÒÔ±£Ö¤Ó¦Óòã½ÓÊÕµ½µÄÊý¾Ý²»»áÒòÎªÍøÂçÉϵĴ«ÊäµÄÎÊÌâ¶øÂÒÐò£¨TCP»áÓÃÕâ¸öÐòºÅÀ´Æ´½ÓÊý¾Ý£©¡£
2¡¢¶ÔÓÚ4´Î»ÓÊÖ£¬ÆäʵÄã×Ðϸ¿´ÊÇ2´Î£¬ÒòΪTCPÊÇȫ˫¹¤µÄ£¬ËùÒÔ£¬·¢ËÍ·½ºÍ½ÓÊÕ·½¶¼ÐèÒªFinºÍAck¡£Ö»²»¹ý£¬ÓÐÒ»·½ÊDZ»¶¯µÄ£¬ËùÒÔ¿´ÉÏÈ¥¾Í³ÉÁËËùνµÄ4´Î»ÓÊÖ¡£Èç¹ûÁ½±ßͬʱ¶ÏÁ¬½Ó£¬ÄǾͻá¾Í½øÈëµ½CLOSING״̬£¬È»ºóµ½´ïTIME_WAIT״̬¡£ÏÂͼÊÇË«·½Í¬Ê±¶ÏÁ¬½ÓµÄʾÒâͼ£¨ÄãͬÑù¿ÉÒÔ¶ÔÕÕ×ÅTCP״̬»ú¿´£©£º

Á½¶Ëͬʱ¶ÏÁ¬½Ó
ÁíÍ⣬Óм¸¸öÊÂÇéÐèҪעÒâһϣº
1.¹ØÓÚ½¨Á¬½ÓʱSYN³¬Ê±¡£ÊÔÏëһϣ¬Èç¹ûserver¶Ë½Óµ½ÁËclien·¢µÄSYNºó»ØÁËSYN-ACKºóclientµôÏßÁË£¬server¶ËûÓÐÊÕµ½client»ØÀ´µÄACK£¬ÄÇô£¬Õâ¸öÁ¬½Ó´¦ÓÚÒ»¸öÖмä״̬£¬¼´Ã»³É¹¦£¬Ò²Ã»Ê§°Ü¡£ÓÚÊÇ£¬server¶ËÈç¹ûÔÚÒ»¶¨Ê±¼äÄÚûÓÐÊÕµ½µÄTCP»áÖØ·¢SYN-ACK¡£ÔÚLinuxÏ£¬Ä¬ÈÏÖØÊÔ´ÎÊýΪ5´Î£¬ÖØÊԵļä¸ôʱ¼ä´Ó1s¿ªÊ¼Ã¿´Î¶¼·ÊÛ£¬5´ÎµÄÖØÊÔʱ¼ä¼ä¸ôΪ1s,
2s, 4s, 8s, 16s£¬×ܹ²31s£¬µÚ5´Î·¢³öºó»¹ÒªµÈ32s¶¼ÖªµÀµÚ5´ÎÒ²³¬Ê±ÁË£¬ËùÒÔ£¬×ܹ²ÐèÒª
1s + 2s + 4s+ 8s+ 16s + 32s = 2^6 -1 = 63s£¬TCP²Å»á°Ñ¶Ï¿ªÕâ¸öÁ¬½Ó¡£
2.¹ØÓÚSYN Flood¹¥»÷¡£Ò»Ð©¶ñÒâµÄÈ˾ÍΪ´ËÖÆÔìÁËSYN Flood¹¥»÷¡ª¡ª¸ø·þÎñÆ÷·¢ÁËÒ»¸öSYNºó£¬¾ÍÏÂÏßÁË£¬ÓÚÊÇ·þÎñÆ÷ÐèҪĬÈϵÈ63s²Å»á¶Ï¿ªÁ¬½Ó£¬ÕâÑù£¬¹¥»÷Õ߾ͿÉÒÔ°Ñ·þÎñÆ÷µÄsynÁ¬½ÓµÄ¶ÓÁкľ¡£¬ÈÃÕý³£µÄÁ¬½ÓÇëÇó²»ÄÜ´¦Àí¡£ÓÚÊÇ£¬LinuxϸøÁËÒ»¸ö½Ðtcp_syncookiesµÄ²ÎÊýÀ´Ó¦¶ÔÕâ¸öÊ¡ª¡ªµ±SYN¶ÓÁÐÂúÁ˺ó£¬TCP»áͨ¹ýÔ´µØÖ·¶Ë¿Ú¡¢Ä¿±êµØÖ·¶Ë¿ÚºÍʱ¼ä´Á´òÔì³öÒ»¸öÌØ±ðµÄSequence
Number·¢»ØÈ¥£¨ÓÖ½Ðcookie£©£¬Èç¹ûÊǹ¥»÷ÕßÔò²»»áÓÐÏìÓ¦£¬Èç¹ûÊÇÕý³£Á¬½Ó£¬Ôò»á°ÑÕâ¸ö SYN Cookie·¢»ØÀ´£¬È»ºó·þÎñ¶Ë¿ÉÒÔͨ¹ýcookie½¨Á¬½Ó£¨¼´Ê¹Äã²»ÔÚSYN¶ÓÁÐÖУ©¡£Çë×¢Ò⣬ÇëÏÈǧÍò±ðÓÃtcp_syncookiesÀ´´¦ÀíÕý³£µÄ´ó¸ºÔصÄÁ¬½ÓµÄÇé¿ö¡£ÒòΪ£¬synccookiesÊÇÍ×аæµÄTCPÐÒ飬²¢²»ÑϽ÷¡£¶ÔÓÚÕý³£µÄÇëÇó£¬ÄãÓ¦¸Ãµ÷ÕûÈý¸öTCP²ÎÊý¿É¹©ÄãÑ¡Ôñ£¬µÚÒ»¸öÊÇ£ºtcp_synack_retries
¿ÉÒÔÓÃËûÀ´¼õÉÙÖØÊÔ´ÎÊý£»µÚ¶þ¸öÊÇ£ºtcp_max_syn_backlog£¬¿ÉÒÔÔö´óSYNÁ¬½ÓÊý£»µÚÈý¸öÊÇ£ºtcp_abort_on_overflow
´¦Àí²»¹ýÀ´¸É´à¾ÍÖ±½Ó¾Ü¾øÁ¬½ÓÁË¡£
3.¹ØÓÚISNµÄ³õʼ»¯¡£ISNÊDz»ÄÜhard codeµÄ£¬²»È»»á³öÎÊÌâµÄ¡ª¡ª±ÈÈ磺Èç¹ûÁ¬½Ó½¨ºÃºóʼÖÕÓÃ1À´×öISN£¬Èç¹ûclient·¢ÁË30¸ösegment¹ýÈ¥£¬µ«ÊÇÍøÂç¶ÏÁË£¬ÓÚÊÇ
clientÖØÁ¬£¬ÓÖÓÃÁË1×öISN£¬µ«ÊÇ֮ǰÁ¬½ÓµÄÄÇЩ°üµ½ÁË£¬ÓÚÊǾͱ»µ±³ÉÁËÐÂÁ¬½ÓµÄ°ü£¬´Ëʱ£¬clientµÄSequence
Number ¿ÉÄÜÊÇ3£¬¶øServer¶ËÈÏΪclient¶ËµÄÕâ¸öºÅÊÇ30ÁË¡£È«ÂÒÁË¡£RFC793ÖÐ˵£¬ISN»áºÍÒ»¸ö¼ÙµÄʱÖÓ°óÔÚÒ»Æð£¬Õâ¸öʱÖÓ»áÔÚÿ4΢Ãë¶ÔISN×ö¼ÓÒ»²Ù×÷£¬Ö±µ½³¬¹ý2^32£¬ÓÖ´Ó0¿ªÊ¼¡£ÕâÑù£¬Ò»¸öISNµÄÖÜÆÚ´óÔ¼ÊÇ4.55¸öСʱ¡£ÒòΪ£¬ÎÒÃǼÙÉèÎÒÃǵÄTCP
SegmentÔÚÍøÂçÉϵĴæ»îʱ¼ä²»»á³¬¹ýMaximum Segment Lifetime£¨ËõдΪMSL
- WikipediaÓïÌõ£©£¬ËùÒÔ£¬Ö»ÒªMSLµÄֵСÓÚ4.55Сʱ£¬ÄÇô£¬ÎÒÃǾͲ»»áÖØÓõ½ISN¡£
4.¹ØÓÚ MSL ºÍ TIME_WAIT¡£Í¨¹ýÉÏÃæµÄISNµÄÃèÊö£¬ÏàÐÅÄãÒ²ÖªµÀMSLÊÇÔõôÀ´µÄÁË¡£ÎÒÃÇ×¢Òâµ½£¬ÔÚTCPµÄ״̬ͼÖУ¬´ÓTIME_WAIT״̬µ½CLOSED״̬£¬ÓÐÒ»¸ö³¬Ê±ÉèÖã¬Õâ¸ö³¬Ê±ÉèÖÃÊÇ
2*MSL£¨RFC793¶¨ÒåÁËMSLΪ2·ÖÖÓ£¬LinuxÉèÖóÉÁË30s£©ÎªÊ²Ã´ÒªÕâÓÐTIME_WAIT£¿ÎªÊ²Ã´²»Ö±½Ó¸ø×ª³ÉCLOSED×´Ì¬ÄØ£¿Ö÷ÒªÓÐÁ½¸öÔÒò£º1£©TIME_WAITÈ·±£ÓÐ×ã¹»µÄʱ¼äÈöԶËÊÕµ½ÁËACK£¬Èç¹û±»¶¯¹Ø±ÕµÄÄÇ·½Ã»ÓÐÊÕµ½Ack£¬¾Í»á´¥·¢±»¶¯¶ËÖØ·¢Fin£¬Ò»À´Ò»È¥ÕýºÃ2¸öMSL£¬2£©ÓÐ×ã¹»µÄʱ¼äÈÃÕâ¸öÁ¬½Ó²»»á¸úºóÃæµÄÁ¬½Ó»ìÔÚÒ»Æð£¨ÄãÒªÖªµÀ£¬ÓÐЩ×Ô×öÖ÷ÕŵÄ·ÓÉÆ÷»á»º´æIPÊý¾Ý°ü£¬Èç¹ûÁ¬½Ó±»ÖØÓÃÁË£¬ÄÇôÕâЩÑÓ³ÙÊÕµ½µÄ°ü¾ÍÓпÉÄÜ»á¸úÐÂÁ¬½Ó»ìÔÚÒ»Æð£©¡£Äã¿ÉÒÔ¿´¿´ÕâÆªÎÄÕ¡¶TIME_WAIT
and its design implications for protocols and scalable
client server systems¡·
5.¹ØÓÚTIME_WAITÊýÁ¿Ì«¶à¡£´ÓÉÏÃæµÄÃèÊöÎÒÃÇ¿ÉÒÔÖªµÀ£¬TIME_WAITÊǸöºÜÖØÒªµÄ״̬£¬µ«ÊÇÈç¹ûÔÚ´ó²¢·¢µÄ¶ÌÁ´½ÓÏ£¬TIME_WAIT
¾Í»áÌ«¶à£¬ÕâÒ²»áÏûºÄºÜ¶àϵͳ×ÊÔ´¡£Ö»ÒªËÑһϣ¬Äã¾Í»á·¢ÏÖ£¬Ê®Óа˾ŵĴ¦Àí·½Ê½¶¼ÊǽÌÄãÉèÖÃÁ½¸ö²ÎÊý£¬Ò»¸ö½Ðtcp_tw_reuse£¬ÁíÒ»¸ö½Ðtcp_tw_recycleµÄ²ÎÊý£¬ÕâÁ½¸ö²ÎÊýĬÈÏÖµ¶¼ÊDZ»¹Ø±ÕµÄ£¬ºóÕßrecyle±ÈǰÕßresue¸üΪ¼¤½ø£¬resueÒªÎÂÈáһЩ¡£ÁíÍ⣬Èç¹ûʹÓÃtcp_tw_reuse£¬±ØÐèÉèÖÃtcp_timestamps=1£¬·ñÔòÎÞЧ¡£ÕâÀÄãÒ»¶¨Òª×¢Ò⣬´ò¿ªÕâÁ½¸ö²ÎÊý»áÓбȽϴóµÄ¿Ó¡ª¡ª¿ÉÄÜ»áÈÃTCPÁ¬½Ó³öһЩ¹îÒìµÄÎÊÌ⣨ÒòΪÈçÉÏÊöÒ»Ñù£¬Èç¹û²»µÈ´ý³¬Ê±ÖØÓÃÁ¬½ÓµÄ»°£¬ÐµÄÁ¬½Ó¿ÉÄܻὨ²»ÉÏ¡£ÕýÈç¹Ù·½ÎĵµÉÏ˵µÄÒ»Ñù¡°It
should not be changed without advice/request of technical
experts¡±£©¡£
6.¹ØÓÚtcp_tw_reuse¡£¹Ù·½ÎĵµÉÏ˵tcp_tw_reuse
¼ÓÉÏtcp_timestamps£¨ÓÖ½ÐPAWS, for Protection Against Wrapped
Sequence Numbers£©¿ÉÒÔ±£Ö¤ÐÒéµÄ½Ç¶ÈÉϵݲȫ£¬µ«ÊÇÄãÐèÒªtcp_timestampsÔÚÁ½±ß¶¼±»´ò¿ª£¨Äã¿ÉÒÔ¶ÁÒ»ÏÂtcp_twsk_uniqueµÄÔ´Âë
£©¡£ÎÒ¸öÈ˹À¼Æ»¹ÊÇÓÐһЩ³¡¾°»áÓÐÎÊÌâ¡£
7.¹ØÓÚtcp_tw_recycle¡£Èç¹ûÊÇtcp_tw_recycle±»´ò¿ªÁË»°£¬»á¼ÙÉè¶Ô¶Ë¿ªÆôÁËtcp_timestamps£¬È»ºó»áÈ¥±È½Ïʱ¼ä´Á£¬Èç¹ûʱ¼ä´Á±ä´óÁË£¬¾Í¿ÉÒÔÖØÓᣵ«ÊÇ£¬Èç¹û¶Ô¶ËÊÇÒ»¸öNATÍøÂçµÄ»°£¨È磺һ¸ö¹«Ë¾Ö»ÓÃÒ»¸öIP³ö¹«Íø£©»òÊǶԶ˵ÄIP±»ÁíÒ»Ì¨ÖØÓÃÁË£¬Õâ¸öʾ͸´ÔÓÁË¡£½¨Á´½ÓµÄSYN¿ÉÄܾͱ»Ö±½Ó¶ªµôÁË£¨Äã¿ÉÄܻῴµ½connection
time outµÄ´íÎ󣩣¨Èç¹ûÄãÏë¹ÛĦһÏÂLinuxµÄÄں˴úÂ룬Çë²Î¿´Ô´Âë tcp_timewait_state_process£©¡£
8.¹ØÓÚtcp_max_tw_buckets¡£Õâ¸öÊÇ¿ØÖƲ¢·¢µÄTIME_WAITµÄÊýÁ¿£¬Ä¬ÈÏÖµÊÇ180000£¬Èç¹û³¬ÏÞ£¬ÄÇô£¬ÏµÍ³»á°Ñ¶àµÄ¸ødestoryµô£¬È»ºóÔÚÈÕÖ¾Àï´òÒ»¸ö¾¯¸æ£¨È磺time
wait bucket table overflow£©£¬¹ÙÍøÎĵµËµÕâ¸ö²ÎÊýÊÇÓÃÀ´¶Ô¿¹DDoS¹¥»÷µÄ¡£Ò²ËµµÄĬÈÏÖµ180000²¢²»Ð¡¡£Õâ¸ö»¹ÊÇÐèÒª¸ù¾Ýʵ¼ÊÇé¿ö¿¼ÂÇ¡£
Again£¬Ê¹ÓÃtcp_tw_reuseºÍtcp_tw_recycleÀ´½â¾öTIME_WAITµÄÎÊÌâÊǷdz£·Ç³£Î£Ïյģ¬ÒòΪÕâÁ½¸ö²ÎÊýÎ¥·´ÁËTCPÐÒ飨RFC
1122£©
Æäʵ£¬TIME_WAIT±íʾµÄÊÇÄãÖ÷¶¯¶ÏÁ¬½Ó£¬ËùÒÔ£¬Õâ¾ÍÊÇËùνµÄ¡°²»×÷ËÀ²»»áËÀ¡±¡£ÊÔÏ룬Èç¹ûÈöԶ˶ÏÁ¬½Ó£¬ÄÇôÕâ¸öÆÆÎÊÌâ¾ÍÊǶԷ½µÄÁË£¬ºÇºÇ¡£ÁíÍ⣬Èç¹ûÄãµÄ·þÎñÆ÷ÊÇÓÚHTTP·þÎñÆ÷£¬ÄÇôÉèÖÃÒ»¸öHTTPµÄKeepAliveÓжàÖØÒª£¨ä¯ÀÀÆ÷»áÖØÓÃÒ»¸öTCPÁ¬½ÓÀ´´¦Àí¶à¸öHTTPÇëÇ󣩣¬È»ºóÈÿͻ§¶ËÈ¥¶ÏÁ´½Ó£¨ÄãҪСÐÄ£¬ä¯ÀÀÆ÷¿ÉÄÜ»á·Ç³£Ì°À·£¬ËûÃDz»µ½Íò²»µÃÒѲ»»áÖ÷¶¯¶ÏÁ¬½Ó£©¡£
Êý¾Ý´«ÊäÖеÄSequence Number
ÏÂͼÊÇÎÒ´ÓWiresharkÖнØÁ˸öÎÒÔÚ·ÃÎÊcoolshell.cnʱµÄÓÐÊý¾Ý´«ÊäµÄͼ¸øÄ㿴һϣ¬SeqNumÊÇÔõô±äµÄ¡££¨Ê¹ÓÃWireshark²Ëµ¥ÖеÄStatistics
->Flow Graph¡ £©

Äã¿ÉÒÔ¿´µ½£¬SeqNumµÄÔö¼ÓÊǺʹ«ÊäµÄ×Ö½ÚÊýÏà¹ØµÄ¡£ÉÏͼÖУ¬Èý´ÎÎÕÊÖºó£¬À´ÁËÁ½¸öLen:1440µÄ°ü£¬¶øµÚ¶þ¸ö°üµÄSeqNum¾Í³ÉÁË1441¡£È»ºóµÚÒ»¸öACK»ØµÄÊÇ1441£¬±íʾµÚÒ»¸ö1440ÊÕµ½ÁË¡£
×¢Ò⣺Èç¹ûÄãÓÃWireshark×¥°ü³ÌÐò¿´3´ÎÎÕÊÖ£¬Äã»á·¢ÏÖSeqNum×ÜÊÇΪ0£¬²»ÊÇÕâÑùµÄ£¬WiresharkΪÁËÏÔʾ¸üÓѺã¬Ê¹ÓÃÁËRelative
SeqNum¡ª¡ªÏà¶ÔÐòºÅ£¬ÄãÖ»ÒªÔÚÓÒ¼ü²Ëµ¥ÖеÄprotocol preference ÖÐÈ¡Ïûµô¾Í¿ÉÒÔ¿´µ½¡°Absolute
SeqNum¡±ÁË
TCPÖØ´«»úÖÆ
TCPÒª±£Ö¤ËùÓеÄÊý¾Ý°ü¶¼¿ÉÒÔµ½´ï£¬ËùÒÔ£¬±ØÐèÒªÓÐÖØ´«»úÖÆ¡£
×¢Ò⣬½ÓÊն˸ø·¢ËͶ˵ÄAckÈ·ÈÏÖ»»áÈ·ÈÏ×îºóÒ»¸öÁ¬ÐøµÄ°ü£¬±ÈÈ磬·¢ËͶ˷¢ÁË1,2,3,4,5Ò»¹²Îå·ÝÊý¾Ý£¬½ÓÊÕ¶ËÊÕµ½ÁË1£¬2£¬ÓÚÊÇ»Øack
3£¬È»ºóÊÕµ½ÁË4£¨×¢Òâ´Ëʱ3ûÊÕµ½£©£¬´ËʱµÄTCP»áÔõô°ì£¿ÎÒÃÇÒªÖªµÀ£¬ÒòΪÕýÈçÇ°ÃæËù˵µÄ£¬SeqNumºÍAckÊÇÒÔ×Ö½ÚÊýΪµ¥Î»£¬ËùÒÔackµÄʱºò£¬²»ÄÜÌø×ÅÈ·ÈÏ£¬Ö»ÄÜÈ·ÈÏ×î´óµÄÁ¬ÐøÊÕµ½µÄ°ü£¬²»È»£¬·¢ËͶ˾ÍÒÔΪ֮ǰµÄ¶¼ÊÕµ½ÁË¡£
³¬Ê±ÖØ´«»úÖÆ
Ò»ÖÖÊDz»»Øack£¬ËÀµÈ3£¬µ±·¢ËÍ·½·¢ÏÖÊÕ²»µ½3µÄack³¬Ê±ºó£¬»áÖØ´«3¡£Ò»µ©½ÓÊÕ·½ÊÕµ½3ºó£¬»áack
»Ø 4¡ª¡ªÒâζ×Å3ºÍ4¶¼ÊÕµ½ÁË¡£
µ«ÊÇ£¬ÕâÖÖ·½Ê½»áÓбȽÏÑÏÖØµÄÎÊÌ⣬ÄǾÍÊÇÒòΪҪËÀµÈ3£¬ËùÒԻᵼÖÂ4ºÍ5¼´±ãÒѾÊÕµ½ÁË£¬¶ø·¢ËÍ·½Ò²ÍêÈ«²»ÖªµÀ·¢ÉúÁËʲôÊ£¬ÒòΪûÓÐÊÕµ½Ack£¬ËùÒÔ£¬·¢ËÍ·½¿ÉÄܻᱯ¹ÛµØÈÏΪҲ¶ªÁË£¬ËùÒÔÓпÉÄÜÒ²»áµ¼ÖÂ4ºÍ5µÄÖØ´«¡£
¶Ô´ËÓÐÁ½ÖÖÑ¡Ôñ£º
Ò»ÖÖÊǽöÖØ´«timeoutµÄ°ü¡£Ò²¾ÍÊǵÚ3·ÝÊý¾Ý¡£
ÁíÒ»ÖÖÊÇÖØ´«timeoutºóËùÓеÄÊý¾Ý£¬Ò²¾ÍÊǵÚ3£¬4£¬5ÕâÈý·ÝÊý¾Ý¡£
ÕâÁ½ÖÖ·½Ê½ÓкÃÒ²Óв»ºÃ¡£µÚÒ»ÖÖ»á½ÚÊ¡´ø¿í£¬µ«ÊÇÂý£¬µÚ¶þÖÖ»á¿ìÒ»µã£¬µ«ÊÇ»áÀË·Ñ´ø¿í£¬Ò²¿ÉÄÜ»áÓÐÎÞÓù¦¡£µ«×ÜÌåÀ´Ëµ¶¼²»ºÃ¡£ÒòΪ¶¼ÔÚµÈtimeout£¬timeout¿ÉÄÜ»áºÜ³¤£¨ÔÚÏÂÆª»á˵TCPÊÇÔõô¶¯Ì¬µØ¼ÆËã³ötimeoutµÄ£©
¿ìËÙÖØ´«»úÖÆ
ÓÚÊÇ£¬TCPÒýÈëÁËÒ»ÖÖ½ÐFast Retransmit µÄËã·¨£¬²»ÒÔʱ¼äÇý¶¯£¬¶øÒÔÊý¾ÝÇý¶¯ÖØ´«¡£Ò²¾ÍÊÇ˵£¬Èç¹û£¬°üûÓÐÁ¬Ðøµ½´ï£¬¾Íack×îºóÄǸö¿ÉÄܱ»¶ªÁ˵İü£¬Èç¹û·¢ËÍ·½Á¬ÐøÊÕµ½3´ÎÏàͬµÄack£¬¾ÍÖØ´«¡£Fast
RetransmitµÄºÃ´¦ÊDz»ÓõÈtimeoutÁËÔÙÖØ´«¡£
±ÈÈ磺Èç¹û·¢ËÍ·½·¢³öÁË1£¬2£¬3£¬4£¬5·ÝÊý¾Ý£¬µÚÒ»·ÝÏȵ½ËÍÁË£¬ÓÚÊǾÍack»Ø2£¬½á¹û2ÒòΪijЩÔÒòûÊÕµ½£¬3µ½´ïÁË£¬ÓÚÊÇ»¹ÊÇack»Ø2£¬ºóÃæµÄ4ºÍ5¶¼µ½ÁË£¬µ«ÊÇ»¹ÊÇack»Ø2£¬ÒòΪ2»¹ÊÇûÓÐÊÕµ½£¬ÓÚÊÇ·¢ËͶËÊÕµ½ÁËÈý¸öack=2µÄÈ·ÈÏ£¬ÖªµÀÁË2»¹Ã»Óе½£¬ÓÚÊǾÍÂíÉÏÖØ×ª2¡£È»ºó£¬½ÓÊÕ¶ËÊÕµ½ÁË2£¬´ËʱÒòΪ3£¬4£¬5¶¼ÊÕµ½ÁË£¬ÓÚÊÇack»Ø6¡£Ê¾ÒâͼÈçÏ£º

Fast RetransmitÖ»½â¾öÁËÒ»¸öÎÊÌ⣬¾ÍÊÇtimeoutµÄÎÊÌ⣬ËüÒÀÈ»ÃæÁÙÒ»¸ö¼èÄѵÄÑ¡Ôñ£¬¾ÍÊÇÖØ×ªÖ®Ç°µÄÒ»¸ö»¹ÊÇ֨װËùÓеÄÎÊÌâ¡£¶ÔÓÚÉÏÃæµÄʾÀýÀ´Ëµ£¬ÊÇÖØ´«#2ÄØ»¹ÊÇÖØ´«#2£¬#3£¬#4£¬#5ÄØ£¿ÒòΪ·¢ËͶ˲¢²»Çå³þÕâÁ¬ÐøµÄ3¸öack(2)ÊÇË´«»ØÀ´µÄ£¿Ò²Ðí·¢ËͶ˷¢ÁË20·ÝÊý¾Ý£¬ÊÇ#6£¬#10£¬#20´«À´µÄÄØ¡£ÕâÑù£¬·¢ËͶ˺ÜÓпÉÄÜÒªÖØ´«´Ó2µ½20µÄÕâ¶ÑÊý¾Ý£¨Õâ¾ÍÊÇijЩTCPµÄʵ¼ÊµÄʵÏÖ£©¡£¿É¼û£¬ÕâÊÇÒ»°ÑË«Èн£¡£
SACK ·½·¨
ÁíÍâÒ»ÖÖ¸üºÃµÄ·½Ê½½Ð£ºSelective Acknowledgment
(SACK)£¨²Î¿´RFC 2018£©£¬ÕâÖÖ·½Ê½ÐèÒªÔÚTCPÍ·Àï¼ÓÒ»¸öSACKµÄ¶«Î÷£¬ACK»¹ÊÇFast
RetransmitµÄACK£¬SACKÔòÊǻ㱨ÊÕµ½µÄÊý¾ÝËé°æ¡£²Î¿´ÏÂͼ£º

ÕâÑù£¬ÔÚ·¢ËͶ˾ͿÉÒÔ¸ù¾Ý»Ø´«µÄSACKÀ´ÖªµÀÄÄЩÊý¾Ýµ½ÁË£¬ÄÄЩûÓе½¡£ÓÚÊǾÍÓÅ»¯ÁËFast RetransmitµÄËã·¨¡£µ±È»£¬Õâ¸öÐÒéÐèÒªÁ½±ß¶¼Ö§³Ö¡£ÔÚ
LinuxÏ£¬¿ÉÒÔͨ¹ýtcp_sack²ÎÊý´ò¿ªÕâ¸ö¹¦ÄÜ£¨Linux 2.4ºóĬÈÏ´ò¿ª£©¡£
ÕâÀﻹÐèҪעÒâÒ»¸öÎÊÌ⡪¡ª½ÓÊÕ·½Reneging£¬ËùνRenegingµÄÒâ˼¾ÍÊǽÓÊÕ·½ÓÐȨ°ÑÒѾ±¨¸ø·¢ËͶËSACKÀïµÄÊý¾Ý¸ø¶ªÁË¡£ÕâÑù¸ÉÊDz»±»¹ÄÀøµÄ£¬ÒòΪÕâ¸öÊ»á°ÑÎÊÌ⸴ÔÓ»¯ÁË£¬µ«ÊÇ£¬½ÓÊÕ·½Õâô×ö¿ÉÄÜ»áÓÐЩ¼«¶ËÇé¿ö£¬±ÈÈçÒª°ÑÄÚ´æ¸ø±ðµÄ¸üÖØÒªµÄ¶«Î÷¡£ËùÒÔ£¬·¢ËÍ·½Ò²²»ÄÜÍêÈ«ÒÀÀµSACK£¬»¹ÊÇÒªÒÀÀµACK£¬²¢Î¬»¤Time-Out£¬Èç¹ûºóÐøµÄACKûÓÐÔö³¤£¬ÄÇô»¹ÊÇÒª°ÑSACKµÄ¶«Î÷ÖØ´«£¬ÁíÍ⣬½ÓÊÕ¶ËÕâ±ßÓÀÔ¶²»ÄܰÑSACKµÄ°ü±ê¼ÇΪAck¡£
×¢Ò⣺SACK»áÏû·Ñ·¢ËÍ·½µÄ×ÊÔ´£¬ÊÔÏ룬Èç¹ûÒ»¸ö¹¥»÷Õ߸øÊý¾Ý·¢ËÍ·½·¢Ò»¶ÑSACKµÄÑ¡ÏÕâ»áµ¼Ö·¢ËÍ·½¿ªÊ¼ÒªÖØ´«ÉõÖÁ±éÀúÒѾ·¢³öµÄÊý¾Ý£¬Õâ»áÏûºÄºÜ¶à·¢ËͶ˵Ä×ÊÔ´¡£ÏêϸµÄ¶«Î÷Çë²Î¿´¡¶TCP
SACKµÄÐÔÄÜȨºâ¡·
Duplicate SACK ¨C ÖØ¸´ÊÕµ½Êý¾ÝµÄÎÊÌâ
Duplicate SACKÓÖ³ÆD-SACK£¬ÆäÖ÷ҪʹÓÃÁËSACKÀ´¸æËß·¢ËÍ·½ÓÐÄÄЩÊý¾Ý±»Öظ´½ÓÊÕÁË¡£RFC-2833
ÀïÓÐÏêϸÃèÊöºÍʾÀý¡£ÏÂÃæ¾Ù¼¸¸öÀý×Ó£¨À´Ô´ÓÚRFC-2833£©
D-SACKʹÓÃÁËSACKµÄµÚÒ»¸ö¶ÎÀ´×ö±êÖ¾£¬
Èç¹ûSACKµÄµÚÒ»¸ö¶ÎµÄ·¶Î§±»ACKËù¸²¸Ç£¬ÄÇô¾ÍÊÇD-SACK
Èç¹ûSACKµÄµÚÒ»¸ö¶ÎµÄ·¶Î§±»SACKµÄµÚ¶þ¸ö¶Î¸²¸Ç£¬ÄÇô¾ÍÊÇD-SACK
ʾÀýÒ»£ºACK¶ª°ü
ÏÂÃæµÄʾÀýÖУ¬¶ªÁËÁ½¸öACK£¬ËùÒÔ£¬·¢ËͶËÖØ´«Á˵ÚÒ»¸öÊý¾Ý°ü£¨3000-3499£©£¬ÓÚÊǽÓÊÕ¶Ë·¢ÏÖÖØ¸´ÊÕµ½£¬ÓÚÊÇ»ØÁËÒ»¸öSACK=3000-3500£¬ÒòΪACK¶¼µ½ÁË4000Òâζ×ÅÊÕµ½ÁË4000֮ǰµÄËùÓÐÊý¾Ý£¬ËùÒÔÕâ¸öSACK¾ÍÊÇD-SACK¡ª¡ªÖ¼ÔÚ¸æËß·¢ËͶËÎÒÊÕµ½ÁËÖØ¸´µÄÊý¾Ý£¬¶øÇÒÎÒÃǵķ¢ËͶ˻¹ÖªµÀ£¬Êý¾Ý°üûÓжª£¬¶ªµÄÊÇACK°ü¡£
Transmitted Received ACK Sent Segment Segment (Including SACK Blocks) 3000-3499 3000-3499 3500 (ACK dropped) 3500-3999 3500-3999 4000 (ACK dropped) 3000-3499 3000-3499 4000, SACK=3000-3500 |
ʾÀý¶þ£¬ÍøÂçÑÓÎó
ÏÂÃæµÄʾÀýÖУ¬ÍøÂç°ü£¨1000-1499£©±»ÍøÂç¸øÑÓÎóÁË£¬µ¼Ö·¢ËÍ·½Ã»ÓÐÊÕµ½ACK£¬¶øºóÃæµ½´ïµÄÈý¸ö°ü´¥·¢ÁË¡°Fast
RetransmitËã·¨¡±£¬ËùÒÔÖØ´«£¬µ«ÖØ´«Ê±£¬±»ÑÓÎóµÄ°üÓÖµ½ÁË£¬ËùÒÔ£¬»ØÁËÒ»¸öSACK=1000-1500£¬ÒòΪACKÒѵ½ÁË3000£¬ËùÒÔ£¬Õâ¸öSACKÊÇD-SACK¡ª¡ª±êʶÊÕµ½ÁËÖØ¸´µÄ°ü¡£
Õâ¸ö°¸ÀýÏ£¬·¢ËͶËÖªµÀ֮ǰÒòΪ¡°Fast RetransmitËã·¨¡±´¥·¢µÄÖØ´«²»ÊÇÒòΪ·¢³öÈ¥µÄ°ü¶ªÁË£¬Ò²²»ÊÇÒòΪ»ØÓ¦µÄACK°ü¶ªÁË£¬¶øÊÇÒòÎªÍøÂçÑÓʱÁË¡£
Transmitted Received ACK Sent Segment Segment (Including SACK Blocks) 500-999 500-999 1000 1000-1499 (delayed) 1500-1999 1500-1999 1000, SACK=1500-2000 2000-2499 2000-2499 1000, SACK=1500-2500 2500-2999 2500-2999 1000, SACK=1500-3000 1000-1499 1000-1499 3000 1000-1499 3000, SACK=1000-1500 |
¿É¼û£¬ÒýÈëÁËD-SACK£¬ÓÐÕâô¼¸¸öºÃ´¦£º
1£©¿ÉÒÔÈ÷¢ËÍ·½ÖªµÀ£¬ÊÇ·¢³öÈ¥µÄ°ü¶ªÁË£¬»¹ÊÇ»ØÀ´µÄACK°ü¶ªÁË¡£
2£©ÊDz»ÊÇ×Ô¼ºµÄtimeout̫СÁË£¬µ¼ÖÂÖØ´«¡£
3£©ÍøÂçÉϳöÏÖÁËÏÈ·¢µÄ°üºóµ½µÄÇé¿ö£¨ÓÖ³Æreordering£©
4£©ÍøÂçÉÏÊDz»ÊǰÑÎÒµÄÊý¾Ý°ü¸ø¸´ÖÆÁË¡£
ÖªµÀÕâЩ¶«Î÷¿ÉÒԺܺõðïÖúTCPÁ˽âÍøÂçÇé¿ö£¬´Ó¶ø¿ÉÒÔ¸üºÃµÄ×öÍøÂçÉϵÄÁ÷¿Ø¡£
LinuxϵÄtcp_dsack²ÎÊýÓÃÓÚ¿ªÆôÕâ¸ö¹¦ÄÜ£¨Linux 2.4ºóĬÈÏ´ò¿ª£©
ºÃÁË£¬ÉÏÆª¾Íµ½ÕâÀï½áÊøÁË¡£ |