è®°å¾åæ¯ä¸æ¾å·¥ä½é¢è¯çæ¶åï¼ç»å¸¸ä¼è¢«é®å°ï¼ä½ ç¥éâ3次æ¡æï¼4次æ¥æâåï¼è¿æ¶åæä¼âè¸ææ竹âå°âè诵âåæåå¤å¥½çâçæ¡âï¼ç¬¬ä¸æ¬¡æä¹æä¹ï¼ç¬¬äºæ¬¡â¦â¦çå®å°±æ²¡æä¸æäºï¼é¢è¯å®è²ä¼¼ä¹æ²¡ææ·±å
¥ä¸å»çææï¼æ·±å
¥ä¸å»æä¹ä¸æï¼ç大欢åï¼
ä½ä¸ºç¨åºåï¼è¦æâå¨æ ¹é®åºâçç²¾ç¥ãç¥å ¶ç¶ï¼æ´è¦ç¥å ¶æ以ç¶ãè¿ç¯æç« å¸æè½æ½ä¸å¥è§ï¼è¿åèåçåçã
为äºä¾¿äºæ´ä½ææ¡æç« ï¼æå¨å ä¸æç« ç®å½ï¼
ä»ä¹æ¯â3次æ¡æï¼4次æ¥æâ
TCPæ¯ä¸ç§é¢åè¿æ¥çåæåè®®ï¼å¨åéæ°æ®åï¼éä¿¡åæ¹å¿ é¡»å¨å½¼æ¤é´å»ºç«ä¸æ¡è¿æ¥ãæè°çâè¿æ¥âï¼å ¶å®æ¯å®¢æ·ç«¯åæå¡å¨çå åéä¿åçä¸ä»½å ³äºå¯¹æ¹çä¿¡æ¯ï¼å¦ipå°åã端å£å·çã
TCPå¯ä»¥çææ¯ä¸ç§åèæµï¼å®ä¼å¤çIPå±æ以ä¸çå±ç丢å ãéå¤ä»¥åé误é®é¢ãå¨è¿æ¥ç建ç«è¿ç¨ä¸ï¼åæ¹éè¦äº¤æ¢ä¸äºè¿æ¥çåæ°ãè¿äºåæ°å¯ä»¥æ¾å¨TCP头é¨ã
TCPæä¾äºä¸ç§å¯é ãé¢åè¿æ¥ãåèæµãä¼ è¾å±çæå¡ï¼éç¨ä¸æ¬¡æ¡æ建ç«ä¸ä¸ªè¿æ¥ãéç¨4次æ¥ææ¥å ³éä¸ä¸ªè¿æ¥ã
TCPæå¡æ¨¡å
å¨äºè§£äºå»ºç«è¿æ¥ãå ³éè¿æ¥çâä¸æ¬¡æ¡æåå次æ¥æâåï¼æ们åæ¥çä¸TCPç¸å ³çä¸è¥¿ã
ä¸ä¸ªTCPè¿æ¥ç±ä¸ä¸ª4å ç»ææï¼åå«æ¯ä¸¤ä¸ªIPå°åå两个端å£å·ãä¸ä¸ªTCPè¿æ¥é常å为ä¸ä¸ªé¶æ®µï¼å¯å¨ãæ°æ®ä¼ è¾ãéåºï¼å ³éï¼ã
å½TCPæ¥æ¶å°å¦ä¸ç«¯çæ°æ®æ¶ï¼å®ä¼åéä¸ä¸ªç¡®è®¤ï¼ä½è¿ä¸ªç¡®è®¤ä¸ä¼ç«å³åéï¼ä¸è¬ä¼å»¶è¿ä¸ä¼å¿ãACKæ¯ç´¯ç§¯çï¼ä¸ä¸ªç¡®è®¤åèå·NçACK表示ææç´å°Nçåèï¼ä¸å æ¬Nï¼å·²ç»æå被æ¥æ¶äºãè¿æ ·ç好å¤æ¯å¦æä¸ä¸ªACK丢失ï¼å¾å¯è½åç»çACK就足以确认åé¢çæ¥æ段äºã
ä¸ä¸ªå®æ´çTCPè¿æ¥æ¯ååå对称çï¼æ°æ®å¯ä»¥å¨ä¸¤ä¸ªæ¹åä¸å¹³çå°æµå¨ãç»ä¸å±åºç¨ç¨åºæä¾ä¸ç§åå·¥æå¡
ãä¸æ¦å»ºç«äºä¸ä¸ªè¿æ¥ï¼è¿ä¸ªè¿æ¥çä¸ä¸ªæ¹åä¸çæ¯ä¸ªTCPæ¥æ段é½å
å«äºç¸åæ¹åä¸çæ¥æ段çä¸ä¸ªACKã
åºåå·çä½ç¨æ¯ä½¿å¾ä¸ä¸ªTCPæ¥æ¶ç«¯å¯ä¸¢å¼éå¤çæ¥æ段ï¼è®°å½ä»¥æ乱次åºå°è¾¾çæ¥æ段ãå 为TCP使ç¨IPæ¥ä¼ è¾æ¥æ段ï¼èIPä¸æä¾éå¤æ¶é¤æè ä¿è¯æ¬¡åºæ£ç¡®çåè½ãå¦ä¸æ¹é¢ï¼TCPæ¯ä¸ä¸ªåèæµåè®®ï¼ç»ä¸ä¼ä»¥æä¹±ç次åºç»ä¸å±ç¨åºåéæ°æ®ãå æ¤TCPæ¥æ¶ç«¯ä¼è¢«è¿«å ä¿æ大åºåå·çæ°æ®ä¸äº¤ç»åºç¨ç¨åºï¼ç´å°ç¼ºå¤±çå°åºåå·çæ¥æ段被填满ã
TCP头é¨
æºç«¯å£åç®ç端å£å¨TCPå±ç¡®å®åæ¹è¿ç¨ï¼åºåå·è¡¨ç¤ºçæ¯æ¥æ段æ°æ®ä¸ç第ä¸ä¸ªåèå·ï¼ACK表示确认å·ï¼è¯¥ç¡®è®¤å·çåéæ¹æå¾
æ¥æ¶çä¸ä¸ä¸ªåºåå·ï¼å³æå被æåæ¥æ¶çæ°æ®åèåºåå·å 1ï¼è¿ä¸ªå段åªæå¨ACKä½è¢«å¯ç¨çæ¶åæææã
å½æ°å»ºä¸ä¸ªè¿æ¥æ¶ï¼ä»å®¢æ·ç«¯åéå°æå¡ç«¯ç第ä¸ä¸ªæ¥æ段çSYNä½è¢«å¯ç¨ï¼è¿ç§°ä¸ºSYNæ¥æ段ï¼è¿æ¶åºåå·å段å
å«äºå¨æ¬æ¬¡è¿æ¥çè¿ä¸ªæ¹åä¸è¦ä½¿ç¨ç第ä¸ä¸ªåºåå·ï¼å³åå§åºåå·ISN
ï¼ä¹ååéçæ°æ®æ¯ISNå 1ï¼å æ¤SYNä½å段ä¼æ¶è
ä¸ä¸ªåºåå·ï¼è¿æå³ç使ç¨éä¼ è¿è¡å¯é ä¼ è¾ãèä¸æ¶èåºåå·çACKåä¸æ¯ã
头é¨é¿åº¦ï¼å¾ä¸çæ°æ®å移ï¼ä»¥32ä½å为åä½ï¼ä¹å°±æ¯ä»¥4bytes为åä½ï¼å®åªæ4ä½ï¼æ大为15ï¼å æ¤å¤´é¨æ大é¿åº¦ä¸º60åèï¼èå ¶æå°ä¸º5ï¼ä¹å°±æ¯å¤´é¨æå°ä¸º20åèï¼å¯åé项为空ï¼ã
ACK ââ 确认ï¼ä½¿å¾ç¡®è®¤å·ææã RST ââ éç½®è¿æ¥ï¼ç»å¸¸çå°çreset by peerï¼å°±æ¯æ¤å段æç鬼ã SYN ââ ç¨äºåå¦åä¸ä¸ªè¿æ¥çåºåå·ã FIN ââ 该æ¥æ段çåéæ¹å·²ç»ç»æå对æ¹åéæ°æ®ã
å½ä¸ä¸ªè¿æ¥è¢«å»ºç«æ被ç»æ¢æ¶ï¼äº¤æ¢çæ¥æ段åªå å«TCP头é¨ï¼è没ææ°æ®ã
ç¶æ转æ¢
ä¸æ¬¡æ¡æåå次æ¥æçç¶æ转æ¢å¦ä¸å¾ã
为ä»ä¹è¦âä¸æ¬¡æ¡æï¼å次æ¥æâ
ä¸æ¬¡æ¡æ
æ¢ä¸ªæäºç解çè§è§æ¥ç为ä»ä¹è¦3次æ¡æã
客æ·ç«¯åæå¡ç«¯éä¿¡åè¦è¿è¡è¿æ¥ï¼â3次æ¡æâçä½ç¨å°±æ¯åæ¹é½è½æç¡®èªå·±å对æ¹çæ¶ãåè½åæ¯æ£å¸¸ç
ã
第ä¸æ¬¡æ¡æ
ï¼å®¢æ·ç«¯åéç½ç»å
ï¼æå¡ç«¯æ¶å°äºãè¿æ ·æå¡ç«¯å°±è½å¾åºç»è®ºï¼å®¢æ·ç«¯çåéè½åãæå¡ç«¯çæ¥æ¶è½åæ¯æ£å¸¸çã
第äºæ¬¡æ¡æ
ï¼æå¡ç«¯åå
ï¼å®¢æ·ç«¯æ¶å°äºãè¿æ ·å®¢æ·ç«¯å°±è½å¾åºç»è®ºï¼æå¡ç«¯çæ¥æ¶ãåéè½åï¼å®¢æ·ç«¯çæ¥æ¶ãåéè½åæ¯æ£å¸¸çã ä»å®¢æ·ç«¯çè§è§æ¥çï¼ææ¥å°äºæå¡ç«¯åéè¿æ¥çååºæ°æ®å
ï¼è¯´ææå¡ç«¯æ¥æ¶å°äºæå¨ç¬¬ä¸æ¬¡æ¡ææ¶åéçç½ç»å
ï¼å¹¶ä¸æååéäºååºæ°æ®å
ï¼è¿å°±è¯´æï¼æå¡ç«¯çæ¥æ¶ãåéè½åæ£å¸¸ãèå¦ä¸æ¹é¢ï¼ææ¶å°äºæå¡ç«¯çååºæ°æ®å
ï¼è¯´ææ第ä¸æ¬¡åéçç½ç»å
æåå°è¾¾æå¡ç«¯ï¼è¿æ ·ï¼æèªå·±çåéåæ¥æ¶è½åä¹æ¯æ£å¸¸çã
第ä¸æ¬¡æ¡æ
ï¼å®¢æ·ç«¯åå
ï¼æå¡ç«¯æ¶å°äºãè¿æ ·æå¡ç«¯å°±è½å¾åºç»è®ºï¼å®¢æ·ç«¯çæ¥æ¶ãåéè½åï¼æå¡ç«¯çåéãæ¥æ¶è½åæ¯æ£å¸¸çã 第ä¸ãäºæ¬¡æ¡æåï¼æå¡ç«¯å¹¶ä¸ç¥é客æ·ç«¯çæ¥æ¶è½å以åèªå·±çåéè½åæ¯å¦æ£å¸¸ãèå¨ç¬¬ä¸æ¬¡æ¡ææ¶ï¼æå¡ç«¯æ¶å°äºå®¢æ·ç«¯å¯¹ç¬¬äºæ¬¡æ¡æä½çååºãä»æå¡ç«¯çè§åº¦ï¼æå¨ç¬¬äºæ¬¡æ¡ææ¶çååºæ°æ®åéåºå»äºï¼å®¢æ·ç«¯æ¥æ¶å°äºãæ以ï¼æçåéè½åæ¯æ£å¸¸çãè客æ·ç«¯çæ¥æ¶è½åä¹æ¯æ£å¸¸çã
ç»åäºä¸é¢çä¸æ¬¡æ¡æè¿ç¨ï¼å®¢æ·ç«¯åæå¡ç«¯é½ç¡®è®¤äºèªå·±çæ¥æ¶ãåéè½åæ¯æ£å¸¸çãä¹åå°±å¯ä»¥æ£å¸¸éä¿¡äºã
æ¯æ¬¡é½æ¯æ¥æ¶å°æ°æ®å çä¸æ¹å¯ä»¥å¾å°ä¸äºç»è®ºï¼åéçä¸æ¹å ¶å®æ²¡æä»»ä½å¤´ç»ªãæè½ç¶æåå çå¨ä½ï¼ä½æ¯ææä¹ç¥éææ没æååºå»ï¼è对æ¹æ没ææ¥æ¶å°å¢ï¼
èä»ä¸é¢çè¿ç¨å¯ä»¥çå°ï¼æå°æ¯éè¦ä¸æ¬¡æ¡æè¿ç¨çã两次达ä¸å°è®©åæ¹é½å¾åºèªå·±ã对æ¹çæ¥æ¶ãåéè½åé½æ£å¸¸çç»è®ºãå ¶å®æ¯æ¬¡æ¶å°ç½ç»å çä¸æ¹è³å°æ¯å¯ä»¥å¾å°ï¼å¯¹æ¹çåéãææ¹çæ¥æ¶æ¯æ£å¸¸çãèæ¯ä¸æ¥é½æ¯æå ³èçï¼ä¸ä¸æ¬¡çâååºâæ¯ç±äºç¬¬ä¸æ¬¡çâ请æ±â触åï¼å æ¤æ¯æ¬¡æ¡æå ¶å®æ¯å¯ä»¥å¾å°é¢å¤çç»è®ºçãæ¯å¦ç¬¬ä¸æ¬¡æ¡ææ¶ï¼æå¡ç«¯æ¶å°æ°æ®å ï¼è¡¨æçæå¡ç«¯åªè½å¾å°å®¢æ·ç«¯çåéè½åãæå¡ç«¯çæ¥æ¶è½åæ¯æ£å¸¸çï¼ä½æ¯ç»å第äºæ¬¡ï¼è¯´ææå¡ç«¯å¨ç¬¬äºæ¬¡åéçååºå ï¼å®¢æ·ç«¯æ¥æ¶å°äºï¼å¹¶ä¸ä½åºäºååºï¼ä»èå¾å°é¢å¤çç»è®ºï¼å®¢æ·ç«¯çæ¥æ¶ãæå¡ç«¯çåéæ¯æ£å¸¸çã
ç¨è¡¨æ ¼æ»ç»ä¸ä¸ï¼
å次æ¥æ
TCPè¿æ¥æ¯ååä¼ è¾ç对çç模å¼ï¼å°±æ¯è¯´åæ¹é½å¯ä»¥åæ¶å对æ¹åéææ¥æ¶æ°æ®ãå½æä¸æ¹è¦å
³éè¿æ¥æ¶ï¼ä¼åéæ令åç¥å¯¹æ¹ï¼æè¦å
³éè¿æ¥äºãè¿æ¶å¯¹æ¹ä¼åä¸ä¸ªACKï¼æ¤æ¶ä¸ä¸ªæ¹åçè¿æ¥å
³éãä½æ¯å¦ä¸ä¸ªæ¹åä»ç¶å¯ä»¥ç»§ç»ä¼ è¾æ°æ®ï¼çå°åéå®äºææçæ°æ®åï¼ä¼åéä¸ä¸ªFIN段æ¥å
³éæ¤æ¹åä¸çè¿æ¥ãæ¥æ¶æ¹åéACK确认å
³éè¿æ¥ã注æï¼æ¥æ¶å°FINæ¥æçä¸æ¹åªè½åå¤ä¸ä¸ªACK, å®æ¯æ æ³é©¬ä¸è¿å对æ¹ä¸ä¸ªFINæ¥æ段çï¼å 为ç»ææ°æ®ä¼ è¾çâæ令âæ¯ä¸å±åºç¨å±ç»åºçï¼æåªæ¯ä¸ä¸ªâæ¬è¿å·¥âï¼ææ æ³äºè§£âä¸å±çæå¿â
ã
âä¸æ¬¡æ¡æï¼å次æ¥æâæä¹å®æï¼
å ¶å®3次æ¡æçç®ç并ä¸åªæ¯è®©éä¿¡åæ¹é½äºè§£å°ä¸ä¸ªè¿æ¥æ£å¨å»ºç«ï¼è¿å¨äºå©ç¨æ°æ®å çé项æ¥ä¼ è¾ç¹æ®çä¿¡æ¯ï¼äº¤æ¢åå§åºåå·ISNã
3次æ¡ææ¯æåéäº3个æ¥æ段ï¼4次æ¥ææ¯æåéäº4个æ¥æ段ã注æï¼SYNåFIN段é½æ¯ä¼å©ç¨éä¼ è¿è¡å¯é ä¼ è¾çã
ä¸æ¬¡æ¡æ
客æ·ç«¯åéä¸ä¸ªSYN段ï¼å¹¶ææ客æ·ç«¯çåå§åºåå·ï¼å³ISN(c).
æå¡ç«¯åéèªå·±çSYN段ä½ä¸ºåºçï¼åæ ·ææèªå·±çISN(s)ã为äºç¡®è®¤å®¢æ·ç«¯çSYNï¼å°ISN(c)+1ä½ä¸ºACKæ°å¼ãè¿æ ·ï¼æ¯åéä¸ä¸ªSYNï¼åºåå·å°±ä¼å 1. å¦ææ丢失çæ åµï¼åä¼éä¼ ã
为äºç¡®è®¤æå¡å¨ç«¯çSYNï¼å®¢æ·ç«¯å°ISN(s)+1ä½ä¸ºè¿åçACKæ°å¼ã
å次æ¥æ
1. 客æ·ç«¯åéä¸ä¸ªFIN段ï¼å¹¶å å«ä¸ä¸ªå¸ææ¥æ¶è çå°çèªå·±å½åçåºåå·K. åæ¶è¿å å«ä¸ä¸ªACK表示确认对æ¹æè¿ä¸æ¬¡åè¿æ¥çæ°æ®ãÂ
2. æå¡ç«¯å°Kå¼å 1ä½ä¸ºACKåºå·å¼ï¼è¡¨ææ¶å°äºä¸ä¸ä¸ªå ãè¿æ¶ä¸å±çåºç¨ç¨åºä¼è¢«åç¥å¦ä¸ç«¯åèµ·äºå ³éæä½ï¼é常è¿å°å¼èµ·åºç¨ç¨åºåèµ·èªå·±çå ³éæä½ã
3. æå¡ç«¯åèµ·èªå·±çFIN段ï¼ACK=K+1, Seq=L 4. 客æ·ç«¯ç¡®è®¤ãACK=L+1
为ä»ä¹å»ºç«è¿æ¥æ¯ä¸æ¬¡æ¡æï¼èå ³éè¿æ¥å´æ¯å次æ¥æå¢ï¼
è¿æ¯å 为æå¡ç«¯å¨LISTENç¶æä¸ï¼æ¶å°å»ºç«è¿æ¥è¯·æ±çSYNæ¥æåï¼æACKåSYNæ¾å¨ä¸ä¸ªæ¥æéåéç»å®¢æ·ç«¯ãèå ³éè¿æ¥æ¶ï¼å½æ¶å°å¯¹æ¹çFINæ¥ææ¶ï¼ä» ä» è¡¨ç¤ºå¯¹æ¹ä¸ååéæ°æ®äºä½æ¯è¿è½æ¥æ¶æ°æ®ï¼å·±æ¹æ¯å¦ç°å¨å ³éåéæ°æ®ééï¼éè¦ä¸å±åºç¨æ¥å³å®ï¼å æ¤ï¼å·±æ¹ACKåFINä¸è¬é½ä¼åå¼åéã
âä¸æ¬¡æ¡æï¼å次æ¥æâè¿é¶
ISN
ä¸æ¬¡æ¡æçä¸ä¸ªéè¦åè½æ¯å®¢æ·ç«¯åæå¡ç«¯äº¤æ¢ISN(Initial Sequence Number), 以便让对æ¹ç¥éæ¥ä¸æ¥æ¥æ¶æ°æ®çæ¶åå¦ä½æåºåå·ç»è£ æ°æ®ã
å¦æISNæ¯åºå®çï¼æ»å»è å¾å®¹æçåºåç»ç确认å·ã
Mæ¯ä¸ä¸ªè®¡æ¶å¨ï¼æ¯é4å¾®ç§å 1ã Fæ¯ä¸ä¸ªHashç®æ³ï¼æ ¹æ®æºIPãç®çIPãæºç«¯å£ãç®ç端å£çæä¸ä¸ªéæºæ°å¼ãè¦ä¿è¯hashç®æ³ä¸è½è¢«å¤é¨è½»ææ¨ç®å¾åºã
åºåå·åç»
å 为ISNæ¯éæºçï¼æ以åºåå·å®¹æå°±ä¼è¶ è¿2^31-1. ètcp对äºä¸¢å åä¹±åºçé®é¢çå¤æé½æ¯ä¾èµäºåºåå·å¤§å°æ¯è¾çãæ¤æ¶å°±åºç°äºæè°çtcpåºåå·åç»ï¼sequence wraparoundï¼é®é¢ãæä¹è§£å³ï¼
ä¸è¿°ä»£ç æ¯å æ ¸ä¸ç解å³åç»é®é¢ä»£ç ãs32æ¯æ符å·æ´åçææï¼èu32åæ¯æ 符å·æ´åãåºåå·åçåç»åï¼åºåå·åå°ï¼ç¸åä¹åï¼æç»æåææ符å·æ°äºï¼å æ¤ç»ææäºè´æ°ã
syn floodæ»å»
æåºæ¬çDoSæ»å»å°±æ¯å©ç¨åççæå¡è¯·æ±æ¥å ç¨è¿å¤çæå¡èµæºï¼ä»è使åæ³ç¨æ·æ æ³å¾å°æå¡çååºãsyn floodå±äºDosæ»å»çä¸ç§ã
å¦ææ¶æçåæ个æå¡å¨ç«¯å£åé大éçSYNå ï¼åå¯ä»¥ä½¿æå¡å¨æå¼å¤§éçåå¼è¿æ¥ï¼åé TCBï¼Transmission Control Blockï¼, ä»èæ¶è大éçæå¡å¨èµæºï¼åæ¶ä¹ä½¿å¾æ£å¸¸çè¿æ¥è¯·æ±æ æ³è¢«ç¸åºãå½å¼æ¾äºä¸ä¸ªTCP端å£åï¼è¯¥ç«¯å£å°±å¤äºListeningç¶æï¼ä¸åå°çè§åå°è¯¥ç«¯å£çSynæ¥æï¼ä¸ æ¦æ¥æ¶å°Clientåæ¥çSynæ¥æï¼å°±éè¦ä¸ºè¯¥è¯·æ±åé ä¸ä¸ªTCBï¼é常ä¸ä¸ªTCBè³å°éè¦280个åèï¼å¨æäºæä½ç³»ç»ä¸TCBçè³éè¦1300个åèï¼å¹¶è¿åä¸ä¸ªSYN ACKå½ä»¤ï¼ç«å³è½¬ä¸ºSYN-RECEIVEDå³åå¼è¿æ¥ç¶æãç³»ç»ä¼ä¸ºæ¤èå°½èµæºã
常è§çé²æ»å»æ¹æ³æï¼
æ æè¿æ¥ççè§éæ¾
çè§ç³»ç»çåå¼è¿æ¥åä¸æ´»å¨è¿æ¥ï¼å½è¾¾å°ä¸å®éå¼æ¶æé¤è¿äºè¿æ¥ï¼ä»èéæ¾ç³»ç»èµæºãè¿ç§æ¹æ³å¯¹äºææçè¿æ¥ä¸è§åä»ï¼èä¸ç±äºSYN Floodé æçåå¼è¿æ¥æ°éå¾å¤§ï¼æ£å¸¸è¿æ¥è¯·æ±ä¹è¢«æ·¹æ²¡å¨å ¶ä¸è¢«è¿ç§æ¹å¼è¯¯éæ¾æï¼å æ¤è¿ç§æ¹æ³å±äºå ¥é¨çº§çSYN Floodæ¹æ³ã
延ç¼TCBåé æ¹æ³
æ¶èæå¡å¨èµæºä¸»è¦æ¯å 为å½SYNæ°æ®æ¥æä¸å°è¾¾ï¼ç³»ç»ç«å³åé TCBï¼ä»èå ç¨äºèµæºãèSYN Floodç±äºå¾é¾å»ºç«èµ·æ£å¸¸è¿æ¥ï¼å æ¤ï¼å½æ£å¸¸è¿æ¥å»ºç«èµ·æ¥åååé TCBåå¯ä»¥ææå°åè½»æå¡å¨èµæºçæ¶èã常è§çæ¹æ³æ¯ä½¿ç¨Syn CacheåSyn Cookieææ¯ã
Syn Cacheææ¯
ç³»ç»å¨æ¶å°ä¸ä¸ªSYNæ¥ææ¶ï¼å¨ä¸ä¸ªä¸ç¨HASH表ä¸ä¿åè¿ç§åè¿æ¥ä¿¡æ¯ï¼ç´å°æ¶å°æ£ç¡®çååºACKæ¥æååé TCBãè¿ä¸ªå¼éè¿å°äºTCBçå¼éãå½ç¶è¿éè¦ä¿ååºåå·ã
Syn Cookieææ¯
Syn Cookieææ¯åå®å ¨ä¸ä½¿ç¨ä»»ä½åå¨èµæºï¼è¿ç§æ¹æ³æ¯è¾å·§å¦ï¼å®ä½¿ç¨ä¸ç§ç¹æ®çç®æ³çæSequence Numberï¼è¿ç§ç®æ³èèå°äºå¯¹æ¹çIPã端å£ãå·±æ¹IPã端å£çåºå®ä¿¡æ¯ï¼ä»¥å对æ¹æ æ³ç¥éèå·±æ¹æ¯è¾åºå®çä¸äºä¿¡æ¯ï¼å¦MSS(Maximum Segment Sizeï¼æ大æ¥æ段大å°ï¼æçæ¯TCPæ¥æçæ大æ°æ®æ¥é¿åº¦ï¼å ¶ä¸ä¸å æ¬TCPé¦é¨é¿åº¦ã)ãæ¶é´çï¼å¨æ¶å°å¯¹æ¹ çACKæ¥æåï¼éæ°è®¡ç®ä¸éï¼çå ¶æ¯å¦ä¸å¯¹æ¹ååºæ¥æä¸çï¼Sequence Number-1ï¼ç¸åï¼ä»èå³å®æ¯å¦åé TCBèµæºã
使ç¨SYN Proxyé²ç«å¢
ä¸ç§æ¹å¼æ¯é²æ¢å¢dqywbè¿æ¥çæææ§åï¼é²ç«å¢æä¼åå é¨æå¡å¨åèµ·SYN请æ±ãé²ç«å¢ä»£æå¡å¨ååºçSYN ACKå 使ç¨çåºåå·ä¸ºc, èçæ£çæå¡å¨ååºçåºåå·ä¸ºc', è¿æ ·ï¼å¨æ¯ä¸ªæ°æ®æ¥æç»è¿é²ç«å¢çæ¶åè¿è¡åºåå·çä¿®æ¹ãå¦ä¸ç§æ¹å¼æ¯é²ç«å¢ç¡®å®äºè¿æ¥çå®å ¨åï¼ä¼ååºä¸ä¸ªsafe resetå½ä»¤ï¼clientä¼è¿è¡éæ°è¿æ¥ï¼è¿æ¶åºç°çsynæ¥æä¼ç´æ¥æ¾è¡ãè¿æ ·ä¸éè¦ä¿®æ¹åºåå·äºãä½æ¯ï¼clientéè¦å起两次æ¡æè¿ç¨ï¼å æ¤å»ºç«è¿æ¥çæ¶é´å°ä¼å»¶é¿ã
è¿æ¥éå
å¨å¤é¨è¯·æ±å°è¾¾æ¶ï¼è¢«æå¡ç¨åºæç»æç¥å°åï¼è¿æ¥å¯è½å¤äºSYN_RCVDç¶æææ¯ESTABLISHEDç¶æï¼ä½è¿æªè¢«åºç¨ç¨åºæ¥åã
对åºå°ï¼æå¡å¨ç«¯ä¹ä¼ç»´æ¤ä¸¤ç§éåï¼å¤äºSYN_RCVDç¶æçåè¿æ¥éåï¼èå¤äºESTABLISHEDç¶æä½ä»æªè¢«åºç¨ç¨åºacceptçä¸ºå ¨è¿æ¥éåãå¦æè¿ä¸¤ä¸ªéå满äºä¹åï¼å°±ä¼åºç°åç§ä¸¢å çæ å½¢ã
åè¿æ¥éå满äº
å¨ä¸æ¬¡æ¡æåè®®ä¸ï¼æå¡å¨ç»´æ¤ä¸ä¸ªåè¿æ¥éåï¼è¯¥éå为æ¯ä¸ªå®¢æ·ç«¯çSYNå å¼è®¾ä¸ä¸ªæ¡ç®(æå¡ç«¯å¨æ¥æ¶å°SYNå çæ¶åï¼å°±å·²ç»å建äºrequest_sockç»æï¼åå¨å¨åè¿æ¥éåä¸)ï¼è¯¥æ¡ç®è¡¨ææå¡å¨å·²æ¶å°SYNå ï¼å¹¶å客æ·ååºç¡®è®¤ï¼æ£å¨çå¾ å®¢æ·ç确认å ãè¿äºæ¡ç®ææ è¯çè¿æ¥å¨æå¡å¨å¤äºSyn_RECVç¶æï¼å½æå¡å¨æ¶å°å®¢æ·ç确认å æ¶ï¼å é¤è¯¥æ¡ç®ï¼æå¡å¨è¿å ¥ESTABLISHEDç¶æã
ç®åï¼Linuxä¸é»è®¤ä¼è¿è¡5次éåSYN-ACKå ï¼éè¯çé´éæ¶é´ä»1så¼å§ï¼ä¸æ¬¡çéè¯é´éæ¶é´æ¯åä¸æ¬¡çååï¼5次çéè¯æ¶é´é´é为1s, 2s, 4s, 8s, 16s, æ»å ±31s, 称为ææ°éé¿
ï¼ç¬¬5次ååºåè¿è¦ç32sæç¥é第5次ä¹è¶ æ¶äºï¼æ以ï¼æ»å ±éè¦ 1s + 2s + 4s+ 8s+ 16s + 32s = 63s, TCPæä¼ææå¼è¿ä¸ªè¿æ¥ãç±äºï¼SYNè¶ æ¶éè¦63ç§ï¼é£ä¹å°±ç»æ»å»è ä¸ä¸ªæ»å»æå¡å¨çæºä¼ï¼æ»å»è å¨çæ¶é´å åé大éçSYNå ç»Server(ä¿ç§°SYN floodæ»å»)ï¼ç¨äºèå°½ServerçSYNéåã对äºåºå¯¹SYN è¿å¤çé®é¢ï¼linuxæä¾äºå 个TCPåæ°ï¼tcp_syncookiesãtcp_synack_retriesãtcp_max_syn_backlogãtcp_abort_on_overflow æ¥è°æ´åºå¯¹ã
å ¨è¿æ¥éå满
å½ç¬¬ä¸æ¬¡æ¡ææ¶ï¼å½serveræ¥æ¶å°ACKå ä¹åï¼ä¼è¿å ¥ä¸ä¸ªæ°çå« accept çéåã
å½acceptéå满äºä¹åï¼å³ä½¿client继ç»åserveråéACKçå
ï¼ä¹ä¼ä¸è¢«ååºï¼æ¤æ¶ListenOverflows+1ï¼åæ¶serveréè¿tcp_abort_on_overflowæ¥å³å®å¦ä½è¿åï¼0表示ç´æ¥ä¸¢å¼è¯¥ACKï¼1表示åéRSTéç¥clientï¼ç¸åºçï¼clientåä¼åå«è¿åread timeout
 æè
 connection reset by peer
