TCP 为什么是三次握手?不是两次、四次?

 

 “ 问烂的面试题,你真的能回答对吗?

TCP 协议为什么握手是 三 次,不是两次也不是四次?下面请你带着这个问题,阅读这篇文章。

定义

首先看定义:

TCP(Transport Control Protocol)是一个面向连接的、可靠的、基于字节流的传输层协议,提供 Host-To-Host 数据的可靠传输,支持全双工,是一个连接导向的协议。

 

定义就这么一句话,可能我写这里大家觉得和这个题目都没啥关系,书上到处都是这句话,但是这个定义牵扯到很多概念都需要我们了解: Host-To-Host 、连接、会话、双工/单工及可靠性。我们先介绍一下这些概念。

 

Host-To-Host:

这里的Host是一个抽象的概念,可以是手机、平板、电视等。收发数据的设备都是Host,所以双方是平等的

应用层自定义协议:

TCP 协议往上是应用到应用(Application-To-Application)的协议,也就是用户层协议,一般我们提供dll接口就会自己维护一套用户层协议,比如登录、下单、撤单、买入、卖出等对应的协议。每一个应用的用户层协议是不一样的,比如微信和淘宝,他们都属于TCP之上的应用层协议,都是独特自定义的。

    连接:

连接是指在网络中两个或多个设备之间建立的通信路径。它是一个物理或逻辑的通信通道,允许数据在两个网络实体之间传输

设计上,连接是一种传输数据的行为。传输之前,建立一个连接。具体来说,数据收发双方的内存中都建立一个用于维护数据传输状态的对象,比如双方 IP 和端口是多少?现在发送了多少数据了?状态健康吗?传输速度如何?等。

 

连接是网络行为状态的记录。

连接是传输层的概念

会话
会话是指在两个网络实体之间进行的一系列交互。它通常是在一个连接上发生的一系列数据交换。
例如微信聊天,你要和女朋友聊天,你们创建一个聊天窗口,这个就是会话。你打字发送,开始传输数据,你和微信服务器间建立一个连接。如果你们聊一段时间不聊了,但是这个聊天窗口没删除,此时连接可能断开,但是会话还在。
会话是应用层的概念
双工/单工问题
在任何一个时刻,如果数据只能单向发送,就是单工,所以单工需要至少一条线路。
如果在某个时刻数据可以向一个方向传输,也可以向另一个方向反方向传输,而且交替进行,叫做半双工。半双工需要至少 1 条线路。如果任何时刻数据都可以双向收发,这就是全双工
TCP 是一个全双工协议,数据任何时候都可以双向传输。这就意味着客户端和服务端可以平等地发送、接收信息。正因为如此,客户端和服务端在 TCP 协议中有一个平等的名词 Host-To-Host

 

对于这些涉及到的概念有了基本了解,下面我们先看看为什么不能是二次握手?

为什么不是二次握手?

为什么不能是二次握手?

第一:为了防止无用连接的建立

 

如果是两次握手,那么在客户端发送SYN之后,服务端收到SYN之后回复了ACK后,服务端连接的状态就要变为Esatblished。如果由于某些原因(网络或者程序崩溃等)客户端没有收到ACK,那么这个连接会一直在服务端,是一个无用的连接,浪费了资源。

 

 

 

而且,如果客户端因为网络延迟收不到ACK,一直重发SYN,服务端每收到一个SYN就只能先主动建立一个连接,将会造成很多重复的无效的连接。

 

 

 

第二:过滤历史连接

假设现在客户端第一次发了seq = 10,然后客户端就发生了崩溃,然后客户端重启再次申请连接发了seq = 20;

这个时候网络中存在旧的和新的两个SYN

如果旧的SYN先到服务端,新的SYN后到服务端会发生什么情况呢?

 

 

 

第一步:服务端收到seq= 10 回复ack = 11此时服务端就可以给这个连接发送数据了,但是发送的数据客户端是收不到的。

第二步:客户端收到11,发现不是自己想要的21,回复RST

第三步:服务端收到RST,把刚建立的连接终止

这个连接就是属于历史连接,是无效的,三次握手就可以过滤掉这种无效的历史连接。

为什么三次握手可以过滤掉而二次握手不行呢?

 

因为在两次握手的情况下,服务端在收到 SYN 报文发送ACK后,就进入 ESTABLISHED 状态,服务端没有中间状态给客户端来阻止历史连接,导致服务端可能建立一个历史连接,造成资源浪费。

 

 

第三:需要同步初始序列号

 

三次握手过程使双方能够同步初始序列号。客户端发送SYN时包含一个初始序列号,服务端回复时会在SYN-ACK中确认这个序列号,并附带自己的初始序列号,客户端的最终ACK则确认了服务端的序列号。这一步是确保数据传输有序和完整性的基础。

 

 

为什么不是四次

为什么不能是四次握手?

 

上面我们提到过TCP是全双工通信,其实本质上全双工通信是需要4次握手的,不过由于第2次和第3次可以合并成一次,所以就成了三次握手。上面的图也回答了这个问题。

留个思考题:为什么断开连接的时候不能是三次必须是四次? 

原创文章,作者:速盾高防cdn,如若转载,请注明出处:https://www.sudun.com/ask/78013.html

(0)
速盾高防cdn's avatar速盾高防cdn
上一篇 2024年5月28日 下午5:44
下一篇 2024年5月28日 下午6:00

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注