为什么要使用三次握手

首先,tcp是可靠传输协议,需要三次握手建立连接服务。

三次握手的目的是“为了防止已经失效的连接请求报文段突然又传到服务端,因而产生错误”,这种情况是:client端发出了一个连接请求报文,而是因为某些未知的原因在某个网络节点上发生延迟、滞留,导致延迟到连接释放以后的某个时间才到达server端。本来这是一个早已失效的报文段,但是server收到此失效的报文之后,会误认为是client再次发出的一个新的连接请求,于是server端就向client又发出确认报文,表示同意建立连接。如果不采用“三次握手”,那么只要server端发出确认报文就会认为新的连接已经建立了,但是client端此时并没有发出建立连接的请求,因此不会去向server端发送数据,server端没有收到数据就会一直等待,产生死锁现象,这样server端就会白白浪费掉很多资源。如果采用“三次握手”的话就不会出现这种情况,client端首先发出连接请求并进入等待状态,server接收连接请求后同意建立连接,并向client返回报文段表示已经建立连接server进入SYN_RECV状态,client接收到server发出的确认信息后自己再发出确认信息,然后就可以建立直接通信。所以说只有三次握手在逻辑上才是最合适的,可以保障可靠性。

三次握手的最主要目的是保证连接是双工的,可靠更多的是通过重传机制来保证的。

### 三次握手的作用及原因分析 #### 作用 三次握手的主要目的是为了在客户端和服务器之间建立一个可靠的连接,确保双方都能够正常收发数据。通过这一过程,可以实现以下几个目标: 1. **确认双方的接收能力和发送能力** 客户端向服务器发起 SYN 请求时,表明自己希望与服务器建立连接并告知自己的初始序列号;服务器接收到该请求后返回 ACK 和 SYN 响应,表示已准备好接受来自客户端的数据,并告知自身的初始序列号;最后,客户端再次发送 ACK 确认消息给服务器,从而完成整个连接的初始化[^1]。 2. **同步序列号** 在 TCP 协议中,每次传输都需要依赖于唯一的序列号来标记每一个字节的位置以便后续校验以及重组分片包。因此,在正式交换应用层信息之前,必须先协商好彼此使用的起始序号值[^2]。 3. **防止历史连接干扰当前新创建的会话** 如果只采用两次握手,则可能存在旧有的重复报文被误认为新的有效连接而导致资源浪费或者错误行为发生的情况。而增加第三次握手就可以避免这种情况的发生[^3]。 #### 原因分析 以下是关于为何需要三次而不是其他次数握手机制的一些具体理由: 1. **为什么不是二次握手?** 若仅执行两步操作即可达成目的的话,那么就有可能会出现如下问题:假如某个终端 A 发出了建链请求但由于某些特殊状况未能及时得到回应进而超时重传这条指令,此时如果 B 收到了第一次尝试却未回复而是等待第二次到达后再做处理的话,就会造成不必要的延迟甚至失败风险增大。另外还有可能出现假连现象——即原本已经失效的老链接残余信号重新激活了一个全新的真实交互流程[^4]。 2. **为什么不简化成单次或更多次呢?** 对于前者而言显然效率太低无法满足实际需求;至于后者则完全没有必要因为经过实验证明目前这种设计既简单又高效同时还具备足够的鲁棒性和安全性足以应对绝大多数场景下的挑战[^5]。 ```python def tcp_three_way_handshake(): """ Simulate the process of a three-way handshake between client and server. """ # Client sends SYN to Server syn_sent = True # Server receives SYN, responds with SYN-ACK if syn_sent: syn_ack_received = True # Client acknowledges receipt by sending final ACK back to Server if syn_ack_received: connection_established = True return connection_established ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值