TCP協議,三次握手與四次揮手

2021-10-07 18:27:29 字數 3694 閱讀 8536

tcp報文格式

每行簡介

1.源埠和目的埠各佔2個位元組,即16位。

2.32位序號,佔4個位元組,tcp連線中傳送的位元組流中每個位元組都按順序編號。例如,一段報文的序號字段值是 301 ,而攜帶的資料共有100欄位,顯然下乙個報文段(如果還有的話)的資料序號應該從401開始。

3.32位確認序號。是期望收到對方下乙個報文的第乙個資料位元組的序號。例如,b收到了a傳送過來的報文,其序列號字段是501,而資料長度是200位元組,這表明b正確的收到了a傳送的到序號700為止的資料。因此,b期望收到a的下乙個資料序號是701,於是b在傳送給a的確認報文段中把確認號置為701。

4.資料偏移,佔4位,它指出tcp報文的資料距離tcp報文段的起始處有多遠。

5.保留,佔6位,保留今後使用,但目前應都位0。

6.標誌位欄位(u、a、p、r、s、f):佔6位元。各位元的含義如下:

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

◆ack:確認ack,當ack=1時,確認序號才有效。tcp規定,在連線建立後所有報文的傳輸都必須把ack置1。

◆psh:為1時,接收方應該盡快將這個報文段交給應用層。

◆rst:為1時,重建連線。

◆syn:在建立連線時為同步序號。當syn=1,ack=0表明是請求連線報文,若同意連線,則相應報文為syn=1,ack=1。

◆fin::標記資料是否傳送完畢。如果fin=1,就相當於告訴對方:「我的資料已經傳送完畢,你可以釋放連線了」。

7.視窗,佔2位元組,指的是通知接收方,傳送本報文你需要有多大的空間來接受。

8.16位校驗和,檢驗首部和資料這兩部分。

9.緊急指標字段:佔16位元。它是乙個偏移量,和序號欄位中的值相加表示緊急資料最後乙個位元組的序號。

10.選項,長度可變,定義一些其他的可選的引數。可能包括」視窗擴大因子」、」時間戳」等選項。

tcp連線的建立(三次握手)

連線如上圖。tcp是面向連線協議。即無論哪一方向另一方傳送資料之前,都必須先在雙方之間建立一條連線,建立一條連線有以下過程。

1.請求端(客戶端)傳送乙個syn段指明客戶打算連線的伺服器的埠,以及初始序列號(isn),這個**syn為報文段1,即說明要建立連線了。同時選擇乙個初始序列號 seq=x **。tcp規定,syn報文段(syn=1的報文段)不能攜帶資料,但需要消耗掉乙個序號。

2.tcp伺服器收到請求報文後,如果同意連線,則發出確認報文。確認報文中標誌位ack=1,syn=1,確認序號是ack=x+1,同時也要自己初始化乙個序列號 seq=y,這個生成序列號seq必須比客戶端的大,即y>x。此時,tcp伺服器程序進入了syn-rcvd(同步收到)狀態。這個報文也不能攜帶資料,但是同樣要消耗乙個序號。此時客戶端可以確定自己接收與傳送訊息沒有問題。

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

4.這三個報文段完成連線的建立,這個過程成為三次握手。

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狀態持續的時間。

客戶端收到伺服器的確認請求後,此時,客戶端就進入fin-wait-2(終止等待2)狀態,等待伺服器傳送連線釋放報文(在這之前還需要接受伺服器傳送的最後的資料)。

3.、伺服器將最後的資料傳送完畢後,就向客戶端傳送連線釋放報文,fin=1,ack=u+1,由於在半關閉狀態,伺服器很可能又傳送了一些資料,假定此時的序列號為seq=w,此時,伺服器就進入了last-ack(最後確認)狀態,等待客戶端的確認。

4.客戶端收到伺服器的連線釋放報文後,必須發出確認,ack=1,ack=w+1,而自己的序列號是seq=u+1,此時,客戶端就進入了time-wait(時間等待)狀態。注意此時tcp連線還沒有釋放,必須經過2∗*∗msl(最長報文段壽命)的時間後,當客戶端撤銷相應的tcb後,才進入closed狀態。

5.伺服器只要收到了客戶端發出的確認,立即進入closed狀態。同樣,撤銷tcb後,就結束了這次的tcp連線。可以看到,伺服器結束tcp連線的時間要比客戶端早一些。

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

建立連線的時候, 伺服器在listen狀態下,收到建立連線請求的syn報文後,把ack和syn放在乙個報文裡傳送給客戶端。

而關閉連線時,伺服器收到對方的fin報文時,僅僅表示對方不再傳送資料了但是還能接收資料(即一方傳送fin只表示自己發完了所有要發的資料,但還允許對方繼續把沒發完的資料發過來),而自己也未必全部資料都傳送給對方了,所以己方可以立即關閉,也可以傳送一些資料給對方後,再傳送fin報文給對方來表示同意現在關閉連線,因此,己方ack和fin一般都會分開傳送,從而導致多了一次。

tcp如何保證可靠性

• 資料報校驗

• 超時重傳機制

• 應答機制

• 對失序資料報重排序

• tcp還能提供流量控制

三次握手總結:tcp協議是傳輸層的乙個面向連線的安全可靠的乙個傳輸協議,三次握手的機制是為了保證能建立乙個安全可靠的連線,那麼第一次握手由客戶端發起,客戶端會向服務端傳送乙個報文,在報文裡面:syn標誌位置為1,表示發起新的連線。服務端收到這個報文之後就知道客戶端傳送乙個確認訊息包,在這個訊息包裡面:ack標誌位置1,表示確認客戶端發起的第一次連線請求。兩次握手之後客戶端確認可以向服務端收發資訊,服務端只能知道客戶端發訊息能收到,但不知道客戶端能不能收到我發的訊息。因此進行第三次握手,第三次握手就是當客戶端收到服務端傳送的確認響應報文之後,還要繼續給服務端進行回應,也是乙個ack標誌位為置為1的確認訊息。通過三次握手,客戶端或者服務端都知道雙方能發訊息和能接收響應。

再附一張processon的三次握手和四次揮手圖吧。

TCP三次握手與四次揮手協議

tcp 在不可靠的網路通道傳進行可靠的訊息傳輸 1 tcp首部資訊 2 三次握手 syn synchronrous 同步訊息序列,發起乙個新的連線 tcp三次握手過程中,攜帶syn 同步序號 seq 訊息序號 rwd 視窗大小 1 urg 緊急指標 urgent pointer 有效。2 ack 確...

TCP協議三次握手與四次揮手

其實該過程就像一次打 前去拜訪 1 客戶端 喂?伺服器麼,我今天要去拜訪你。syn 1 seq x 2 伺服器 哦,好的,我去門口接你。syn 1 ack 1 seq y ack x 1 3 客戶端 我到了,你真客氣,我要進來了。ack 1 seq x 1 ack y 1 客戶端主動開啟,伺服器被動...

tcp協議三次握手 四次揮手

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