抓包是学习网络协议的有效途径,通过实际分析,使得”理论”不那么枯燥,本文会通过抓包来分析各类包结构。

为了方便理解,大家需要先有以下概念:

  • TCP包结构 - [ ETHERNET头 [ IP头 [ TCP头 [ DATA ] ] ] ]
  • UDP包结构 - [ ETHERNET头 [ IP头 [ UDP头 [ DATA ] ] ] ]

有了以上概念,下面放上我抓取的TCP包(HTTP)

sudo tcpdump -i en0 port 80 -xx

17:17:29.484811 IP 192.168.12.101.63895 > 119.29.177.26.http: Flags [P.], seq 1:80, ack 1, win 4103, options [nop,nop,TS val 53585color3116 ecr 3024973830], length 79: HTTP: GET / HTTP/1.1
    0x0000:  d0c7 c08a 1a7c 6003 0899 962a 0800 4500
    0x0010:  0083 68c9 4000 4006 dc66 c0a8 0c65 771d
    0x0020:  b11a f997 0050 6046 44fe ae85 07c8 8018
    0x0030:  1007 21bd 0000 0101 080a 1ff0 783c b44d
    0x0040:  7006 4745 5420 2f20 4854 5450 2f31 2e31
    0x0050:  0d0a 486f 7374 3a20 7777 772e 762d 6a75
    0x0060:  2e63 6f6d 2e63 6e0d 0a55 7365 722d 4167
    0x0070:  656e 743a 2063 7572 6c2f 372e 3531 2e30
    0x0080:  0d0a 4163 6365 7074 3a20 2a2f 2a0d 0a0d
    0x0090:  0a

ETHERNET头

    0                   1                   2
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |            Destination Mac(6Bytes)            |
   |                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |              Source Mac (6Bytes)              |
   |                                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |     Type(2Bytes)  |
   +-+-+-+-+-+-+-+-+-+-+
字段 说明 实际值
Destination Mac 目的MAC d0c7 c08a = d0:c7:c0:8a:1a:7c
Source Mac 源MAC 1a7c 6003 = 60:03:08:99:96:2a
Type 类型 0800

IP头

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |Version|  IHL  |Type of Service|          Total Length         |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |         Identification        |Flags|      Fragment Offset    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Time to Live |    Protocol   |         Header Checksum       |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                       Source Address                          |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Destination Address                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Options                    |    Padding    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段 说明 实际值
Version IP版本 4
IHL IP头部长度(单元4字节) 5,即5x4=20字节
Total Length IP数据包总长度,最长65535,即为何需要IP分片 0x0083 = 131 = 20(IP头)+ 32(TCP头)+ 79(实际数据)
Protocol 协议号
1 ICMP
2 IGMP
6 TCP
17 UDP
6 即TCP
Time to Live 存活数,每过一次路由减1,到0后停止路由 0x40,即64
Source Address 原IP地址 c0a8 0c65 = c0.a8.0c.65 = 192.168.12.101
Destination Address 目的IP地址 771d b11a = 77.1d.b1.1a = 119.29.177.26

TCP头

    0                   1                   2                   3
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |          Source Port          |       Destination Port        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                        Sequence Number                        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Acknowledgment Number                      |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |  Data |           |U|A|P|R|S|F|                               |
   | Offset| Reserved  |R|C|S|S|Y|I|            Window             |
   |       |           |G|K|H|T|N|N|                               |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |           Checksum            |         Urgent Pointer        |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                    Options                    |    Padding    |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
   |                             data                              |
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
字段 说明 实际值
Source Port 原端口 f997 = 63895
Destination Port 目的端口 0050 = 80
Sequence Number 序列号Seq 6046 44fe - tcpdump显示的是相对序列号,即针对之前三次握手的序列号为基础
Acknowledgment Number 确认号Ack ae85 07c8
Data Offset TCP头长度(单位4字节) 8 即共8x4=32字节

PS:TCP头之后就是DATA,即

GET / HTTP/1.1
Host: www.v-ju.com.cn
User-Agent: curl/7.51.0
Accept: */*

UDP头

tcpdump -i eth0 port 6050 -xx

16:33:20.761382 IP 192.168.0.88.24625 > 120.24.89.194.6050: UDP, length 2
  0x0000:  8cab 8ede 1301 54f6 c500 54fe 0800 4500
  0x0010:  001e 0000 4000 4011 a7f4 c0a8 0058 7818
  0x0020:  59c2 6031 17a2 000a e821 0d0a
 0      7 8     15 16    23 24    31  
+--------+--------+--------+--------+ 
|     Source      |   Destination   | 
|      Port       |      Port       | 
+--------+--------+--------+--------+ 
|                 |                 | 
|     Length      |    Checksum     | 
+--------+--------+--------+--------+
字段 说明 实际值
Source Port 原端口 6031 = 24625
Destination Port 目的端口 17a2 = 6050
Length 长度包含头部+数据 000a = 10 = 8(UDP头)+ 2(数据)

PS: UDP头之后就是DATA,即\r\n