tcp的3次握手 4次挥手

首先我们来看耳熟能详的『三次握手』,这基本上是 TCP 的代名词了,无论懂不懂具体原理的人,提到 TCP,基本上都是知道『三次握手』的。
而本身,TCP 的三次握手就是为了确保通讯双方能够稳定的建立连接并完成数据报文的请求与响应动作,至于为什么是三次握手而不是四次五次,这是一个哲学问题,这里就不做讨论了。
第一步:
客户端向服务端发送一份特殊的 TCP 报文,该报文并不包含应用层的数据,是一份特殊的报文,它的 TCP 首部中 SYN 字段值为 1 (参见上述报文格式)。
除此之外,客户端还会随机生成一个初始序号,填在报文的「序号」字段,代表当前报文的序号是这个,并且我后续的分组会基于这个序号递增。
然后该报文将会经网络层、链路层、物理层发送到服务端。
第二步:
如果分组丢失了,那么客户端会经过某个时间间隔再次尝试发送。
而如果分组准确的到达服务端了,服务端拆开 TCP 首部会看到,这是一个特殊的 SYN 握手报文,于是为此次连接分配缓存等资源。
接着服务端开始构建响应报文,SYN 是一个用于同步需要的字段,响应报文中依然会被置为 1,并且服务端也将随机生成一个初始序号放置的响应报文的序号字段中。
最后,服务端还会为响应报文中的确认字段赋值,这个值就是客户端发过来的那个序号值加一。
整体上的意思就是说,「我同意你的连接请求,我的初始序号为 xxx,你的初始序号我收到了,我等着你的下一个分组到来」
第三步:
客户端收到服务端的响应报文,于是分配客户端 TCP 连接所必须的缓存等资源,于是连接已经建立。
实际上从第三步开始,客户端就可以携带应用层数据向服务端交换报文了,以后的每份报文中,SYN 都为 0,因为它只是用于同步初始序号的,这一点需要明确。
总的来说,整个『握手』过程大致如下图所示:

tcp的3次握手 4次挥手
下面我们看看拆除一条 TCP 连接的『四次挥手』是怎样的过程。
因为一条 TCP 连接会消耗大量的主机资源,不仅仅服务端需要分配各种缓存资源,客户端也同样需要分配相应资源。因为 TCP 是『全双工通信』,服务端和客户端两方其实是一样的,谁是客户谁是服务器是相对的。
强调这一点是为了说明,一条 TCP 连接不是只有客户端才能断开,服务端也同样可以主动断开连接,这一点需要清楚。
我们这里假设客户端主动发起断开连接的请求为例:
第一步:
客户端构建一份特殊的 TCP 报文,该报文首部字段 FIN 被置为 1,然后发送该报文。
第二步:
服务端收到该特殊的 FIN 报文,于是响应客户端一个 ACK 报文,告诉客户端,请求关闭的报文已经收到,我正在处理。
第三步:
服务端发送一个 FIN 报文,告诉客户端,我将要关闭连接了。
第四步:
客户端返回一个 ACK 响应报文,告诉服务端,我收到你刚才发的报文了,我已经确认,你可以关闭连接了。
当服务端收到客户端发送的 ACK 响应报文时,将释放服务端用于该 TCP 连接的所有资源,与此同时,客户端也会定时等待一定时间后完全释放自己用于该连接的相关资源。
用一张图更直观的描述一下:

作者:YangAM
链接:https://juejin.im/post/5b10be81518825139e0d8160
来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
tcp的3次握手 4次挥手