寫在前面的話:
在剛開始學習網絡的時候感覺一些包以及一些啥層的啥協議特別抽象,總是不能窺探其中的原理。而經過自己利用模擬軟件進行網絡學習環境的搭建,以及傳輸時的抓包分析,終於將那一層窗戶紙捅破了,希望你們能堅持下去,努力會有收穫的--共勉!
簡介:
IP協議控制傳輸的協議單元稱爲IP數據報(IP Datagram,IP數據報、IP包或IP分組)。IP協議屏蔽了下層各種物理子網的差異,能夠向上層提供統一格式的IP數據報。lP數據報採用數據報分組傳輸的方式,提供的服務是無連接方式。IP數據報的格式能夠說明lP協議具有什麼功能。IPv4數據報由報頭和數據兩部分組成,其中,數據是高層需要傳輸的數據,報頭是爲了正確傳輸高層數據而增加的控制信息。報頭的前一部分長度固定,共20字節,是所有IP數據報必須具有。在首部固定部分的後面是可選字段,長度可變。
IP包具體結構:
分析條件:
利用華爲的模擬器 eNSP + Wireshark 搭建一個超級簡單的網絡環境
對PC2端口進行抓包,利用數據包分析IP包各個部分的具體含義。
版本:由抓包分析 爲4 《---》 ipv4協議
首部長度: 這裏必須要明確,因爲由 ip 包分析存在可變部分,也即數據包的長度是不固定的。(一般可變部分是用不上的)
服務類型:舉一個簡單的例子,一臺PC發數據,一個發郵件,另一個發視頻通話,你覺得哪個包應該先發出去? 顧名思義當然是即時通信的優先了(視頻通話先發)
這裏我是使用最簡單的 ICMP(網絡探測包協議)ping 兩臺 pc 是否互通抓的包,也就不存在哪個優先級高低的問題了
總長度:如果長度>1500byte 就要進行分段傳輸
在IP層時:這裏的 總長度最大= 2^16-1=65535(在物理層進行封裝時 MTU=1500)
標識:假如發一個 5000byte 的數據包,肯定分段傳輸,那再接收層如何拼接分段的數據包? --- 》 爲同一類型的包打一個tag
將一個 5000byte 的包拆分成了四個,查看每個包的標識都是 0x615d
標誌: 判斷一個被分段的數據包是否全部接收成功(通常由三個字節組成)如:這個 001 表示後面還有分段數據包
000表示傳輸完成:
片偏移: 記錄分段數據包在完整包時所處的位置---》 用於拼接完成的數據包
生存時間(TTL): 每經一個路由器則自減,當TTL=0時表示傳輸失敗,等待重傳。
小技巧:如何根據 TTL 的時間判斷對方的操作系統?
windows : 128 Linux: 64 unix:255 沒事的時候ping一下百度判斷百度服務器的操系統是啥?
協議: 指出數據將交給那個進程處理。
如果協議號爲tcp,則接受端將數據交給傳輸層的進程處理
首部檢驗和: 判斷首部字段有沒有傳輸錯誤,通常 發/接 雙方進行異或操作(對數據取反碼)
源地址: 發送方的 ip 地址(寄快遞時發送方的地址)
目的地址:接收方地址(收快遞人的地址)
可變部分:
IP首部的可變部分就是一個可選字段。選項字段用來支持排錯、測量以及安全等措施,內容很豐富。此字段的長度可變,從1個字節到40個字節不等,取決於所選擇的項目。某些選項項目只需要1個字節,它只包括1個字節的選項代碼。但還有些選項需要多個字節,這些選項一個個拼接起來,中間不需要有分隔符,最後用全0的填充字段補齊成爲4字節的整數倍。
增加首部的可變部分是爲了增加IP數據報的功能,但這同時也使得IP數據報的首部長度成爲可變的。這就增加了每一個路由器處理數據報的開銷。實際上這些選項很少被使用。新的IP版本IPv6就將IP數據報的首部長度做成固定的。這些任選項定義如下:
(1)安全和處理限制(用於軍事領域)
(2)記錄路徑(讓每個路由器都記下它的IP地址)
(3)時間戳(Time Stamp)(讓每個路由器都記下IP數據報經過每一個路由器的IP地址和當地時間)
(4)寬鬆的源站路由(Loose Source Route)(爲數據報指定一系列必須經過的IP地址)
(5)嚴格的源站路由(Strict Source Route)(與寬鬆的源站路由類似,但是要求只能經過指定的這些地址,不能經過其他的地址) [1]
這些選項很少被使用,並非所有主機和路由器都支持這些選項。