TCP協議 標記位&定時器&三次握手四次揮手

TCP段格式:
這裏寫圖片描述
1、標記位
URG(緊急位)
緊急指針是一個正的偏移量,和序號字段中的值相加表示緊急數據最後一個字節的序號。TCP的緊急方式是發送端向另一端發送緊急數據的一種方式。緊急指針指向包內數據段的某個字節(數據從第一字節到指針所指字節就是緊急數據,不進入接收緩衝就直接交給上層進程,餘下的數據要進入接收緩衝的)

PSH(急迫位)
在一個交互程序中,當客戶發送一個命令給服務器時,它設置PUSH標誌並停下來等待服務器的響應。通過允許客戶應用程序通知其TCP設置PUSH標誌,客戶進程通知TCP在向服務器發送一個報文段時不要因等待額外數據而使已提交數據在緩存中滯留。類似地,當服務器的TCP接收到一個設置了PUSH標誌的報文段時,它需要立即將這些數據(包括以前存中滯留的數據)遞交給服務器進程而不能等待判斷是否還會有額外的數據到達。PSH=1,只對接收方的接收緩衝區起作用,發送方通過使用PUSH位來通知接收方將所有收到的數據立即提交給服務器進程,而不需要等待額外數據(將緩存填滿)而讓數據在緩存中停留!這裏所說的數據包括與此PUSH包一起傳輸的數據以及之前就爲該進程傳輸過來的數據(滯留在緩存中的數據)。

URG和PSH的區別:
URG:緊急標誌位,表示的是此報文段中有緊急數據,將緊急數據排在普通數據的前面;當接受端收到此報文後後必須先處理緊急數據,而後再處理普通數據。
PSH: 催促標誌位,當發送端將PSH置爲1時,TCP會立即創建一個報文併發送。接受端收到PSH爲1的報文後就立即將接受緩衝區內數據向上交付給應用程序,而不是等待緩衝區滿後再交付。
2、定時器

重傳計時器:Retransmission Timer 
堅持計時器:Persistent Timer 
保活計時器:Keeplive Timer 
時間等待計時器:Time_Wait Timer。

(1)重傳計時器
爲了控制丟失的報文段或丟棄的報文段,也就是對報文段確認的等待時間。當TCP發送報文段時,就創建這個特定報文段的重傳計時器,可能發生了兩種情況:若在計時器超時之前收到對報文段的確認,則撤銷計時器;若在收到對特定報文段的確認之前計時器超時,則重傳該報文,並把計時器復位;
重傳時間=2*RTT;
RTT的值應該動態計算。常用的公式是:RTT=previous RTT*i + (1-i)*current RTT。i的值通常取90%,即新的RTT是以前的RTT值的90%加上當前RTT值的10%.

(2)堅持計時器
專門爲對付零窗口通知而設立的;
當發送端收到零窗口的確認時,就啓動堅持計時器,當堅持計時器截止期到時,發送端TCP就發送一個特殊的報文段,被稱爲探測報文段,這個報文段只有一個字節的數據;探測報文段有序號,但序號永遠不需要確認,甚至在計算對其他數據的確認時這個序號也被忽略,探測報文段提醒接收端,確認已丟棄,必須重傳。
堅持計時器的截止期爲重傳時間的值,但若沒有收到從接收端來的響應,則發送另外一個探測報文段,並將堅持計時器的值加倍和並復位u,發送端繼續發送探測報文段,將堅持計時器的值加倍和復位,直到這個值增大到閾值爲止(通常是60s),之後,發送端每隔60s就發送一個報文段,直到窗口重新打開;

(3)保活計時器
每當服務器收到客戶的信息,就將keeplive timer復位,超時通常設置爲2小時,若服務器超過2小時還沒收到來自客戶的信息,就發送探測報文段,若發送了10個探測報文段(每75s發送一個)還沒收到響應,則終止連接;

(4)時間等待計時器
在連接終止期使用,當TCP關閉連接時,並不認爲這個連接就真正的關閉了,在時間等待期,連接還處於一種中間過渡狀態,這樣就可以使重複的fin報文段在到達終點後被丟棄,這個計時器的值通常設置爲MSL的兩倍。

3、三次握手與四次揮手

建立連接的過程:
這裏寫圖片描述
(1)Client將標誌位SYN置爲1,隨機產生一個值seq=J,並將該數據包發送給Server,Client進入SYN_SENT狀態,等待Server確認。
(2)Server收到數據包後由標誌位SYN=1知道Client請求建立連接,Server將標誌位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之間可以開始傳輸數據了。

關閉連接的過程:
這裏寫圖片描述
(1)客戶端發送FIN表示關閉連接請求,Client進入FIN_WAIT_1狀態。
(2)服務器收到FIN後發出ACK,應答客戶端的關閉連接請求。Server進入CLOSE_WAIT狀態。
(3)服務器發送FIN,向客戶端發送關閉連接請求。Server進入LAST_ACK狀態。
(4)Client收到FIN後,Client進入TIME_WAIT狀態,接着發送一個ACK給Server,確認序號爲收到序號+1,Server進入CLOSED狀態,完成四次揮手。

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