TCP 協議

傳輸層協議作用

1.分段及封裝應用層送來的數據
2.提供端到端的傳輸服務
3.在發送主機與接收主機之間構建邏輯通信
4.包括兩個協議:
1)TCP
2)UDP
怎樣提供的邏輯通信:
在這裏插入圖片描述

兩臺主機進程間通信條件

本地主機(IP地址定義)
本地進程(端口定義)
遠程主機(IP地址定義)
遠程進程(端口定義)

端口範圍

熟知端口(著名端口):0-1023,由ICANN指派
註冊端口:1024-49151,IANA不指派也不控制,但須註冊
動態端口(短暫端口):49152-65535,IANA不指派也不控制,無須註冊

傳輸層的分用和複用

由應用程序產生應用進程,由應用進程產生進程端口號,由端口號提供相應的服務。
在這裏插入圖片描述

運輸層協議與網絡層協議的主要區別

IP協議的作用範圍:提供主機之間的邏輯通信
TCP和UDP 協議的作用範圍:提供進程之間的邏輯通信

TCP 協議

TCP 協議是:
面向連接的:通訊雙方交換數據之前必須建立連接
可靠的:多種確保可靠的機制
字節流服務:8bit(1Byte)爲最小單位構成的字節流

套接字地址

TCP 使用“連接”(而不僅僅是“端口”)作爲最基本的抽象,同時將TCP連接的端點稱爲插口(socket),或套接字、套接口。
插口和端口、IP地址的關係是:
在這裏插入圖片描述

TCP發送接收過程

TCP發送進程以字節流的形式傳遞數據,而接收進程也把數據作爲字節流來接收,類似於假想的管道
UDP發送進程發送的數據報文都是獨立的,因此UDP不是面向流的協議
緩存:數據流向的每一個方向上都有兩種緩存:發送緩存、接收緩存
字節號:
以字節爲單位
字節號的定義範圍爲:0~(2^32-1)
編號機制:隨機
舉例:假如隨機號正好是1057,而要發送6000個字節,那麼字節編號範圍是:1057~7056
序號:
以字節爲基礎,TCP給每一個報文段指派一個序號,每個報文段的序號就是在這個報文段中第一個字節數據的序號
舉例:
比如TCP要傳輸6000個字節的文件。第一個字節的編號是10001。如果數據用5個報文段來發送,前4個報文段各攜帶1000字節的藪據,最後一個報文段攜帶2000字節的數據
報文段1>序號:10001(字節號範圍:10001~11000)
報文段2->序號:11001(字節號範圍:11001~12000)
報文段3->序號:12001(字節號範圍:12001~13000)
報文段4一>序號:13001(字節號範圍:13001~14000)
報文段5->序號:14001(字節號範圍:14001~16000)
在這裏插入圖片描述

在傳輸層向IP層發送數據時要以分組爲單位,而不是按字節流來發送,TCP協議把若干字節構成一個分組,我們可以把這樣的分組稱爲報文段( segment),這種報文段並不一定都一樣長,可以幾個字節,也可以是幾千個字節
在這裏插入圖片描述

TCP協議報文段格式

在這裏插入圖片描述
源端口與目的端口:各佔2字節。端口是運輸層與應用層的服務接口。運輸層的複用和分用功能都要通過端口才能實現。

序號字段:佔4字節。TCP連接中傳送的數據流中的每一個字節都編上一個序號。序號字段的值則指的是本報文段所發送的數據的第一個字節的序號。

確認號字段:佔4字節,是期望收到對方的下一個報文段的數據的第一個字節的序號。

數據偏移/首部長度:佔4bit,它指出TCP首部共有多少個4字節,首部長度可以在20-60字節之間。因此,這個字段值可以在5(5x4=20)至15(15x4=60)之間,首部長度也叫數據偏移,是因爲首部長度實際上指示了數據區在報文段中的起始偏移值。

保留字段:佔6bit,保留爲今後使用,但目前應置爲0.

