Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。


  同类型的软件有:cain、sniffer


  WinPcap是用于网络封包抓取的一套工具,可适用于32位的操作平台上解析网络封包,包含了核心的封包过滤,一个底层动态链接库,和一个高层系统函数库,及可用来直接存取封包的应用程序界面

  Winpcap提供了两个不同的库:packet.dll 和wpcap.dll。 

packet.dll提供一个底层的API,通过这个API可直接访问网络设备驱动,而独立于Microsoft OS. 

wpcap.dll是一个高层的强大捕获程序库,与Unix下的libpcap兼容。它独立于下层的网络硬件和操作系统

 Wireshark 启动界面

wKioL1mezTeD2LNBAAFJRGqOzGE859.png






























wireshark是捕获机器上的某一块网卡的网络包,当你有多块网卡的时候,你需要选择一个网卡。

点击 抓包->网络接口 出现下面对话框,选择正确的网卡。然后点击"开始"按钮, 开始抓包


wKiom1mezoOyoNKOAABPNwMtr5E936.png









窗口介绍

wKiom1mezsTBQQOgAATWagtbhI8960.png

WireShark 主要分为这几个界面

1. 显示过滤器,用于过滤

2. 封包列表,显示捕获到的封包, 有源地址和目标地址,端口号。 颜色不同,代表

3. 封包详细信息,显示封包中的字段

4. 16进制数据

5. 地址栏,杂项


显示过滤器

wKiom1me0VXxDiKVAAAM0jdMV0A519.png

表达式规则

 1. 协议过滤

比如TCP,只显示TCP协议。

2. IP 过滤

比如 

ip.src==192.168.1.102,源地址为 192.168.1.102

ip.dst==192.168.1.102,目标地址为 192.168.1.102

3. 端口过滤

tcp.port ==80,  端口为80的

tcp.srcport == 80,  只显示TCP协议的源端口为80的

4. Http模式过滤

http.request.method=="GET",   只显示HTTP GET方法的。

5. 逻辑运算符为 AND/ OR


封包列表

面板中显示:编号,时间戳,源地址,目标地址,协议,长度,封包信息

不同的协议用了不同的颜色显示,默认:

绿色是TCP报文,深蓝色是DNS,浅蓝是UDP,黑色标识出有问题的TCP报文:比如乱序报文。

wKioL1me00KBDSmhAACmJUmcvsY605.png


封包详细信息

这个面板是我们最重要的,用来查看协议中的每一个字段。

wKioL1me1ACDVr2dAAChtCMEJmY675.png

Frame:   物理层的数据帧概况

Ethernet II: 数据链路层以太网帧头部信息

Internet Protocol: 互联网层IP包头部信息

Transmission Control Protocol:  传输层T的数据段头部信息,此处是TCP

Hypertext Transfer Protocol:  应用层的信息,此处是HTTP协议


wireshark与OSI七层模型

wKiom1me1V7T3tbwAAGdiLBkJJ8545.png

TCP包的具体内容

wKioL1me1hOBDu1xAAQ0DaGYLU0191.png


分析TCP三次握手过程

wKiom1me1mjDaF_IAABsQiYdZP0452.png


我们用wireshark实际分析下三次握手的过程。

打开wireshark, 打开浏览器输入 http://www.cnblogs.com/tankxiao

在wireshark中输入"http"过滤, 然后选中GET /tankxiao HTTP/1.1的那条记录,右键然后点击"Follow TCP Stream",

这样做的目的是为了得到与浏览器打开网站相关的数据包,将得到如下图

wKioL1me3XmR2BEyAAFYakf94BA114.png

图中可以看到wireshark截获到了“三次握手”的三个数据包。第四个包才是HTTP的, 这说明HTTP的确是使用TCP建立连接的。


第一次握手数据包

客户端向服务器发送连接请求包,标志位SYN(同步序号)为1,序号Seq为X=0

wKiom1me3kzBu8aCAADtWrKp0nw629.png


第二次握手的数据包

服务器收到客户端发的报文,由SYN=1知道客户端要求建立联机。向客户端发送一个SYN和ACK都为1的TCP报文,设置初始序号seq Y=0,将确认序号(Acknowledgement Number)设置为客户的序号加1,即X+1 = 0+1=1, 如下图

wKiom1me4FKgLe0lAADKd8_O4pM359.png