ãå¦å¤ï¼tcp_abort_on_overflowæ¯0çè¯ï¼serverè¿ä¸æ®µæ¶é´å次åésyn+ackç»clientï¼ä¹å°±æ¯éæ°èµ°æ¡æç第äºæ¥ï¼ï¼å¦æclientè¶
æ¶çå¾
æ¯è¾çï¼å°±å¾å®¹æå¼å¸¸äºãè客æ·ç«¯æ¶å°å¤ä¸ª SYN ACK å
ï¼åä¼è®¤ä¸ºä¹åç ACK 丢å
äºãäºæ¯ä¿ä½¿å®¢æ·ç«¯å次åé ACK ï¼å¨ acceptéåæ空é²çæ¶åæç»å®æè¿æ¥ãè¥ acceptéåå§ç»æ»¡åï¼åæç»å®¢æ·ç«¯æ¶å° RST å
ï¼æ¤æ¶æå¡ç«¯åésyn+ackç次æ°è¶
åºäºtcp_synack_retriesï¼ã
æå¡ç«¯ä» ä» åªæ¯å建ä¸ä¸ªå®æ¶å¨ï¼ä»¥åºå®é´ééä¼ synåackå°æå¡ç«¯
å½ä»¤
netstat -så½ä»¤
[root@server ~]# netstat -s | egrep "listen|LISTEN"Âä¸é¢çå°ç 667399 times ï¼è¡¨ç¤ºå ¨è¿æ¥éå溢åºç次æ°ï¼éå ç§éæ§è¡ä¸ï¼å¦æè¿ä¸ªæ°åä¸ç´å¨å¢å çè¯è¯å®å ¨è¿æ¥éåå¶å°æ»¡äºã
[root@server ~]# netstat -s | grep TCPBacklogDropÂæ¥ç Accept queue æ¯å¦æ溢åº
sså½ä»¤
[root@server ~]# ss -lnt
å¦æStateæ¯listenç¶æï¼Send-Q 表示第ä¸åçlisten端å£ä¸çå ¨è¿æ¥éåæ大为50ï¼ç¬¬ä¸åRecv-Qä¸ºå ¨è¿æ¥éåå½å使ç¨äºå¤å°ã é LISTEN ç¶æä¸ Recv-Q 表示 receive queue ä¸ç bytes æ°éï¼Send-Q 表示 send queue ä¸ç bytes æ°å¼ã
å°ç»
å½å¤é¨è¿æ¥è¯·æ±å°æ¥æ¶ï¼TCP模åä¼é¦å æ¥çmax_syn_backlogï¼å¦æå¤äºSYN_RCVDç¶æçè¿æ¥æ°ç®è¶ è¿è¿ä¸éå¼ï¼è¿å ¥çè¿æ¥ä¼è¢«æç»ãæ ¹æ®tcp_abort_on_overflowå段æ¥å³å®æ¯ç´æ¥ä¸¢å¼ï¼è¿æ¯ç´æ¥reset.
ä»æå¡ç«¯æ¥è¯´ï¼ä¸æ¬¡æ¡æä¸ï¼ç¬¬ä¸æ¥serveræ¥åå°clientçsynåï¼æç¸å ³ä¿¡æ¯æ¾å°åè¿æ¥éåä¸ï¼åæ¶åå¤syn+ackç»client. 第ä¸æ¥å½æ¶å°å®¢æ·ç«¯çack, å°è¿æ¥å å ¥å°å ¨è¿æ¥éåã
ä¸è¬ï¼å ¨è¿æ¥éåæ¯è¾å°ï¼ä¼å 满ï¼æ¤æ¶åè¿æ¥éåè¿æ²¡æ»¡ãå¦æè¿æ¶æ¶å°synæ¥æï¼åä¼è¿å ¥åè¿æ¥éåï¼æ²¡æé®é¢ãä½æ¯å¦ææ¶å°äºä¸æ¬¡æ¡æä¸ç第3æ¥(ACK)ï¼åä¼æ ¹æ®tcp_abort_on_overflowå段æ¥å³å®æ¯ç´æ¥ä¸¢å¼ï¼è¿æ¯ç´æ¥reset.æ¤æ¶ï¼å®¢æ·ç«¯åéäºACK, é£ä¹å®¢æ·ç«¯è®¤ä¸ºä¸æ¬¡æ¡æå®æï¼å®è®¤ä¸ºæå¡ç«¯å·²ç»åå¤å¥½äºæ¥æ¶æ°æ®çåå¤ãä½æ¤æ¶æå¡ç«¯å¯è½å ä¸ºå ¨è¿æ¥éå满äºèæ æ³å°è¿æ¥æ¾å ¥ï¼ä¼éæ°åé第2æ¥çsyn+ack, å¦æè¿æ¶ææ°æ®å°æ¥ï¼æå¡å¨TCP模åä¼å°æ°æ®åå ¥éåä¸ãä¸æ®µæ¶é´åï¼client端没æ¶å°åå¤ï¼è¶ æ¶ï¼è¿æ¥å¼å¸¸ï¼clientä¼ä¸»å¨å ³éè¿æ¥ã
âä¸æ¬¡æ¡æï¼å次æ¥æârediså®ä¾åæ
æå¨devæºå¨ä¸é¨ç½²redisæå¡ï¼ç«¯å£å·ä¸º6379,
éè¿tcpdumpå·¥å ·è·åæ°æ®å ï¼ä½¿ç¨å¦ä¸å½ä»¤ï¼
å¨dev2æºå¨ä¸ç¨redis-cli访é®dev:6379, åéä¸ä¸ªping, å¾å°åå¤pong
åæ¢æå ï¼ç¨tcpdump读åæè·å°çæ°æ®å
å ±æ¶å°äº7个å ã
æå°çæ¯IPæ°æ®å ï¼IPæ°æ®å å为IP头é¨åIPæ°æ®é¨åï¼IPæ°æ®é¨åæ¯TCP头é¨å TCPæ°æ®é¨åã
IPçæ°æ®æ ¼å¼ä¸ºï¼
å®ç±åºå®é¿åº¦20B+å¯åé¿åº¦ææã
10:55:45.662077 IP dev2.39070 > dev.6379: Flags [S], seq 4133153791, win 29200, options [mss 1460,sackOK,TS val 2959270704 ecr 0,nop,wscale 7], length 0
对çIP头é¨æ ¼å¼ï¼æ¥æ解æ°æ®å çå ·ä½å«ä¹ã
å©ä½çæ°æ®é¨åå³ä¸ºTCPåè®®ç¸å ³çãTCPä¹æ¯20Båºå®é¿åº¦+å¯åé¿åº¦é¨åã
å¯åé¿åº¦é¨åï¼åè®®å¦ä¸ï¼
è¿æ ·ç¬¬ä¸ä¸ªå
åæå®äºãdev2ådevåéSYN请æ±ãä¹å°±æ¯ä¸æ¬¡æ¡æä¸ç第ä¸æ¬¡äºã
 SYN seq(c)=4133153791
