抓包分析TCP三次握手和四次挥手
1、tcp报文格式
2、三次握手过程
3、tcp三次握手抓包数据(其中红线X的587不是)
- 第一次握手:标志位[SYN=1],***Seq=0
- 第二次握手:标志位[SYN=1,ACK=1],***Seq=0 确认号Ack=1
- 第三次握手:标志位[ACK=1],***Seq=1 确认号Ack=1
4、http请求包数据,包含6个部分,前面5个部分是网络的5层协议(物理、数据,网络,传输,应用),第6个部分由于是post请求,传递了request body的内容;
每一层都有一个字段指向上一层,表明上一层是什么协议。这大概是因为发包的时候会在数据上依次加上应用层、传输层、网络层、链路层的头部,但是对方收到数据包后是从最底层(链路层)开始层层剥去头部解包的,所以在每层上有一个字段指向上层,表明上层的协议,对方就知道下一步该怎么解包了。组装包的过程是从物理层->应用层,解包的过程也是如此;
关于五层协议干了什么:https://blog.csdn.net/qq_22238021/article/details/80279001
5、再往下看其他数据包,会发现存在大量的TCP segment of a reassembled PDU,字面意思是要重组的协议数据单元(PDU:Protocol Data Unit)的TCP段,这是TCP层收到上层大块报文后分解成段后发出去。
每个数据包的Protocol Length都是1506 Byte,这是因为以太网帧的封包格式为:Frame = Ethernet Header + IP Header + TCP Header + TCP Segment Data。即:
1、Ethernet Header = 14 Byte = Dst Physical Address(6 Byte)+ Src Physical Address(6 Byte)+ Type(2 Byte),以太网帧头以下称之为数据帧。
2、IP Header = 20 Byte(without options field),数据在IP层称为Datagram,分片称为Fragment。
3、TCP Header = 20 Byte(without options field),数据在TCP层称为Stream,分段称为Segment(UDP中称为Message)。
4、TCP Segment Data = 1452 Byte(从图可见)。
所以,每个数据包的Protocol Length = 14 Byte + 20 Byte + 20 Byte + 1452 Byte = 1506 Byte。
6、四次挥手
在测试这个之前遇到了一个问题,由于测试的是laravel网站,在响应头中返回了Connection: keep-alive,导致退出了测试网站后过了大概10分钟左右才出现了tcp断开请求;刚关闭网站时,本地ip向服务端ip发出[TCP Keep-Alive],然后服务端ip回复[TCP Keep-Alive ACK];这里具体的含义是有关http 请求的是否保持长连接,即链接是否复用,每次请求是复用已建立好的请求,还是重新建立一个新的请求。
HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTTP协议为无连接的协议);当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。参考:TCP Keep-Alive
三次挥手原因:因为服务器端在给客户端传回的过程中,将两个连续发送的包进行了合并。
三次挥手过程:
- 第一次挥手:标志位[FIN=1,ACK=1],***Seq=812 确认号Ack=897
- 第二次挥手:标志位[FIN=1,ACK=1],***Seq=897 确认号Ack=813
- 第三次挥手:标志位[ACK=1],***Seq=813 确认号Ack=898
为什么握手需要三次,两次不行吗?因为服务端还不知道客户端的接受能力是否有问题;
参考链接:
https://www.cnblogs.com/163yun/p/9552368.html
https://baijiahao.baidu.com/s?id=1647167709154490152&wfr=spider&for=pc