一文读懂TCP的三次握手(详细图解)

在学习TCP三次握手的过程前,首先熟悉几个缩写简称:

TCB

传输控制块,打开后服务器/客户端进入监听(LISTEN)状态

SYNTCP报文标志位,该位为1时表示发起一个新连接
ACKTCP报文标志位,该位为1时,确认序号有效,确认接收到消息。TCP规定,在连接建立后所有报文的传输都必须把ACK1
seqsequence number,报文初始序列号,代表发送的第一个字节的序号
ackacknowledgement number,报文确认序号,代表希望收到的下一个数据的第一个字节的序号

熟悉上面几个标志位和序列号含义后,下面来看TCP的三次握手过程:

先上几个帮助理解的点:

不管请求还是应答,都是带两种数据:请求号SYN/应答号ACK + 数据包报文号;

请求时要发请求号SYN,应答时要发送应答号ACK;在数据包传送时,发送方要发送当前数据包报文号seq和确认收到上一个数据包的确认报文号ack

下面结合示意图来理解三次握手过程:

前期:

TCP服务器创建传输控制块TCB,进入监听LISTEN状态,准备接收请求。

第一次握手:客户端——请求(发送请求SYN+数据包当前序列号seq,无需应答)

客户端创建传输控制块TCB,进入监听LISTEN状态。
设置SYN=1,表示这是握手报文,并发送给服务器
设置发送的数据包序列号seq=x
此时客户端处于同步已发送SYN-SENT
状态

第二次握手:服务器——确认(发送应答ACK+请求SYN+确认收到上一个数据包的确认号ack+ 当前数据包序列号seq)

设置ACK=1,表示确认应答。
设置
ack=x+1,表示已收到客户端x之前的数据,希望下次数据从x+1开始
设置SYN=1
,表示握手报文,并发送给客户端
设置发送的数据包序列号seq=y
此时服务器处于同步已接收SYN-RCVD
状态

第三次握手:客户端——确认服务器的确认(发送应答ACK+确认收到上一个数据包的确认号ack+ 当前数据包序列号seq ,连接已建立,无需请求)

设置ACK=1,表示确认应答。
设置
ack=y+1,表示收到服务器发来的序列号为seq=y的数据包,希望下次数据从y+1开始
设置seq=x+1
,表示接着上一个数据包seq=x继续发送
至此三次握手结束,连接建立

为什么要使用三次握手机制?

1.为了阻止历史连接

若网络状况不好的时候,客户端发送的SYN信号未能及时传输给服务器。当网络恢复时已经失效的SYN信号又到达服务器。如果只有两次握手便可建立连接,那么此时客户端就不知道这个连接是不是已经失效了的历史连接,从而导致错误的发生。三次握手时,客户端便可以根据上下文来判断此次连接是否为历史连接,避免错误的发生。

2. 为了避免服务器开启无用连接增加服务器开销

客户端设置了一个超时时间,超过了就重新发送一个TCP连接请求。如果没有第三次握手的话,服务端是不知道客户端是否收到服务返回的信息的,这样没有给服务器端一个创建还是关闭连接端口的请求,服务器端的端口就一直开着,等到客户端因超时重新发出请求时,服务器就会重新开启一个端口连接。那么服务器端上没有接收到请求数据的上一个端口就一直开着,长此以往,这样的端口多了,就会造成服务器端开销的严重浪费。

### TCP 三次握手过程解释 TCP三次握手机制用于建立可靠的连接,确保通信双方能够同步并确认彼此的数据传输能力。具体来说: #### 握手的第一步 客户端向服务器发送一个带有 SYN (Synchronize Sequence Numbers) 标志位设置为 1 的数据包,此数据包中还包含了初始序列号 ISN (Initial Sequence Number),该序列号由客户端随机生成[^2]。 ```plaintext Client Server | | --->| SYN=1, Seq=x | | | ``` #### 握手的第二步 收到这个请求后,服务端会回应一个包含两个标志位的数据包:ACK (Acknowledgment) 和 SYN。其中 ACK 字段表示对上一步接收方所发出报文序号的认可;而新的 SYN 则用来告知对方自己也准备好开始对话,并附带另一个随机产生的初始序列号 y。 ```plaintext Client Server | | <---------------|--- ACK=1, Seq=y, Ack=x+1 | | | ``` #### 握手的第三步 最后,客户机再次回传给服务器一个仅设置了 ACK 标记的数据包,其目的是为了验证它已经成功收到了来自服务器的确立消息,并且同意使用之前协商好的参数进行后续交互。此时,整个三阶段握手完成,正式建立起一条双向通讯信道。 ```plaintext Client Server | | --->| ACK=1, Seq=x+1, Ack=y+1 | | | ``` 一旦完成了这三次交换之后,两端就可以安全可靠地互相传递信息了。这种机制不仅有助于防止重复连接的发生,同时也提供了必要的错误检测功能来保障网络层面上的服务质量。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值