ip資料報長度問題總結
首先要看tcp/ip協議,涉及到四層:鏈路層,網路層,傳輸層,應用層。
其中乙太網(ethernet)的資料幀在鏈路層
ip包在網路層
tcp或udp包在傳輸層
tcpip資料報的最大長度是64k位元組(65535),因為在ip包頭中用2個位元組描述報文長度,2個位元組所能表達的最大數字就是65535。
由於ip協議提供為上層協議分割和重組報文的功能,因此傳輸層協議的資料報長度原則上來說沒有限制。實際上限制還是有的,因為ip包的標識字段終究不可能無限長,按照ipv4,好像上限應該是4g(64k*64k)。依靠這種機制,tcp包頭中就沒有「包長度」字段,而完全依靠ip層去處理分幀。這就是為什麼tcp常常被稱作一種「流協議」的原因,開發者在使用tcp服務的時候,不必去關心資料報的大小,只需講socket看作一條資料流的入口,往裡面放資料就是了,tcp協議本身會進行擁塞/流量控制。
udp則與tcp不同,udp包頭內有總長度字段,同樣為兩個位元組,因此udp資料報的總長度被限制為65535,這樣恰好可以放進乙個ip包內,使得 udp/ip協議棧的實現非常簡單和高效。65535再減去udp頭本身所佔據的8個位元組,udp服務中的最大有效載荷長度僅為65527(好像還要減去ip頭20個位元組,最後為65507)。這個值也就是 你在呼叫getsockopt()時指定so_max_msg_size所得到返回值,任何使用sock_dgram屬性的socket,一次send的 資料都不能超過這個值,否則必然得到乙個錯誤。
那麼,ip包提交給下層協議時將會得到怎樣的處理呢?這就取決於資料鏈路層協議了,一般的資料鏈路層協議都會負責將ip包分割成更小的幀,然後在目的端重 組它。在ethernet上,資料鏈路幀的大小如以上幾位大俠所言。而如果是ip over atm,則ip包將被切分成乙個乙個的atm cell,大小為53位元組。
乙太網(ieee 802.3)幀格式:
1、前導碼:7位元組0x55,一串1、0間隔,用於訊號同步
2、幀起始定界符:1位元組0xd5(10101011),表示一幀開始
3、da(目的mac):6位元組
4、sa(源mac):6位元組
5、型別/長度:2位元組,0~1500保留為長度域值,1536~65535保留為型別域值(0x0600~0xffff)
6、資料:46~1500位元組
7、幀校驗序列(fcs):4位元組,使用crc計算從目的mac到資料域這部分內容而得到的校驗和。
以csma/cd作為mac演算法的一類lan稱為乙太網。csma/cd衝突避免的方法:先聽後發、邊聽邊發、隨機延遲後重發。一旦發生衝突,必須讓每台主機都能檢測到。關於最小傳送間隙和最小幀長的規定也是為了避免衝突。
考慮如下的情況,主機傳送的幀很小,而兩台衝突主機相距很遠。在主機a傳送的幀傳輸到b的前一刻,b開始傳送幀。這樣,當a的幀到達b時,b檢測到衝突,於是傳送衝突訊號。假如在b的衝突訊號傳輸到a之前,a的幀已經傳送完畢,那麼a將檢測不到衝突而誤認為已傳送成功。由於訊號傳播是有時延的,因此檢測衝突也需要一定的時間。這也是為什麼必須有個最小幀長的限制。
按照標準,10mbps乙太網採用中繼器時,連線的最大長度是2500公尺,最多經過4個中繼器,因此規定對10mbps乙太網一幀的最小傳送時間為51.2微秒。這段時間所能傳輸的資料為512位,因此也稱該時間為512位時。這個時間定義為乙太網時隙,或衝突時槽。512位=64位元組,這就是乙太網幀最小64位元組的原因。
512位時是主機捕獲通道的時間。如果某主機傳送乙個幀的64位元組仍無衝突,以後也就不會再發生衝突了,稱此主機捕獲了通道。
由於通道是所有主機共享的,如果資料幀太長就會出現有的主機長時間不能傳送資料,而且有的傳送資料可能超出接收端的緩衝區大小,造成緩衝溢位。為避免單一主機占用通道時間過長,規定了乙太網幀的最大幀長為1500。
100mbps乙太網的時隙仍為512位時,乙太網規定一幀的最小傳送時間必須為5.12μs。
1000mbps乙太網的時隙增至512位元組,即4096位時,4.096μs。
mtu的含義: mac幀內的資料(payload)欄位的最大長度
我們使用ping命令時, -l引數所指定的資料報大小,是指的icmp報文中的icmpdata欄位的長度,不包括icmpheader,更不包括ipheader.
乙太網封裝ip資料報的最大長度是1500位元組,也就是說乙太網最大幀長應該是乙太網首部加上1500,再加上7位元組的前導同步碼和1位元組的幀開始定界符,具體就是:7位元組前導同步嗎+1位元組幀開始定界符+6位元組的目的mac+6位元組的源 mac+2位元組的幀型別+1500+4位元組的fcs。
按 照上述,最大幀應該是1526位元組,但是實際上我們抓包得到的最大幀是1514位元組,為什麼不是1526位元組呢?原因是當資料幀到達網絡卡時,在物理層上網絡卡要先去掉前導同步碼和幀開始定界符,然後對幀進行crc檢驗,如果幀校驗和錯,就丟棄此幀。如果校驗和正確,就判斷幀的目的硬體位址是否符合自己的接收條件(目的位址是自己的物理硬體位址、廣播位址、可接收的多播硬體位址等),如果符合,就將幀交「裝置驅動程式」做進一步處理。這時我們的抓包軟體才能抓 到資料,因此,抓包軟體抓到的是去掉前導同步碼、幀開始分界符、fcs之外的資料,其最大值是6+6+2+1500=1514。
以 太網規定,乙太網幀資料域部分最小為46位元組,也就是乙太網幀最小是6+6+2+46+4=64。除去4個位元組的fcs,因此,抓包時就是60位元組。當數 據字段的長度小於46位元組時,mac子層就會在資料字段的後面填充以滿足資料幀長不小於64位元組。由於填充資料是由mac子層負責,也就是裝置驅動程式。 不同的抓包程式和裝置驅動程式所處的優先層次可能不同,抓包程式的優先順序可能比裝置驅動程式更高,也就是說,我們的抓包程式可能在裝置驅動程式還沒有填充不到64位元組的幀的時候,抓包程式已經捕獲了資料。因此不同的抓包工具抓到的資料幀的大小可能不同。下列是本人分別用wireshark和sniffer抓包的結果,對於tcp 的ack確認幀的大小乙個是54位元組,乙個是60位元組,wireshark抓取時沒有填充資料段,sniffer抓取時有填充資料段。
UDP 資料報長度選擇
在進行udp程式設計的時候,我們最容易想到的問題就是,一次傳送多少bytes好?當然,這個沒有唯一答案,相對於不同的系統,不同的要求,其得到的答案是不一樣的,我這裡僅對 像icq一類的傳送聊天訊息的情況作分析,對於其他情況,你或許也能得到一點幫助 首先,我們知道,tcp ip通常被認為是乙個四層協議...
TCP IP資料報文長度
tcp報文是tcp層傳輸的資料單元,也叫報文段。1 埠號 用來標識同一臺計算機的不同的應用程序。1 源埠 源埠和ip位址的作用是標識報文的返回位址。2 目的埠 埠指明接收方計算機上的應用程式介面。tcp報頭中的源埠號和目的埠號同ip資料報中的源ip與目的ip唯一確定一條tcp連線。2 序號和確認號 ...
UDP 資料報長度選擇 整理
在進行udp程式設計的時候,我們最容易想到的問題就是,一次傳送多少bytes好?當然,這個沒有唯一答案,相對於不同的系統,不同的要求,其得到的答案是不一樣的,我這裡僅對 像icq一類的傳送聊天訊息的情況作分析,對於其他情況,你或許也能得到一點幫助 首先,我們知道,tcp ip通常被認為是乙個四層協議...