初学计算机网络(二):使用Wireshark抓包
0. 简介
0.1 本文目的
本文将通过使用Wireshark抓包来和大家一起分析计算机网络各个层中帧、包、段等各自的结构内容,帮助大家更深入的理解计算机网络。
0.2 Wireshark简介
Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。
0.3 Wireshark下载安装
- 点击下载:Wireshark
- 如果大家自己不会安装可参考博客:图解Wireshark安装
本文中就不再赘述如何安装以及安装出现的问题等。 - 关于如何使用Wireshark可以参见博客抓包新手使用教程
里面有详细的教程教你如何抓取、过滤、查看你想要抓到的包,本文将主要进行抓取结果分析。
1. 数据链路层
1.1 熟悉 Ethernet 帧结构
1.1.1 Ethernet 帧结构
- 以太网帧格式-前导码(8B):
连续的8B(10101010)曼码,更利于收发双方同步。
注意:以太网一般将该前导码看着为物理层的封装,而非数链层,也即帧中不含该部分 - 以太网帧格式-地址域(6B):
目的和源MAC/硬件/物理地址,48b,该值固化在NIC的BIOS中,全球唯一。
分为目的地址和源地址两部分共12B - 以太网帧格式-类型域(2B):
注意IEEE802.3中该位置是数据的长度,而以太网帧中是表示数据域中装载的是哪种网络层协议的分组,也即系统内核知道该递交给哪个进程。 - 以太网帧格式-数据域(46~1500B):
注意不是LLC-PDU即LLC帧,而直接是网络层分组。当网络层分组不足46B时将会由Pad域进行填充,且不管是否为填充数据,该部分都将会提交给目的方网络层。如果经过填充,则由目的方网络层根据其网络层分组中的长度字段移出填充部分,得到网络层数据。(至于为什么要接收方网络层移除,如有知道请评论告知,谢谢)
知识拓展: 至于为什么要将数据域的长度最小要达到46B是因为以太网要求帧最小长度应为6B+6B+2B+46B+4B=64B 来保证以太网中CSMA/CD的冲突检测,能检测到的最小帧长度就是64B。 - 以太网帧格式-帧校验序列FCS域(4B):
置于最后有利于:对于发送方,边发送边逐位进行CRC校验生成,最终形成32位CRC校验和填于尾部;对于接收方,边接收边逐位进行CRC校验,最终形成校验和与收到的进行对比(注意:CRC从DA开始)
1.1.2 动手操作
- 打开Wireshark,选择你的IP所对应网络随便进行抓包,本机选择以太网3,根据自身灵活选择
- 随便选择一个查看
可以看到只有目的MAC地址、源MAC地址、类型。并且值得注意的是没有直接显示数据域和校验码,这是因为数据域直接放到网络层显示,校验码没实际分析价值被Wireshark自动切除。
1.2 了解子网内/外通信时的 MAC 地址
-
可以先查看以下两个子网内计算机的ip地址,如果网关一致,则两台计算机属于同一子网,先打开Wireshark抓包,再ping对方计算机,在Wireshark中设置过滤条件为 ip.addr == X.X.X.X and icmp (其中X位置输入ping的IP地址),然后可以查看目的MAC地址
本机 -
再ping子网外的计算机比如输入:
ping www.4399.com
按照上述步骤查看目的MAC地址,多试几次输入ping www.baidu.com
按照上述步骤查看目的MAC地址。两次目的MAC地址应当一致。
4399
baidu
通过上述对比发现
- 访问本子网的计算机时,目的 MAC 就是该主机的
- 访问非本子网的计算机时,目的 MAC 一致是网关的
1.3 掌握 ARP 解析过程
- 输入命令:
arp -d *
命令清空 arp 缓存 - 再输入命令:
ping x.x.x.x
(同一子网IP) - 抓包可查看结果
可以看出我首先广播出去查询ip所对应MAC地址,然后得到目的ip直接给我点对点ARP回应,本机则获得了其MAC地址 - 再输入命令:
arp -a
查看本机arp表,就发现已经记录下来了
- 再次清除本地ARP表,ping外网IP,则可获得结果
则可发现是网关回应它的MAC地址给你。这是因为在网关以外就不靠MAC地址传输了,而是靠网络层的IP地址传输。
- 结论:
- ARP 请求都是使用广播方式发送的
- 如果访问的是本子网的 IP,那么 ARP 解析将直接得到该 IP 对应的 MAC;如果访问的非本子网的 IP, 那么 ARP 解析将得到网关的 MAC。
2. 网络层
2.1 熟悉 IP 包结构
2.1.1 IP包结构
- 版本
4bit,目前基本为4 - 头部长度
4bit,在5~15之间,单位为4B(一行)
即表明IP包头部在20~60B之间 - 数据包总长
16bit,表示头部+数据的长度,显然最大长度为65535B
目前多小于或等于1500B - 标识符
16bit,标识该分组的一个随机号码 - 标志
DF(Don‘t Fragment)
1表示不允许分割;0允许
MF(More Fragments)
如果分组已经分割(也形成分组),则
1表示该分组不是最后一个,后面还有;
0表示该分组是原来分组的最后一个分段(片) - 分段偏移量
分段后的这块数据位于原分组的何处 - 生命期
8bit,防止分组长期滞留子网
一般经过一个路由器则减1,如已经为0则丢弃 - 协议
8bit,指出分组携带的数据(上/本层)使用哪种协议
常见的:TCP(6)、UDP(17)、ICMP(1)、OSPF(89)等 - 头部校验
8bit,仅校验头部的原因
首先,节点的任务是尽快转发分组
其次,分组中的数据部分为传输层的PDU,它提供了高层的校验 - 源地址和目的地址
IP地址32bit,共64bit
2.1.2 动手操作
打开Wireshark抓包,随便选择一个查看
可以看到分别有版本、头部长度、总长、标识符、标志、分段偏移量、生命期、协议、头部校验、源地址、目的地址。
2.2 IP 包的分段与重组
输入命令ping www.4399.com -l 2500
并且同时用Wireshark抓包,对其ip进行筛选之后结果如下:
可以看出,因为IP包最大长度只能1500B,所以就分成了1500B和1000B分别进行传输,第一个包总长为1514B是因为还有帧结构目的MAC地址6B和源MAC地址6B和类型2B共14,而第二个包总长就是1062B中除过1000B内容外,14B是帧结构,而多的48B就可能和ICMP协议格式有关了。(此为自己理解,如有问题欢迎评论指正)
分段标志就可以看如图
2.3 考察 TTL 事件
输入命令tracert www.4399.com
进行追踪
同时使用 Wireshark 抓包并且添加过滤条件 icmp
从上图结果可以看出来当TTL=12时,包发到了,所以可以得出本机与服务器中间有12跳。在Cmder中得到相同结果。
3. 传输层
3.1 熟悉 TCP 和 UDP 段结构
3.1.1 TCP 和 UDP 段结构
- TCP
- 端口号:16b,源和目的端口唯一定义一条TCP连接
- 顺序号:32b,表明本segment在字节流中的相对位置(开始位置)
- 确认号:32b,希望收到的下一字节序号
- 头部长度:4b,以32b(一行)为单位。TCP头部长度不固定,因此必须设置该字段,实际也指出了数据部分的开始位置
- FLAG
URG紧急位:一般为0。当置1时,表示数据段中有紧急数据,位置从当前顺序号加上紧急指针(偏移量)开始。发送方传输层实体接到进程紧急指示后,后面收到的数据即为紧急数据,将立即发送已有的数据和紧急数据(不再继续累积数据),且到达后接收方立刻中断,将紧急数据提前提交上层应用程序。
ACK确认号位:置1表示确认号有效;否则忽略确认号字段。用于连接请求时的第一次握手
PSH推位:置1,表示数据段是被“推”过来的,即发送方正在等待一些字节以形成段时突然得到应用程序的Push指令,将立即把此时缓存中的数据形成段,马上递交给IP层(一般在连接好后的第一个请求包置PSH为1)
RST恢复位:置1,可用于表示数据段非法(如确认号不对),拒绝(Reject)不正确的连接请求确认等。一般而言,如你接收到了一个RST位为1的段,表明你这方出现了问题。
SYN同步位:一般为0。置1时只用在连接建立时的3次握手中的前2次,即用于连接双方互相通知顺序号,初始化一个连接。
FIN结束位:置1时用于释放连接,发送方告知接收方已无数据要发送或请求方不再请求数据(现在基本都是4次握手释放) - 窗口尺寸:16b,接收方告诉发送方:
(确认号-1)之前的字节已经正确接收,还可最多发送这么多字节。
如果为0,表示(确认号-1)之前的字节已正确接收,但希望暂停发送;其后再发送一个有相同确认号但窗口尺寸非0的段告诉发送方恢复传输 - 校验核
- 选项:必须32b的整数倍,一般在连接建立时,如:
协商MTU
注意:传输层的MTU即MSS(Maximum Segment Size )仅为数据部分,多为1460B
协商窗口尺寸因子:由于窗口尺寸为16b,因此最大为64KB。对于特定情况(如1000Mbps但线路延迟100ms且双方方有足够的缓存)应根据线路的状态和发送方及接收方的情况动态的改变窗口尺寸使得其可以大于64KB(左移因子,最大可将窗口尺寸从16b扩大为30b),以提高线路利用率
协商重发方式:选择性 或全部。缺省为选择性重发(SACK)
- UDP
- 源端口
- 目的端口
- 头部长度
- 校验核
3.1.2 动手操作
-
使用Wireshark抓包并筛选条件为
tcp
-
使用Wireshark抓包并筛选条件为
udp
结果与上述格式相同也验证了结论。
3.2 分析 TCP 建立和释放连接
打开浏览器访问网页的同时进行抓包,就可以抓到三次握手建立连接和四次挥手释放连接,但是实际中往往挥手只有三次因为第二次和第三次一起发送。
4. 应用层
4.1 了解 DNS 解析
- 在Cmder中输入命令:
ipconfig /flushdns
- 再开启Wireshark抓包过滤条件为dns
- 再在Cmder中输入命令:
nslookup qige.io
抓包结果为:
可以看到当前计算机使用 UDP,向默认的 DNS 服务器的 53 号端口发出了查询请求,而 DNS 服务器的 53 号端口返回了结果。
4.2 了解 HTTP 的请求和应答
打开浏览器访问 qige.io 网站,同时用 Wireshark 抓包
结果如下:
可以看出一个消息是request另一个是response
而回应消息有一个200,意思是请求成功
常见的状态消息为
消息 | 描述 |
---|---|
200 OK | 请求成功 |
304 Not Modified | 未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。 |
404 Not Found | 服务器无法找到被请求的页面。 |
500 Internal Server Error | 请求未完成。服务器遇到不可预知的情况。 |