linux網路編程之TCP/IP基礎(四):TCP串連的建立和斷開、滑動視窗

來源:互聯網
上載者:User

一、TCP段格式:

TCP的段格式如所示


源連接埠號碼與目的連接埠號碼
源連接埠號碼和目的連接埠號碼,加上IP首部的源IP地址和目的IP地址唯一確定一個TCP串連。


序號
序號表示在這個報文段中的第一個資料位元組序號。


確認號
僅當ACK標誌為1時有效。確認號表示期望收到的下一個位元組的序號。


頭部長度
4位,TCP頭部最多60個位元組,最少20個位元組


保留位
6位,必須為0


6個標誌位
URG-緊急指標有效
ACK-確認序號有效
PSH-接收方應儘快將這個報文段交給應用程式層
RST-串連重設
SYN-同步序號用來發起一個串連
FIN-表示將要終止一個串連

視窗大小
通過視窗大小來達到流量控制。

校正和
對tcp表頭與資料進行校正。


緊急指標
是一個正的位移量,與序號欄位中的值相加表示緊急資料最後一個位元組的序號。TCP的緊急方式是發送端向另一端發送緊急資料(也稱為帶外資料)的一種方式。

選項與填充(選項為4位元組整數倍,否則用0填充)
最常見的可選欄位是最長報文大小MSS(Maximum Segment Size),每個串連方通常都在通訊的第一個報文段中指明這個選項。它指明本端所能接收的最大長度的報文段(payload)。該選項如果不設定,預設為536(20+20+536=576位元組的IP資料報),其中ip首部和tcp首部各20個位元組,而internet
上標準的MTU (最小)為576B。


二、通訊時序(3次握手-->傳輸資料-->4次揮手)

是一次TCP通訊的時序圖:



在這個例子中,首先用戶端主動發起串連、發送請求,然後伺服器端響應請求,然後用戶端主動關閉串連。兩條豎線表示通訊的兩端,從上到下表示時間的先後順序,注意,資料從一端傳到網路的另一端也需要時間,所以圖中的箭頭都是斜的。雙方發送的段按時間順序編號為1-10,各段中的主要資訊在箭頭上標出,例如段2的箭頭上標著SYN, 8000(0), ACK 1001, <mss 1024>,表示該段中的SYN位置1,32位序號是8000,該段不攜帶有效載荷(資料位元組數為0),ACK位置1,32位確認序號是1001,帶有一個mss選項值為1024。


建立串連的過程:
1. 用戶端發出段1,SYN位表示串連請求。序號是1000,這個序號在網路通訊中用作臨時的地址,每發一個資料位元組,這個序號要加1,這樣在接收端可以根據序號排出資料包的正確順序,也可以發現丟包的情況,另外,規定SYN位和FIN位也要佔一個序號,這次雖然沒發資料,但是由於發了SYN位,因此下次再發送應該用序號1001。mss表示最大段尺寸,如果一個段太大,封裝成幀後超過了鏈路層的最大幀長度,就必須在IP層分區,為了避免這種情況,用戶端聲明自己的最大段尺寸,建議伺服器端發來的段不要超過這個長度。
2. 伺服器發出段2,也帶有SYN位,同時置ACK位表示確認,確認序號是1001,表示“我接收到序號1000及其以前所有的段,請你下次發送序號為1001的段”,也就是應答了用戶端的串連請求,同時也給用戶端發出一個串連請求,同時聲明最大尺寸為1024。
3. 用戶端發出段3,對伺服器的串連請求進行應答,確認序號是8001。


在這個過程中,用戶端和伺服器分別給對方發了串連請求,也應答了對方的串連請求,其中伺服器的請求和應答在一個段中發出,因此一共有三個段用於建立串連,稱為'''三方握手(three-way-handshake)'''。在建立串連的同時,雙方協商了一些資訊,例如雙方發送序號的初始值、最大段尺寸等。


在TCP通訊中,如果一方收到另一方發來的段,讀出其中的目的連接埠號碼,發現本機並沒有任何進程使用這個連接埠,就會應答一個包含RST位的段給另一方。例如,伺服器並沒有任何進程使用8080連接埠,我們卻用telnet用戶端去串連它,伺服器收到用戶端發來的SYN段就會應答一個RST段,用戶端的telnet程式收到RST段後報告錯誤Connection timeout:


資料轉送的過程:
1. 用戶端發出段4,包含從序號1001開始的20個位元組資料。
2. 伺服器發出段5,確認序號為1021,對序號為1001-1020的資料表示確認收到,同時請求發送序號1021開始的資料,伺服器在應答的同時也向用戶端發送從序號8001開始的10個位元組資料,這稱為piggyback。
3. 用戶端發出段6,對伺服器發來的序號為8001-8010的資料表示確認收到,請求發送序號8011開始的資料。

在資料轉送過程中,ACK和確認序號是非常重要的,應用程式交給TCP協議發送的資料會暫存在TCP層的發送緩衝區中,發出資料包給對方之後,只有收到對方應答的ACK段才知道該資料包確實發到了對方,可以從發送緩衝區中釋放掉了,如果因為網路故障丟失了資料包或者丟失了對方發回的ACK段,經過等待逾時後TCP協議自動將發送緩衝區中的資料包重發。


