浅谈 TCP 为什么不是二次握手

本文围绕客户端与服务器建立连接展开,介绍了序列号、确认号等概念。以找朋友开黑为例说明三次握手过程,探讨为何不能用两次握手。指出若用两次握手,可能因失效请求使服务端误建连接,浪费资源,而三次握手可避免此情况。

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

序列号seq: 用来标记数据段的顺序
确认号ack: 期待收到对方下一个报文段的第一个数据字节的序号;
确认ACK: 仅当ACK=1时,确认号字段才有效。ACK=0时,确认号无效
同步SYN: 连接建立时用于同步序号。

客户端与服务器之间的建立连接:

在这里插入图片描述
举个简单的例子

你要找你朋友开黑,首先要他:“开不开黑?"
然后他接收到你的消息后了你句:“来啊”
最后你接收到他的消息后立马复了句:“上号!”,以表示握手成功。

到正题了

TCP 握手为什么需要三次呢,如果把最后一次的去掉改为两次握手是否可行呢?

假如客户端向服务端进行握手,进行第一次请求时,可能会遇到网络信号差或者服务器负载过多,导致这个握手请求没有立即达到服务端这就形成了一个失效的握手连接,但是服务端接收到失效的请求报文就会误认为是客户端又发了一次连接请求,服务端就会进行第二次握手。

如果说TCP握手是两次的话,只要服务端确认消息就算建立连接了,这是不可靠的。

假如现在客户端并没有发出建立连接的请求,之前发过的这个请求是失效的请求,一切都是服务端在自相情愿,因此客户端是不会理睬服务端的确认信息,也不会向服务端发送确认的请求,但是服务器却认为新的连接已经建立起来了,并一直等待客户端发来数据,这样的情况下,服务端的很多资源就没白白浪费掉了。

总结

TCP 采用三次握手的办法就是为了防止上述这种情况的发生,比如客户端不会向服务端发出确认的请求,服务端会因为收不到确认的报文,就知道客户端并没有要建立连接,那么服务端也就不会去建立连接,这就是三次握手的作用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值