作者:变优秀的小白
Github:关注YX-XiaoBai
爱好:Americano More Ice !
QQ学习交流群(new): 811792998
目录
- 三次握手🤝(顶配版)
- 三次握手🤝作用
- 为什么只有三次握手🤝才能确认对方的接收与发送能力正常,而两次不行
- (ISN)是固定的吗
- 什么是半连接队列
- 三次握手过程中可以携带数据吗
- 为什么第一次、第二次握手不可以携带数据呢
当面试官问你为什么需要有三次握手、三次握手的作用、讲讲三次握手的时候,你会怎么回答?
三次握手🤝(顶配版)
名词解释
SYN(synchronize 同步)
ACK(acknowledge 确认)
FIN(finish 结束)
ISN(Initial Sequence Number)
初始状态: 客户端处于closed
状态,服务端处于listen
状态
客户端 | 服务端 | |
---|---|---|
初始状态 | closed | listen |
第一次握手 | SYN_SENT (主动打开) | listen |
第二次握手 | SYN_SENT | SYN_REVD (被动打开) |
第三次握手 | ESTABLISHED | SYN_REVD |
最后 | ESTABLISHED | ESTABLISHED |
详细过程
- 第一次握手🤝: 客户端发送一个
SYN
报文给服务端,并指明客户端的初始化序列号ISN(c)
。此时客户端处于SYN_SENT
状态- 发送内容:
1个报文
+ISN
: 客户端SYN
; 客户端ISN
- 发送内容:
- 第二次握手🤝: 服务端接收客户端
SYN
报文,一是自己的SYN
作为响应,二是指明自己的初始化序列ISN(s)
,同时将ISN(c)+1
–>转换为ACK
值,表明服务端已经接收到客户端的SYN
报文。此时服务端处于SYN_REVD
状态。- 发送内容:
2个报文
+ISN
: 服务端SYN
, 服务端ACK
; 服务端ISN
- 发送内容:
- 第三次握手🤝: 客户端接收服务端的
SYN
报文,将ISN(s)+1
–>转换为ACK
值,表明客户端已经接收到服务端的SYN
报文。此时客户端处于ESTABLISHED
状态。- 发送内容:
1个报文
: 客户端ACK
- 发送内容:
- 最后: 服务端接收到
ACK
报文。服务端处于ESTABLISHED
状态,双方建立连接。
三次握手🤝作用
作用很多,能记越多越好
- 确认双方的发送、接收能力是否正常
- 指定自身的初始化序列号(
ISN
),为后面可靠传输做充分准备 - 如果是
https
协议,三次握手过程中还会进行数字证书验证和加密密钥的生成
为什么只有三次握手🤝才能确认对方的接收与发送能力正常,而两次不行
- 第一次握手🤝: 客户端发送网络包,服务端接收成功。
- 结论:客户端发送能力正常,服务端接受能力正常
- 第二次握手🤝: 服务端发送网络包,客户端接收成功。
- 结论: 服务端接收、发送能力正常,服务端接收、发送能力正常
- 但是: 服务端不能确认客户端接收能力是否正常(客户端第三次才响应告诉服务器,才可确认客户端接收能力正常)
- 第三次握手🤝: 客户端发送网络包,服务端接收成功。
- 结论: 服务端得出结论 -> 客户端的接收、发送能力正常;服务端的接收、发送能力正常
从上面得出,只有三次握手才能确认双方的接收与发送能力是否正常
(ISN)是固定的吗
三次握手的一个重要功能是客户端与服务端交换ISN
(Initial Sequence Number
),以便让对方知道接下来接收数据是如何按序列号
组装数据的
若ISN
是固定的,攻击者便很容易猜出ACK
,因此ISN
是动态生成的
什么是半连接队列
服务器第一次收到客户端的SYN
之后,就会处于SYN_REVD
状态(第二次握手),此时双方还没有完全建立连接,服务器会把这中中下请求连接都放在一个队列里,这种队列就称为半连接队列
当然还有全连接队列
,即完成了三次握手,已经建立了连接就会放在全连接队列
,若队列满了就会出现丢包现象
Tips: 补充一点关于
SYN-ACK重传次数
的问题,当服务端发送SYN-ACK
包完成,若没有收到客户端确认包(ACK
),服务端会进行首次重传,等一段时间仍未收到,服务端进行第二次重传…当重传次数大于系统规定最大重传此时,系统将连接信息从半连接队列
中删除。注意的是,每次重传等待时间不一定相同,一般都是指数递增,如1s, 2s, 4s, 8s…
三次握手过程中可以携带数据吗
是可以携带的。第一次、第二次握手都不可以携带数据,而第三次握手是可以携带数据的。
为什么第一次、第二次握手不可以携带数据呢
我们可以假如这第一次握手可以携带数据,若有人要恶意攻击服务器,那他每次在第一次握手中SYN
中放入大量数据(无需理会服务器的发送、接收能力),疯狂重复发送SYN
报文会导致服务端花费大量时间和空间来处理和接收这些报文。
所以,会使服务器更容易受到攻击。
但是在第三次握手中,客户端已经处于ESTABLISHED
状态,对于客户端来说,它已经与服务端建立了连接,并且确保服务器的接收、发送能力是正常的。
所以,能携带数据没毛病
参考文章
- 掘金作者:帅地
结束语:如果遇到什么疑问或者建议的,可直接留言评论!作者看到会马上一一回复
如果觉得小白此文章不错或对你有所帮助,期待你的一键三连💫!❤️ni
更多推荐
面试必问的三次握手(无敌顶配版) 学会的眨眨眼!
发布评论