第äºä¸ªå
ï¼devååºè¿æ¥ï¼ack=4133153792. 表ædevä¸æ¬¡åå¤æ¥æ¶è¿ä¸ªåºå·çå
ï¼ç¨äºtcpåè注ç顺åºæ§å¶ãdevï¼ä¹å°±æ¯server端ï¼çåå§åºå·ä¸ºseq=4264776963, syn=1. SYN ack=seq(c)+1 seq(s)=4264776963
第ä¸ä¸ªå
ï¼clientå
确认ï¼è¿é使ç¨äºç¸å¯¹å¼åºçãseq=4133153792, çäºç¬¬äºä¸ªå
çack. ack=4264776964. ack=seq(s)+1, seq=seq(c)+1
 è³æ¤ï¼ä¸æ¬¡æ¡æå®æãæ¥ä¸æ¥å°±æ¯åépingåpongçæ°æ®äºã
æ¥ç第å个å ã
10:55:48.090073 IP dev2.39070 > dev.6379: Flags [P.], seq 1:15, ack 1, win 229, options [nop,nop,TS val 2959273132 ecr 3132256230], length 14
tcpé¦é¨é¿åº¦ä¸º32B, å¯éé¿åº¦ä¸º12B. IPæ¥æçæ»é¿åº¦ä¸º66B, é¦é¨é¿åº¦ä¸º20B, å æ¤TCPæ°æ®é¨åé¿åº¦ä¸º14B. seq=0xf65a ec00=4133153792 ACK, PSH. æ°æ®é¨å为2a31 0d0a 2434 0d0a 7069 6e67 0d0a
ISN = M + F(localhost, localport, remotehost, remoteport)
/** The next routines deal with comparing 32 bit unsigned ints * and worry about wraparound (automatic with unsigned arithmetic).*/static inline int before(__u32 seq1, __u32 seq2){
  return (__s32)(seq1-seq2) < 0;}#define after(seq2, seq1) before(seq1, seq2)
