注册
|
登录
发帖
热搜
活动
交友
discuz
论坛
BBS
翼度工具
翼度网址导航
开发工具
Linux命令速查
网页设计配色表
在线制作icon
颜色代码选取器
翼度科技
»
论坛
›
编程开发
›
JavaScript
›
查看内容
返回列表
发新帖
为什么必须使用三次握手?
漂亮的大白
漂亮的大白
当前离线
积分
18
6
主题
6
帖子
18
积分
新手上路
新手上路, 积分 18, 距离下一级还需 32 积分
新手上路, 积分 18, 距离下一级还需 32 积分
积分
18
发消息
显示全部楼层
TCP(传输控制协议)的三次握手是建立可靠连接的关键步骤,其设计目的是确保通信双方都准备好,并且避免重复的连接初始化。三次握手并不是随意设定的,而是有其重要的技术理由。
1. 防止重复的连接初始化
假设只使用两次握手,会存在以下问题:
旧的重复SYN包问题
:如果网络中的一个旧的SYN包(因为网络延迟等原因)突然到达服务器,服务器会误以为是一个新的连接请求。如果没有第三次握手,服务器会直接接受这个旧的请求并建立连接,但客户端实际上并没有发送新的请求。这会导致资源浪费和连接状态混乱。
2. 确认双方的接收和发送能力
三次握手确保了双方的发送和接收能力:
第一次握手(SYN)
:客户端告诉服务器它希望建立连接,并发送初始序列号。
第二次握手(SYN-ACK)
:服务器收到请求并回应,同时发送自己的初始序列号,表示自己已经准备好接收数据。
第三次握手(ACK)
:客户端确认服务器的回应,同时确认自己可以接收服务器的数据。
3. 避免资源浪费
如果没有三次握手的确认步骤,服务器会在每次收到SYN请求后直接分配资源(如缓存和连接控制块)。但由于客户端未必真正准备好,这些资源可能会被浪费。三次握手确保只有在双方都确认可以通信的情况下才会分配资源。
两次握手的问题示例
假设使用两次握手:
第一次握手(SYN)
:客户端发送SYN包,服务器接收并回应SYN-ACK。
第二次握手(SYN-ACK)
:服务器发送SYN-ACK包,认为连接已建立。
在这种情况下,如果客户端由于某种原因没有接收到SYN-ACK包(如网络丢包),服务器认为连接已经建立并开始等待客户端的数据,但客户端并没有建立连接。这会导致服务器资源被浪费,最终可能导致拒绝服务攻击(DoS)。
sequenceDiagram
participant Client as 客户端
participant Server as 服务器
Client->>Server: SYN (序列号X)
Server-->>Client: SYN-ACK (序列号Y, 确认号X+1)
Client->>Server: ACK (确认号Y+1)
复制代码
来源:
https://www.cnblogs.com/zx618/p/18314362
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!
上一篇:
Dart 入门教程
下一篇:
[JS] 字母异位词分组与JS中对象键值特性
发表于 2024-7-21 23:30:34
举报
回复
使用道具
分享
返回列表
发新帖
本版积分规则
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
|
立即注册
快速回复
快速回复
返回顶部
返回顶部
返回列表
返回列表