首先下载安装wireshark
打开软件
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。