å设seq1=255ï¼ seq2=1ï¼åçäºåç»ï¼ã
seq1 = 1111 1111 seq2 = 0000 0001
æ们å¸ææ¯è¾ç»ææ¯
seq1 - seq2=
1111 1111
-0000 0001
-----------
1111 1110
ç±äºæ们å°ç»æ转åæäºæ符å·æ°ï¼ç±äºæé«ä½æ¯1ï¼å æ¤ç»ææ¯ä¸ä¸ªè´æ°ï¼è´æ°çç»å¯¹å¼ä¸º
0000 0001 + 1 = 0000 0010 = 2
å æ¤seq1 - seq2 < 0
æ¥çæ¯å¦æè¿æ¥æº¢åº
netstat -s | grep LISTEN
tcpdump -w /tmp/a.cap port 6379 -s0
-wææ°æ®åå
¥æ件ï¼-s0设置æ¯ä¸ªæ°æ®å
ç大å°é»è®¤ä¸º68åèï¼å¦æç¨-S 0åä¼æå°å®æ´æ°æ®å
tcpdump -r /tmp/a.cap -n -nn -A -x| vim -
ï¼-x 以16è¿å¶å½¢å¼å±ç¤ºï¼ä¾¿äºåé¢åæï¼
0x0000: Â 4500 003c 08cf 4000 3606 14a5 0ab3 b561
0x0010: Â 0a60 5cd4 989e 18eb f65a ebff 0000 0000
0x0020: Â a002 7210 872f 0000 0204 05b4 0402 080a
0x0030: Â b062 e330 0000 0000 0103 0307
0x0000: Â 4500 0042 08d1 4000 3606 149d 0ab3 b561
0x0010: Â 0a60 5cd4 989e 18eb f65a ec00 fe33 5504
0x0020: Â 8018 00e5 4b5f 0000 0101 080a b062 ecac
0x0030: Â bab2 6fe6 2a31 0d0a 2434 0d0a 7069 6e67
0x0040: Â 0d0a
0x2a31 Â Â Â Â -> *1
0x0d0a     -> \r\n
0x2434 Â Â Â Â -> $4
0x0d0a     -> \r\n
0x7069 0x6e67 Â -> ping
0x0d0a     -> \r\n0x2a31     -> *1
0x0d0a     -> \r\n
0x2434 Â Â Â Â -> $4
0x0d0a     -> \r\n
0x7069 0x6e67 Â -> ping
0x0d0a     -> \r\n
dev2ådevåéäºpingæ°æ®ï¼ç¬¬å个å å®æ¯ã
第äºä¸ªå ï¼dev2ådevåéackååºã åºåå·ä¸º0xfe33 5504=4264776964, ack确认å·ä¸º0xf65a ec0e=4133153806=(4133153792+14).
第å
个å
ï¼devådev2ååºpongæ¶æ¯ãåºåå·fe33 5504ï¼ç¡®è®¤å·f65a ec0e, TCP头é¨å¯éé¿åº¦ä¸º12B, IPæ°æ®æ¥æ»é¿åº¦ä¸º59B, é¦é¨é¿åº¦ä¸º20B, å æ¤TCPæ°æ®é¿åº¦ä¸º7B. æ°æ®é¨å2b50 4f4e 470d 0a, ç¿»è¯è¿æ¥å°±æ¯+PONG\r\n
.
è³æ¤ï¼Redis客æ·ç«¯åServer端çä¸æ¬¡æ¡æè¿ç¨åæå®æ¯ã
æ»ç»
âä¸æ¬¡æ¡æï¼å次æ¥æâçä¼¼ç®åï¼ä½æ¯æ·±ç©¶è¿å»ï¼è¿æ¯å¯ä»¥å»¶ä¼¸åºå¾å¤ç¥è¯ç¹çãæ¯å¦åè¿æ¥éåãå ¨è¿æ¥éåççã以åå ³äºTCP建ç«è¿æ¥ãå ³éè¿æ¥çè¿ç¨å¾å®¹æå°±ä¼å¿è®°ï¼å¯è½æ¯å 为åªæ¯æ»è®°ç¡¬èäºå 个è¿ç¨ï¼æ²¡ææ·±å ¥ç 究èåçåçã
æ以ï¼âä¸æ¬¡æ¡æï¼å次æ¥æâä½ ççæäºåï¼
åèèµæ
ãredisãhttps://segmentfault.com/a/1190000015044878
ãtcp optionãhttps://blog.csdn.net/wdscq1234/article/details/52423272
ãæ»å¨çªå£ãhttps://www.zhihu.com/question/32255109
ãå
¨è¿æ¥éåãhttp://jm.taobao.org/2017/05/25/525-1/
ãclient foolingã https://github.com/torvalds/linux/commit/5ea8ea2cb7f1d0db15762c9b0bb9e7330425a071
ãbacklog RECV_Qãhttp://blog.51cto.com/59090939/1947443
ãå®æ¶å¨ãhttps://www.cnblogs.com/menghuanbiao/p/5212131.html
ãéåå¾ç¤ºãhttps://www.itcodemonkey.com/article/5834.html
ãtcp floodæ»å»ãhttps://www.cnblogs.com/hubavyn/p/4477883.html
ãMSS MTUãhttps://blog.csdn.net/LoseInVain/article/details/53694265
注ï¼æ¬æé¦åäºå客å个人å客ï¼
https://www.cnblogs.com/qcrao-2018/p/10182185.html
æ¬æ为ååæç« ï¼è½¬è½½æ³¨æåºå¤ï¼æ¬¢è¿é¿æ以ä¸å¾çå ³æ³¨å ¬ä¼å·CoderPark ï¼ç¬¬ä¸æ¶é´é 读åç»ç²¾å½©æç« ãè§å¾å¥½çè¯ï¼è¯·çå»æç« å³ä¸è§ã好çãï¼æè°¢æ¯æãä¸çº¿äºèç½å·¥ç¨å¸å¸¦ä½ âç²¾è¿âèä¸æè½ï¼èµ¶å¿«æ¥å§!
æ¬æä½è ï¼é¥¶å ¨æï¼ä¸ç§é¢è®¡ç®æç¡å£«ï¼æ»´æ»´åºè¡å端ç åå·¥ç¨å¸ã
ç¹å»ãé 读åæãï¼ç»æ¬æä½è é¥¶å ¨æç¹èµï¼