成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

詳解TCP/IP重組

開發 開發工具
學習網絡應用開發的時候最大的疑惑是“分片”,幾乎在TCP/IP的每一層都有這個概念。這篇文章總結了我關于TCP/IP分片、重組的一些認識。

學習網絡應用開發的時候最大的疑惑是“分片”。幾乎在TCP/IP的每一層都有這個概念,由于專注這方面的資料非常少所以對這部分內容很多朋友多云山霧繞的,這篇文章總結了我關于TCP/IP分片、重組的一些認識,希望對大家有幫助。

MTU

按不同的網絡傳輸介質和傳輸算法網絡有不同的種類,比如令牌環、FDDI、ATM、以太網。其中以太網最為普遍——幾乎成為了網絡的代名詞,所以我們所能接觸到的所有網絡幾乎都是以太網。以太網的傳輸介質是銅纜、雙絞線、光纖;傳輸算法是CSMA/CD,按照這個算法規定數據并不是“源源不斷”的發送出去的,而是每次發送“一小段”,發送完畢后要檢測是否沖突。MTU(Maximum Transmission Unit,最大傳輸單元)就是指“一小段”數據有多大。按照IEEE802.3(以太網技術的標準化名稱)規范MTU的最大值是64字節、最大長度是1518字節。

IEEE之所以選擇這兩個值是為了考慮到線路的利用率,以10Mbps為例(以太網最早的標準),最大傳輸距離是500m,做多允許中繼4次,所以它最大允許2500m的傳輸距離。

MTU

數據在這個距離上跑個一來一回需要57.6μs,在這個時間內A一共可以發送576bit也就是72字節。去掉8個字節的前導碼和幀開始符(一個幀以7個字節的前導碼和1個字節的幀開始符作為幀的開始)也就是64字節。最大值1518字節有點“拍腦袋”的意思,采用這個值可以讓線路利用率更高,至于為什么會這樣幾乎沒有人能回答上來(包括以太網之父Bob Metcalfe也說不清楚)

以太網最大MTU是1518,(去掉以太網的源MAC地址(6字節)+目標MAC地址(6字節)+類型(2字節)+冗余校驗(4字節);所以能夠給上層協議用的最大值是1500)基于以太網的IP協議無論多大,在物理傳輸的時候都會被切分成1500個字節“按塊傳輸”。

雖然是“按塊傳輸”但是數據鏈路協議并沒有分塊和重組的概念,你可以想想發送端有一個“大水池”,數據鏈路每次從水池里取1518個字節后仍出去;接收端也有一個大水池,數據鏈路協議收到數據包后一股腦全部扔進去。(“大水池”是所有進程共享的,暫且忽略“溢出的”可能)

IP重組

數據鏈路層協議考慮到的是“兩塊網卡怎么傳輸數據”,兩端的“大水池”相當于網卡的內存空間。數據運到“大水池”里面后要有人來“分揀”,完成這項工作的就是IP協議,它會對數據包進行分揀,首先扔掉那些IP地址不是本機的數據;然后根據端口來對數據包進行分類。

每個IP端口都有一個大水池(其實所有的大水池都是鏈表),IP協議把分揀的數據放到每個端口對應的大水池里面。如果IP協議的大小是1500那么我們就不用考慮重組的問題了,但是TCP/IP協議設計的時候不是針對以太網設計的。IP協議中表示長度的字段是16位,那么單個IP數據包大小最大可以達到——65536字節。這意味著一個IP數據包可能會被拆分成多個以太網數據幀(MTU1500)傳送,所以IP數據包必須考慮能夠把N個1500字節的幀組裝起來,這就是IP重組。(IP協議從來不會主動“分片”,它只是被迫重組,受限于MTU所以有重組機制)

我們可以做個試驗,ICMP(ping)協議是基于IP的,我們模擬從172.16.46.141發送一個大小為1500的數據包到172.16.46.142。一個1500字節+ICMP頭部(8字節)=1508;會被分成兩個IP數據包,一個大小是1480(+IP頭20字節剛好是1500),一個是28(+IP頭20字節是48字節)。

IP重組

可以看到截圖中兩個IP數據包的id都是22828,其中第一個的flags部分是[+],表示有IP分片并且這是第一個分片。

  • 第一個IP分片完整大小是1500(MTU),去掉IP頭(20字節),實際大小是1480(ICMP數據包,包含頭部)
  • 第二個IP分片完整大小是48,去掉IP頭部(20字節),實際大小是28字節
  • 1480+28=1508,剛好是我們ICMP數據包的大小

