天天看點

Http協定-TCP三向交握、四次揮手HTTP關于TCP連接配接的常用術語HTTP連接配接過程圖建立連接配接–三次握手資料傳輸關閉連接配接–四次揮手Q&A

Http協定-TCP三向交握、四次揮手

HTTP關于TCP連接配接的常用術語

  1. SYN:synchronous建立聯機
  2. ACK:acknowledgement 确認
  3. PSH:push傳送
  4. FIN:finish結束
  5. RST:reset重置
  6. URG:urgent緊急
  7. Sequence number:順序号碼
  8. Acknowledge number:确認号碼

HTTP連接配接過程圖

Http協定-TCP三向交握、四次揮手HTTP關于TCP連接配接的常用術語HTTP連接配接過程圖建立連接配接–三次握手資料傳輸關閉連接配接–四次揮手Q&A

整個連接配接過程分為三個部分:1、連接配接建立 2、資料傳輸 3、連接配接關閉

建立連接配接–三次握手

Http協定-TCP三向交握、四次揮手HTTP關于TCP連接配接的常用術語HTTP連接配接過程圖建立連接配接–三次握手資料傳輸關閉連接配接–四次揮手Q&A

第一次握手:主機A發送位碼為syn=1,随機産生seq number的資料包到伺服器,主機B由SYN=1知道,A要求建立聯機;

第二次握手:主機B收到請求後要确認聯機資訊,向A發送ack number=(主機A的seq+1),syn=1,ack=1,随機産生seq的包;

第三次握手:主機A收到後檢查ack number是否正确,即第一次發送的seq number+1,以及位碼ack是否為1,若正确,主機A會再發送ack number=(主機B的seq+1),ack=1,主機B收到後确認seq值與ack=1則連接配接建立成功。

資料傳輸

用戶端和服務端建立連接配接(握手成功)後,就可以進行資料傳輸。

關閉連接配接–四次揮手

Http協定-TCP三向交握、四次揮手HTTP關于TCP連接配接的常用術語HTTP連接配接過程圖建立連接配接–三次握手資料傳輸關閉連接配接–四次揮手Q&A
  1. 用戶端程序發出連接配接釋放封包,并且停止發送資料。釋放資料封包首部,FIN=1,其序列号為seq=u(等于前面已經傳送過來的資料的最後一個位元組的序号加1),此時,用戶端進入FIN-WAIT-1(終止等待1)狀态。 TCP規定,FIN封包段即使不攜帶資料,也要消耗一個序号。
  2. 伺服器收到連接配接釋放封包,發出确認封包,ACK=1,ack=u+1,并且帶上自己的序列号seq=v,此時,服務端就進入了CLOSE-WAIT(關閉等待)狀态。TCP伺服器通知高層的應用程序,用戶端向伺服器的方向就釋放了,這時候處于半關閉狀态,即用戶端已經沒有資料要發送了,但是伺服器若發送資料,用戶端依然要接受。這個狀态還要持續一段時間,也就是整個CLOSE-WAIT狀态持續的時間。
  3. 用戶端收到伺服器的确認請求後,此時,用戶端就進入FIN-WAIT-2(終止等待2)狀态,等待伺服器發送連接配接釋放封包(在這之前還需要接受伺服器發送的最後的資料)。
  4. 伺服器将最後的資料發送完畢後,就向用戶端發送連接配接釋放封包,FIN=1,ack=u+1,由于在半關閉狀态,伺服器很可能又發送了一些資料,假定此時的序列号為seq=w,此時,伺服器就進入了LAST-ACK(最後确認)狀态,等待用戶端的确認。
  5. 用戶端收到伺服器的連接配接釋放封包後,必須發出确認,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此時,用戶端就進入了TIME-WAIT(時間等待)狀态。注意此時TCP連接配接還沒有釋放,必須經過2∗∗MSL(最長封包段壽命)的時間後,當用戶端撤銷相應的TCB後,才進入CLOSED狀态。
  6. 伺服器隻要收到了用戶端發出的确認,立即進入CLOSED狀态。同樣,撤銷TCB後,就結束了這次的TCP連接配接。可以看到,伺服器結束TCP連接配接的時間要比用戶端早一些

Q&A

【問題1】為什麼連接配接的時候是三次握手,關閉的時候卻是四次握手?

答:因為當Server端收到Client端的SYN連接配接請求封包後,可以直接發送SYN+ACK封包。其中ACK封包是用來應答的,SYN封包是用來同步的。但是關閉連接配接時,當Server端收到FIN封包時,很可能并不會立即關閉SOCKET,是以隻能先回複一個ACK封包,告訴Client端,“你發的FIN封包我收到了”。隻有等到我Server端所有的封包都發送完了,我才能發送FIN封包,是以不能一起發送。故需要四步握手。

【問題2】為什麼TIME_WAIT狀态需要經過2MSL(最大封包段生存時間)才能傳回到CLOSE狀态?

答:雖然按道理,四個封包都發送完畢,我們可以直接進入CLOSE狀态了,但是我們必須假象網絡是不可靠的,有可以最後一個ACK丢失。是以TIME_WAIT狀态就是用來重發可能丢失的ACK封包。在Client發送出最後的ACK回複,但該ACK可能丢失。Server如果沒有收到ACK,将不斷重複發送FIN片段。是以Client不能立即關閉,它必須确認Server接收到了該ACK。Client會在發送出ACK之後進入到TIME_WAIT狀态。Client會設定一個計時器,等待2MSL的時間。如果在該時間内再次收到FIN,那麼Client會重發ACK并再次等待2MSL。所謂的2MSL是兩倍的MSL(Maximum Segment Lifetime)。MSL指一個片段在網絡中最大的存活時間,2MSL就是一個發送和一個回複所需的最大時間。如果直到2MSL,Client都沒有再次收到FIN,那麼Client推斷ACK已經被成功接收,則結束TCP連接配接。

【問題3】為什麼不能用兩次握手進行連接配接?

答:3次握手完成兩個重要的功能,既要雙方做好發送資料的準備工作(雙方都知道彼此已準備好),也要允許雙方就初始序列号進行協商,這個序列号在握手過程中被發送和确認。

現在把三次握手改成僅需要兩次握手,死鎖是可能發生的。作為例子,考慮計算機S和C之間的通信,假定C給S發送一個連接配接請求分組,S收到了這個分組,并發 送了确認應答分組。按照兩次握手的協定,S認為連接配接已經成功地建立了,可以開始發送資料分組。可是,C在S的應答分組在傳輸中被丢失的情況下,将不知道S 是否已準備好,不知道S建立什麼樣的序列号,C甚至懷疑S是否收到自己的連接配接請求分組。在這種情況下,C認為連接配接還未建立成功,将忽略S發來的任何資料分 組,隻等待連接配接确認應答分組。而S在發出的分組逾時後,重複發送同樣的分組。這樣就形成了死鎖。

【問題4】如果已經建立了連接配接,但是用戶端突然出現故障了怎麼辦?

TCP還設有一個保活計時器,顯然,用戶端如果出現故障,伺服器不能一直等下去,白白浪費資源。伺服器每收到一次用戶端的請求後都會重新複位這個計時器,時間通常是設定為2小時,若兩小時還沒有收到用戶端的任何資料,伺服器就會發送一個探測封包段,以後每隔75秒鐘發送一次。若一連發送10個探測封包仍然沒反應,伺服器就認為用戶端出了故障,接着就關閉連接配接。