网络协议之抓包大作战
使用 Wireshark工具抓包,学习网络协议
- ping测试 -> 拆解 IPv4、ICMP 协议
- Http测试 -> 拆解 TCP、HTTP协议
为避免过早陷入网络协议的细节,建议提前阅读各种协议头部结构体中的插图
1. Ping -> 拆解 IPv4、ICMP 协议
1 | 【终端】 |
1 | 【抓包流水】 |
分析:
- 在 Ping baidu.com 时,首先进行 DNS 查询 IP 地址,
- 然后获取到若干个包,都是基于 ICMP 协议 的。
- ICMP消息是以未确认的IPv4数据报传送的,它们自己也不可靠。
- 按以太网首部、IPv4、ICMP 顺序拆解,如下:
1 | 【协议详情】 |
2. 访问Http -> 拆解 TCP、HTTP协议
1 | 【抓包流水】 |
按编号分别解释:
- 1008:Client -> Server三次握手之一
- 1009:Server -> Client 三次握手之二
- 1010:Client -> Server 三次握手之三
- 1011:三次握手结束,Client -> Server 发送 Http 的 Get 请求,从 IP 请求头我们知道此 Http 不分片,此协议见下方代码。
- 1013:Server -> Client ,回应 Get 请求,即回应 1011。
- 1014、1015、1016,Server -> Client 发送常规数据,长度都是 1514。
- 1017:Client -> Server ,Ack 2897,同时回应了1014、1015.
- 1018:Client -> Server, Ack 4345,作为 1016 的回应。
- 1019:Server -> Client,但是中途出现丢包(5793
8689 的数据包丢了),此1019包数据seq为 86899573,缓存在 Client 端的窗口中。 - 1020:Client -> Server ,重复包,相当于又发了一次1018。
- 1021:Server -> Client,因为网络问题,导致包抵达时间不同,延时长、包丢失等。这里可以明显看到 Ack=403 有问题,因为 Client 发来的 403 早就到达 Server 了。
- 1022:Sever -> Client,乱序,理由同上。
- 1023:Client -> Server,告知需要5793的数据,结合 SLE=8689 SRE=9573 说明:我等你的5793后面的数据,但是 8689~9573 之间的数据我已经缓存了,用不着再发。
1 | 【协议详情】 |
推荐阅读:聊一聊TCP协议中的push标志位
Wireshark 抓包工具–TCP 数据包解读
由于 SYN包是用来初始化连接的, 它不可能和 FIN和RST标记一起出现。
为什么正常包的长度是1514?
- 首先最大帧的长度应该是1526字节,1526 bytes = 前同步码(7 bytes)+ 帧开始定界符(1 byte)+ MTU + FCS(4 bytes) 。
- 但是抓包拿到的包是已经去掉了前导同步码和帧开始定界符,已经经过CRC 验证后的了,所以只能拿到1514字节。
- 1514 bytes = 源 mac (6 bytes)+ 目的 mac (6 bytes) + 长度 (2 bytes) + MTU (1500 bytes)
- MTU 是最大传输单元,MTU = IP 头(20 Bytes)+ Data。
- 以1015包为例,Data 占1448bytes,TCP 头部32bytes,IP 头部20bytes,汇总就是1500字节。
参考解答:MTU问题,为何抓包到1514
超 np 的 TCP 协议解读:TCP协议解析