TCP协议为什么要三次握手而不是两次?

TCP协议在建立连接时采用三次握手确保连接可靠性。本文介绍了TCP协议的三次握手过程,详细解释了为什么需要三次握手而非两次,并探讨了第三次握手失败的处理方式,以及TCP协议的四次分手过程,帮助理解TCP连接的生命周期。

TCP协议简介

TCP协议是五层协议中运输层的协议,下面依赖网络层、链路层、物理层,对于一个报文想发到另一台机器(假设是服务器)上对等层,每一个所依赖的层都会对报文进行包装,例如TCP协议就依赖网络层的IP协议,所以发送的报文会经过如下封装:

当这个数据包到达服务器时,服务器的网络层会对IP相关协议内容解封装、校验,然后运输层对TCP层进行解封,解封涉及到一系列的步骤,例如这个数据包是要干嘛?是发给我的吗?这些操作需要根据TCP报文的首部信息来判断,首部包含以下内容:

主要通过首部信息来了解这个包是干嘛的,关于首部信息,这儿需要用到的几个如下:

ACK : TCP协议规定,只有ACK=1时有效,也规定连接建立后所有发送的报文的ACK必须为1

SYN(SYNchronization) : 在连接建立时用来同步序号。当SYN=1而ACK=0时,表明这是一个连接请求报文。对方若同意建立连接,则应在响应报文中使SYN=1和ACK=1. 因此, SYN置1就表示这是一个连接请求或连接接受报文。

FIN (finis)即完,终结的意思, 用来释放一个连接。当 FIN = 1 时,表明此报文段的发送方的数据已经发送完毕,并要求释放连接。

注意:URG、ACK、PSH、PST、RST、SYN、FIN只有一位,也就是只有0或者1两种状态。

TCP协议三次握手

下面这张图不是本人画的,如果作者看到可以联系我为图片设置您博文的外连接。

第一次握手,客户端先向服务端发送一个请求连接的报文段,这个报文段SYN位设置为1,序列号Seq(Sequence Number)设置为某一值,假设为X,发送出去之后客户端进入SYN_SEND状态,等待服务器的确认;

第二次握手:服务器收到SYN报文段。服务器收到客户端的SYN报文段,需要对这个SYN报文段进行确认,设置Acknowledgment Number为x+1(Sequence Number+1);同时,自己自己还要发送SYN请求信息,将SYN位置为1,Sequence Number

### 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、付费专栏及课程。

余额充值