TCP三次握手及四次揮手詳解及常見面試題

2021-08-21 18:46:20 字數 3862 閱讀 2485

2023年05月24日 11:51:38

1. 源埠號:表示傳送端埠號,字段長為16位。 

2. 目標埠號:表示接收埠號,字段長為16位。 

3. 序列號:表示傳送資料的位置,字段長為32位。每傳送一次資料,就累加一次該資料位元組數的大小。 

注意:序列號不會從0或1開始,而是在建立連線時由計算機生成的乙個隨機數作為其初始值,通過syn包傳送給接收端主機。然後再將每**過去的位元組數累加到初始值上表示資料的位置。 

4. 確認應答號:表示下一次應該收到的資料的序列號,字段長為32位元組。傳送端收到這個確認應答以後可以認為在這個序號以前的資料都已經被正常接收。

(1)保證報文按序到達。 

(2)保證可靠性。 

(3)保證效率。 

(4)精準的報告哪些報文已經收到,哪些需要重傳。

首部長度:該字段長度為4位,單位為4位元組(32位)。tcp首部長度不包括選項的話,是20個位元組,20/4=5,5的二進位制序列:0101,報頭長度也叫資料偏移,所以該欄位可以設定為5,選項字段最大的是40位元組,所以,tcp首部長度為最大為20+40=60位元組,該欄位可以設定的最大長度為60/4=15。

保留:該欄位主要是為了以後擴充套件時使用,其長度為4位。一般設定為0,即使收到的包在該字段不為0,此包也不會丟棄。

控制位:字段長為6,每一位從左到右分別為:urg、ack、psh、rst、syn、fin。當對應的值為1,表示有具體含義。

字段含義

urg緊急指標是否有效。為1,表示某一位需要被優先處理。

ack確認號是否有效,一般置為1。

psh提示接收端應用程式立即從tcp緩衝區把資料讀走。

rst對方要求重新建立連線,復位。

syn請求建立連線,並在其序列號的字段進行序列號的初始值設定。建立連線,設定為1.

fin希望斷開連線。

8. 視窗大小:接收緩衝區的大小,tcp不允許傳送超過此處所示大小的資料。 

9. 校驗和:傳送端填充,crc校驗,接收校驗不通過,則認為資料有問題。和udp的區別是,udp校驗的是資料本身,tcp校驗的不僅包含tcp首部,而且包含tcp資料部分。 

10. 緊急指標:只有在urg為1時有效,該字段為1表示本報文的段中的緊急資料的指標。 

11. 選項:用於提高tcp的傳輸效能。需要根據首部長度進行控制,其最大長度為40位元組。

我們在著重講一下在三次握手和四次揮手中的用到序列號、確認號及標誌位

佔4個位元組,用來標記資料段的順序,tcp把連線中傳送的所有資料位元組都編上乙個序號,第乙個位元組的編號由本地隨機產生,給位元組編上序號後,就給每乙個報文段指派乙個序號,序列號seq就是這個報文段中的第乙個位元組的資料編號。

佔4個位元組,期待收到對方下乙個報文段的第乙個資料位元組的序號,序列號表示報文段攜帶資料的第乙個位元組的編號,而確認號指的是期望接受到下乙個位元組的編號,因此擋牆報文段最後乙個位元組的編號+1即是確認號。

佔1個位元位,僅當ack=1,確認號字段才有效。ack=0,確認號無效。

連線建立時用於同步序號。當syn=1,ack=0表示:這是乙個連線請求報文段。若同意連線,則在響應報文段中使用syn=1,ack=1.因此,syn=1表示這是乙個連線請求,或連線接收報文,syn這個標誌位只有在tcp建立連線才會被置為1,握手完成後syn標誌位被置為0.

用來釋放乙個

建立連線時,客戶端傳送syn包到伺服器,其中包含客戶端的初始序號seq=x,並進入syn_sent狀態,等待伺服器確認。(其中,syn=1,ack=0,表示這是乙個tcp連線請求資料報文;序號seq=x,表明傳輸資料時的第乙個資料位元組的序號是x)。

伺服器收到請求後,必須確認客戶的資料報。同時自己也傳送乙個syn包,即syn+ack包,此時伺服器進入syn_recv狀態。(其中確認報文段中,標識位syn=1,ack=1,表示這是乙個tcp連線響應資料報文,並含服務端的初始序號seq(伺服器)=y,以及伺服器對客戶端初始序號的確認號ack(伺服器)=seq(客戶端)+1=x+1)。

客戶端收到伺服器的syn+ack包,向伺服器傳送乙個序列號(seq=x+1),確認號為ack(客戶端)=y+1,此包傳送完畢,客戶端和伺服器進入estab_lished(tcp連線成功)狀態,完成三次握手。

在三次握手協議中,伺服器維護乙個未連線佇列,該隊列為每個客戶端的syn包(syn=j)開設乙個條目,該條目表明伺服器已收到syn包,並向客戶發出確認,正在等待客戶的確認包時,刪除該條目,伺服器進入estab_lished狀態。