緊急比特URG :當URG = 1時,表明緊急指針字段有效。它告訴系統此報文中有緊急數據,應儘快傳送(相當於高優先級的數據)

確認比特ACK :只有當ACK = 1時確認號字段纔有效。當ACK = 0時,確認號無效。

推送比特PSH(PuSH):接收TCP收到推送比特置1的報文段,就儘快地交付給接收應用進程,而不在等到整個緩存都填滿了後再向上交付。

復位比特RST(ReSeT):當RST = 1時,表明TCP連接中出現嚴重差錯(如由於主機崩潰或其他原因),必須釋放連接,然後再重新新建運輸連接。

同步比特SYN:同步比特SYN置爲1,就表示這是一個連接請求或連接接受報文

終止比特FIN(FINaL):用來釋放一個連接。當FIN = 1時,表明此報文段的發送段的數據已發送完畢,並要求釋放運輸連接。

端口字段:佔2字節。窗口字段用來控制對方發送的數據量,單位爲字節。TCP連接的一端根據
設置的緩存空間大小確定自己的接收窗口大小,然後通知對方以確定對方的發送窗口的上限。

檢驗和:佔2字節。檢驗和字段檢驗的範圍包括首部和數據這兩部分。在計算檢驗和時,要在TCP報文段的前面加上12字節的僞首部。

緊急指針字段:佔16bit,緊急指針指出在本報文段中的緊急數據的最後一個字節的序號。

選項字段:長度可變。TCP只規定了一種選項,即最大報文段長度MSS(Maximum Segment Size)。MSS 告訴對方TCP:“我的緩存接收的報文段的數據字段的最大長度是MSS個字節。”
MSS是TCP報文段中的數據字段的最大長度。數據字段加上TCP首部纔等於整個的TCP報文段。
MSS:Maximum Segment Unit : 最大報文段長度
MTU:Maximum Transmisson Unit:最大傳輸單元
MSS = MTU - 20Byte(IP首部) - 20Byte(TCP首部)

填充字段:這是爲了使整個首部長度是4字節的整數倍。

以下內容轉載了https://blog.csdn.net/qq_38950316/article/details/81087809 的文章

三次握手建立TCP連接

在這裏插入圖片描述

第一次握手:建立連接時,客戶端發送SYN包(seq=x)到服務器,並進入SYN_SENT狀態,等待服務器確認;SYN:同步序列編號(Synchronize Sequence Numbers)。(seq爲序號)

第二次握手:服務器收到SYN包,必須確認客戶的SYN(ack=x+1),同時自己也發送一個SYN包(seq=y),即SYN+ACK包,此時服務器進入SYN_RECV狀態;

第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=y+1),此包發送完畢,客戶端和服務器進入ESTABLISHED(TCP連接成功)狀態,完成三次握手。

TCP四次揮手過程

在這裏插入圖片描述第一次揮手:客戶端進程發出連接釋放報文,並且停止發送數據。釋放數據報文首部,FIN=1,其序列號爲seq=u(等於前面已經傳送過來的數據的最後一個字節的序號加1),此時,客戶端進入FIN-WAIT-1(終止等待1)狀態。 TCP規定,FIN報文段即使不攜帶數據,也要消耗一個序號。

第二次揮手:服務器收到連接釋放報文,發出確報文,ACK=1,ack=u+1,並且帶上自己的序列號seq=v,此時,服務端就進入了CLOSE-WAIT(關閉等待)狀態。TCP服務器通知高層的應用進程,客戶端向服務器的方向就釋放了,這時候處於半關閉狀態,即客戶端已經沒有數據要發送了,但是服務器若發送數據,客戶端依然要接受。這個狀態還要持續一段時間,也就是整個CLOSE-WAIT狀態持續的時間。

客戶端收到服務器的確認請求後,此時,客戶端就進入FIN-WAIT-2(終止等待2)狀態,等待服務器發送連接釋放報文(在這之前還需要接受服務器發送的最後的數據)。

