使用wireshark抓包理解tcp协议和tls
首先下载安装 打开软件
1.选则自己连结的网络; 此时就会捕获的数据
2.加上端口过滤。
3.启动一个本地的http服务(这里采用的nodejs);
// server.js import koa from koa; const app = new koa(); app.use(ctx => { ctx.body = "hello" }) app.listen(3000)
node server.js
4.curl http://localhost:3000
一个TCP报文段的最大长度为65495字节. TCP封装在IP内,IP数据报最大长度2^16-1 ,头部最小20,TCP头部长度最小20,所以最大封装数据长度为65535-20-20=65495 TCP固定首部20个字节,即除去选项及填充
Syn (Synchronize Sequence Numbers) 同步序列编码; Seq (Sequence Number) 当前包序列号; Sequence Number (raw)== Syn +Seq; Next Sequence Number 下一个包的的序列号 ==Seq + Len Acknowledgment Number 确认序号 Acknowledgment number (raw) ==确认序号 + (对方)Sequence Number (raw) Len 数据包长度 点击SEQ=0的行,可以看到如下数据:
1. tcp第一次握手:客户端===>服务端 发起连接请求。
Sequence Number: 0 (relative sequence number) Sequence Number (raw): X [Next Sequence Number: 1 (relative sequence number)] Acknowledgment Number: 0 Acknowledgment number (raw): 0 ... .... .... ..1. = Syn: Set #(不重复随机数X)
2. tcp第二次握手:服务端===>客户端 回应请求。
Sequence Number: 0 (relative sequence number) Sequence Number (raw): Y [Next Sequence Number: 1 (relative sequence number)] Acknowledgment Number: 1 Acknowledgment number (raw): X+1 ... .... .... ..1. = Syn: Set # (不重复随机数Y)
3.tcp第三次握手:客户端===>服务端 回应。
Sequence Number: 1 (relative sequence number) Sequence Number (raw): X+1 #4257407297 Acknowledgment Number: 1 Acknowledgment number (raw): Y+1 #3318791688 ... .... .... ..1. = Syn: Set
三次握手
第1次挥手:客户端发送一个FIN,用来关闭客户端到服务端的数据传送,客户端进入FIN_WAIT_1状态;
第2次挥手:服务端收到FIN后,发送一个ACK给客户端,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号),服务端进入CLOSE_WAIT状态;
第3次挥手:服务端发送一个FIN,用来关闭服务端到客户端的数据传送,服务端进入LAST_ACK状态;
第4次挥手:客户端收到FIN后,客户端t进入TIME_WAIT状态,接着发送一个ACK给Server,确认序号为收到序号+1,服务端进入CLOSED状态,完成四次挥手。
其中:FIN标志位数置1,表示断开TCP连接。
四次挥手
1-3行:建立连接; 6 行:服务端==>客户端:回答79号的内容:第1包 ,长度65495,下一个包编号65496; 7 行:服务端==>客户端:回答79号的内容:第65496包 ,长度65495,下一个包编号130991; 8 行:服务端==>客户端:回答79号的内容:第130991包 ,长度65495,下一个包编号196486; 9 行:服务端==>客户端:回答79号的内容:第196486包 ,长度65495,下一个包编号261981; 10 行:服务端==>客户端:回答79号的内容:第261981包 ,长度65495,下一个包编号327476; 11 行:服务端==>客户端:回答79号的内容:第327476包 ,长度56384,下一个包编号383860;(完) 12 行:客户端==>服务端:回答383860号内容:确认79号包 15-18行:断开连接;(同理)
http与https
从图中可以看出http是明文传输的:
https网络协议模型:
SSL/TLS握手过程
然后我们尝试抓取一下https
第一步,浏览器给出协议版本号、一个客户端生成的随机数(Client random),以及客户端支持的加密方法。
第二步,服务器确认双方使用的加密方法,使用的tls版本号和一个随机数。
第三步,并给出数字证书、以及一个服务器运行Diffie-Hellman算法生成的参数,比如pubkey。
第四步,浏览器获取服务器发来的pubkey,计算出另一个pubkey,发给服务器。
第五步,服务器发给浏览器一个session ticket。