1. 程式人生 > >TCP中報文段大小(MSS)、MTU

TCP中報文段大小(MSS)、MTU

寫這篇部落格是因為直到今天才搞懂什麼叫做最大報文段長度。這也讓我想起了當初我面試騰訊實習時,面試官問我的TCP相關的問題“TCP報文的長度在TCP三次握手中那一次確定的?”因為當初相關網路的知識剛剛複習,比較生疏。我當時還以為他是想考我TCP報文段中“視窗”欄位的意思呢,我當時想了一下,回答了“第三次”。面試官聽到我的答案後沒有什麼表情,現在想想自己當初的回答是多麼的low比。面試官給了我很大的面子沒有嘲笑我。以後要好好複習。今天在這裡總結下TCP最大報文段的相關知識點。

一、MSS的含義

我們知道TCP傳輸可靠性的保證中有一點是:TCP會將應用層交付下來的資料分為TCP認為最適合傳送的資料塊。這裡的資料塊大小就是MSS(maximum segment size最大分段長度)。

MSS欄位位於TCP首部中的選項欄位。

一句話,MSS就是TCP報文段所允許傳送的最大資料部分的長度,如果上層交付下來的資料太大,就對其進行資料分塊。這個分塊過程是在運輸層完成的,在接收端的運輸層對分塊的TCP報文段的資料部分進行重組。

注意:這個MSS指的是TCP報文段中資料部分的最大長度,並不是整個TCP報文段長度。整個TCP報文段長度 = TCP首部長度 + TCP資料部分長度。

二、通訊雙方如何協商MSS

MSS的值是在TCP三次握手建立連線的過程中,經通訊雙方協商確定的。我們都知道鏈路層使用乙太網的話,IP層的MTU是1500 byte,這樣去掉IP資料報首部(20 byte),在去掉TCP首部(20 byte)後為1460 byte,此時在預設情況下TCP“選項”欄位的MSS值為1460 byte = 1500 - 20 - 20。在 Internet 標準中,IP層的MTU是576 byte,那麼此時TCP“選項”欄位的MSS值為536 byte = 576 - 20 - 20。

以上是預設情況下一個TCP報文段中的MSS值,下面我們詳細說明MSS值的確定過程。

MSS值只會出現在SYN報文中(不要問我為什麼,我也不知道為什麼只出現SYN報文中),即SYN=1時,才會有MSS欄位值。當客戶端想要以TCP方式從伺服器端下載資料時,

(1)首先客戶端會發送一個SYN請求報文,這個SYN報文的“選項”欄位中會有MSS值(MSS = MUT - IP首部長度 - TCP首部長度)。該MSS值是為了告知對方最大的傳送資料大小。

(2)當伺服器端收到SYN報文後,會向請求端返回SYN+ACK(同步確認報文)報文,其中的“選項”欄位也會有MSS值。

(3)通訊雙方選擇SYN和SYN+ACK報文中最小的MSS最為此次TCP連線的MSS,從而達到通訊雙發協商MSS的效果。

綜上,可以回答開始時的問題。在第二次握手後就可以確定TCP中最大傳輸報文(MSS)大小。

三、MTU

MTU是最大傳輸單元,這個根據由具體的網路決定的,如乙太網MTU=1500,Internet的MTU=576。

如果IP層所要傳輸的資料長度>MTU的話,要對這個資料進行分片處理,每個片長度都小於MTU,每個片構成一個IP資料報進行傳輸。

在服務端的IP層使用IP資料報的首部資訊對這些分片的IP資料報進行重組。這樣使得IP層的分片對傳輸層看起來是透明的(傳輸層不知道IP層進行了分片操作)。

四、MTU分片的一個問題

(1)如果IP層每個分片都正確到達目的端,那自然是很好的。但是如果IP層在傳送端對要傳送的資料(TCP報文段)進行分片操作,但是在傳輸過程中某個分片發生了錯誤,這樣會使整個TCP報文段重傳。因為IP層不負責可靠性(超時和重傳),可靠性有傳輸層提供。

