TCP的基礎知識

1. 簡介

定義:TCP(Transmission Control Protocol),即傳輸控制協議,是一種傳輸層通信協議。

特點:面向連接、面向字節流、可靠的雙全工通信協議。

面向連接:指的是要使用TCP傳輸數據,必須先建立TCP連接,傳輸完成後釋放連接。就像打電話一樣必須先撥號建立一條連接,打完後掛機釋放連接。

雙全工通信:即一旦建立了TCP連接,通信雙方可以在任何時候都能發送數據。

可靠的:指的是通過TCP連接傳送的數據,無差錯,不丟失,不重複,並且按序到達。

面向字節流:流,指的是流入到進程或從進程流出的字符序列。簡單來說,雖然有時候要傳輸的數據流太大,TCP報文長度有限制,不能一次性傳輸完,要把它分成好幾個數據塊,但是由於可靠性保證,接收方可以按順序接收數據塊然後重新組成分塊之前的數據流,所以TCP看起來就像直接互相傳輸字節流一樣,面向字節流。

2. TCP/IP的分層管理

TCP/IP協議族裏最重要的一點就是分層。TCP/IP協議族按層次分別分爲以下4層:應用層、傳輸層、網絡層和數據鏈路層。

把TCP/IP層次化是有好處的。比如,如果互聯網只由一個協議統籌,某個地方需要改變設計時,就必須要把所有部分整體替換掉。而分層之後只需把變動的層替換掉即可。把各層之間的接口部分規劃好之後,每個層次內部的設計就能夠自由改動了。

值得一提的是,層次化之後,設計也變得相對簡單了。處於應用層上的應用可以只考慮分派給自己的任務,而不需要弄清對方在地球上哪個地方、對方的傳輸路線是怎樣的、是否能確保傳輸等送達問題。

應用層

應用層決定了向用戶提供應用服務時通信的活動。

TCP/IP協議族內預存了各類通用的應用服務。比如,FTP(File Transfer Protocol,文件傳輸協議)和DNS(Domain Name System,域名系統)服務就是其中兩類。Http協議也處於改層。

傳輸層

傳輸層對上層應用層,提供處於網絡連接中的兩臺計算機之間的數據傳輸。

在傳輸層有兩個性質不同的協議:TCP(Transmission Control Protocol,傳輸控制協議)和UDP(User Data Protocol,用戶數據報協議)。

網絡層(又名網絡互連層)

網絡層用來處理在網絡上流動的數據包。數據包是網絡傳輸的最小數據單位。改成規定了通過怎樣的路徑(所謂的傳輸路線)到達對方計算機,並把數據包傳送給對方。

與對方計算機之間通過多臺計算機或網絡設備進行傳輸時,網絡層所起的作用就是在衆多的選項內選擇一條傳輸路線。

鏈路層(又名數據鏈路層,網絡接口層)

用來處理連接網絡的硬件部分。包括控制操作系統、硬件的設備驅動、NIC(Network Interfance Card,網絡適配器,即網卡),及光纖等物理可見部分(還包括連接器等一些傳輸媒介)。硬件上的範疇均在鏈路層的作用範圍之內。

TCP/IP模型和OSI模型

OSI模型分爲七層:分別是,應用層、表示層、會話層、傳輸層、網絡層、鏈路層和物理層。OSI七層模型對應TCP的四層模型如下所示。

3. TCP的三次握手

TCP建立連接,必須要進行三次握手:若A要與B進行連接,則必須經過以下幾個步驟。

第一次握手:建立連接。客戶端向服務端發送連接請求報文段,將SYN置爲1,Sequence Number置爲x;然後,客戶端進入SYN_DENT狀態,等待服務器的確認。即A發送信息給B。

第二次握手:服務器收到客戶端的SYN報文段,需要對這個SYN報文段進行確認。即B收到連接信息後向A返回確認信息。此時服務器進入SYN_RECV狀態。確認信息是:SYN=1,回覆應答字段ACK=1,Sequence=y,ack=x+1;

