TCP连接之报文首部
在面試時,會經常被問到TCP報文的一些細節,可以說TCP報文是不少企業用來考察面試者對網絡的掌握程度的一道題目。
TCP連接作為網絡傳輸的一個環節,是不可或缺的一部分。例如,OSI七層模型的應用層HTTP就是基于TCP連接實現的。
TCP連接的三次握手和四次揮手機制相信是每個后臺開發人員耳熟能詳的知識點,那么關于TCP的報文細節以及背后的原理是怎么樣的呢?TCP是怎樣借助報文來實現三次握手和四次揮手呢?筆者通過閱讀書本和加上自己的理解。通過本文,來談談TCP報文首部以及報文首部背后的原理。
首先先粘上一張TCP報文圖
好了,下面介紹一些基礎的內容
TCP雖然是面向字節流的,但TCP傳送的數據單元卻是報文段,一個TCP報文段分首部和數據兩部分,其中很關鍵的就是TCP的報文頭,TCP的全部功能都體現在首部中的各個字段中。
TCP報文段首部的前20個字節(上圖有標識)是固定的,后面有4n字節(如果有選項最少為4字節)是根據需要添加的選項,所以TCP首部的最小長度是20字節。
?
1. 源端口號和目的端口號:
各2個字節,分別寫入源端口號和目的端口號。端口就是我們熟悉的65536個套接字的端口號,顯然,源端口號和目的端口號跟TCP的分用功能有著密切的關系,不同的應用使用不同的端口號,這樣就可以互不干擾。而通信的雙方的端口號必須相同,才能保證這一條通道是連接暢通的。
?
2.序列號(32位)
TCP是面向字節流的。在一個TCP連接中傳送的字節流中的每一個字節都是按順序編號。整個要傳送的字節流的起始序號必須在連接建立時就要設置。首部中的序號字段值指的是本報文段所發送的數據的第一個字節的序號。例如一個報文段的序號字段值是101,它的長度是100,那么跟在它后面的報文的序號字段值就是從201開始。
?
3. 確認號(32位)
是期望收到對方下一個報文段的第一個數據字節的序號。例如TCP通信雙方分別為A和B,在B正確收到A發送過來的一個報文段,例如就上面的101-200字節,那么B期望的收到下一個報文段就必須是從201開始。于是B在發送A的確認報文段中把確認號設置為201。
說到這里,上面敘述的三次握手機制的實現原理就比較清晰了,TCP連接通過序號和確認號精確地把一定長度的數據段從連接的一端傳送到另一端。
?
4. 數據偏移
因為選項字段部分,數據偏移就顯得尤為重要了。因為選項部分報文段的長度是4n,這個長度是不確定的,如果不標記這個報文段的報頭長度,就無法確定報文段的數據部分是從哪一個字節開始,這樣在解析報文的時候會出現麻煩。數據偏移就是為了解決這個問題而設計的。
?
5. URG(緊急)
?? 當URG等于1時,表明緊急指針字段有用。它用來告訴系統,這個報文段中有緊急的數據,應該盡快發送。當緊急標志被置1的時候,緊急數據就會被放在本報文段的首部,這樣做的好處是,讓緊急數據盡快發送到TCP的接收方。例如:在一大段程序通過TCP連接從發送方發往接收方,已經發送了一部分,但由于一些原因,例如發送方發送了像Ctrl+C(通常為中斷服務器服務)這類指令的時候,希望接收方盡快收到這樣的緊急信號,如果放在數據報的末尾,未免太慢了,因為這兩個字符會被放置在接收方緩存的末尾,在所有數據都被處理完畢后才交付到接收方的應用進程。
?
6. ACK(確認)
?? 這個字段是TCP通信過程比較常見的字段。當ACK=1時,確認號字段才有效,而確認號字段在上文已經說過,是發送端希望接收端下一次發送的數據的序列號。TCP協議規定,當TCP連接建立之后,所有的發送的報文ACK都置為1。也就是說,ACK字段能夠辨別TCP連接是否建立成功。如果是一個運維工程師,抓包來分析不同的字段,這個字段應該是再熟悉不過了。
?
7. PSH(推送)
有時當兩個應用進程進行交互式的通信,有時在一段的應用進程希望在輸入一個命令的時候得到接收方的響應,這個時候,TCP就可以使用推送操作。接收放收到推送字段置1的報文段,就盡快地交付給接收應用進程,而不再等到整個緩沖都填滿了再向上交互。但是據說實際上這個字段用得很少,因為TCP本身可以實現這個功能。
?
8. RST(復位)
當RST = 1時,表明TCP連接中出現了嚴重錯誤。例如主機崩潰或者其他原因,必須釋放連接。然后在 重新建立運輸連接。
?
9. SYN(同步)
?? 在連接建立時用來進行同步的信號。當SYN = 1而ASK = 0時,表明這是一個連接請求報文。對方若同意建立連接,則在響應的報文段中使SYN = 1 ,ACK = 1。
?
10 .FIN(終止)
?? 用來釋放一個連接,當FIN = 1時,表明此報文段的發送方的數據已經發送完畢,并釋放TCP連接,這個字段只有在TCP的四次揮手時候才會被置為1.
?
11.檢驗和
檢驗和字段檢驗(報文的)范圍包括首部和數據兩部分。在計算檢驗和時,都要在TCP報文段的前面添加12字節的偽首部。檢驗和有什么用?這關系到報文的正確性問題。為了保證TCP連接上傳輸的數據的正確性,即從發送方傳送到接收方沒有出現錯誤,用檢驗和來確定數據傳輸過程是否發生了錯誤。
?
12.緊急指針
??? 緊急指針在URG = 1時才有意義,它指出本報文段中的緊
?
轉載于:https://www.cnblogs.com/thomson-fred/p/9926689.html
總結
以上是生活随笔為你收集整理的TCP连接之报文首部的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6.2 二叉树的定义、性质与存储结构
- 下一篇: 句子相似度比较的归一化