首先下载安装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。
 



