第三次握手:(針對服務器端的SYN的確認應答)客戶端收到服務器的(SYN+ACK)報文段,並向服務器發送ACK報文段。即A收到確認信息後再次向B返回確認連接信息。此時客戶端與服務器進入ESTABLISHED狀態。應答信息是:ACK=1,Sequence=x+1,ack=y+1。

此時,A會告訴自己上層連接建立;B收到連接信息後告訴上層連接建立。

三次握手過程,借用網上的一張圖進行說明。

這樣就完成了TCP三次握手過程,相當於TCP的連接建立完成可以開始傳輸數據了。

問題一:爲什麼是三次握手?

答:本質上是因爲TCP是全雙工,爲了保證傳輸的可靠性,需要給每次傳輸的數據段添加序號,那麼初始的序號就是TCP三次握手真正的意義所在。

理解:在一次網絡傳輸過程中,C端發送給S端的數據包可能會被分割成多段,每一段都有一個序號,發送給S端的數據包並無法確保先發送的先收到後發送的後收到,所以每段數據都會有一個序號。S端收到數據後也並不是每收一個就立馬返回給C端。在S端有一個隊列緩衝區,等到所有數據全收到後,S端會先進性一個排序,然後再將數據返回給C端。故此,三次握手它做的事情就是交換TCP通信的屬實序號。至於爲什麼是三次握手,這裏用通俗的話解釋就是爲了確保通信的可靠性。首先第一次,C端發送序號給S端是告訴S端我發送的序號是啥啥啥,你別搞錯了。第二次S端將收到的數據排序打包後再生成一個新的序號告訴C端,我給你返回的數據是啥啥啥,你別搞錯了。第三次是C端告訴S端我收到你給我的迴應了,內容是啥啥啥。

至此,TCP的三次握手過程就完成了。

4. TCP的四次揮手

TCP釋放連接需要四次揮手的過程,該過程可以是客戶端或者服務端首先發起斷開連接的請求。現在假設A主動釋放連接(數據傳輸結束後,通信的雙方都可以釋放連接)

第一次揮手:A發送釋放信息給B。發出去之後,A->B發送數據這條路就斷了。此時A(客戶端)就進入了FIN-WAIT-1(終止等待1)狀態。

第二次揮手:B收到釋放信息後,回覆確認釋放的信息。服務端同意客戶端的釋放連接請求。此時服務器進入了CLOSE-WAIT(關閉等待)狀態。在此之後(客戶端收到服務器的確認請求),此時客戶端就進入了FIN-WAIT-2(終止等待2)狀態。等待服務器發送連接釋放報文。

第三次揮手:B發送請求釋放連接信息給A。此時是服務器向客戶端發送連接釋放報文。此時服務器進入了LASK-ACK(最後確認)狀態,等待客戶端的確認。

第四次揮手:A收到服務器B發出的釋放連接信息後,向B發出確認釋放信息。B收到確認信息後就會正式關閉連接。此時,客戶端進入了TIME-WAIT(時間等待)狀態。此時TCP連接還沒有釋放,必須經過2*SML時間段後,客戶端纔會進入CLOSED狀態。

該過程用圖表示可能會更清楚一些。

至此,TCP的四次揮手也就學習完了。上面描述了爲什麼需要三次握手,至此是否會有疑問,爲什麼握手需要三次,而揮手卻需要四次呢?現在我們來看一下這個問題。

我們知道,TCP是全雙工的(即,客戶端和服務端可以相互發送和接收請求),所以需要雙方都確認關閉連接。基於此,我們更詳細的分析其中的道理。通信雙方都可以獨立關閉自己的通信通道,也就是辦關閉。客戶端先發送FIN告知服務端我已經完成數據發送了,服務端發送ack來告知客戶端它已知曉此事。這樣的一個流程下來,就關閉了客戶端的發送信息通道,但是還是可以接受來自服務端的數據的。此時的服務端已經不能接收來自客戶端的數據了,但是它還是可以給客戶端發送數據。如果服務端也沒有數據要發送給客戶端了,服務端也會以一個FIN標誌位發送一個釋放連接的信息給客戶端,客戶端收到後會發送一個ack確認信息表示已經知曉。這樣就關閉了服務端的發送信息通道和客戶端的接收信息通道。

 

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