1.為什麼需要三次握手,兩次不可以嗎?或者四次、五次可以嗎?

我們來分析一種特殊情況,假設客戶端請求建立連線,發給伺服器syn包等待伺服器確認,伺服器收到確認後,如果是兩次握手,假設伺服器給客戶端在第二次握手時傳送資料,資料從伺服器發出,伺服器認為連線已經建立,但在傳送資料的過程中資料丟失,客戶端認為連線沒有建立,會進行重傳。假設每次傳送的資料一直在丟失,客戶端一直syn,伺服器就會產生多個無效連線,占用資源,這個時候伺服器可能會掛掉。這個現象就是我們聽過的「syn的洪水攻擊」。 

總結:第三次握手是為了防止:如果客戶端遲遲沒有收到伺服器返回確認報文,這時會放棄連線,重新啟動一條連線請求,但問題是:伺服器不知道客戶端沒有收到,所以他會收到兩個連線,浪費連線開銷。如果每次都是這樣,就會浪費多個連線開銷。

首先,客戶端傳送乙個fin,用來關閉客戶端到伺服器的資料傳送,然後等待伺服器的確認。其中終止標誌位fin=1,序列號seq=u。

伺服器收到這個fin,它傳送乙個ack,確認ack為收到的序號加一。

關閉伺服器到客戶端的連線,傳送乙個fin給客戶端。

客戶端收到fin後,並發回乙個ack報文確認,並將確認序號seq設定為收到序號加一。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。

客戶端傳送fin後,進入終止等待狀態,伺服器收到客戶端連線釋放報文段後,就立即給客戶端傳送確認,伺服器就進入close_wait狀態,此時tcp伺服器程序就通知高層應用程序,因而從客戶端到伺服器的連線就釋放了。此時是「半關閉狀態」,即客戶端不可以傳送給伺服器,伺服器不可以傳送給客戶端。 

此時,如果伺服器沒有資料報傳送給客戶端,其應用程式就通知tcp釋放連線,然後傳送給客戶端連線釋放資料報,並等待確認。客戶端傳送確認後,進入time_wait狀態,但是此時tcp連線還沒有釋放,然後經過等待計時器設定的2msl後,才進入到close狀態。

2.為什麼需要2msl時間?

首先,msl即maximum segment lifetime,就是最大報文生存時間,是任何報文在網路上的存在的最長時間,超過這個時間報文將被丟棄。《tcp/ip詳解》中是這樣描述的:msl是任何報文段被丟棄前在網路內的最長時間。rfc 793中規定msl為2分鐘,實際應用中常用的是30秒、1分鐘、2分鐘等。

tcp的time_wait需要等待2msl,當tcp的一端發起主動關閉,三次揮手完成後傳送第四次揮手的ack包後就進入這個狀態,等待2msl時間主要目的是:防止最後乙個ack包對方沒有收到,那麼對方在超時後將重發第三次握手的fin包,主動關閉端接到重發的fin包後可以再發乙個ack應答包。在time_wait狀態時兩端的埠不能使用,要等到2msl時間結束才可以繼續使用。當連線處於2msl等待階段時任何遲到的報文段都將被丟棄。

總結:

(1)為了保證客戶端傳送的最後乙個ack報文段能夠到達伺服器。即最後乙個確認報文可能丟失,伺服器會超時重傳,然後客戶端再一次確認,同時啟動2msl計時器。如果沒有等待時間,傳送完確認報文段就立即釋放連線的話,伺服器就無法重傳,因此也就收不到確認,就無法按步驟進入close狀態,即必須收到確認才能close。 

(2)防止已經失效的連線請求報文出現在連線中。經過2msl,在這個連續持續的時間內,產生的所有報文段就可以都從網路消失。

TCP三次握手及四次揮手分析

本文目的 熟悉tcp三次握手及四次揮手的整體過程及一些設計思想 tcp建立連線需要進行三次握手 斷開連線需要四次揮手,下面說說握手及揮手的過程 整個過程如下 1 tcp連線建立 三次握手 建立連線舉個簡單的例子,方便理解 a 你好我是a,你聽得到我在說話嗎?b 聽到了,我是b,你聽到我在說話嗎?a ...

TCP三次握手 四次揮手詳解

1 建立連線協議 三次握手 1 客戶端傳送乙個帶syn標誌的tcp報文到伺服器。這是三次握手過程中的報文1。2 伺服器端回應客戶端的,這是三次握手中的第2個報文,這個報文同時帶ack標誌和syn標誌。因此它表示對剛才客戶端syn報文的回應 同時又標誌syn給客戶端,詢問客戶端是否準備好進行資料通訊。...

TCP三次握手 四次揮手詳解

1 建立連線協議 三次握手 1 客戶端傳送乙個帶syn標誌的tcp報文到伺服器。這是三次握手過程中的報文1。2 伺服器端回應客戶端的,這是三次握手中的第2個報文,這個報文同時帶ack標誌和syn標誌。因此它表示對剛才客戶端syn報文的回應 同時又標誌syn給客戶端,詢問客戶端是否準備好進行資料通訊。...