IP協(xié)議是互聯(lián)網最基礎的協(xié)議,在使用tcpdump查看數據包的時候,有時候對一些字段的漢所以不是很明確
比如:
[tenmao@localhost ~]$ sudo tcpdump -i any -n icmp -vvvv
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
21:11:21.505189 IP (tos 0x0, ttl 64, id 36112, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.58.100 > 14.215.177.38: ICMP echo request, id 61852, seq 1, length 64
21:11:21.509826 IP (tos 0x0, ttl 128, id 49303, offset 0, flags [none], proto ICMP (1), length 84)
14.215.177.38 > 192.168.58.100: ICMP echo reply, id 61852, seq 1, length 64
我們仔細對照IP協(xié)議來分析上面的內容
IP協(xié)議字段解釋

- 版本號:IP協(xié)議的版本。對于IPv4來說值是4
- 頭部長度:4位最大為0xF,注意該字段表示單位是字(4字節(jié))
- 服務類型(Type Of Service,TOS):3位優(yōu)先權字段(現(xiàn)已被忽略) + 4位TOS字段 + 1位保留字段(須為0)。4位TOS字段分別表示最小延時、最大吞吐量、最高可靠性、最小費用,其中最多有一個能置為1。應用程序根據實際需要來設置 TOS值,如ssh和telnet這樣的登錄程序需要的是最小延時的服務,文件傳輸ftp需要的是最大吞吐量的服務
- 總長度: 指整個IP數據報的長度,單位為字節(jié),即IP數據報的最大長度為65535字節(jié)(2的16次方)。由于MTU的限制,長度超過MTU的數據報都將被分片傳輸,所以實際傳輸的IP分片數據報的長度遠遠沒有達到最大值
下來的3個字段則描述如何實現(xiàn)分片:
標識:唯一地標識主機發(fā)送的每一個數據報,其初始值是隨機的,每發(fā)送一個數據報其值就加1。同一個數據報的所有分片都具有相同的標識值
標志: 位1保留,位2表禁止分片(DF),若設置了此位,IP模塊將不對數據報進行分片,在此情況下若IP數據報超過MTU,IP模塊將丟棄數據報并返回一個ICMP差錯報文;位3標識更多分片(MF),除了數據報的最后一個分片,其他分片都要把它設置為1
位偏移:分片相對原始IP數據報數據部分的偏移。實際的偏移值為該值左移3位后得到的,所以除了最后一個IP數據報分片外,每個IP分片的數據部分的長度都必須是8的整數倍
生存時間:數據報到達目的地之前允許經過的路由器跳數。TTL值被發(fā)送端設置,常設置為64。數據報在轉發(fā)過程中每經過一個路由該值就被路由器減1.當TTL值為0時,路由器就將該數據包丟棄,并向源端發(fā)送一個ICMP差錯報文。TTL可以防止數據報陷入路由循環(huán)
協(xié)議: 區(qū)分IP協(xié)議上的上層協(xié)議。在Linux系統(tǒng)的/etc/protocols文件中定義了所有上層協(xié)議對應的協(xié)議字段,ICMP為1,TCP為6,UDP為17
頭部校驗和: 由發(fā)送端填充接收端對其使用CRC算法校驗,檢查IP數據報頭部在傳輸過程中是否損壞
源IP地址和目的IP地址: 表示數據報的發(fā)送端和接收端。一般情況下這兩個地址在整個數據報傳遞過程中保持不變,不論中間經過多少個路由器
-
選項:可變長的可選信息,最多包含40字節(jié)。選項字段很少被使用??捎玫腎P可選項有:
- 記錄路由: 記錄數據包途徑的所有路由的IP,這樣可以追蹤數據包的傳遞路徑
- 時間戳: 記錄每個路由器數據報被轉發(fā)的時間或者時間與IP地址對,這樣就可以測量途徑路由之間數據報的傳輸的時間
- 松散路由選擇: 指定路由器的IP地址列表數據發(fā)送過程中必須經過所有的路由器
- 嚴格路由選擇: 數據包只能經過被指定的IP地址列表的路由器
- 上層協(xié)議(如TCP/UDP)的頭部信息
tcpdump抓取二進制數據
- 二進制數據
[tenmao@localhost ~]$ sudo tcpdump -i any -nxt icmp -vvvv
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
IP (tos 0x0, ttl 64, id 8012, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.58.100 > 14.215.177.38: ICMP echo request, id 9198, seq 1, length 64
0x0000: 4500 0054 df3d 4000 4001 a060 c0a8 3a64
0x0010: 0ed7 b127 0800 cbae 472e 0001 5d71 a35c
0x0020: 0000 0000 1e81 0700 0000 0000 1011 1213
0x0030: 1415 1617 1819 1a1b 1c1d 1e1f 2021 2223
0x0040: 2425 2627 2829 2a2b 2c2d 2e2f 3031 3233
0x0050: 3435 3637
IP頭部對照解析
IP (tos 0x0, ttl 64, id 8012, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.58.100 > 14.215.177.38: ICMP echo request, id 9198, seq 1, length 64
4500 0054 1f4c 4000 4001 6053 c0a8 3a64
| 字段 | 協(xié)議 | 內容 | 對應的tcpdump文字描述 |
|---|---|---|---|
| 0x4 | 4位的版本號 | IP版本號 | |
| 0x5 | 4位的頭部長度 | 頭部長度為5個字(20字節(jié)) | |
| 0x00 | 8位的服務類型TOS | 普通服務 | tos 0x0 |
| 0x0054 | 16位的總長度 | 數據包總長度(84字節(jié)) | length 84 |
| 0x1f4c | 16位的標識 | 數據報標識 | id 8012 |
| 0x4 | 3位的標志 | 禁止分片,因沒攜帶數據 | flags [DF] |
| 0x000 | 13位的位偏移 | 為0表沒發(fā)生位偏移 | offset 0 |
| 0x40 | 8位的生存時間 | 生存時間為64跳 | ttl 64 |
| 0x01 | 8位的協(xié)議字段 | 為1表上層協(xié)議是ICMP協(xié)議 | proto ICMP (1) |
| 0x6053 | 16位的IP頭部校驗和 | 頭部校驗和 | |
| 0xc0a8 3a64 | 32位的源端IP地址 | 源端IP地址192.168.58.100 | 192.168.58.100 |
| 0x0ed7 b126 | 32位的目的端IP地址 | 目的端IP地址14.215.177.38 | 14.215.177.38 |
更多字段
tos(Type of Service):
8個優(yōu)先級的定義如下:
111--Network Control(網絡控制);
110--Internetwork Control(網間控制);
101--Critic(關鍵);
100--Flash Override(疾速);
011--Flash(閃速);
010--Immediate(快速);
001--Priority(優(yōu)先);
000--Routine(普通)
常見proto協(xié)議號
- 1
ICMP Internet控制消息 - 6
TCP傳輸控制 - 17
UDP用戶數據報