1.常用过滤规则
指定源地址:
ip.src == 10.0.1.123
ip.src == 10.0.1.123 && udp
http
数据链路层:
筛选mac地址为04:f9:38:ad:13:26的数据包----eth.src == 04:f9:38:ad:13:26
筛选源mac地址为04:f9:38:ad:13:26的数据包----eth.src == 04:f9:38:ad:13:26
网络层:
筛选ip地址为192.168.1.1的数据包----ip.addr == 192.168.1.1
筛选192.168.1.0网段的数据---- ip contains "192.168.1"
筛选192.168.1.1和192.168.1.2之间的数据包----ip.addr == 192.168.1.1 && ip.addr == 192.168.1.2
筛选从192.168.1.1到192.168.1.2的数据包----ip.src == 192.168.1.1 && ip.dst == 192.168.1.2
传输层:
筛选tcp协议的数据包----tcp
筛选除tcp协议以外的数据包----!tcp
筛选端口为80的数据包----tcp.port == 80
筛选12345端口和80端口之间的数据包----tcp.port == 12345 && tcp.port == 80
筛选从12345端口到80端口的数据包----tcp.srcport == 12345 && tcp.dstport == 80
应用层:
过滤请求数据包----http.request
过滤响应数据包----http.response
过滤指定域名----http.host == “xxx.xxx.xxx”
筛选url中包含.php的http数据包----http.request.uri contains ".php"
筛选内容包含username的http数据包----http contains "username"
过滤请求头----http.request.method == GET
过滤请求的url----http.request.url==”/xxx/xxxx”
过滤包含HTTP错误状态码的响应数据包----http.request.code >= 400
过滤服务器端错误状态码的响应数据包----http.response.code <=599。
2.UDP报文结构
3.TCP报文结构
4.关键点
这里讲一下关键的点
4.1 TCP/UDP headers checksum
前面几个图可以看到Checksum,校验和。
TCP的数据包的校验和计算的数据来源包括三部分:TCP伪首部和TCP首部和TCP数据。TCP计算校验和引入了伪首部,包括后面介绍的UDP。如下图所示,TCP伪首部包括:源地址(32 bit),目标地址(32 bit),Zeros(8 bit),Protocol(8 bit),TCP Length(16 bit)。
由上图可知,源地址是106.11.43.158(6a 0b 2b 9e), 目标地址192.168.1.105(c0 a8 01 69),TCP的协议号是6,TCP数据长度是IP数据总长度减去IP头部52-20=32(0x20)。接下来是TCP头部和数据部分抓包示例:
由上图可知,TCP的校验和是0x755E,计算过程如下:
- 取伪首部的数据
Source Address Destination Address Zeros Protocol TCP Length
6a 0b 2b 9e c0 a8 01 69 00 06 00 20
- 将伪首部数据合并为16位一组并相加
6a0b+2b9e+c0a8+0169+0006+0020=157E0
- 取TCP数据
01 bb de c0 d3 86 24 c6 0e 5f 8d 90 80 10 00 0e 75 5e 00 00 01 01 05 0a 0e 5f 8d 8f 0e 5f 8d 90
- 将校验和部分置为00 00
01 bb de c0 d3 86 24 c6 0e 5f 8d 90 80 10 00 0e 00 00 00 00 01 01 05 0a 0e 5f 8d 8f 0e 5f 8d 90
- 将TCP数据合并为16位一组并相加
01bb+dec0+d386+24c6+0e5f+8d90+8010+000e
+0000+0000+0101+050a+0e5f+8d8f+0e5f+8d90=432BC
- 将伪首部和TCP数据的相加结果相加
157E0 + 432BC = 58A9C
- 将上一步结果的高16位和低16位相加
8A9C + 5 = 8AA1
- 将0xFFFF减8AA1得到校验和
0xFFFF - 0x8AA1 = 755E
- 与抓包的校验和比较是一致的
4.2 使用python生成TCP\UDP报文,用于软件开发测试
#!/usr/bin/env python
import socket
TCP_IP = '127.0.0.1'
TCP_PORT = 1337
BUFFER_SIZE = 1024
MESSAGE = 'Hello, World!'
encoded = str.encode(MESSAGE) # b'Hello, World!'
decoded = encoded.decode() # 'Hello, World!'
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((TCP_IP, TCP_PORT))
s.send(encoded)
data = s.recv(BUFFER_SIZE)
s.close()
print ("received data:", data)
5.Wireshark抓取TCP数据包分析三次握手
第一次握手数据包
客户端发送一个数据包,SYN=1,ACK=0,序列号从0开始,表示客户端请求建立连接
第二次握手数据包
服务器端发会数据包,SYN=1,ACK=1,seq=0,ack=seq+1表示已接收的数据包数量
第三次握手数据包
客户端重新传回确认包,SYN=0,服务器端检查ACK=1,ack=seq+1=1表示当前段成功接收数据位数
TCP层FLAGS字段重要标识
6.基本的一些概念
参考博客
https://blog.csdn.net/qq_44281295/article/details/127110834
https://zhuanlan.zhihu.com/p/631821119
https://blog.csdn.net/to_be_better_wen/article/details/129191378