一、准备工作
- 客户端创建
参考链接:
编写一个网游客户端 - Wirshark下载安装
参考链接:
Wireshark的下载安装及简单使用教程 - Fiddler下载安装
参考链接:
fiddler下载及安装
二、Wireshark抓包
-
TCP的连接过程(三次握手)
-
通过抓包分析三次握手
第一次握手
客户端发送一个TCP报文段,将SYN值置为1,同时随机生成一个Seq序号,表示是TCP的第一次握手。SYN是同步标志位。
第二次握手
服务器在收到客户端发来的请求连接的TCP报文段后,向客户端发送同意连接的报文段。其中,SYN的值置为1,ACK的值置为1,也随机生成一个Seq序列,同时对客户端发送的TCP报文段的序号进行确认,确认的值是收到序列号加1。
第三次握手
客户端收到服务器同意连接的报文段后,向服务器发送一个确认。其中,SYN的值置为0,ACK的值置为1,也会随机生成一个Seq序列号,同时对服务器报文段的序列号进行确认,确认的值是收到序列号加1。
三次握手完成后,客户端与服务器就可以进行收发数据,完成通信。
-
通过抓包看数据的收发(对客服端而言)
数据接收
数据发送
-
TCP的断开连接(四次挥手)
5.通过抓包分析四次挥手
第一次挥手
客户端向服务器发送断开连接的请求,将FIN(结束位)的值置为1.
第二次挥手
服务器向客户端发出断开连接的请求做出回应,表示同意断开连接。
第三次挥手
服务器向客户端发送断开连接的请求,将FIN(结束位)置为1。
第四次挥手
客户端向服务器断开连接的请求做出回应,表示同意断开连接。
四次挥手完成后,客户端与服务器想要再次进行通信,就需要再一次进行连接。
注意:有时候通过抓包会发现,只能够抓到三次挥手的包。原因是这个过程服务器将回应客户端断开连接请求和向客户端发送断开连接的请求合成一次,故抓包的时候只能抓到三次。
三、Fiddler
Fiddler 默认下,Fiddler不会捕获HTTPS会话,需要进行设置。
-
设置方法
选择的含义
from all processes : 抓取所有的 https 程序, 包括 本机 和 手机
from browsers only : 只抓取浏览器中的 https 请求
from non-browsers only : 只抓取除了浏览器之外的所有 https 请求
from remote clients only : 抓取远程的客户端的 https ,可以代表手机
过程
点击Tools->Options->Https,勾选Decrypt Https traffic,然后根据需求进行一些选择。 -
使用Https数据传输过程
①客户端发起明文请求,请求中包括自己支持的一套加密规则、以及一个随机数(Random_C)发送给服务器。
②服务器初步响应,服务器根据自己支持的加密规则,从客户端发来的请求中选出一组加密算法与HASH算法,生成随机数,并将自己的身份信息以证书(CA)的形式发回给浏览器。CA证书里面包含了服务器地址,加密公钥,以及证书的颁发机构等信息。
③客户端进行证书校验,生成密码,计算协商密钥,生成握手信息
证书校验: 验证证书的合法性。
生成密码:浏览器会生成一串随机数的密码(Pre_master),并用CA证书里的公钥加密(enc_pre_master),用于传给服务器。
计算协商密钥:根据两个明文随机数 Random_C 和 Random_S 与自己计算产生的 Pre-master,计算得到协商密钥enc_key。
生成握手信息:使用约定好的HASH计算握手消息,并使用协商密钥enc_key及约定好的算法对消息进行加密。
④加密信息(客户端向服务器发送三条数据)
第一条是公钥加密过的服务器随机数密码enc_pre_master。
第二条是客户端发给服务器的通知,表明以后按照约定进行通信。
第三条是客户端加密生成的握手信息。
⑤服务器进行私钥解密,计算协商密钥,解密握手消息,生成握手消息
私钥解密:使用自己的私钥从接收到的enc_pre_master中解密取出密码Pre_master。
计算协商密钥:根据两个明文随机数 Random_C 和 Random_S 与Pre-master,计算得到协商密钥enc_key。
解密握手消息:使用协商密钥enc_key解密客户端发来的握手消息,并验证HASH是否与客户端发来的一致。
生成握手消息:使用协商密钥enc_key及约定好的算法加密一段握手消息,发送给客户端。
⑥加密信息(服务器向客户端发送两条数据)
第一条是服务器发给客户端的通知,表明同意按照约定进行通信。
第二条是服务器加密生成的握手信息。
⑦客户端解密握手信息,验证HASH
客户端解密并计算握手消息的HASH,如果与服务端发来的HASH一致,此时握手过程结束。
⑧正常加密通信
握手成功之后,所有的通信数据将由之前协商密钥enc_key及约定好的算法进行加密解密。 -
通过抓包进行验证
图中的内容是客户端向服务器发送请求(此处应该是谷歌浏览器向百度服务器发送请求)
图中所抓的包是服务器向客户端返回的内容,内容主要是web页面所用到的文件。(此处应是百度服务器向浏览器返回的web页面)
以其中一条内容,来看上面是发送的内容,这些信息是以明文的方式显示。下面内容是服务器给的应答信息,其中,200表示请求页面是成功的,没有出现错误。可以通过下面的一些按钮来查看想应得一些信息。
对比Wireshark抓包,会发现无法找到Https的包
通过上面图片的过程,发现http的TCP属于短连接,整个连接过程,完成数据传输后,就会断开连接。要再次进行通信,需要再次连接才能够实现数据通信。
四、总结
通过使用Wireshark进行抓包,能够更加清楚TCP的三次握手和四次挥手的过程。针对Wireshark无法抓取Https的包,采用Fiddle进行抓包,清楚Https实现数据传输的过程。整个过程对于Fiddle的使用,不是很熟悉。对于其他部分的内容还是很顺畅。在文章有些地方可能表达不是很对,希望没有误导大家。