第三次揮手:服務器將最後的數據發送完畢後,就向客戶端發送連接釋放報文,FIN=1,ack=u+1,由於在半關閉狀態,服務器很可能又發送了一些數據,假定此時的序列號爲seq=w,此時,服務器就進入了LAST-ACK(最後確認)狀態,等待客戶端的確認。

第四次揮手:客戶端收到服務器的連接釋放報文後,必須發出確認,ACK=1,ack=w+1,而自己的序列號是seq=u+1,此時,客戶端就進入了TIME-WAIT(時間等待)狀態。注意此時TCP連接還沒有釋放,必須經過2∗∗MSL(最長報文段壽命)的時間後,當客戶端撤銷相應的TCB後,才進入CLOSED狀態。

服務器只要收到了客戶端發出的確認,立即進入CLOSED狀態。同樣,撤銷TCB後,就結束了這次的TCP連接。可以看到,服務器結束TCP連接的時間要比客戶端早一些。

TCP 確認機制

在這裏插入圖片描述

TCP窗口機制

在這裏插入圖片描述

常見面試題

【問題1】爲什麼連接的時候是三次握手,關閉的時候卻是四次握手?

答:因爲當Server端收到Client端的SYN連接請求報文後,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,“你發的FIN報文我收到了”。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。

【問題2】爲什麼TIME_WAIT狀態需要經過2MSL(最大報文段生存時間)才能返回到CLOSE狀態?

答:雖然按道理,四個報文都發送完畢,我們可以直接進入CLOSE狀態了,但是我們必須假象網絡是不可靠的,有可以最後一個ACK丟失。所以TIME_WAIT狀態就是用來重發可能丟失的ACK報文。在Client發送出最後的ACK回覆,但該ACK可能丟失。Server如果沒有收到ACK,將不斷重複發送FIN片段。所以Client不能立即關閉,它必須確認Server接收到了該ACK。Client會在發送出ACK之後進入到TIME_WAIT狀態。Client會設置一個計時器,等待2MSL的時間。如果在該時間內再次收到FIN,那麼Client會重發ACK並再次等待2MSL。所謂的2MSL是兩倍的MSL(Maximum Segment Lifetime)。MSL指一個片段在網絡中最大的存活時間,2MSL就是一個發送和一個回覆所需的最大時間。如果直到2MSL,Client都沒有再次收到FIN,那麼Client推斷ACK已經被成功接收,則結束TCP連接。

【問題3】爲什麼不能用兩次握手進行連接?

答:3次握手完成兩個重要的功能,既要雙方做好發送數據的準備工作(雙方都知道彼此已準備好),也要允許雙方就初始序列號進行協商,這個序列號在握手過程中被髮送和確認。

現在把三次握手改成僅需要兩次握手,死鎖是可能發生的。作爲例子,考慮計算機S和C之間的通信,假定C給S發送一個連接請求分組,S收到了這個分組,併發 送了確認應答分組。按照兩次握手的協定,S認爲連接已經成功地建立了,可以開始發送數據分組。可是,C在S的應答分組在傳輸中被丟失的情況下,將不知道S 是否已準備好,不知道S建立什麼樣的序列號,C甚至懷疑S是否收到自己的連接請求分組。在這種情況下,C認爲連接還未建立成功,將忽略S發來的任何數據分 組,只等待連接確認應答分組。而S在發出的分組超時後,重複發送同樣的分組。這樣就形成了死鎖。

【問題4】如果已經建立了連接,但是客戶端突然出現故障了怎麼辦?

TCP還設有一個保活計時器,顯然,客戶端如果出現故障,服務器不能一直等下去,白白浪費資源。服務器每收到一次客戶端的請求後都會重新復位這個計時器,時間通常是設置爲2小時,若兩小時還沒有收到客戶端的任何數據,服務器就會發送一個探測報文段,以後每隔75分鐘發送一次。若一連發送10個探測報文仍然沒反應,服務器就認爲客戶端出了故障,接着就關閉連接。

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