這里需要解釋IP重組的幾個問題

  • IP只有重組,沒有分片。IP數據包頭部的MF標志位主要用于解決MTU和IP大小不匹配的問題,用于IP數據包重組,IP數據包從來不會主動分片。
  • IP沒有重傳,IP數據包被分為多個幀傳輸,**如果任何一個幀丟失IP數據包都會重組失敗那么整個數據包都會被丟棄**。所以基于IP協議的上層協議一般不會發送超過1500大小的數據包(考慮一下如果用UDP協議發送65535個字節,被拆分成43個MTU大小的幀,收到了42個,其中一個沒有收到那么IP數據包重組失敗,數據包被徹底丟棄,是不是很浪費帶寬?)

TCP的MSS

TCP協議格式中沒有一個字段表示數據包大小,它被設計成一個“流式”協議,所以在三次握手的時候會相互交換MSS(Maximum Segment Size 最大分段大小),表示一個TCP分片是多大。

那么MSS取值多少合適呢?有了上面的結論IP沒有重傳不難得出答案——1500最合適。如果TCP數據分片超過這個值會被拆分成多個MTU幀,從而引起IP重組;IP重組本身是不可靠的所以很有可能丟失數據包(最重要的是IP重組失敗后不會報告上層協議)要命的是TCP協議不會知道重組失敗,也沒有辦法重傳。

所以如果我們用tcpdump抓包所有的TCP三次握手MSS都是等于MTU值的。

UDP呢?

長期以來我一直疑惑單個UDP數據包最大值是多少(調用send/recv函數時傳遞的大小),UDP頭部有2個字節表示長度理論上一個UDP數據包最大能夠傳輸65536字節,這個也是IP數據包的最大理論值。有些系統定義了SO_MAX_MSG_SIZE宏來表示這個限制。

但是如果UDP數據包真的用這個值那么一定會觸發IP重組從而又回到了我們上面的結論IP只有重組沒有重傳。一個UDP數據包被拆分成43個MTU大小的幀,對端收到了42個,其中一個沒有收到那么IP數據包重組失敗,數據包被徹底丟棄,如果網絡質量不是特別好UDP數據包會經常“丟包”。

所以UDP最大數據包值合適的大小是1500-8(UDP包頭)=1492。

總結

 

IP只有重組沒有重傳,如果任何一個IP包丟失那么就會把整個數據包丟棄。所以TCP用MTU值作為MSS;UDP用1492作為最大值以此來避免IP重組。

【本文是51CTO專欄作者“邢森”的原創文章,轉載請聯系作者本人獲取授權】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2019-09-05 12:46:05

TCP加速TCPIP

2014-09-22 09:15:03

TCPIP

2014-10-15 09:14:24

IP

2020-04-10 08:55:26

TCPIPBBR算法

2019-04-08 08:44:10

TCPIP網絡協議

2010-09-27 13:35:43

TCP IP故障

2014-11-21 09:16:23

TCPIP

2013-10-25 09:32:52

OSI七層協議TCP協議

2010-09-08 15:11:36

TCP IP協議棧

2010-06-08 13:32:19

TCP IP協議基礎

2010-06-08 14:23:47

TCP IP協議概念

2019-03-28 13:34:22

IP TCP握手

2014-10-13 09:22:39

TCPIPwireshark

2017-08-16 11:00:38

TCPIP協議

2019-09-18 20:07:06

AndroidTCP協議

2018-12-05 23:18:24

TCPIP數據封裝

2010-06-08 15:10:08

2010-06-09 16:28:50

TCP IP傳輸協議

2015-03-03 10:52:48

TCPIP

2010-09-17 16:38:41

TCP IP協議
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲91av| 午夜寂寞影院列表 | 国产精品久久久久永久免费观看 | 国产视频中文字幕 | 欧美久久一级 | 亚洲成人一区二区 | 国产精品九九九 | 亚洲+变态+欧美+另类+精品 | 国产伦一区二区三区视频 | 日本一区二区高清不卡 | 国产精品久久久久久久久久久免费看 | 中文在线亚洲 | 国产成年人小视频 | 久久国内精品 | 久久精品av麻豆的观看方式 | 欧美夜夜 | 国产ts人妖系列高潮 | 成人日韩| 在线一区视频 | 在线视频 欧美日韩 | 91视频一区二区 | 日韩免费一级 | 国产一二区视频 | 中文字幕av色 | av在线免费观看网址 | 99亚洲视频| 中文字幕av网 | 国产精品一区二区久久久久 | 免费福利视频一区二区三区 | 国产成人精品一区二区三 | 日韩在线观看一区 | 成人欧美一区二区三区黑人孕妇 | 国产精品亚洲一区二区三区在线 | www.天天操.com | 国产成人99久久亚洲综合精品 | 国产一二三区电影 | 激情毛片| av手机免费在线观看 | 欧美日韩一区二区三区四区 | 久久国产精品-久久精品 | 97色在线视频 |