在日常的开发中,发送异步请求是经常会做的事情,它通常是一个http请求,而这个http请求是通过一个TCP通道来在服务器和客户端之间传递,因此TCP通道的建立是进行通信的前提条件,这篇文章就准备好好聊聊关于 TCP通道建立 的过程,也就是所谓的“三次握手”,废话不多说,开搞!
何为TCP
要想搞清楚“三次握手”,首先我们需要先知道TCP(Transmission Control Protocol)为何物,它是一种面向连接的、可靠的、基于字节流的传输层通信协议,它是为了在 不可靠的 互联网络上提供 可靠的端到端字节流 而专门设计的一个传输协议。互联网络与单个网络有很大的不同,因为互联网络的不同部分可能有截然不同的拓扑结构、带宽、延迟、数据包大小和其他参数,TCP的设计目标是能够动态地适应互联网络的这些特性,而且具备面对各种故障时的健壮性
由于它需要提供一个可靠的连接,因此肯定就需要做额外的工作来达到这个目的,这也就引出了本文的主题(三次握手),接下来就详细聊聊这个过程是如何进行的
详解三次握手的过程
三次握手的根本目的其实就是让客户端和服务端双方都能确认对方的 发送和接收 能力是正常的,理解了这个根本目的,就能明白它为什么这么设计,下面先引用一张网上的图
整个过程分为五步
- 第一步,客户端和服务器端都处于 CLOSE 状态,此时客户端主动打开连接,服务端被动打开连接,服务端状态变为 LISTEN
- 第二步,客户端会随机初始化一个 序号(client_isn),将这个序号置于TCP首部的 序号 字段,同时将 SYN标志 置为1,表明是一个SYN报文,然后将这个SYN报文发送给服务端,此时客户端状态变为 SYN_SENT
- 第三步,服务端接收到客户端发送的SYN报文后,此为第一次握手,服务端会随机初始化自己的 序号(server_isn),然后将其放置到TCP首部的 序号 字段,同时将 client_isn + 1 放置到TCP首部的 确认应答号 字段,然后将SYN和ACK字段都置为1,最后将此报文发送给客户端,此时服务端的状态变为 SYN_RCVD
- 第四步,客户端接收到服务端的报文后,此为第二次握手,客户端此时还要向服务端最后发送一个确认应答报文,首先将TCP首部的ACK字段置为1,然后将确认应答号字段置为 server_isn+1,最后再发送给服务端,此时客户端状态为 ESTABLISHED
- 第五步,服务端接收到客户端发送的应答报文后,此为第三次握手,状态也变为 ESTABLISHED,至此客户端与服务端就可以正式开始通信了
通过对上述步骤的分析,我们可以知道第一次握手时可以让服务端知道客户端的 发送能力 是正常的,第二次握手可以让客户端知道服务端的 发送和接收能力 是正常的,第三次握手可以让服务端知道客户端的 接收能力 是正常的,至此就可以让通信双方确认了对方的发送和接收能力都正常,然后就可以进行可靠的通信了
结语
TCP的建立需要三次握手,但是销毁却需要四次挥手,为什么不一样呢,请听下回分解~