TCP三握手四揮手總結

                                                                          TCP運輸連接管理
 
   一條完整的運輸連接分爲三個階段:連接建立,數據傳送,連接釋放。類比現實生活中的一次完整的電話通信:先打通,再嘮嗑,最後掛斷。細分該過程,連接建立需要解決以下問題:
1.連接雙方都必須確認對方存在(打電話必須確認電話開機,信號良好 不能是空號)
2.要允許雙方協商一些參數(最大報文段長度,最大窗口大小,服務質量等)
3.能夠對運輸實體資源進行分配(緩存大小 最大連接個數)

  TCP建立連接採用CS方式 連接建立需要三次握手:(準備工作,服務器被動打開)

第一次握手:客戶端主動打開,並且發送同步請求報文段,該報文段內容包括SYN=1
選擇序號 seq=x,其中SYN=1表示客戶端請求連接,seq=x表示該客戶端開始接收數據的序列號是x。也就說服務器發送的數據的第一個字節放在x處

第二次握手:如果服務器同意連接,則發送SYN=1(同步連接),確認號ACK=1 確認收到了客戶端的請求,同意確認連接;並且發送ack=x+1 確認收到了客戶端發送的起始序列號x在此同時發送隨機值seq=y 告訴客戶端,服務器的下一個報文起始位置的值

第三次握手:客戶端收到服務器同意連接的報文段,發送ACK=1,確認客戶端收到了服務器的報文段,並且發送ack=y+1確認收到了服務器的起始序列號y,由於該報文段雖然不攜帶數據,但是也需佔有一個序列號,所以客戶端的起始序列號變爲seq=x+1

斷開連接需要四次揮手:

第一次揮手:客戶端發送FIN=1,並且告訴服務器下一個報文的起始序列號是seq=u

第二次揮手:服務器發送ACK=1表示收到了上一條報文段 並且發送小寫的ack=u+1
告訴客戶端收到了起始序列號u 並且發送自己的下一個報文的起始序列號seq=w

第三次揮手:服務器數據發送完畢,ACK和FIN同時爲1,並且告訴客戶端此時自己下一個報文段的起始序列號seq=w,再次確認收到了客戶端的起始序列號ack=u+1

第四次揮手:客戶端接受到服務器的FIN=1,發送ACK=1,確認接收到了上次的報文段
由於該條報文段雖然不包含數據,但是也會佔用一個序列號,所以起始序列號變爲
u+1 並且發送ack=w+1 表示收到了服務器的起始序列號w

  注意:在四次揮手過程中的幾個小細節:
   1:原理上第二次揮手是可以省略的,但是往往當服務器收到客戶端的關閉請求的同時還在發送數據,先發送ACK表示收到了關閉請求,但是暫時還不 能關閉,直到服務器發送完所有數據,纔會令FIN=1 表示同意關閉連接 
      
      2:第四次揮手後,客戶端會進入TIME_WAIT狀態等待2MSL(2倍的網絡片段最大存活時間)而不是立即關閉,因爲最後一次ACK可能丟失,Server如果沒有收到ACK,將不斷重複發送FIN片段。所以Client不能立即關閉,它必須確認Server接收到了該ACK。Client會在發送出ACK之後進入到TIME_WAIT 狀態。Client會設置一個計時器,等待2MSL的時間。如果在該時間內再次收到FIN,那麼Client會重發ACK並再次等待2MSL。(關於這個問題後續再做討論)
       3:三握手的意義,爲了防止網絡延遲造成的服務器資源浪費,假如客戶端發送了連接請求,但是在某個網絡節點上滯留了,很久很久以後服務器才收到客戶端的連接請求,同意建立連接,並且等待客戶端確認並且發送數據,而此時客戶端早已不需要此次連接,將不會理睬server端的確認,這樣將會白白浪費server端的資源。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章