這也是TCP對資料分段的一個原因,分段後的資料在往下交付後肯定不會超過MTU,這樣避免了因為分片而帶來的的麻煩。

(2)如果UDP進行資料傳輸的話,UDP將應用層交付下來的整個資料封裝為UDP資料報(沒有像TCP分塊的操作)。這樣IP層的資料很容易超過MTU,造成資料分片。而TCP的資料分塊,不會導致IP層的分片。

總的來說UDP不會分段,就由IP來分片。TCP分段,也就不用IP來分片了!

總結:

1、IP分片是由於傳輸的資料超過了MTU,TCP分塊是由於資料超過了MSS。

2、IP分片是在傳送端的網路層中進行的,IP重組是在接收端的網路層中,根據IP首部完成的。TCP資料分塊是在傳送端的傳輸層進行的,TCP重組是在接收端的傳輸層完成的。IP層的分片與重組對傳輸層是透明的。

一般情況下,使用UDP、ICMP傳送資料時,在網路層要進行分片。而使用TCP傳輸的話,TCP的MSS分塊避免了分片。

相關推薦

TCP報文大小MSSMTU

寫這篇部落格是因為直到今天才搞懂什麼叫做最大報文段長度。這也讓我想起了當初我面試騰訊實習時,面試官問我的TCP相關的問題“TCP報文的長度在TCP三次握手中那一次確定的?”因為當初相關網路的知識剛剛複

Linux設定TCP傳送報文大小SEGMENT

為了構造特定payload的tcp報文,算是費了一些功夫。 第一次嘗試: 修改介面MTU。發現然而並沒什麼用。。 第二次嘗試 修改MSS,這個MSS是有範圍的,如果payload需要設定成固定的20就沒有辦法了 第三次嘗試 使用setsocketoption來設定傳送的緩衝

AOP的連線點Joinpoint切點Pointcut增強Advice引介Introduction織入Weaving切面Aspect

連線點(Joinpoint):程式執行的某個特定位置(如:某個方法呼叫前、呼叫後,方法丟擲異常後)。一個類或一段程式程式碼擁有一些具有邊界性質的特定點,這些程式碼中的特定點就是連線點。Spring僅支援方法的連線點。 切點(Pointcut):如果連線點相當於資料中的記錄,那麼

你如何理解AOP的連線點Joinpoint切點Pointcut增強Advice引介Introduction織入Weaving切面Aspect這些概念?

a. 連線點(Joinpoint):程式執行的某個特定位置(如:某個方法呼叫前、呼叫後,方法丟擲異常後)。一個類或一段程式程式碼擁有一些具有邊界性質的特定點,這些程式碼中的特定點就是連線點。Spring僅支援方法的連線點。  b. 切點(Pointcut):如果連線點相當

oracle實現擷取字串substr查詢字串位置instr替換字串replace

 (1)oracle中實現擷取字串:substr substr(string, start_position, [length]) 其中,string是元字串,start_position為開始位

python---djangoorm的使用4,參數on_delete重點補充

protect 設置 lean 速度 str through 存在 也會 ren 1.索引: 普通索引:加快查找速度 唯一索引:加快查找速度,唯一約束 主鍵索引:加快查找速度,唯一索引,不為空 class UserInfo(models.Model): user

JAVA如何設定圖片圖示自適應Jlable等元件的大小

一、問題: 一個程式,元件上設定某個圖片作為圖示,因為的label(應該說是元件)已經設定了固定大小, 所以再開啟一些大圖片時,超過元件大小的部分沒顯示出來,而小圖片又沒填充完整個元件 二、解決這個

word字型大小pt和網頁css設定font-size時用的px大小對應關係

pt與px轉換關係為 1px= 0.75pt。 所以word中五號字型(10.5pt)在網頁中對應的大小為font-size:14px。(10.5 / 0.75 = 14) 初號44pt 小初36pt 一號26pt 小一24pt 二號22pt 小二18pt 三號16pt 小

