本文討論兩個問題①IP數據報的首部②IP數據報的分片
TCP/IP模型分為五層,從上到下依次是應用層、傳輸層、網絡層、數據鏈路層和物理層。
IP數據報是網絡層的概念。
- IP數據報的首部
版本號:0~3 共占4位,是IP協議的版本號,IPV4和IPV6,所以只能是0100、0110兩個選項
首部長度:4~7 共占4位,共 有2的4次方,就是最多可以表示0~15個數,而IP數據報首部的固定部分都有20個字節了,所以0~15是不夠用的,所以首部長度按4字節為一個單位。例如:首部長度0110=6,就是首部長度有6*4=24個字節。
服務類型Tos:8~15 共占8位,
總長度:16~31 共占16位,2的16次方=65536,也就是0~65535,IP分組的總長度,最長的IP分組是65535個字節。
生存時間TTL:63~70 共占8位,2的8次方=256,就是這個IP分組最多經過256個路由器。
協議:71~78 共占8位。該IP分組中裝的是傳輸層哪個協議的數據包。6是TCP協議的,17是UDP協議的
首部校驗和:79~94 共占16位。對首部錯誤的一個校驗
標識、標志位、片偏移占32位,共4個字節,和IP數據報的分片有關。
- 分片
分片的原因:在網絡層,因為要向下層也就是數據鏈路層傳輸,而數據鏈路層幀有最大傳輸單元(Max Transport Unit MTU)限制,超過這個值就得降數據報分組。
比如以太網的MTU是1500B,PPP(Point to Point Prootocol)的MTU是296B,FDDI(Fiber Distributing Data Interface 光纖分布式數據接口)的MTU是4352,令牌環的MTU是4464B。
如果數據報的長度大於MTU,就可以分片了。至於允許不允許分片,需要看IP數據報首部的標志位。
標識(ID):32~47 共占16位,IP分組的標識(ID),IP協議利用一個計數器,每產生一個IP分組加1,作為該分組的標識。
標志位:48~50 占3位,保留位、DF、MF。DF=Don't Fragment,DF=1時,不允許分片;DF=0時,允許分片。MF=1時,非最后一片;MF=0時,最后一片或者未分片。
這兩位只有三種可能。10:不允許分片;01:允許分片,不是最后一片;00:允許分片,是最后一片。不存在11.
片偏移:占13位,這個分片在原IP分組中的相對位置,以分片的首字節表示。IP分組總長度是占16個字節,而片偏移占143個字節,所以片偏移是以(2的16次方)除以(2的13次方)=2的3次方=8字節為單位的。
舉個例子:假設IP數據分組的長度是L,數據鏈路層的MTU是M,IP數據報首部的長度是20個字節(沒有可選部分),每個分片都是按數據鏈路層可以傳輸的最大長度來切片的。那么:
每個分片中封裝的數據:
d={向下取整【(M-20)/8】}*8
式子中20是首部數據長度,8:片偏移是以8字節為單位。
需要的總片數:
n=向上取整[(L-20)/d]
每片的片偏移字段取值:
Vi=(d/8)*(i-1) i=1,2,3...,n
每片的總長度字段:
li=d+20 i=1,2,。。。,n-1
li=L-(i-1)*d i=n
把IP分組的標識作為每個分片的標識。
等IP數據報的所有分片到達接收端時,會按照片偏移把其重新組裝起來。如果丟失了一片怎么辦?接收方計算機會等待一段時間,如果還接收不到這個分片,就會把IP分組的所有分片全部丟掉。
思考一下:
接收端計算機怎么樣才能唯一確定一個分片?
①源IP地址
②目的IP地址
③標識(ID)
④片偏移字段
⑤協議
歡迎大家指正~