第一章 網絡層概述
網絡層向上只提供簡單靈活的、無連接的、盡最大努力交付的數據報服務。
網絡在發送分組時不需要先建立連接。每一個分組(即 IP 數據報)獨立發送,與其前后的分組無關(不進行編號)。
網絡層不提供服務質量的承諾。即所傳送的分組可能出錯、丟失、重復和失序(不按序到達終點),當然也不保證分組傳送的時限。
- 由於傳輸網絡不提供端到端的可靠傳輸服務,這就使網絡中的路由器可以做得比較簡單,而且價格低廉(與電信網的交換機相比較)。
- 如果主機(即端系統)中的進程之間的通信需要是可靠的,那么就由網絡的主機中的運輸層負責可靠交付(包括差錯處理、流量控制等) 。
- 網絡的造價大大降低,運行方式靈活,能夠適應多種應用。
網絡層數據包(IP數據包,Packet)由 首部、數據 兩部分組成
數據:很多時候是由傳輸層傳遞下來的數據段(Segment)
第二章 網絡層首部
版本(Version)
- 占4位
- 0b0100:IPv4
- 0b0110:IPv6
首部長度(Header Length)
- 占4位,二進制乘以4才是最終長度
- 0b0101:20(最小值)
- 0b1111:60(最大值)
區分服務(Differentiated Services Field)
- 占8位
- 可以用於提高網絡的服務質量(QoS,Quality of Service),這個了解即可
總長度(Total Length)
- 占16位
- 首部 + 數據的長度之和,最大值是 65535字節
- 總長度必須不超過最大傳送單元MTU
標識(Identification)
- 占16位
- 數據包的ID,當數據包過大進行分片時,同一個數據包的所有片的標識都是一樣的
- 是一個計數器專門管理數據包的ID,每發出一個數據包,ID就加1
標志(Flags)
- 占3位
- 第1位(Reserved Bit):保留
- 第2位(Don’t Fragment):1代表不允許分片,0代表允許分片
- 第3位(More Fragments):1代表不是最后一片,0代表是最后一片
片偏移(Fragment Offset)
- 占13位
- 片偏移乘以8:字節偏移(wireshark顯示的是字節偏移)
- 每一片的長度一定是8的整數倍
IP數據報分片
一數據報的總長度為 3820 字節,其數據部分的長度為 3800 字節(使用固定首部),需要分片為長度不超過 1420 字節的數據報片。
因固定首部長度為 20 字節,因此每個數據報片的數據部分長度不能超過 1400 字節。
於是分為 3 個數據報片,其數據部分的長度分別為 1400、1400 和 1000 字節。
原始數據報首部被復制為各數據報片的首部,但必須修改有關字段的值。
生存時間(Time To Live,TTL)
- 占8位
- 每個路由器在轉發之前會將TTL減1,一旦發現TTL減為0,路由器會返回錯誤報告
- 觀察使用
ping
命令后的TTL,能夠推測出對方的操作系統、中間經過了多少個路由器
協議(Protocol)
- 占8位
- 表明所封裝的數據是使用了什么協議
首部校驗和(Header Checksum)
- 用於檢查首部是否有錯誤
第三章 網際控制報文協議 ICMP
為了更有效地轉發 IP 數據報和提高交付成功的機會,在網際層使用了網際控制報文協議 ICMP (Internet Control Message Protocol)。
- ICMP 是互聯網的標准協議。
- ICMP 允許主機或路由器報告差錯情況和提供有關異常情況的報告。
- 但 ICMP 不是高層協議(看起來好像是高層協議,因為 ICMP 報文是裝在 IP 數據報中,作為其中的數據部分),而是 IP 層的協議。
PING (Packet InterNet Groper)
- PING 用來測試兩個主機之間的連通性。
- PING 使用了 ICMP 回送請求與回送回答報文。
- PING 是應用層直接使用網絡層 ICMP 的例子,它沒有通過運輸層的 TCP 或UDP。
ping /?
查看ping的用法
ping ip地址 -l 數據包大小
發送指定大小的數據包(ping www.baidu.com -l 1400
)
ping ip地址 -f
不允許網絡層分塊 (ping www.baidu.com -l 2000 -f
)
第四章 實戰
Wireshark抓包
向百度發送800字節的數據包
通過 Wireshark 抓包查看 ping www.baidu.com
發送的包
通過 ping
命令,實際上發送了4次 ICMP數據包:
通過 Wireshark 可以證實:
完整網絡層
首部占20個字節,為了發送ICMP數據包還要再占8個字節
根據TTL追蹤經過路由器
這里的TTL是47,如果是linux服務器默認值是64,可能經過17個路由器?
ping ip地址 -i TTL 設置TTL的值
通過 tracert、pathping 命令,可以跟蹤數據包經過了哪些路由器
ping baidu.com -i 1 經過1次就消亡,第一個路由器再轉發前減一變為0,不給轉返回錯誤報告,由網關回復。
通過 ping baidu.com -i 1、ping baidu.com - i 2、ping baidu.com -i 3 …
一點一點增大TTL
可以追蹤發包到百度經過的路由器。
tracert 和 pathping 命令實際上更簡單也可以追蹤路由器:
tracert baidu.com
pathping baidu.com