TCP 为什么需要三次握手?

TCP 协议是我们每天都在使用的一个网络通讯协议,因为绝大部分的网络连接都是建立在 TCP 协议上的,比如你此刻正在看的这篇文章是建立在 HTTP(Hypertext Transfer Protocol,超文本传送协议) 应用层协议的基础上的,而 HTTP 协议的“底层”则是建立在 TCP 的传输层协议上的 。因此可以理解为,你之所以能看到本篇文章就是得益于 TCP 协议的功劳 。
我们本课时讲的是,说一下 TCP 三次握手的执行流程,以及为什么需要三次握手?
典型回答
在回答这个问题之前,首先我们需要搞清楚两个概念,第一,什么是 TCP?第二,什么是 TCP 连接?只有搞明白了这两个问题,我们才能彻底搞懂为什么 TCP 需要三次握手?
什么是 TCP?
首先来说 TCP(Transmission Control Protocol,传输控制协议)是一个面向连接的、可靠的、基于字节流的传输层协议 。从它的概念中我们可以看出 TCP 的三个特点:面向连接、可靠性和面向字节流 。

TCP 为什么需要三次握手?

文章插图
 
TCP 的特点
面向连接:是指 TCP 是面向客户端和服务器端连接的通讯协议,使用它可以将客户端和服务器端进行连接 。
可靠性:是指无论网络环境多差,TCP 都可以保证信息一定能够传递到接收端 。
TCP 之所以可以保证可靠性主要得益于两个方面,一个是“状态性”,另一个是“可控制性” 。所谓状态性是指 TCP 会记录信息的发送状态,例如,哪些数据收到了、哪些数据没收到等状态信息都会被记录;可控制性是指 TCP 会根据状态情况控制自己的行为,比如当 TCP 意识到丢包了就会控制重发此包,这样就实现了 TCP 的可靠性 。
面向字节流:是指 TCP 是以字节流的方式进行数据传输的 。
RFC 793 对 TCP 连接的定义如下:
 
Connections: The reliability and flow control mechanisms described above require that TCPs initialize and maintain certain status information for each data stream. The combination of this information, including sockets, sequence numbers, and window sizes, is called a connection.
 
小贴士: TCP 之所以被广泛应用,首先是因为它是一个标准化的协议,TCP 的标准协议就是由 RFC 793 定义的,它已经有了 30 多年的历史,并且已经被多次更新 。RFC(Request For Comments)是 IETF(Inte.NET Engineering Task Force)的正式文档 。IETF 是一家制定互联网标准的组织,它制定了 Internet(互联网)的整体协议体系,凡是经过 IETF 评审认可的标准都会被发布为带编号的 RFC 的文档 。
TCP 定义的大致意思是,用于保证可靠性和流控制机制的信息,包括 Socket、序列号及窗口大小被称为连接 。
其中,Socket 是由 IP 地址加端口号组成的,序列号是用来解决乱序问题的,而窗口大小则是用来做流量控制的 。
TCP 三次握手的执行流程
接下来我们来看 TCP 三次握手的执行流程,如下图所示:
TCP 为什么需要三次握手?

文章插图
 
关键字说明:
 
  • SYN(SYNchronize Sequence Numbers),同步序列编号;
  • ACK(Acknowledge Character),确认字符;
  • SEQ(Sequence Number),序列号 。
 
TCP 的执行流程如下:
 
  • 最开始时客户端和服务端都处于 CLOSED 状态,然后服务端先主动监听某个端口,此时服务器端就变成了 LISTEN(监听)状态;
  • 然后客户端主动发起连接,发送 SYN(同步序列编号),此时客户端就变成了 SYN-SENT 状态;
  • 服务端接收到信息之后返回 SYN 和 ACK 至客户端,此时服务器端就变成了 SYN-REVD 状态;
 
客户端接收到消息之后,再发送 ACK 至服务器端,此时客户端就变成了 ESTABLISHED(已确认)状态,服务端收到 ACK 之后,也变成了 ESTABLISHED 状态,此时连接工作就执行完了 。
为什么 TCP 需要三次握手?
了解了以上 TCP 的基础概念之后,我们再来看一下 TCP 为什么需要三次握手?
原因一:防止重复连接
首先来说 RFC 793 - Transmission Control Protocol 其实就指出了三次握手的主要原因,它的描述如下:
 
The principle reason for the three-way handshake is to prevent old duplicate connection initiations from causing confusion.
 
翻译为中文的意思是,三次握手的主要原因是为了防止旧的重复连接引起连接混乱问题 。


推荐阅读