報文段

報文段

報文段.是指TCP/IP協定網路傳輸過程中,起著路由導航,查詢各個網路路由網段,IP位址,交換協定等IP數據包。報文段充當整個TCP/IP協定數據包的導航路由功能。

基本介紹

  • 中文名:報文段
  • 報文:套用層的信息分組
  • 報文段:運輸層分組
  • 方式:MSS
  • 特點:可靠
  • 服務:位元組流
最大的報文段長度,相關算法,

最大的報文段長度

TCP提供的是一種面向連線的,可靠的位元組流服務,TCP提供可靠性的一種重要的方式就是MSS。通過MSS,套用數據被分割成TCP認為最適合傳送的數據塊,由TCP傳遞給IP的信息單位稱為報文段或段(segment)。代表一個TCP socket的結構體struct tcp_sock中有多個成員用於確定套用數據被分割成最大為多大的數據塊較為合適(最大報文段長度MSS)。
我們不難聯想到,跟最大報文段長度最為相關的一個參數是網路設備接口的MTU乙太網的MTU是1500,基本IP首部長度為20,TCP首部是20,所以MSS的值可達1460(MSS不包括協定首部,只包含套用數據)。
前面的TCP三次握手協定中我們看到,通訊的雙方都通過TCP選項通告了自己期望接收的MSS值,該值直接來源於struct tcp_sock的成員advmss,而這個值直接取自於網路設備接口的MTU減去IP首部和TCP首部的長度。在本地乙太網中可達1460(如果首部都不含選項的話)。而成員rx_opt是一個結構體struct tcp_options_received,它記錄的是來自對端的TCP選項通告,其成員mss_clamp表示mss的上限值,其來源就是對端的MSS 通告,而mss_user是用戶設定的mss,其優先權最高,如果有user_mss,則使用user_mss,忽略其它。
從上面我們可以看到,MSS是可以通過SYN段進行協商的(MSS選項只能出現在SYN報文段中),但它並不是任何條件下都可以協商的,如果一方不接受來自另一方的MSS值,並且沒有user_mss,則MSS就定為默認值536位元組(加上首部,允許576位元組的IP數據報)。實際上,struct tcp_sock->rx_opt->mss_clamp的初始值就定為536,等收到來自對端的MSS通告後,才進行修改。而結構體 struct tcp_sock的成員mss_cache用於快取上次的有效的mss,其初始值也被定為536。

相關算法

函式mytcp_sync_mss為一個tcp socket中的mss相關的成員進行數據同步,其基本的一個算法是:
1、當前的MSS正常情況下應該為mtu-IP首部-TCP首部(不包括選項)。
2、struct tcp_sock->rx_opt->mss_clamp中含有對端通告的能夠接受的MSS值,如果該值小於第一步計算所得到的MSS,則以該值為準。
3、IP首部如果帶有IP選項,則MSS中要減去選項長度。
4、如果MSS已經小於48了,則令其等於48。
5、減去TCP首部中選項的長度。
6、如果MSS當前已經大於滑動視窗大小的1/2,則取滑動視窗大小的1/2作為MSS值(但不能小於48)。
7、成員mss_cache用於快取下剛剛計算所得的MSS。
所以,說本地乙太網中MSS為1460的說法並不正確,它還會動態變化,如果IP首部和TCP首部中出現選項,則MSS要相應的減小,一般TCP首部中會有12位元組的時間戳選項(外加兩位元組的填充選項),這時的MSS就等於1448。
MSS的主要作用是限制另一端主機傳送的數據的長度,同時,主機本身也控制自己傳送數據報的長度,這將使以較小MTU連線到一個網路上的主機避免分段。
struct tcp_sock有一個成員xmit_size_goal,用於記錄該socket傳送數據報時的segment的大小,一般情況下它的值就等於MSS(特殊情況有例外,以後再分析)。

相關詞條

熱門詞條

聯絡我們