TCP 三次握手和四次揮手及其狀態

牛平發表於2017-03-14
三次握手:
     TCP的三次握手過程:
  1.     C端傳送SYN(SYN=1)標誌,同時傳送一個SEQ number(SEQ為一個隨機數),表示要和S端進行連線。(C: SYN_SENT S: LISTEN )
  2.     S端接收到這個含有(SYN=1)的包之後,表示要接受這個包,則回覆一個ACK number(ACK=SEQ+1 ),然後也回覆一個SYN=1,ACK=1的包。( C:SYN_SENT, S:SYN_REVD)
  3.     C端回覆一個ACK number包(ACK=SEQ+1), ACK = 1,然後連線就建立了,剩下的工作就是去傳輸了。(C: ESTABLISHED S:ESTABLISHED)

疑問:
     這個地方之前自己存在一個誤區,誤以為SYN 和 SYN number是一個東西,結果導致兩者混淆,一直沒有真正理解這個三次握手,造成錯誤一直持續到現在,悔之晚矣。多加幾個疑問,
就會不再想當然了。



圖中,可以看到第一條,首先10.0.0.61 向10.1.3.32 傳送了一個SYN包,及SYN的標誌位為1,並且傳送了一個Seq number=2856901853,
第二條:10.1.3.32接收到請求後,返回了一個SYN+ACK包,及確認以及連線包,Ack number=2856901853+1,然後隨機發了一個Seq=3836060639的隨機數。
第三條:10.0.0.61 接收到請求後,返回了一個ACK包,ACK number=3836060639+1 ,然後發了一個Seq=隨機數。

透過以上三條,則建立了一個有狀態的連線,隨後進行的是一個資料傳輸的過程。

三次握手的本質是,雙方可靠的交換了一個Seq號,透過該Seq號,確認了後續傳輸的有序性。

四次揮手:
     四次揮手的過程,首先一個很重要的提醒是百度百科中的一句話,及TCP是全雙工的,所以需要來去雙方都來關閉連線。
     假設A已經傳完了所有的資料
  1.     A傳送一個FIN標誌位為1的包,表明自己已經完成了傳輸。
  2.     B傳送一個ACK表示自己已經知道了,並且關閉了來自於A->B的連線。
  3.     過了一會兒,B也傳完了所有的資料,接著B傳送了一個FIN標誌為1的包,然後就傳給了A。
  4.     A一看來了個FIN的標誌,從而說明已經收到了B的斷開連線的訊號,然後A發了一個ACK=1的包,正式斷開了所有連線。

仔細一看這段描述,發現有幾個問題,首先A發了一個FIN=1的包,只是說明A已經將該傳的都傳完了,至於B收到與否,A到底管不管,或者知道不知道。
所以,顯然,事情不應該如上面所說,如同三次握手一樣,必須存在著Seq number的介入。

正確過程如下:
  1.     A傳送一個FIN=1的包,並且有個Seq number。(A:FIN_WAIT_1 B:ESTABLISHED)
  2.     B收到後,返回一個ACK=1的包,並且返回一個Ack number= Seq number+1的包。(A: FIN_WAIT_1 B:CLOSE_WAIT)
  3.     B傳輸完畢後,和另外一個連線一樣,發一個FIN=1的包,並同時攜帶一個Seq number。(A:FIN_WAIT_2 B:LAST_ACK)
  4.     A收到後,返回一個ACK=1的包,並同時把Ack number = seq number +1的包發給A。(A:TIME_WAIT B:CLOSED)










來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29757574/viewspace-2135346/,如需轉載,請註明出處,否則將追究法律責任。

相關文章