ArcGISMultiPart Polyline的座標提取及重繪

前段時間在專案中需要將Shp檔案中的多線段(Polyline)的座標提取出來,存成座標序列檔案如XML,方便前端應用中展示。 於是直接將Polyline強轉為IPointCollection介面,進而獲取點座標序列,寫成XML檔案。思路清晰,實現也很簡單。 經過一段時間應用

C/C++錯誤Segmentation fault

}3)其他其實大概的原因都是一樣的,就是段錯誤的定義。但是更多的容易出錯的地方就要自己不斷積累,不段發現,或者吸納前人已經積累的經驗,並且注意避免再次發生。例如:<1>定義了指標後記得初始化,在使用的時候記得判斷是否為NULL<2>在使用陣列的時候是否被初始化,陣列下標是否越界,陣列元

『ORACLE』 數據泵Data Pumpexpdp導出11g

schema 導出表 data mp3 字符 acl spa style -s [[email protected]/* */ ~]$ mkdir datadump[[email protected]/* */ ~]$ cd datadump/[[e

java-web生成文檔

all 檢查 download com ftl 緩沖 getc cor tps 基於Java的解決方案也是很多的,包括使用Jacob、Apache POI、Java2Word、iText等各種方式,其實在從Office 2003開始,就可以將Office文檔轉換成XML文件

phpcurl的使用

lookup mpat com 2.0 libcurl borde 基於 測試 字符串 cURL 是一個利用URL語法規定來傳輸文件和數據的工具,PHP的curl是通過libcurl庫與服務器使用各種類型的協議,如HTTP、FTP、TELNET等。 PHP curl函數

OpenGL在MFC的使用總結——基本框架

palette 接受 white 要求 無效 結構 del 一次 是你 項目中要畫3D顯示的模型,於是要用到OpenGL,加上是在MFC中,並且是在MFC中的ActiveX中使用。再並且鑒於他們程序主框架的設定。常規的方法還不一定能實現。所以還是查過不少資料,在此一一總

Java的反射機制

erl void port 令行 sage [0 ray 輸出 我們 基本概念   在Java運行時環境中,對於任意一個類,能否知道這個類有哪些屬性和方法?對於任意一個對象,能否調用它的任意一個方法?   答案是肯定的。   這種動態獲取類的信息以及動態調用對象的方法的功能

JAVA的枚舉

enum 枚舉 在實際編程中,往往存在著這樣的“數據集”,它們的數值在程序中是穩定的,而且“數據集”中的元素是有限的。例如星期一到星期日七個數據元素組成了一周的“數據集”,春夏秋冬四個數據元素組成了四季的“數據集”。在Java中想表示這種數據集最容易想到的寫法可能是這樣,我們以表示一周五天的工作日來舉

HTML和CSS的居中效果1

htm inner height overflow n-1 txt posit splay read HTML和CSS中的居中效果 單行上下左右居中 Html: <div class=”container”></div> CSS:

pythonxrange和range

log item .py 對象 nbsp net range all file 說到序列,我們第一想到的是一組有序元素組成的集合。同時,每個元素都有唯一的下標作為索引。 在Python中,有許多內界的序列。包括元組tuple,列表list,字符串str等。上面提到的序列

R環境的工作空間workspace

nbsp help dir style mod 部分 setw 保存 讀取 工作空間(workspace)就是當前R的工作環境,它儲存著全部用戶定義的對象(向量、矩陣、函數、數據框、列表) 。在一個R會話結束時,你能夠將當前工作空間保存到一個鏡像中。並在下次啟動R時

DelphiMD5實現方法

file 單元 ava sender shm md5 文章 files admin 原來寫過一個計算MD5的程序,是用了一個叫MD5.pas的單元,使用起來還算簡單,但還有更簡單的辦法,安裝了indy就會有IdHashMessageDigest單元(delphi 7默認安裝