TCP三次握手详解

        关于TCP的三次握手,分为个步骤。

下图是抓包工具显示出来的,方便理解。

1.(见第一行)客户端发送数据包给服务器,此时状态为【SYN】,相当于是客户端给服务器打招呼,SYN只有在双方初次打招呼时才会出现。

2.(见第二行)服务器收到客户端发来的数据包,服务器给客户端回一个数据包,此时状态为【SYN】【ACK】,这里的SYN表示的是第一次服务器与客户端打招呼,ACK是确认的意思,表示收到上一次请求,意思是我已经收到了你的第一次打招呼,所以有这个状态。

3.(见第三行)客户端收到服务器发来得数据包,并再次发数据包给服务器表示收到你的回复,此时状态为【ACK】,这里没有SYN,因为双方已经打过一次招呼了,故此时这有ACK这个状态。这里为止TCP三次握手就结束了。

第一步骤的seq=0表示源端序列号为0,第二步骤的seq=0,ack=1表示目标端的序列号也为0,ack为1是从第一步骤的seq+1得来的,它确认的是第一步骤的seq=0收到,还有就是表示下一次发过来的序列号是1.第三步骤的seq为1,ack=1,它是表示确认收到第二步骤。由第二步骤的seq+1得来。

 

 

TCP(传输控制协议)的三次握手是建立可靠连接的关键机制,其核心目的是确保通信双方能够确认彼此的发送和接收能力,并协商初始序列号以避免数据混乱。以下是详细的三次握手过程: ### 第一次握手 客户端向服务器发送一个 **SYN**(同步序列编号)标志位为 1 的 TCP 报文段,表示请求建立连接。该报文段中包含一个随机生成的初始序列号(Sequence Number),记作 `ISN (Initial Sequence Number)`,用于后续的数据传输排序[^1]。此时客户端进入 **SYN_SENT** 状态。 例如: ```plaintext Client -> Server: SYN=1, seq=x ``` ### 第二次握手 服务器收到客户端的 **SYN** 报文后,会回应一个 **SYN-ACK** 报文,即 **SYN** 和 **ACK**(确认应答)标志位均为 1。该报文包含两个关键字段: - 服务器自己的初始序列号 `seq=y` - 对客户端序列号的确认值 `ack=x+1` 这一步表明服务器已经准备好与客户端通信,并确认了客户端的发送能力和自身的接收能力[^2]。此时服务器进入 **SYN_RCVD** 状态。 例如: ```plaintext Server -> Client: SYN=1, ACK=1, seq=y, ack=x+1 ``` ### 第三次握手 客户端收到服务器的 **SYN-ACK** 报文后,会发送一个 **ACK** 标志位为 1 的确认报文,其中包含对服务器序列号的确认值 `ack=y+1`。这个报文到达服务器后,双方都确认了彼此的发送和接收能力,连接正式建立[^3]。 例如: ```plaintext Client -> Server: ACK=1, ack=y+1 ``` ### 握手的必要性 三次握手的主要目的是解决以下问题: - **网络延迟导致的重复分组问题**:若使用两次握手,可能会因网络延迟导致旧的连接请求突然传送到服务器,造成资源浪费或错误[^4]。 - **确认双向通信能力**:通过三次交互,客户端和服务器都能确认对方具备发送和接收数据的能力。 - **协商初始序列号**:防止历史数据包干扰新连接,避免数据错乱。 ### 为什么不能是两次握手? 如果仅使用两次握手,在第二次握手服务器认为连接已建立,但客户端可能未收到确认报文(如因网络丢包)。此时服务器开始发送数据,而客户端仍在等待确认,从而可能导致死锁现象[^4]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值