問題聚焦:
本節從以下四個方面討論TCP協議:
TCP頭部信息:指定通訊的源端端口號、目的端端口號、管理TCP鏈接,控制兩個方向的數據流
TCP狀態轉移過程:TCP鏈接的任意一端都是一個狀態機
TCP數據流:兩種主要類型:交互數據流,成塊數據流
TCP數據流的控制:保證可靠傳輸和提升網絡通訊質量,兩個方面:超時重傳,擁塞控制
1 TCP服務的特色
傳輸層協議:TCP協議,UDP協議
TCP協議特色:面向鏈接,字節流和可靠傳輸
先創建鏈接,才能開始讀寫數據
雙方都要分配內核資源
全雙工,讀寫能夠經過一個鏈接
必須斷開鏈接,以釋放資源
一對一,因此不適合基於廣播和多播的應用程序(UDP適合)
字節流服務:發送端執行的寫操做次數和接收端執行的讀操做次數之間沒有任何數量關係,這就是字節流的概念,即應用程序對數據的發送和接收是沒有邊界限制的。
(和字節流相對應的是數據報服務:如UDP,發送端應用程序沒執行一次寫操做,UDP模塊就將其封裝成一個UDP數據報併發送之,接收端必須針對每個UDP數據報執行讀操做。)
TCP字節流服務和UDP數據報服務的工做流程區別以下圖所示:
TCP傳輸是可靠的:
- 發送應答機制,即發送端發送的每一個TCP報文段都必須獲得接收方的應答,才認爲這個TCP報文段傳輸成功
- 超時重傳機制:發送端在發送出一個TCP報文段以後啓動定時器,若是在定時時間內未收到應答,它將重發該報文段
- 重排,整理:TCP報文段最終是以IP數據報發送的,而IP數據報到達接收端可能亂序、重複,因此TCP協議還會對接收到的TCP報文段重排、整理,再交付給應用層。
2 TCP頭部結構
如圖:
16位端口號:告知主機該報文段是來自哪裏(源端口號),以及傳給哪一個上層協議或應用程序(目的端口)。對於客戶端來講,端口號常爲系統自動選擇。
32位序號:一個TCP通訊過程當中某一個傳輸方向上的字節流的每一個字節的編號。如某個TCP報文段傳送的數據是字節流中的第1025到2048字節,那麼該報文段的序號值就是ISN+1025,ISN爲初始序號值。
32位確認號:用做對另外一方發送來的TCP報文段的響應。其值是收到的TCP報文段的序號值加1。
4位頭部長度:標識TCP頭部有多少個4字節。最長標識60字節。
6位標誌位:ACK(確認號是否有效),SYN(請求創建一個鏈接),FIN(通知對方本端要關閉鏈接)
16位窗口大小:TCP流量控制窗口。告訴對方本端的TCP緩衝區還能容納多少字節的數據。
16位校驗和:CRC算法校驗。這個校驗不只包括TCP頭部,也包括數據部分。
16位緊急指針:發送端向接收端發送緊急數據的方法。一個正的偏移量,它和序號字段的值相加表示最後一個緊急數據的下一字節的序號。
選項:最多40字節。常見7種類型。
結構:
常見的7種選項:
Demo 使用tcpdump觀察TCP頭部信息
須要注意的一點是,tcpdump輸出的TCP報文段描述信息和TCP頭部二進制信息是徹底對應的,只是省略了一些不經常使用的信息,因此只是在這裏具體分析TCP頭部的二進制信息,而在後面只使用tcpdump的描述信息進行過程的分析。
首先來看一下tcpdump的描述信息的含義:
Flags [S]: 表示該TCP報文段包含SYN標識,所以它是一個同步報文段。若是TCP報文段包含其餘標識,則tcpdump也會將該標誌的首字母顯示在Flags後的方括號中。
seg:序號值。
win:接收通告窗口的大小。這是一個同步報文段,因此win值反映的是實際的接收通告窗口的大小。
options:TCP選項字段。mss(發送端聲明的最大報文長度),sackOK(發送端支持並贊成使用SACK選項),TS val(發送端的時間戳),ecr(時間戳回顯應答,第一個報文,因此時間戳的應答位0),nop(空選項操做),wscale(發送端使用的窗口擴大因子位6)。
接下來分析二進制信息:從第21字節開始
十六進制數 |
十進制表示 |
TCP頭部信息 |
0xa295 |
41621 |
源端口號 |
0x0017 |
23 |
目的端口號 |
0xd099e103 |
3499745539 |
序號 |
0x00000000 |
0 |
確認號 |
0xa |
10 |
TCP頭部長度爲10個4字節,即40字節 |
0x002 |
|
設置了SYN標誌位,即SYN=1 |
0x8010 |
32792 |
接收窗口大小 |
0xfe30 |
|
頭部檢驗和 |
0x0000 |
|
沒設置URG位,因此緊急指針無效 |
0x0204 |
|
最大報文段長度選項的kind值和length值 |
0x400c |
16396 |
最大報文長度 |
0x0402 |
|
容許SACK選項 |
0x080a |
|
時間戳選項的kind值和length值 |
0x026e44d9 |
40781017 |
時間戳 |
0x00000000 |
0 |
回顯應答時間戳 |
0x01 |
|
空操做選項 |
0x0303 |
|
窗口擴大因子選項的kind值和length值 |
0x06 |
6 |
窗口擴大因子爲6 |
3 TCP鏈接的創建和關閉
Demo 使用tcpdump觀察的數據來分析TCP鏈接的創建和關閉
當執行telnet命令登陸和退出另一臺電腦時,會觸發TCP鏈接的的創建和關閉。抓取的包篩選出TCP鏈接部分的包,以下圖所示(爲了方便觀察,並無給出對應的二進制信息)
分析:由於整個過程並無發生應用層數據的交換,因此TCP報文段的數據部分的長度老是0。
時序圖表示以下:
TCP三次握手過程
報文段1:包含SYN標誌位,同步報文段,請求發起鏈接,初始報文序號ISN爲535734930(同步報文段佔了一個序號值)。
報文段2:包含SYN標誌位,同步報文段,初始報文序號ISN爲2159701207(同步報文段佔了一個序號值)。
包含ACK標誌位,對報文段1進行確認,確認值爲535734931,即第1個同步報文段的序號值加1。
報文段3:包含ACK標誌位,對報文段2進行確認,確認值爲2159701208,即第2個同步報文段的序號值加1。
TCP四次釋放過程
報文段4:包含FIN標誌位,結束報文段。佔用一個序號值。
報文段5:確認結束報文段4。
報文段6:發送本身的結束報文段。
報文段7:確認結束報文段6。
特殊地,半關閉狀態:
TCP鏈接是全雙工的,因此它容許兩個方向的數據傳輸被獨立關閉。
半關閉狀態:通訊的一段發送結束報文段給對方,告訴它本端已經完成了數據的發送,但容許繼續接收癩子對方的數據,直到對方也發送結束報文段以關閉鏈接。
判斷對方是否已經關閉鏈接的方法:read系統調用返回0。
socket網絡編程接口經過shudown函數提供了對半關閉的支持。
鏈接超時
對於提供可靠的TCP服務來講,當對方沒有應答時,它必然先進行重連,若是重連仍然無效,則通知應用程序鏈接超時。
在應用程序中,咱們能夠修改鏈接超時時間。在後面的章節會介紹相關的內容。
4 TCP狀態轉移
下圖是TCP完整的狀態轉移圖。描繪了全部的TCP狀態以及可能的狀態轉換。
- CLOSED是一個假想的起始點,並非一個實際的狀態。
- 粗虛線表示典型的服務器端鏈接的狀態轉移
- 粗實線表示典型的客戶端鏈接的狀態轉移
TIME_WAIT狀態:
在主動關閉流程中,假設客戶端爲接收方
客戶端接收到服務器的結束報文段以後,並無直接進入CLOSED狀態,而是轉移到TIME_WAIT狀態。
在這個狀態要等待2MSL(MSL, 報文段最大生存時間)的時間,才能徹底關閉。緣由:
- 可靠地終止TCP鏈接:若關閉確認報文段丟失(報文段7),則在這段時間等待接收重發的關閉確認報文段。
- 保證讓遲來的TCP報文段有足夠的時間被識別並丟棄:2MSL可確保在網絡上兩個傳輸方向上還沒有被接收到的、遲到的TCP報文段都已經小時。確保一個新的TCP鏈接能夠安全的創建而不會接收到上一個TCP鏈接的數據。(這也是爲何當有些和TCP相關的程序退出後,咱們沒法當即啓動它的緣由)
復位報文段:
在某些特殊條件下,TCP鏈接的一端會向另外一端發送攜帶RST標誌的報文段,即復位報文段,以通知對方關閉鏈接或從新創建鏈接。
三種產生復位報文段的3種狀況。
- 訪問不存在的端口:當客戶端程序訪問一個不存在的端口時,目標主機將給它發送一個復位報文段。
- 異常終止鏈接:一旦給對方發送一個復位報文段,發送端全部排隊等待的數據都將被丟棄。
- 處理半打開鏈接:若是客戶端(或服務器)處於半打開狀態的鏈接寫入數據,則對方將回應一個復位報文段。
5 TCP數據流
在前面的小節中,咱們討論了TCP的鏈接及其狀態,從本節開始,咱們開始討論經過TCP鏈接交換的應用程序數據。
按照數據長度分爲兩種:
- 交互數據(實時性):
- 成塊數據(傳輸效率):
- 當傳輸大量大塊數據的時候,發送方會連續發送多個TCP報文段,接收方能夠一次確認全部這些報文段。
- 服務器每發送4個TCP報文段就傳送一個PSH標誌給客戶端,以通知客戶端的應用程序儘快讀取數據。
6 TCP超時重傳
異常網絡情況下,TCP控制數據傳輸以保證其可靠服務的措施。
Point:
- TCP模塊爲每一個TCP報文段都維護一個重傳定時器,該定時器在TCP報文段第一次被髮送時啓動。
- 若是超時時間內未收到接收方的應答,TCP模塊將重傳TCP報文段並重置定時器。
- 每次重傳超時時間增長一倍。
- Linux內核有兩個重要的內核參數與TCP超時重傳相關:/proc/sys/net/ipv4/tcp_retries1和proc/sys/net/ipv4/tcp_retries2
- TCP報文段的重傳能夠發生在超時以前,即快速重傳,下一節討論。
7 擁塞控制
目的:提升網絡利用率,下降丟包率,並保證網絡資源對每條數據流的公平性。
四種擁塞控制:
- 慢啓動(slow start)
- 擁塞控制(congestion avoidance)
- 快速重傳(fast retransmit)
- 快速恢復(fast recovery)
多種實現:
最終受控制的變量:發送端向網絡一次連續寫入的數據量(SWND, 發送窗口)。
SWND限定了連續發送的TCP報文段數量。
TCP報文段的最大長度(僅指數據部分)稱爲SMSS。
影響:發送端須要合理地選擇SWND的大小。若是SWND過小,會引發明顯的網絡延遲:反之,若是SWND太大,則容易致使網絡擁塞。
窗口大小:接收方經過比較兩個值:RWND(接收通告窗口)和擁塞窗口(CWND),取其較小值,做爲SWND的值。
如圖所示:
關於TCP還剩下擁塞控制的詳細介紹,將在後續做爲專題仔細學習。
To be continued ......