Cosen95 / fe_interview

字节、阿里、美团、滴滴、腾讯等大厂高级前端面试题整理
238 stars 25 forks source link

讲一下TCP三次握手、四次挥手过程及原理 #126

Open Cosen95 opened 3 years ago

Cosen95 commented 3 years ago

什么是TCP

TCP 提供面向有连接的通信传输,面向有连接是指在传送数据之前必须先建立连接,数据传送完成后要释放连接。

无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。

同时由于TCP协议是一种面向连接的、可靠的、基于字节流的运输层通信协议,TCP全双工模式,所以需要四次挥手关闭连接。

TCP 包头格式

图片来源网络

TCP首部承载这TCP协议需要的各项信息,下面我们来分析一下:

TCP的连接是需要四个要素确定唯一一个连接:(源IP,源端口号)+ (目的IP,目的端口号)

所以TCP首部预留了两个 16 位作为端口号的存储,而IP地址由上一层IP协议负责传递。

源端口号和目地端口各占 16 位两个字节,也就是端口的范围是2^16=65535

TCP 三次握手和四次挥手

三次握手

图片来源网络

注意:我们上面写的 ack 和 ACK,不是同一个概念:

四次挥手

为什么连接的时候是三次握手,关闭的时候却是四次握手?

建立连接时因为当 Server 端收到 Client 端的 SYN 连接请求报文后,可以直接发送 SYN+ACK 报文。其中 ACK 报文是用来应答的,SYN 报文是用来同步的。所以建立连接只需要三次握手。

由于 TCP 协议是一种面向连接的、可靠的、基于字节流的运输层通信协议,TCP全双工模式

这就意味着,关闭连接时,当 Client 端发出 FIN 报文段时,只是表示 Client 端告诉 Server 端数据已经发送完毕了。当 Server 端收到 FIN 报文并返回 ACK 报文段,表示它已经知道 Client 端没有数据发送了,但是 Server 端还是可以发送数据到 Client 端的,所以 Server 很可能并不会立即关闭 SOCKET,直到 Server 端把数据也发送完毕。

Server 端也发送了 FIN 报文段时,这个时候就表示 Server 端也没有数据要发送了,就会告诉 Client 端,我也没有数据要发送了,之后彼此就会愉快的中断这次 TCP 连接。