TCP三次握手和四次揮手

2021-09-10 09:38:37 字數 2981 閱讀 4893

tcp三次握手及釋放連線過程(「三次握手」和「四次揮手」)

tcp在傳輸之前會進行三次溝通,一般稱為「三次握手」,傳完資料斷開的時候要進行四次溝通,一般稱為「四次揮手」。

tcp的傳輸連線分為3個階段,連線建立(三次握手),資料傳送和連線釋放(四次揮手)。

tcp傳輸連線的管理就是使傳輸連線建立和釋放都能正常的進行。

兩個序號和三個標誌位:

(1)序號:seq序號,佔32位,用來標識從tcp源端向目的端傳送的位元組流,發起方傳送資料時對此進行標記。

(2)確認序號:ack序號,佔32位,只有ack標誌位為1時,確認序號欄位才有效,ack=seq+1。

(3)標誌位:共6個,即urg、ack、psh、rst、syn、fin等,具體含義如下:

(a)urg:緊急指標(urgent pointer)有效。

(b)ack:確認序號有效。

(c)psh:接收方應該盡快將這個報文交給應用層。

(d)rst:重置連線。

(e)syn:發起乙個新連線。

(f)fin:釋放乙個連線。

需要注意的是:

(a)不要將確認序號ack與標誌位中的ack搞混了。

(b)確認方ack=發起方req+1,兩端配對。

tcp建立連線(三次握手)

1.tcp伺服器程序先建立傳輸控制塊tcb,時刻準備接受客戶程序的連線請求,此時伺服器就進入了listen(監聽)狀態;

2.tcp客戶程序也是先建立傳輸控制塊tcb,然後向伺服器發出連線請求報文,這是報文首部中的同部位syn=1,同時選擇乙個初始序列號 seq=x ,此時,tcp客戶端程序進入了 syn-sent(同步已傳送狀態)狀態。tcp規定,syn報文段(syn=1的報文段)不能攜帶資料,但需要消耗掉乙個序號。

3.tcp伺服器收到請求報文後,如果同意連線,則發出確認報文。確認報文中應該 ack=1,syn=1,確認號是ack=x+1,同時也要為自己初始化乙個序列號 seq=y,此時,tcp伺服器程序進入了syn-rcvd(同步收到)狀態。這個報文也不能攜帶資料,但是同樣要消耗乙個序號。

4.tcp客戶程序收到確認後,還要向伺服器給出確認。確認報文的ack=1,ack=y+1,自己的序列號seq=x+1,此時,tcp連線建立,客戶端進入established(已建立連線)狀態。tcp規定,ack報文段可以攜帶資料,但是如果不攜帶資料則不消耗序號。

5.當伺服器收到客戶端的確認後也進入established狀態,此後雙方就可以開始通訊了。

為什麼tcp客戶端最後還要傳送一次確認呢?

正解:主要防止已經失效的連線請求報文突然又傳送到了伺服器,從而產生錯誤。

為什麼採用三次握手?

1.為了實現可靠資料傳輸,tcp協議的通訊雙方,都必須維護乙個序列號,以標識傳送出去的資料報中,哪些是已經被對方收到的,三次握手的過程是通訊雙方相互告知序列號起始值,並確定對方已經收到了序列號起始值的必經步驟

2.如果只是兩次握手,至少只有連線起傳送方的起始序列號能被確認,另一方的確認序列號則得不到確認。

tcp三次握手失敗了怎麼辦?

伺服器端傳送了syn+ack報文後就會啟動乙個定時器,等待客戶端返回的ack報文,如果第三次握手失敗了的話,客戶端給伺服器端返回了ack報文,伺服器並不能收到這個ack報文,那麼伺服器端就會啟動超時重傳機制,超過規定時間後重新傳送syn+ack,如果重傳達到指定次數後還未收到ack應答,那麼一段時間後,伺服器端自動關閉這個連線,但是伺服器認為這個連線已經建立,如果客戶端向伺服器寫資料,伺服器端將以rst包響應。為了防止syn洪氾攻擊。

tcp連線的釋放(四次揮手)

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連線的時間要比客戶端早一些。

為什麼建立連線是三次握手,關閉連線確是四次揮手呢?

建立連線的時候, 伺服器在listen狀態下,收到建立連線請求的syn報文後,把ack和syn放在乙個報文裡傳送給客戶端.而關閉連線時,伺服器收到對方的fin報文時,僅僅表示對方不再傳送資料了但是還能接收資料,而自己也未必全部資料都傳送給對方了,所以己方可以立即關閉,也可以傳送一些資料給對方後,再傳送fin報文給對方來表示同意現在關閉連線,因此,己方ack和fin一般都會分開傳送,從而導致多了一次。

tcp 四次揮手 TCP的三次握手和四次揮手

三次握手 第一次握手 客戶端傳送syn包 syn x 到伺服器,並進入syn send狀態,等待伺服器確認 第二次握手 伺服器收到syn包,必須確認客戶的syn ack x 1 同時自己也傳送乙個syn包 syn y 即syn ack包,此時伺服器進入syn recv狀態 第三次握手 客戶端收到伺服...

TCP三次握手和四次揮手

一 tcp三次握手 three way handshake 1 tcp三次握手的作用 三次握手的目的是連線伺服器指定埠,建立tcp連線,並同步連線雙方的序列號和確認號並交換 tcp 視窗大小資訊。在socket程式設計中,客戶端執行connect 時,將觸發三次握手。2 tcp三次握手過程 第一步 ...

TCP三次握手和四次揮手

三次握手 四次揮手 需四次揮手原因 由於tcp的半關閉特性,tcp連線時雙全工 即資料在兩個方向上能同時傳遞 因此,每個方向必須單獨的進行關閉。這個原則就是 當一方完成它的資料傳送任務後就能傳送乙個fin來終止這個方向上的連線。當一端收到乙個fin後,它必須通知應用層另一端已經終止了那個方向的資料傳...