Wireshark 是一个网络封包分析软件。帮你撷取网络封包,并尽可能显示出最为详细的网络封包资料。
Wireshark 可以获取HTTP,也能获取HTTPS,但是不能解密HTTPS,只能帮你捕获包,没有密钥是看不懂HTTPS 的,HTTPS 可以使用Charles 。Https 抓包。
直接网上下载安装Wireshark ,打开界面如下,
双击后开始抓包
你会发现Wireshark 抓的包好多可能是不是你要要查看的,因为它帮你把所有的包都抓下来了,所有过滤就十分重要了。
数据包相关概念
由于在大学学习的不认真(哭笑),还有就是没看过数据包,导致一些概念已将模糊了,但相关的字段代表啥意思,对于抓包来说还是很重要的(其实在别的方面也很重要)。
上面红框的部分分别对应了
物理层
数据链路层
网络层
传输层
应用层
将传输层展开可以看到
从上到下与下图相对应
相关字段的概念笔记
序列号(seq,32 位)
在一个TCP 连接传送的字节流里的每一个字节都按顺序编号。首部里的序号字段值则指的是本报文段所发送数据的第一个字节的序号。
确认号(ack,32位)
是期望收到对方下一个报文段的第一个数据字节的序号。
若确认号 = N ,则表明:到序号N-1 为止的所有数据都已正确收到。
标志位
URG --- 为1表示高优先级数据包,紧急指针字段有效。
ACK --- 为1表示确认号字段有效。
PSH --- 为1表示是带有PUSH标志的数据,指示接收方应该尽快将这个报文段交给应用层而不用等待缓冲区装满。
RST --- 为1表示出现严重差错(如由于主机崩溃或其他原因),必须释放连接,可能需要重新创建TCP连接。
还可以用于拒绝非法的报文段和拒绝连接请求。
SYN --- 为1表示这是连接请求或是连接接受请求,用于创建连接和使顺序号同步。
FIN --- 为1表示发送方没有数据要传输了,要求释放连接。
窗口
指的是发送本报文段的一方的接收窗口。
窗口值告诉对方:从本报文段首部里的确认号算起,接收方目前允许对方发送的数据量(以字节为单位)。窗口值作为接收方让发送方设置其发送窗口的依据。
紧急指针
告诉系统此保温段里有紧急数据,应尽快传送(相当于高优先级的数据包)。
例如,已经发送很长的数据,但是想撤销,比如发现数据又问题,如果不使用紧急数据,那最后一个撤销的包会排在之前的数据包的后面,这样只有之前的处理完才会处理该包,浪费时间,而且没有起到撤销的效果(当URG = 1 时,表明紧急指针有效)。
数据包的过滤
在过滤栏输入过滤语法是一个比较好用的方法。
过滤语法
过滤地址
ip.addr==192.168.10.10 或 ip.addr eq 192.168.10.10 #过滤地址
ip.src==192.168.10.10 #过滤源地址
ip.dst==192.168.10.10 #过滤目的地址
过滤协议,直接输入协议名
icmp
http
过滤协议和端口
tcp.port==80
tcp.srcport==80
tcp.dstport==80
过滤http协议的请求方式
http.request.method=="GET"
http.request.method=="POST"
连接符
&&
||
and
or
通过连接符可以把上面的命令连接在一起,比如:
ip.src==192.168.10.10 and http.request.method=="POST
数据流追踪
一个完整的数据流一般都是由很多个包组成的,所以想看整个数据流的包,可以 右键-->追踪流 ,
当我们选择了追踪流时,就会过滤出该流的完整数据流。还有这个数据流包含的数据包。顶部的过滤器是该流的过滤规则。
这样可以看到从发起这次Http 请求到断开的一下类数据包,而且没有其它的无关的数据包造成干扰。
三次握手与四次挥手抓包
先要清楚理论上的三次握手与四次挥手才能看懂抓包。
三次握手
第一次握手:建立连接。客户端发送连接请求报文段,将SYN位置为1,Sequence Number为x;
然后,客户端进入SYN_SEND状态,等待服务器的确认;
第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,
设置Acknowledgment Number为x + 1(Sequence Number + 1);同时,自己自己还要发送SYN请求信息,
将SYN位置为1,Sequence Number为y;服务器端将上述所有信息放到一个报文段(即SYN+ACK报文段)里,
一并发送给客户端,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK报文段。然后将Acknowledgment Number设置为y + 1,
向服务器发送ACK报文段,这个报文段发送完毕以后,客户端和服务器端都进入ESTABLISHED状态,完成TCP三次握手。
清楚了过程,再去抓包,这也是一个从理论到实践的过程啊,可以看看数据包是怎样的。
三次握手抓包如图
四次挥手
第一次挥手:主机1(可以使客户端,也可以是服务器端),设置Sequence Number,向主机2发送一个FIN报文段;
此时,主机1进入FIN_WAIT_1状态;这表示主机1没有数据要发送给主机2了;
第二次挥手:主机2收到了主机1发送的FIN报文段,向主机1回一个ACK报文段,
Acknowledgment Number为 Sequence Number加1;主机1进入FIN_WAIT_2状态;
主机2告诉主机1,我“同意”你的关闭请求;
第三次挥手:主机2向主机1发送FIN报文段,请求关闭连接,同时主机2进入LAST_ACK状态;
第四次挥手:主机1收到主机2发送的FIN报文段,向主机2发送ACK报文段,然后主机1进入TIME_WAIT状态;
主机2收到主机1的ACK报文段以后,就关闭连接;此时,主机1等待2MSL(MSL:Maximum Segment Lifetime,
报文段最大生存时间,详情请见下文介绍)后依然没有收到回复,则证明Server端已正常关闭,
那好,主机1也可以关闭连接了。
四次挥手抓包如图