Wireshark
- 一站式学习wireshark
- wireshark过滤规则语法
- 网络延迟会导致包的收发顺序并不是理想的,例如,发送某个包后接受到的ACK可能是之前包的ACK, 参见《wireshark网络分析的艺术》中的虚惊一场章节
- TCP参数解读(详见《Wireshark网络分析就是这么简单》P57-TCP的连接启蒙)
- Len是数据段的长度,这个长度不包括TCP头,Len=0的包不代表就没有字节
- ACK: 确认号,假如需要确认一个"Seq:x Len:y"的包,需要回复的确认号是x+y
- 当前包的Seq等于上一个包(源地址和目的地址均相同)的Seq+上一个包的Len
- 每个包的TCP层含有的“window size”, 不是发送窗口,而是在向对方声明自己的接收窗口
- 发送窗口是无法看到了,只能通过推断得到一些关于发送窗口的信息
- 其它
- Follow Tcp Dump 会显示相应的会话信息
- wireshark中的一些提示的含义,参见《wireshark网络分析的艺术》中的Wireshark的提示一章
- MTU,参见《wireshark网络分析的艺术》中的MTU导致的悲剧
- 抓取回环包时,需要在lo口抓取,示例:
tcpdump -i lo -w ./coap5.cap
问题和原理
MTU1500,为何抓包到1514?
- 抓包软件抓到的是去掉前导同步码、帧开始分界符、FCS之外的数据,其最大值是 6+6+2+1500=1514。这是由于据 RFC894的说明,以太网封装IP数据包的最大长度是1500字节,也就是说以太网最大帧长应该是以太网首部加上1500,再加上7字节的前导同步码和 1字节的帧开始定界符,具体就是:7字节前导同步吗+1字节帧开始定界符+6字节的目的MAC+6字节的源MAC+2字节的帧类型+1500+4字节的 FCS。 按照上述,最大帧应该是1526字节,但是实际上我们抓包得到的最大帧是1514字节,为什么不是 1526字节呢?原因是当数据帧到达网卡时,在物理层上网卡要先去掉前导同步码和帧开始定界符,然后对帧进行CRC检验,如果帧校验和错,就丢弃此帧。如 果校验和正确,就判断帧的目的硬件地址是否符合自己的接收条件(目的地址是自己的物理硬件地址、广播地址、可接收的多播硬件地址等),如果符合,就将帧交 “设备驱动程序”做进一步处理。这时我们的抓包软件才能抓到数据。因此,抓包软件抓到的是去掉前导同步码、帧开始分界符、FCS之外的数据,其最大值是 6+6+2+1500=1514
举例(结合包)
-
wireshark抓HTTP包
- 抓到的包如上图所示,可知我们需要的是两个HTTP的包,序号分别为2和4,但实际中还有两个TCP包,经分析TCP包和HTTP包除应用层和物理层外其它都相同,seq和ack都相同,但len不同。 猜测TCP本身有一套确认机制,所以自动确认,然后发送HTTP数据时,由于这期间没有收到对方发过来的数据,所以ACK和Seq(TCP确认时长度为0)的值是一样的?没看懂啥玩意,直接忽略
参考资料
- 《Wireshark网路分析的艺术》
- 《Wireshark网络分析就是这么简单》