第三次握手的数据包

客户端收到服务器发来的包后检查确认序号(Acknowledgement Number)是否正确,即第一次发送的序号加1(X[ 0 ]+1=1)。以及标志位ACK是否为1。若正确,服务器再次发送确认包,ACK标志位为1,SYN标志位为0。确认序号(Acknowledgement Number)=Y+1=0+1=1,发送序号为X+1=1。客户端收到后确认序号值与ACK=1则连接建立成功,可以传送数据了。

wKiom1me4QHCuhyxAAC-kJl3T-0156.png


就这样通过了TCP三次握手,建立了连接。



TCP/IP知识

wKiom1me7bmQkXQ_AACKTtXhffI659.jpg

1. 链路层:

也称作数据链路层或者网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡。它们一起处理与电缆(或其他任何传输媒介)的物理接口细节。


2. 网络层:

也称作互联网层,处理分组在网络中的活动,例如分组的选路。网络层协议包括IP协议(网际协议)、ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)。


3. 运输层主要为两台主机上的应用程序提供端到端的通信:

在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。TCP为两台主机提供高可靠性的数据通信。他所作的工作包括把应用程序交给它的数据分成合适的小块交给下面的网络层,确认接收到的分组,设置发送最后确认分组的超时时钟等。由于运输层提供了高可靠性的端到端通信,因此应用层可以忽略所有这些细节。而另一方面,UDP则为应用层提供一种非常简单的服务。它只是把称作数据报的分组从一台主机发送到另一台主机,但并不保证该数据报能到达另一端。任何必须的可靠性必须由应用层来提供。


4. 应用层负责处理特定的应用程序细节:

包括Telnet(远程登录)、FTP(文件传输协议)、SMTP(简单邮件传送协议)以及SNMP(简单网络管理协议)等。


TCP是一种面向连接的、可靠的 基于字节流的传输层通信协议。TCP将用户数据打包成报文段,它发送后启动一个定时器,另一端收到的数据进行确认、对失序的数据重新排序、丢弃重复数据。


TCP的特点:

1、TCP是面向连接的运输层协议

2、每一条TCP连接只能有两个端点,每一条TCP连接只能是点对点的

3、TCP提供可靠交付的服务

4、TCP提供全双工通信。数据在两个方向上独立的进行传输。因此,连接的每一端必须保持每个方向上的传输数据序号。

5、面向字节流。面向字节流的含义:虽然应用程序和TCP交互是一次一个数据块,但TCP应用程序交下来的数据仅仅是一连串的无结构的字节流。

wKioL1me7vygIcvgAAB3ehYlMGQ023.jpg

1. 源端口号:数据发起者的端口号,16bit

2. 目的端口号:数据接收者的端口号,16bit

3. 序号:32bit的序列号,由发送方使用

4. 确认序号:32bit的确认号,是接收数据方期望收到发送方的下一个报文段的序号,因此确认序号应当是上次已成功收到数据字节序号加1。

5. 首部长度:首部中32bit字的数目,可表示15*32bit=60字节的首部。一般首部长度为20字节。

6. 保留:6bit, 均为0

7. 紧急URG:当URG=1时,表示报文段中有紧急数据,应尽快传送。

8. 确认比特ACK:ACK = 1时代表这是一个确认的TCP包,取值0则不是确认包。

9. 推送比特PSH:当发送端PSH=1时,接收端尽快的交付给应用进程。

10. 复位比特(RST):当RST=1时,表明TCP连接中出现严重差错,必须释放连接,再重新建立连接。

11. 同步比特SYN:在建立连接是用来同步序号。SYN=1, ACK=0表示一个连接请求报文段。SYN=1,ACK=1表示同意建立连接。

12. 终止比特FIN:FIN=1时,表明此报文段的发送端的数据已经发送完毕,并要求释放传输连接。

13. 窗口:用来控制对方发送的数据量,通知发放已确定的发送窗口上限。

14. 检验和:该字段检验的范围包括首部和数据这两部分。由发端计算和存储,并由收端进行验证。

15. 紧急指针:紧急指针在URG=1时才有效,它指出本报文段中的紧急数据的字节数。

16. 选项:长度可变,最长可达40字节。


wireshark捕获到的TCP包中的每个字段如下图所示:

wKioL1me7zXD7jreAAGuteFtYjI216.jpg