天天看點

tcp三次握手後被馬上rst_面試題之簡述TCP三向交握

tcp三次握手後被馬上rst_面試題之簡述TCP三向交握
TCP握手協定 在TCP/IP協定中,TCP協定提供可靠的連接配接服務,采用三次握手建立一個連接配接.第一次握手:建立連接配接時,用戶端發送syn包(syn=j)到伺服器,并進入SYN_SEND狀态,等待伺服器确認; SYN:同步序列編号(Synchronize Sequence Numbers)第二次握手:伺服器收到syn包,必須确認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀态; 第三次握手:用戶端收到伺服器的SYN+ACK包,向伺服器發送确認包ACK(ack=k+1),此包發送完畢,用戶端和伺服器進入ESTABLISHED狀态,完成三次握手.
           
tcp三次握手後被馬上rst_面試題之簡述TCP三向交握

下面是TCP封包格式圖:

tcp三次握手後被馬上rst_面試題之簡述TCP三向交握

圖1 TCP封包格式

上圖中有幾個字段需要重點介紹下:

(1)序号:Seq序号,占32位,用來辨別從TCP源端向目的端發送的位元組流,發起方發送資料時對此進行标記。

(2)确認序号:Ack序号,占32位,隻有ACK标志位為1時,确認序号字段才有效,Ack=Seq+1。

(3)标志位:共6個,即URG、ACK、PSH、RST、SYN、FIN等,具體含義如下:

(A)URG:緊急指針(urgent pointer)有效。

(B)ACK:确認序号有效。

(C)PSH:接收方應該盡快将這個封包交給應用層。

(D)RST:重置連接配接。

(E)SYN:發起一個新連接配接。

(F)FIN:釋放一個連接配接。

需要注意的是:

(A)不要将确認序号Ack與标志位中的ACK搞混了。

(B)确認方Ack=發起方Req+1,兩端配對

所謂三次握手(Three-Way Handshake)即建立TCP連接配接,就是指建立一個TCP連接配接時,需要用戶端和服務端總共發送3個包以确認連接配接的建立。在socket程式設計中,這一過程由用戶端執行connect來觸發,整個流程如下圖所示:

tcp三次握手後被馬上rst_面試題之簡述TCP三向交握
  • Step 1 (SYN) : 第一次握手:Client将标志位SYN置為1,随機産生一個值seq=x,并将該資料包發送給Server,Client進入SYN_SENT狀态,等待Server确認。
  • Step 2 (SYN + ACK): 二次握手:Server收到資料包後由标志位SYN=1知道Client請求建立連接配接,Server将标志位SYN和ACK都置為1,ack=x+1,随機産生一個值seq=Y,并将該資料包發送給Client以确認連接配接請求,Server進入SYN_RCVD狀态。
  • Step 3 (ACK) : 第三次握手:Client收到确認後,檢查ack是否為y+1,ACK是否為1,如果正确則将标志位ACK置為1,ack=x+1,并将該資料包發送給Server,Server檢查ack是否為x+1,ACK是否為1,如果正确則連接配接建立成功,Client和Server進入ESTABLISHED狀态,完成三次握手,随後Client與Server之間可以開始傳輸資料了。