准备工作
先从网上下载Wireshark,我下载的是3.2.7版本,打开Wireshark,找到一条有网络波动的网络进去。
可以看到我的网络连接的WLAN也就是无线网络!
Wireshark抓包内容
它主要包括5部分内容:
- 第一行物理层数据,物理层数据帧,这层数据单位为比特(bit)
- 第二行数据链路层数据,以太网帧头部信息,这层数据单位为帧(frame)
- 第三行网络层数据,IP头信息,这层数据单位为数据包(packet)
- 第四行传输层数据,TCP头信息,这层数据单位可以叫数据包(packet),为了区分如果是TCP的数据单元称为段 (segments)而UDP协议的数据单元称为数据报(datagrams)
- 第五行应用层数据,负载的数据,不是必须
过滤请求
我们以百度网站www.baidu.com/为列!打开百度网站,按下F15,再按下Ctrl+F5强制刷新网页,再netWork All下面可以看到
百度网站的ip地址是14.215.177.39:443;在Wireshark过滤规则里面输入ip,会自动提示ip对应的过滤规则,我们选择ip.addr,改成 ip.addr==14.215.177.39,点击停止捕获分组,再开启新的捕获分组,再次Ctrl+F5刷新百度网页,我们就能看到百度的请求捕获!
我选中第二条请求数据,右键选择跟踪流-TCP流
可以看到过滤规则已经自动变成过滤这条流的相应数据了!
TCP三次握手
从上图第一条数据可以看到是端口号52118请求443端口,也就是我们客户端请求百度服务器!
对应第一次握手:建立连接时,客户端发送SYN到服务器,并进入SYN_SENT状态
第二条数据对应百度服务器的回应!
第二次握手:服务器收到请求后,回送SYN+ACK信令到客户端,此时服务器进入SYN_RECV状态;
第三条数据数据对应第三次握手!
第三次握手:客户端收到SYN+ACK包,向服务器发送确认ACK包,客户端进入ESTABLISHED状态,服务器收到请求后也进入ESTABLISHED状态,完成三次握手,此时TCP连接成功,客户端与服务器开始传送数据!
TLS阶段
由于请求是https请求。所以除了http所有的三次握手外还有tls协议内容
1、Client Hello
主要看红色箭头部分,客户端发送随机数字(Random1)和自己可以支持的加密方法(Cipher Suites)以及期望采用的TLS协议(TLS 1.2);建立的会话标识(Session ID),有了它,随后重连服务器就不需要再执行一个完整的握手过程了。
2、Server Hello
主要看红色箭头部分,服务器发送随机数字(Random2)和服务端选择的通信使用的加密协议套件(Cipher Suite: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256)以及服务端确认通信使用的TLS版本(TLS 1.2);
TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256表示协议TLS,密钥交换算法 ECDHE,认证算法 RSA,加密算法 AES_128_GCM,MAC算法 SHA256
3、Certificate,Server Key Exchange,Server Hello Done
Certificate,Server Key Exchange,Server Hello Done这三个步骤是在同一个tls里面;
服务端发送的消息:服务端返回证书,交换公钥,Server结束三部分内容。
Server Key Exchange
服务端通过Diffie-Hellman算法生成一个Pubkey
4、Client Key Exchange,Change Cipher Spec,Encrypted Handshake Message
客户端收到服务端证书后,会先验证证书的合法性,如果验证通过才会进行后续通信!
客户端收到服务端的Pubkey,生成另一个Pubkey传给服务器!
客户端发送的消息:交换公钥,编码改变通知 和 握手结束消息
5、Application Data
双方建立连接,交换信息!
New Session Ticket
完成上面的步骤,可以说TLS的握手阶段已经完成了,但是,服务器还会发送一个Session Ticket给浏览器。如上图所示,这个Session Ticket包含了这个Session的生命周期是(15 minutes。这个Session Ticket包有什么做用呢?握手阶段用来建立TLS连接。如果出于某种原因,对话中断,就需要重新握手。客户端只需发送一个服务器在上一次对话中发送过来的Session Ticket。这个Session Ticket是加密的,只有服务器才能解密,其中包括本次对话的主要信息,比如对话密钥和加密方法。当服务器收到Session Ticket以后,解密后就不必重新生成对话密钥了。就可以继续使用上一次的连接了。
重新连接https
在经过上一次的握手之后,下一次的https的重连接会变得更加简洁,
在Client hello上,附加了上次服务器给的Session Ticket(Session ID),这样就减少了验证的次数,使重新连接更加方便!