记一次wireshark抓包的报文分析
本文最后更新于:2023年2月28日 下午
(一个陈年的wireshark老包)一次完整的请求响应过程如图:
1. 数据包结构
wireshark中数据与OSI七层协议的对应关系:
2. 应用层
2.1 DNS报文
DNS包括查询请求和查询响应,其报文格式相似,基本格式如下:
在wireshark中对应为:
报文首部
基本格式:
实例:
-
事务 ID (Transaction ID)
DNS 报文的 ID 标识。DNS请求报文与其对应的响应报文该字段的值相同,用以区分 DNS 响应报文对应请求。
长度为 16bit。
-
标志 (Flags)
DNS 报文中的标志字段,包含若干字段:
字段 长度 描述 QR(Query/Response) 1 bit 标查询请求/响应的标志信息。
0:查询报文
1:响应报文Opcode (Operation Code) 4 bit 操作码。
0:标准查询;
1:表示反向查询;
2:表示服务器状态请求。AA(Authoritative Answer) 1 bit 授权应答,该字段在响应报文中有效。
1:名称服务器是权威服务器;
0:名称服务器不是权威服务器。TC(Truncation Flag) 1 bit 是否被截断。
1:响应已超过 512 字节并已被截断,只返回前 512 个字节。RD(Recursion Desired) 1 bit 客户端希望域名解析服务器采取的解析方式。
0:表示希望域名解析服务器采取迭代解析
1:表示希望域名解析服务器采取递归解析RA(Recursion Avaliable) 1 bit 域名解析服务器采取的解析方式,该字段在响应报文中有效。
0:表示域名解析服务器采取迭代解析
1:表示域名解析服务器采取递归解析Z (Zero) 3 bit 保留位,全部置0。 rcode(Response code) 4 bit 返回码字段,表示响应的状态,该字段在响应报文中有效。
0:无差错
1:查询格式错
2:服务器失效
3:域名不存在
4:查询没有被执行
5:查询被拒绝
6-15: 保留未用 -
问题计数 (Questions
DNS 查询请求的数目。
长度为 16bit。
可以看到实例的DNS请求中有一个查询请求。
-
回答资源记录数 (Answer RRs)
DNS 响应的数目。
长度为 16bit。
可以看到实例的DNS响应中有一个查询请求和一个查询响应。
-
权威名称服务器计数 (Authority RRs)
权威名称服务器的数目。
长度为 16bit。
-
附加资源记录数 (Addtional RRs)
额外的记录数目(权威名称服务器对应 IP 地址的数目)。
长度为 16bit。
问题
基本格式:
实例:
Name:域名(标准查询)/IP地址(反向查询)
Name Length: 域名长度
Label Count: 暂时没查到相关资料,猜测与域名服务器的层级有关(代表总层数)
Type:DNS 查询请求的资源类型。通常查询类型为 A 类型,表示由域名获取对应的 IP 地址。
Class:地址类型,通常为互联网地址,值为 1。
资源记录
只在查询响应中出现,基本格式:
实例:
-
生存时间 (TTL)
客户端保留该资源记录的秒数
3. 传输层
3.1 UDP协议
用户数据报协议 (User Datagram Protocol,UDP)
UDP is connectionless. That is, no connection is established between the sender and the receiver. Packets are transmitted from the source to the destination without checking if the destination exists or is prepared to receive the packets.
无连接协议,传输不可靠。
在DNS解析时,常常采取效率更高的UDP协议。
基本格式:
实例:
IP Payload = UDP Head + UDP Payload
3.2 TCP协议
传输控制协议 (Transmission Control Protocol,TCP)
TCP报文
基本格式:
-
数据偏移/首部长度 (Header Length)
标识TCP头部长度,单位。
因此,我们可得TCP头部的最大长度应为 ;基本TCP头部长度为 ;可选头部的最大长度为 。
-
标志位 (flgs)
标志位 释义 URG 紧急指针( urgent pointer)有效标志位 ACK 确认标志位 PSH 提交应用层提醒标志位 RST 复位报文标志位 SYN 建立连接标志位 FIN 终止连接标志位 -
窗口 (Window Size)
声明接收窗口大小。
滑动窗口
三次握手
三次握手(Three-Way Handshake)建立TCP连接,即建立一个TCP连接时,需要客户端和服务端总共发送3个包以确认连接的建立。
第一次握手
客户端向服务器端发送包,其中:
- 生成
客户端初始序列号 (ISN) = X
,保存至包头的序列号(seq)
中 - 置
标志位(flags)
的SYN=1
第二次握手
服务器端向客户端发送包,其中:
- 生成
服务器端初始序列号 (ISN) = Y
,保存至包头的序列号(seq)
中 - 置
确认号(ack)
为X+1
- 置
标志位(flags)
的SYN=1
,置标志位(flags)
的ACK=1
第三次握手
客户端向服务器端发送包,其中:
- 置
序列号(seq)
为X+1
- 置
确认号(ack)
为Y+1
- 置
标志位(flags)
的ACK=1
但是关于第三次握手
seq
在报文中存储 的位置没有找到清晰地解读
几个概念的区分:
标识 | 释义 | 概念 |
---|---|---|
ack | 确认号 (acknowledgment number) | 主机A填充进报文段的确认号是主机A期望从主机B收到的下一字节的序列号 |
seq | 序列号 (sequence number) | 数据流中每次发送报文首字节编号 |
ISN | 初始序列号 (initial sequence number) | TCP 建立连接的时候,客户端和服务端首次生成的序列号 |
SYN | 标志位 (flags) 中的 建立联机 (synchronous) 状态标识 | |
ACK | 标志位 (flags) 中的 确认 (acknowledgement 状态标识 |
四次挥手
参考资料
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!