網路層中帶有IP的資料包結構詳解

在OSI7層模型中,IP地址在網路層被封裝成為包packet,比起下層幀frame,它多的就是在報頭處的IP地址。下面我們看一下資料包的構成。

網路層中帶有IP的資料包結構詳解

從最頂層的應用程式一步一步往下走,在報頭新增埠號,session等,在網路層新增的就是這個IP報文。從左上角開始version表示版本號,在2018年流行的版本有兩種,IPV4和IPV6,你們用的網都是IPV4。headerLength見名知意就是報頭長度,範圍從20~60個位元組。dsField全名Differentiated Services Field,它被用於QOS全名quality of Service網路服務質量,他能夠解決網路中的卡頓問題。dsfield佔一個位元組,高6位分為dscp用於指明轉發優先順序,這裡也是決定了資料走的是機房裡的什麼效能的交換機,就是公交車一樣,遇到紅綠燈在下一次開車時就得快開,不然就會晚點。後兩位則表示ecn全名explicit congestion notification表示阻塞資訊,它記錄著對傳輸速率的評級,是否處於網路阻塞中。

totalLength就不說了,我相信大家一定懂得。identification標識,flags標緻,fragment offset,碎片偏移。如果有程式設計基礎的朋友,id,flag都不用說,fragment offset用於當我們傳輸速率受限時,如何保證將一個完整的檔案傳送過去,同時要保證資料完整性。有時候有人可能網上下載一個zip檔案,然後解壓的時候發現解壓不了,資料丟失了。

同時資料鏈路層有這麼一個特性叫做mtu,它規定了最大傳輸單元,就是它限制乙太網資料幀frame的長度為1500,如果該資料幀攜帶的data長度超過了1500-報文頭長度,那麼就需要分片傳輸。這裡的1500是一個闕值,不能太高,也不能太低。mtu長度越大,傳輸速率越快。id,flag,fragment offset這三個引數都是在這裡用到的。

然後time to live,ttl表示最大生存時間,可以理解成為計數器。預設最大值為225,它被設計用於防止迴環路由,什麼是迴環路由呢?比如我要是北京XX地進行通訊,先要走我們這裡的電信資料中心,然後透過路由器轉發的到山東省電信,然後天津市電信,然後到達北京電信。那麼這中間是經過很多個路由器的,上面是順利的情況下是按照這個路線走,那麼如果從山東省電信出去的線路沒有轉發到天津而是又發回給我本地了怎麼辦?這種情況下就是傳送失敗了,然後本地也傻了又發給山東電信,就這樣一直在這裡形成一個死迴圈,這就是迴環路由。

為了解決這一情況呢,使用ttl做一個計數器。我們管每一個路由器叫做每一跳,就是轉發出去一次,記作ttl-1,如果出現死迴圈ttl一直-1,當ttl=0時,連線超時 資料傳送失敗。那麼大家可以看一下我傳送給不同大型網站伺服器的ttl經過了多少跳。

網路層中帶有IP的資料包結構詳解

離我最近的百度伺服器經過了200多跳。

網路層中帶有IP的資料包結構詳解

可以看到baidu和qq的機房位置應該是離著挺近的,相差了一跳。大家也可以試試,隨便ping一個網站,ttl越接近255,那麼訪問速度就越快,不對啊我剛才測試了一下,有的人的系統ttl是預設值255,有的是128,我這臺是預設64的。那麼怎麼看ttl預設值呢,直接ping本地127。0。0。1即可。

網路層中帶有IP的資料包結構詳解

因為ping127。0。0。1不需要經過任何跳轉,所以在沒有經過路由的情況下它的最大值為64。ttl也可以在登錄檔裡面更改的,更改時最大長度不可以超過255也就是一個位元組。

protocol是協議的意思,它標示著該資料包被傳輸層的tccp協議中使用還是udp協議中使用。下面是headerChecksum,看名字應該是用於校驗的,這裡不是md5校驗碼那種校驗,而是對ip報頭的每16位,每2個位元組進行求和校驗。怎麼求呢,與16位二進位制資料的反碼進行求和,得0則校驗正確,否則這個包是損壞的,會被廢棄。本文中指出的資料包被廢棄就是你們常說的丟包。

下面是source ip address,源IP 與 destination ip addres,目的IP。內容較多,為了讀者閱讀體驗這兩個引數會出現在下一篇文章中。看最後IP options,這是ip報頭的拓展引數。不知各位是否還記得,上面已經出現過一個headerLength了,為什麼又出來一個totalLength呢?header是原有報頭長度20個位元組,拓展引數+header=totalLength。是這麼來的,不過這個ip options是隻有特殊的應用場景才有的引數,比方說軍工級別的通訊。