TCP協議及三次握手和四次揮手

2022-09-09 06:30:15 字數 3533 閱讀 4352

1、tcp協議

tcp(transmission control protocol 傳輸控制協議)是一種面向連線(連線導向)的、可靠的、 基於ip的傳輸層協議。

2、tcp報文結構

2.1 應用資料在整個傳輸過程中被封裝的資料形式

位於傳輸層的tcp資料分組稱為段(segment),又譯為報文段、資料段或分段。tcp將來自應用層的資料分塊並封裝成tcp段進行傳送。tcp段封裝在ip資料報中,然後再封裝成資料鏈路層中的幀,如下圖所示:

2.2 tcp段的組成

(1)tcp段=tcp首部+應用資料

(2)tcp首部組成及功能

表:tcp報文控制標誌(control bits)說明

3、tcp三次握手

三次握手的互動過程,具體如下圖所示:

wireshark抓包分析:

第一次握手:

第二次握手:

第三次握手:

4、tcp四次揮手

四次揮手的全部互動過程,具體如下圖所示:

wireshark抓包分析:

第一次揮手:

第二次揮手:

第三次揮手:

第四次揮手:

5、三次握手、四次揮手的常見面試題

有關tcp的連線建立的三次握手及拆除過程的四次揮手的面試問題,是技術面試過程中的出現頻率很高的重點和難點問題,常見問題大致如下:

問題(1):為什麼關閉連線的需要四次揮手,而建立連線卻只要三次握手呢?

關閉連線時,被動斷開方在收到對方的fin結束請求報文時,很可能業務資料沒有傳送完成,並不能立即關閉連線,被動方只能先回覆乙個ack響應報文,告訴主動斷開方:「你發的fin報文我收到了,只有等到我所有的業務報文都傳送完了,我才能真正的結束,在結束之前,我會發你fin+ack報文的,你先等著」。所以,被動斷開方的確認報文,需要拆開成為兩步,故總體就需要四步揮手。

而在建立連線場景中,server端的應答可以稍微簡單一些。當server端收到client端的syn連線請求報文後,其中ack報文表示對請求報文的應答,syn報文用來表示服務端的連線也已經同步開啟了,而ack報文和syn報文之間,不會有其他報文需要傳送,故而可以合二為一,可以直接傳送乙個syn+ack報文。所以,在建立連線時,只需要三次握手即可。

問題(2):為什麼連線建立的時候是三次握手,可以改成兩次握手嗎?

三次握手完成兩個重要的功能:一是雙方都做好傳送資料的準備工作,而且雙方都知道對方已準備好;二是雙方完成初始sn序列號的協商,雙方的sn序列號在握手過程中被傳送和確認。

如果把三次握手改成兩次握手,可能發生死鎖。兩次握手的話,缺失了client的二次確認ack幀,假想的tcp建立的連線時二次揮手,可以如下圖所示:

圖:假想的tcp建立的連線時二次握手的示意圖

在假想的tcp建立的連線時二次握手過程中,client傳送server傳送乙個syn請求幀,server收到後傳送了確認應答syn+ack幀。按照兩次握手的協定,server認為連線已經成功地建立了,可以開始傳送資料幀。這個過程中,如果確認應答syn+ack幀在傳輸中被丟失,client沒有收到,client將不知道server是否已準備好,也不知道server的sn序列號,client認為連線還未建立成功,將忽略server發來的任何資料分組,會一直等待server的syn+ack確認應答幀。而server在發出的資料幀後,一直沒有收到對應的ack確認後就會產生超時,重**送同樣的資料幀。這樣就形成了死鎖。

問題(3):為什麼主動斷開方在time-wait狀態必須等待2msl的時間?

原因之一:主動斷開方等待2msl的時間,是為了確保兩端都能最終關閉。假設網路是不可靠的,被動斷開方傳送fin+ack報文後,其主動方的ack響應報文有可能丟失,這時候的被動斷開方處於last-ack狀態的,由於收不到ack確認被動方一直不能正常的進入closed狀態。在這種場景下,被動斷開方會超時重傳fin+ack斷開響應報文,如果主動斷開方在2msl時間內,收到這個重傳的fin+ack報文,會重傳一次ack報文,後再一次重新啟動2msl計時等待,這樣,就能確保被動斷開方能收到ack報文,從而能確保被動方順利進入到closed狀態。只有這樣,雙方都能夠確保關閉。反過來說,如果主動斷開方在傳送完ack響應報文後,不是進入time_wait狀態去等待2msl時間,而是立即釋放連線,則將無法收到被動方重傳的fin+ack報文,所以不會再傳送一次ack確認報文,此時處於last-ack狀態的被動斷開方,無法正常進入到closed狀態。

原因之二:防止「舊連線的已失效的資料報文」出現在新連線中。主動斷開方在傳送完最後乙個ack報文後,再經過2msl,才能最終關閉和釋放埠,這就意味著,相同埠的新tcp新連線,需要在2msl的時間之後,才能夠正常的建立。2msl這段時間內,舊連線所產生的所有資料報文,都已經從網路中消失了,從而,確保了下乙個新的連線中不會出現這種舊連線請求報文。

問題(4):如果已經建立了連線,但是client端突然出現故障了怎麼辦?

tcp還設有乙個保活計時器,client端如果出現故障,server端不能一直等下去,這樣會浪費系統資源。每收到一次client客戶端的資料幀後,server端都的保活計時器會復位。計時器的超時時間通常是設定為2小時,若2小時還沒有收到client端的任何資料幀,server端就會傳送乙個探測報文段,以後每隔75秒鐘傳送一次。若一連傳送10個探測報文仍然沒反應,server端就認為client端出了故障,接著就關閉連線。如果覺得保活計時器的兩個多小時的間隔太長,可以自行調整tcp連線的保活引數。

參考:

tcp協議三次握手 四次揮手

起初,伺服器和客戶端都為closed狀態。在通訊開始前,雙方都得建立各自的傳輸控制塊 tcb 伺服器建立完tcb後遍進入listen狀態,此時準備接收客戶端發來的連線請求。第一次握手 客戶端向服務端傳送連線請求報文段。該報文段的頭部中syn 1,ack 0,seq x。請求傳送後,客戶端便進入syn...

TCP協議三次握手四次揮手

1.什麼是tcp協議 tcp協議是作用在傳輸層的傳輸控制協議 tcp 提供一種面向連線的 可靠的位元組流服務 在乙個 tcp 連線中,僅有兩方進行彼此通訊。廣播和多播不能用於 tcp tcp 使用校驗和,確認和重傳機制來保證可靠傳輸 tcp 給資料分節進行排序,並使用累積確認保證資料的順序不變和非重...

TCP協議三次握手四次揮手

tcp有哪些過程?a.建立連線 b.資料傳輸 c.終止連線 tcp三次握手和四次揮手的過程?syn,ack是什麼?syn 請求建立連線 含有同步序列號的標誌位的資料,tcp建立連線時,將這個 位 置1 ack 針對syn的確認應答 fin是什麼?fin 傳送端完成傳送任務 位 當tcp完成資料傳輸需...