TCP为什么要三次握手(三次数据传输)而不是两次?TCP为什么要释放连接?

本文深入解析TCP协议的三次握手过程,包括建立连接的三个阶段:第一次握手请求序列号同步,第二次握手确认序列号,第三次握手完成连接建立。阐述了三次握手而非两次的原因,以及其在防止历史连接干扰和确保数据可靠传输方面的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • TCP的运输连接

    TCP的运输连接是有三个阶段:建立连接、数据传送和连接释放。
 

  • TCP的连接过程

 假设A就是客户程序,B就是TCP服务器程序

第一次握手:A的TCP客户端给服务器端TCP会发送一个特殊的TCP数据段,其是不包含应用层数据的,单它需要一个数据段头部的一个标记字段,SYN=1(该信号是指请求和服务器端计算机的序号同步),并会发送一个初始顺序号。

第二次握手:B收到A的连接请求报文后,如果同意就会向A回复确认信息。SYN依旧为1,此事确认信息seq+1(意思应该是我收到了,我确认了你的初始序号),并且发送自己的序列号seq=y(sever_isn)。这时也是不允许携带应用层数据的。(虽然被授予连接了,但是没有获得服务器的允许连接分配缓冲区和变量)

第三次握手:A收到B的回复,允许连接数据后发送回复确认ACK置1,ack=y+1,自己为seq=x+1(不携带信息,不消耗序列号,自己本身不用确认,序列号不变)。客服也会给连接分配缓冲区合和变量,其次因为连接已经建立,所以SYN=0。

TCP为什么要三次握手(三次数据传输)而不是两次?

答:第一次,第二次握手只是告知对方的序列号初始值,但是没有实现客服和服务器都给连接分配缓冲区和变量,并不会传输数据。如果只是两次握手,只有发起方的其实序列号被确认,而服务器端的序列号得不到确认,只有服务器的缓冲区和变量分配给连接,客户机没有分配,无法进行数据传送。目的就是为了防止失效的连接请求报文段突然又传送到B,产生错误。为了实现序列号同步,实现有效可靠的数据传输。

在TCP协议中,三次握手是必要的,而不能用两次握手来建立连接。这是因为两次握手无法解决以下问题:

1. 确认双方都能接收数据:两次握手只能确定客户端和服务器之间的连接是单向的,即客户端可以向服务器发送数据,但服务器无法向客户端发送数据。如果在第一次握手时服务器没有收到客户端的SYN数据包,则无法确认客户端的状态,也就无法确定连接是否建立成功。

2. 避免历史连接的干扰:两次握手无法防止历史连接的干扰。假设在客户端向服务器发送SYN数据包后,由于网络延迟或其他原因,数据包被延迟了一段时间。此时,客户端可能已经关闭了连接,但服务器仍然会认为该连接处于打开状态,并尝试向客户端发送数据,从而导致错误和混乱。

通过三次握手,TCP协议可以解决上述问题,并确保连接的可靠性和稳定性。因此,不能用两次握手来代替三次握手。

三次握手(三次数据传输)?(源于计算机网络书籍)

TCP为什么要释放连接?

答:假设不释放连接的话,若A向B发送的某个丢失分组又回传到B(之前发送因为网络原因或其他原因丢失,B没有收到),B就会认为传输没有结束,会继续等待A的后续分组到来,这会导致过期的连接再次回传到服务器,但是A认为传输已经结束了(它的实际需要发送的数据已经全部发送),对B的载答确认不知道如何回应,就会导致服务器一直超时重传(超时重传是TCP协议保证数据可靠性的另一个重要机制,其原理是在发送某一个数据以后就开启一个计时器,在一定时间内如果没有得到发送的数据报的ACK报文,那么就重新发送数据,直到发送成功为止),那么服务器会一直发送ACK报文。

### TCP 三次握手的工作原理 TCP三次握手机制是为了建立可靠的通信连接而设计的一种协议机制。以下是其工作原理: 1. **第一次握手** 客户端向服务器发送一个 SYN(Synchronize Sequence Numbers)数据包,表示希望与服务器建立连接并同步序列号。此时,SYN 数据包中的 `seq` 字段会被设置为随机值 \(X\)【^1】。 2. **第二次握手** 服务器接收到客户端的 SYN 请求后,回复一个 SYN+ACK 数据包。其中,SYN 表示同意建立连接,ACK 是对客户端请求的确认。服务器会在 ACK 中携带客户端初始序列号加一 (\(X+1\)) 的值作为确认响应,同时也会提供自己的初始序列号 \(Y\)【^2】。 3. **第三次握手** 客户端再次发送一个 ACK 数据包给服务器,确认已经接收到来自服务器的 SYN 和 ACK 响应,并将服务器的初始序列号加一 (\(Y+1\)) 返回给服务器。至此,双方都完成了对方的初始化确认,从而建立了可靠的数据传输通道【^3】。 --- ### 使用三次握手的原因对比两次握手 如果仅使用两次握手,则可能会因为网络延迟或其他异常情况而导致旧有的、失效的连接请求重新到达目标主机,进而引发不必要的资源分配或安全风险。具体来说: - 如果只有两次握手,在某些情况下,当某个连接被中断之后,残留的连接请求可能仍然在网络中游荡。一旦这些过期的消息最终抵达目的地,就可能导致服务端误以为有新的合法连接需求,从而浪费计算资源或者暴露潜在漏洞【^2】。 - 而通过增加一次额外的手动验证环节——即第三步由客户端主动发起最后一步确认动作,可以有效避免上述问题的发生。这使得即使存在陈旧消息干扰的情况下,也能确保当前正在进行的是真实有效的交互过程【^3】。 因此,尽管相比起两阶段方法而言稍显复杂一些,但从稳定性和安全性角度来看,三阶段协商无疑更加优越合理。 ```python # Python模拟TCP三次握手逻辑示意代码 class TCPSession: def __init__(self, client_seq=0, server_seq=0): self.client_seq = client_seq self.server_seq = server_seq def start_handshake(self): # Client sends SYN to Server (First Handshake) syn_packet_client_to_server = {'type': 'SYN', 'seq': self.client_seq} # Server receives SYN and replies with SYN+ACK (Second Handshake) ack_value_for_client = syn_packet_client_to_server['seq'] + 1 new_server_seq = random.randint(1000,9999) # Simulate a random sequence number from the server side. syn_ack_packet_server_to_client = { 'type':'SYN_ACK', 'ack': ack_value_for_client, 'seq':new_server_seq } # Client acknowledges receipt of SYN+ACK by sending an ACK back (Third Handshake). final_ack_from_client={'type':'ACK','ack':syn_ack_packet_server_to_client['seq']+1} return f"Handshake completed successfully! Final Acknowledgement Value Sent Back To Server Is {final_ack_from_client['ack']}" session = TCPSession() print(session.start_handshake()) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值