天天看點

TCP的連接配接機制

一、三次握手

TCP的連接配接機制

(1)用戶端将标志位SYN置為1,随機産生一個值seq=J,并将該資料報發動給伺服器,用戶端進入SYN—SENT狀态,等待伺服器端确認。

(2)伺服器收到資料報後由标志位SYN=1知道用戶端請求建立連接配接,伺服器端将SYN和ACK置為1,ack=J+1。随機産生一個值seq=K,并将該資料包發送給Client以确認連接配接請求,Server進入SYN_RCVD狀态。

(3)Client收到确認後,檢查ack是否為J+1,ACK是否為1,如果正确則将标志位ACK置為1,ack=K+1,并将該資料包發送給Server,Server檢查ack是否為K+1,ACK是否為1,如果正确則連接配接建立成功,Client和Server進入ESTABLISHED狀态,完成三次握手,随後Client與Server之間可以開始傳輸資料了。

2、三次握手的原因

如果僅兩次連接配接可能出現一種情況:

用戶端發送完連接配接封包(第一次握手)後由于網絡不好,延時很久後封包到達服務端,服務端接收到封包後向用戶端發起連接配接(第二次握手)。此時用戶端會認定此封包為失效封包,但在兩次握手情況下服務端會認為已經建立起了連接配接,服務端會一直等待用戶端發送資料,但因為用戶端會認為服務端第二次握手的回複是對失效請求的回複,不會去處理。這就造成了服務端一直等待用戶端資料的情況,浪費資源。

3、TCP四次揮手

TCP的連接配接機制

4、四次揮手的原因

TCP是全雙工的,它允許兩個方向的資料傳輸被獨立關閉。當主動發起關閉的一方關閉連接配接之後,TCP進入半關閉狀态,此時主動方可以隻關閉輸出流。

之是以不是三次而是四次主要是因為被動關閉方将 "對主動關閉封包的确認"和"關閉連接配接"兩個操作分兩次進行。

對主動關閉封包的确認是為了快速告知主動關閉方,此關閉連接配接封包已經收到。此時被動方不立即關閉連接配接是為了将緩沖中剩下的資料從輸出流發回主動關閉方(主動方接收到資料後同樣要進行确認), 是以要把"确認關閉"和"關閉連接配接"分兩次進行。

5、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連接配接。

6、如果建立連接配接,用戶端故障怎麼辦?

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

繼續閱讀