這個例子只描述了最簡單的一問一答的情景,實際的TCP資料轉送過程可以收發很多資料區段,雖然典型的情景是用戶端主動請求伺服器被動應答,但也不是必須如此,事實上TCP協議為應用程式層提供了全雙工系統(full-duplex)的服務,雙方都可以主動甚至同時給對方發送資料。


如果通訊過程只能採用一問一答的方式,收和發兩個方向不能同時傳輸,在同一時間只允許一個方向的資料轉送,則稱為'''半雙工(half-duplex)''',假設某種連線導向的協議是半雙工的,則只需要一套序號就夠了,不需要通訊雙方各自維護一套序號。


關閉串連的過程:
1. 用戶端發出段7,FIN位表示關閉串連的請求。
2. 伺服器發出段8,應答用戶端的關閉串連請求。
3. 伺服器發出段9,其中也包含FIN位,向用戶端發送關閉串連請求。
4. 用戶端發出段10,應答伺服器的關閉串連請求。


建立串連的過程是三方握手,而關閉串連通常需要4個段,伺服器的應答和關閉串連請求通常不合并在一個段中,因為有串連半關閉的情況(調用shutdown而不是close),這種情況下用戶端關閉串連之後就不能再發送資料給伺服器了,但是伺服器還可以發送資料給用戶端,直到伺服器也關閉串連為止。

三、滑動視窗和流量控制

如果發送端發送的速度較快,接收端接收到資料後處理的速度較慢,而接收緩衝區的大小是固定的,就會遺失資料。TCP協議通過'''滑動視窗(SlidingWindow)'''機制解決這一問題。看的通訊過程。


1. 發送端發起串連,聲明最大段尺寸是1460,初始序號是0,視窗大小是4K,表示“我的接收緩衝區還有4K位元組空閑,你發的資料不要超過4K”。接收端應答串連請求,聲明最大段尺寸是1024,初始序號是8000,視窗大小是6K。發送端應答,三方握手結束。
2. 發送端發出段4-9,每個段帶1K的資料,發送端根據視窗大小知道接收端的緩衝區滿了,因此停止發送資料。
3. 接收端的應用程式提走2K資料,接收緩衝區又有了2K空閑,接收端發出段10,在應答已收到6K資料的同時聲明視窗大小為2K。

4. 接收端的應用程式又提走2K資料,接收緩衝區有4K空閑,接收端發出段11,重新聲明視窗大小為4K。
5. 發送端發出段12-13,每個段帶2K資料,段13同時還包含FIN位。
6. 接收端應答接收到的2K資料(6145-8192),再加上FIN位佔一個序號8193,因此應答序號是8194,接收端同時聲明視窗大小為2K。
7. 接收端的應用程式提走2K資料,接收端重新聲明視窗大小為4K。
8. 接收端的應用程式提走剩下的2K資料,接收緩衝區全空,接收端重新聲明視窗大小為6K。
9. 接收端的應用程式在提走全部資料後,決定關閉串連,發出段17包含FIN位,發送端應答,串連完全關閉。


在接收端用小方塊表示1K資料,實心的小方塊表示已接收到的資料,虛線框表示接收緩衝區,因此套在虛線框中的空心小方塊表示視窗大小,可以看出,隨著應用程式提走資料,虛線框是向右滑動的,因此稱為滑動視窗。


從這個例子還可以看出,發送端是一K一K地發送資料,而接收端的應用程式可以兩K兩K地提走資料,當然也有可能一次提走3K或6K資料,或者一次只提走幾個位元組的資料,也就是說,應用程式所看到的資料是一個整體,或說是一個流(stream),在底層通訊中這些資料可能被拆成很多資料包來發送,但是一個資料包有多少位元組對應用程式是不可見的,因此TCP協議是面向流的協議,這也是容易出現粘包問題的原因。而UDP是面向訊息的協議,每個UDP段都是一條訊息,應用程式必須以訊息為單位提取資料,不能一次提取任意位元組的資料,這一點和TCP是很不同的。


四、TCP如何保證可靠性

1、應用資料被分割成TCP認為最適合發送的資料區塊,稱為段傳遞給IP層。
2、當TCP發出一個段後,它啟動一個定時器,等待目的端確認收到這個報文段。如果不能及時收到一個確認,將重發這個報文段。
3、當TCP收到發自TCP串連另一端的資料,它將發送一個確認。這個確認不是立即發送,通常將延遲幾分之一秒。
4、TCP將保持它首部和資料的校正和。這是一個端到端的校正和,目的是檢測資料在傳輸過程中的任何變化。如果收到段的校正和有差錯,TCP將丟棄這個報文段並且不確認(導致對方逾時重傳)
5、TCP承載於IP資料報來傳輸,而IP資料報的到達可能會失序,因此TCP報文段的到達也可能會失序。TCP將對收到的資料進行重新排序。
6、IP資料報會發生重複,TCP的接收端必須丟棄重複的資料。
7、TCP還能提供流量控制。TCP串連的每一方都有一定大小的緩衝空間。

參考:

《Linux C 編程一站式學習》

《TCP/IP詳解 卷一》

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.