Host
准备环境
Server1
2
3
4
5
6
7
8ens3      Link encap:Ethernet  HWaddr 02:42:ac:11:00:36  
          inet addr:172.17.0.54  Bcast:172.17.255.255  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:36/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:3733 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1723 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1216408 (1.2 MB)  TX bytes:678036 (678.0 KB)
Client1
2
3
4
5
6
7
8ens3      Link encap:Ethernet  HWaddr 02:42:ac:11:00:18  
          inet addr:172.17.0.24  Bcast:172.17.255.255  Mask:255.255.0.0
          inet6 addr: fe80::42:acff:fe11:18/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1717 errors:0 dropped:0 overruns:0 frame:0
          TX packets:904 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:1021151 (1.0 MB)  TX bytes:301129 (301.1 KB)
Program
在各自主机上启动进程
Server1
2
3
4
5
6
7
8
9
10
11
12import socket
import sys
BUFSIZE = 1024
ip_port = ('0.0.0.0', 9999)
server = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)  # udp
server.bind(ip_port)
while True:
    data,client_addr = server.recvfrom(BUFSIZE)
    print(data)
    sys.stdout.flush()
server.close()
Client1
2
3
4
5
6
7
8import socket
BUFSIZE = 1024
client = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
while True:
    msg = raw_input(">> ").strip()
    ip_port = ('172.17.0.54', 9999)
    client.sendto(msg.encode('utf-8'),ip_port)
client.close()

TCPDUMP
Linux cooked mode
首先尝试默认的linux处理模式
tcpdump udp -i any -w ./udp.cap
1  | 00000000: d4c3 b2a1 0200 0400 0000 0000 0000 0000 ................  | 
0xd4c3 b2a1首四字节被称为幻数,它的主机序列用于传输识别0x0200 0400两字节常数 + 两字节常数,代表主版本号 + 次版本号0x0000 0000四字节常数,全为0,表示时区0x0000 0000四字节常数,全为0,表示时间戳精度0x0000 0400四字节常数,主机字节序为0x04000000,表示每个包抓包大小0x7100 0000四字节常数,主机字节序为0x00000071,表示数据链路层类型DLT_LINUX_SLL0x7315 f460四字节变量,代表秒时间戳0xe14b 0300四字节变量,代表微秒部分时间戳0x3100 0000四字节变量,抓包数据长度0x3100 0000四字节变量,数据包数据的未截断长度0x0000两字节变量,报文来源,来自他人0x0001两字节变量,寻址类型,Novell 802.30x0006两字节变量,数据链路层地址长度,6 Octets0x0242 ac11 0018六字节变量,发送方mac地址
在默认模式里,没有记录下服务端的mac地址
记录文件里,也没有记录下数据链路层头尾的数据0x0000地址少于8个字节,填充补足8字节0x0800协议类型
指定数据链路类型
列出本机支持的类型1
2
3
4$ tcpdump -L
Data link types for ens3 (use option -y to set):
  EN10MB (Ethernet)
  DOCSIS (DOCSIS) (printing not supported)
指定以太网协议tcpdump udp port 9999 -i ens3 -y EN10MB -w ./udp.cap
1  | 00000000: d4c3 b2a1 0200 0400 0000 0000 0000 0000 ................  | 
指定数据链路类型后,DLT字段主机序列变为0x00000001,类型为DLT_EN10MB
指定数据链路类型后,同时记录下服务端mac地址、客户端mac地址
https://www.tcpdump.org/manpages/tcpdump.1.html
https://www.tcpdump.org/manpages/pcap-savefile.5.html
https://www.tcpdump.org/linktypes.html
https://www.tcpdump.org/linktypes/LINKTYPE_LINUX_SLL.html
tcpdump文件格式分析
Linux cooked-mode capture 格式转换
tcpdump抓包分析
网络层
格式
1  | 0 1 2 3  | 
4500 0021 783d 4000 4011 6a1e ac11 0018 ac11 0036
4: 版本,IPv45: 头长度,5个32位,共20字节00: 区分服务21: 长度,33字节783d:ID4000:0b01000000不分片,偏移为040: 生存时间TTL,646a1e:检验和11:协议,17(udp)ac11 0018:来源ipac11 0036:目标ip
检验和
ip数据报,检验和仅检查头部是否正确:1
2
3
4
5
6
7
8
9
10
11
12    0100010100000000    4500
    0000000000100001    0021
    0111100000111101    783d
    0100000000000000    4000
    0100000000010001    4011
    0000000000000000    0000
    1010110000010001    ac11
    0000000000011000    0018
    1010110000010001    ac11
+   0000000000110110    0036
--------------------
00101001010111011111   295DF
进位部分截断,加回低位,再取反:1
2
3
4
5
6
700101001010111011111   295DF
+               0010    0002
--------------------
    1001010111100001    95E1
XOR 1111111111111111    ffff
--------------------
    0110101000011110    6a1e
运输层
格式
1  | 0 7 8 15 16 23 24 31  | 
9f66 270f 000d 9d1b 6865 6c6c 6f
9f66:40806 来源端口270f:9999 目标端口000d:13 UDP报文长度9d1b:检验和6865 6c6c 6f:hello
检验和
pseudo header:1
2
3
4
5
6
7
8 0      7 8     15 16    23 24    31
+--------+--------+--------+--------+
|          source address           |
+--------+--------+--------+--------+
|        destination address        |
+--------+--------+--------+--------+
|  zero  |protocol|   UDP length    |
+--------+--------+--------+--------+
假头(不传)+真头+数据,计算检验和:
1  | 1010110000010001 ac11  | 
进位部分截断,加回低位,再取反:1
2
3
4
5
6
700110110001011100001   362E1
+               0011    
--------------------
    0110001011100100    62E4
XOR 1111111111111111    ffff
--------------------
    1001110100011011    9D1B