三次握手
指建立tcp链接时,需要客户端和服务器总共发送三个包,主要作用是确认双方接受和发放能力是否正常,初始化 客户端处于
Closed
状态,服务端处于Listen
状态
在三次握手开始之前,先对字段有所了解
1、seq 序列号 随机数 seq = x
每次连接都会携带一个自己的随机序列号
2、ack 确认号 ack = seq + 1
确认上一次收到了序列号 除了第一次连接都会携带
3、ACK 确认收到序列号 ACK = 1
除了第一次连接都会携带
4、SYN 发起一个新连接 SYN = 1
5、FIN 释放一个连接 FIN = 1
第一次握手🤝 客户端给服务器发送一个TCP报文
1、SYN = 1建立一个新的链接
2、
seq = x 随机序列号
此时客户端处于SYN-SEND状态
第二次握手🤝 服务器收到SYN报文后,回复浏览器
1、SYN = 1同意建立一个新的链接
2、ACK = 1确认收到序列号
3、ack = x + 1确认收到序列号是x
4、
seq = y 随机序列号
服务端进入SYN-REVD阶段
第三次握手🤝 浏览器收到报文后回复服务器
1、ACK = 1确认收到序列号
2、ack = y + 1确认收到序列号是y
3、seq = x+1
上一次浏览器发送的 seq = x
基础上 + 1
服务器和浏览器同时进入 ESTABLISHED 状态
关于三次握手可能问到的面试题
三次握手的作用
1、确认服务器和客户端的接受和发送能力正常
2、指定自己的初始化序列号,为后面的可靠传输做准备
什么是半连接队列
1、服务器第一次收到客户端的SYN后,处于SYN-REVD状态,此时双方还没有建立连接,服务器会把此时情况下的连接放到队列里,我们把这种队列称为半连接队列
什么是全连接队列
1、当双方已经完成三次握手,此时的请求连接会放到全连接对列里,如果队列满了会出现丢包的情况
四次挥手
1、客户端和服务器要断开连接时进行的四次挥手
2、刚开始双方都处于 ESTABLISHED 状态
第一次挥手🙋 客户端发起断开连接
1、FIN = 1 关闭连接
2、seq = q 随机序列号
客户端处于FIN-WAIT-1状态
第二次挥手🙋 服务器收到客户端的断开请求,开始处理内部处理操作
1、ACK = 1 确认收到序列号
2、ack = q + 1 确认收到序列号q
3、seq = w 随机序列号
服务器进入 COLSE-WAIT
处理阶段
客户端进入 FIN-WAIT-2
阶段 等待服务器处理
第三次挥手🙋 服务器处理完毕,回复客户端
1、ACK = 1 确认收到序列号
2、ack = q + 1 确认收到序列号q
3、seq = v 随机序列号
4、FIN = 1 关闭连接
服务器进入 LAST-ACK
阶段 等待浏览器确认收到
第四次挥手🙋 客户端收到服务器报文,回复服务器
1、ACK = 1 确认收到序列号
2、ack = v + 1 确认收到序列号v
3、seq = q + 1
浏览器进入 TIME-WAIT
阶段,此时TCP
未释放掉,等待 2MSL
(毫秒),等待服务器收到自己的报文,然后进入 COLSE
阶段
为什么是四次 挥手
客户端发送FIN
报文后,表示客户端当前没有数据需要处理,而不代表服务端没有数据需要处理。此时需要服务端回复ACK
确认收到报文后,开始处理内部数据。当内部数据处理完后,再回复FIN
可以关闭连接