参考文章:
面试被问到有没有用过抓包工具, 还真没有... 弥补一波. 一直以来看http和https的介绍, 都是文章, 然后图片, 理解的也不深入. 借此一个机会, 深入理解下.
入行不久, 写的哪里不对的, 请谅解. 还望各位路过的大佬帮忙指出, 十分感谢.
我刚开始用, 哪里不对的. 望大神们见谅.


在官网中有很舒服的操作原理说明: Wireshark/HTTPS
http://www.cnblogs.com/zhangrunhao/httpsinfo是GET /zhangrunhao/ HTTP/1.1ping <域名>即可, 例如: ping www.cnblogs.com)ip.addr == <记录下的ip地址>
具体的tcp协议的讲解, 可以参考TCP协议
tcp协议中的各个字段.
这篇文章中需要用到的三个字段:
sequence number: 序列号
占4个字节,是本报文段所发送的数据项目组第一个字节的序号。在TCP传送的数据流中,每一个字节都有一个序号。例如,一报文段的序号为300,而且数据共100字节,则下一个报文段的序号就是400;序号是32bit的无符号数,序号到达2^32-1后从0开始.
Acknowledgment number: 确认码
占4字节, 是期望收到对方下次发送的数据的第一个字节的序号, 也就是期望收到的下一个报文段的首部中的序号. 确认序号应该是上次已成功收到数据字节序号+1. 只有ACK标志为1时, 确认序号才有效.

三次握手的简单建立过程: 所有的TCP链接都是通过三次握手开始的, 也就是客户端和服务器在发送应用数据之前, 发送一系列的数据包.

一次完整的三次握手的过程就完成了, 客户端和服务器端的数据就可以开始传输了. 需要注意的是, 客户端一旦发送完最后一个ACK数据包, 就立即开始发送应用数据, 但是服务器端需要等到最后一个ACK包接受完成才会去响应请求.
三次握手第一次握手:

客户端向服务器发出请求建立的链接, 标志为是SYN, 这个时候报文中的同部位SYN=1, 然后我们的序列号也回生成好, seq=x. 这个时候, 三次握手也就开始了.
第二次握手:

服务器收到请求, 并发送给客户端确认报文. 在确认的报文中, 标志位应该为ACK SYN, 因为此时还没有携带数据, 所以这个时候, ack = seq(x, 客户端发送过来的那个) + 1, 并在这条报文中初始化序列号, seq = y. 发送给客户端, 让客户端用来确认, 我们第二次握手的请求建立过程. 询问下客户端是否准备完成了.
第三次握手:

客户端收到服务器发送过来的第二次握手的tcp请求, 再次向服务器发送确认. 只是确认的时候, 标志为只需要是ACK, 同时生成确认序号: ack = y(这里的y, 是服务器第二次握手发送过来的seq) + 1. 这里表示客户端, 已经准备好了.
题外话: 为什么是三次握手, 而不是两次?
因为在我们第一次客户端发送握手请求的时候, 会出现网络情况不好, 发了很久才给服务器. 服务器收到请求后, 就会发送确认收到. 后面就会一直傻傻等待客户端传数据过来, 其实不知道, 这条请求链接在客户端那边已经作废了. 从而造成资源的浪费.
四次挥手
在实际的捕获中, 只抓到三个tcp的数据包, 有资料讲解, 服务器给客户端确认关闭, 并向客户端发起关闭请求的的链接合并成了一个. 也就是第二和第三次挥手, 都是由服务器端发送给客户端的, 这个时候合并成了一个请求.

第一次挥手:

第一次挥手的过程, 是客户端向服务器端发起请求. 发送一个带有FIN ACK标志位tcp包. 我们可以看到这个时候seq = 1; ack = 1. 表示, 凡是带有FIN标志位的tcp包, 都是为了告诉另一端, 我再没有数据需要传递给你了.
第二次挥手和第三次挥手:

本来, 第二次挥手是, 服务器用来确认客户端发送过来的请求的.然后再告诉客户端, 服务器也没什么好给你的东西了. 我理解的, 这应该是一种资源的优化, 既然都是服务器发送给客户端, 如果再服务器确认之后, 确实也没有要发送的了, 就直接一起发送过去了.变成了seq=1, ack=2. 标志位是FIN ACK, 其中ack = 2表示确认第一次挥手.
第四次挥手:

这是我们的最后一次挥手过程, 由客户端向服务器发送确认过程. 标志位ACK, 表示, 这是一个用于确认的tcp包. 发送ack(确认二三次挥手seq + 1) = 2. 至此一次完整的http通信过程就全部完成了.
那么问题来了: 为什么是四次挥手, 而不是三次呢?
因为, 在挥手的过程中, 第一次挥手的时候, 客户端发送向了服务器端不需要通信的请求. 服务器端通过第二次挥手确认了收到. 但并不能保证, 服务器端再没有需要给客户端发送的信息了啊. 只是表明了, 客户端没有要发送给服务器的数据了, 服务器知道了. 但是服务器没有需要给客户端的数据, 就需要通过第三次挥手来表示. 客户端回复收到. 至此才算完完全全的完成.
一句话概况: 通过非对称加密的方式来传递对称加密所需要的秘钥.
我懒, 还是贴图好了(原谅我这名盗图狗), 等会我们在抓包的过程中逐步分析.

注意一点: ssl / tls的交互过程, 是在完成我们上面的三次握手开始的.
此过程完全参考了Wireshark中关于HTTPS的操作说明.
https://en.wikiversity.org.ssl, 然后回车.Client Hello标志的TLS包.ip.addr == <destination> destination是指, 我们的ip地址.
说两个事:
ping en.wikiversity.org 多么舒服的做法..
ipconfig /all和arp -a进行确认
Internet Protocol Version 4这一层, 查看网络层的详情.
Transmission Control Protocol, 你可以看到传输层的详细信息.
SSL/TLSClient Hello数据包Client Hello标识的tsl数据包. 这里还有, 物理层, 链路层, 网络层, 传输层, 安全传输层的信息, 这里和步骤三中的各项数据保持一致.
TCP ACK标识的tcp数据包, 那是服务器端对于收到客户端请求的回应.SSL/TLSServer Hello数据包Server Hello标识的数据包.Secure Sockets Layer, 也就数安全数据层.
Certificate, Server Key Exchange, Server Hello Done.标识的数据包.Secure Sockets Layer, 让我们来仔细观察安全层所携带的数据.

Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message标识的tcp数据包.
Application Data的数据之间的传递了, 此时的数据都是经过加密的.New Session Ticket.标识的数据包, 服务器用来确定加密信息, 有些不带有, 还不是很清楚的具体原因. 有待学习, 有待学习.不会的地方可真多... 文章若有错误的地方, 还望大家能够帮忙指出. 大恩不言谢, 他日以身相许.
原文:https://www.cnblogs.com/zhangrunhao/p/10428759.html