TCP为什么是三次握手?两次、四次握手不行吗?
2023-04-18 13:15:46 时间
TCP协议需要经过三次握手,才能建立连接,而像SCTP协议,则必须经过四次握手,才能建立连接。不禁我们要问了,为什么TCP不是两次握手,或者四次握手来建立连接呢?
TCP是一种可靠的传输控制协议,它必须做到两点,一是保证数据的可靠传输,二是尽可能提高传输效率,三次握手正是为了做到这两点才出现的。
可靠性的实现
假设A、B双方欲建立TCP连接。
首先,由操作系统随机选取一个32位序列号,假设A的初始序列号为1000,接着对所要发送的数据进行编号,1001,1002,1003...
A会把初始序列号ISN告诉给B,让B知道,什么样的编号数据是合法的,什么样的编号数据是非法的,比如接收到一个编号999的数据,那就是非法的。
B也会对A每一个编号数据进行确认,如果收到编号为2001,1001-2000说明有1000个字节已经安全到达。
同理,B也会进行类似的操作。如果B的初始序列号ISN为2000,B也会开始编号2001,2002,2003...
B再将初始序列号ISN告诉A,A同样可以确认B发送了多少个字节,这些数据合不合法。
通过以上步骤,不难发现,TCP协议握手的本质是通信双方数据原点的序列号,从而实现可靠性。
传输效率
实现数据可靠传输,为什么刚好需要三次握手呢?如果两次握手,行不行?
两次握手:
- A发送同步信号SYN+A的初始序列号
- B发送同步信号SYN+B的初始序列号+B的ACK序列号
两次握手会产生一个问题,B没办法知道A是不是已经接收了自己的同步信号。一旦这个同步信号丢了,A和B就B的初始序列号将无法达成一致。
显然,两次握手是不可取的。
那么四次握手又如何呢?
- A发送同步信号SYN+A的初始序列号
- B确认收到A的同步信号,并记录A的ISN到本地,命名B的ACK序列号
- B发送同步信号SYN+B的初始序列号
- A确认收到B的同步信号,并记录B的ISN到本地,命名A的ACK序列号
显然,并不需要四个步骤,2和3和可以合并,提高连接的速度和效率。
TCP协议需考虑到可靠性和传输效率,明白了这一点,我们也就明白了为什么只能是三次握手,而不是两次或者四次了。
相关文章
- 直接在代码里面对list集合进行分页
- .NET Framework 4.5新特性详解
- 大数据的简要介绍
- 大数据的由来
- 高斯混合模型的自然梯度变量推理
- timing-wheel 仿Kafka实现的时间轮算法
- 使用Navicat软件连接自建数据库(Linux系统)
- 那一天,我被Redis主从架构支配的恐惧
- Redis 深入了解键的过期时间
- C#使用委托调用实现用户端等待闪屏
- 基于流计算 Oceanus 和 Elasticsearch Service 构建百亿级实时监控系统
- GRAND | 转录调控网络预测数据库
- JFreeChart API中文文档
- 临床相关突变查询数据库
- TIGER | 人类胰岛基因变化查询数据库
- 视频边缘计算网关EasyNVR在视频整体监控解决方案中的应用分析
- Apache Arrow - 大数据在数据湖后的下一个风向标
- 常见的电商数据指标体系
- AKShare-艺人数据-艺人流量价值
- MySQL中多表联合查询与子查询的这些区别,你可能不知道!