TCP三次握手过程及状态变迁

Posted 刘小豆豆豆

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TCP三次握手过程及状态变迁相关的知识,希望对你有一定的参考价值。

TCP的连接建立:

1、TCP三次握手过程和状态变迁

TCP 是面向连接的协议,所以使用 TCP 前必须先建立连接,而建立连接是通过三次握手来进行的。

  • 一开始,客户端和服务端都处于 CLOSED 状态。先是服务端主动监听某个端口,处于 LISTEN 状态

第一次握手:

  • 客户端会随机初始化序号(client_isn),将此序号置于 TCP 首部的「序号」字段中,同时把 SYN 标志位置为 1 ,表示 SYN 报文。接着把第一个 SYN 报文发送给服务端,表示向服务端发起连接,该报文不包含应用层数据,之后客户端处于 SYN-SENT 状态。

第二次握手:

  • 服务端收到客户端的 SYN 报文后,首先服务端也随机初始化自己的序号(server_isn),将此序号填入 TCP 首部的「序号」字段中,其次把 TCP 首部的「确认应答号」字段填入 client_isn + 1, 接着把 SYN 和 ACK 标志位置为 1。最后把该报文发给客户端,该报文也不包含应用层数据,之后服务端处于 SYN-RCVD 状态。

第三次握手:

  • 客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先该应答报文 TCP 首部 ACK 标志位置为 1 ,其次「确认应答号」字段填入 server_isn + 1 ,最后把报文发送给服务端,这次报文可以携带客户到服务器的数据,之后客户端处于 ESTABLISHED 状态。服务器收到客户端的应答报文后,也进入 ESTABLISHED 状态。

从上面的过程可以发现,第三次握手是可以携带数据的,前两次握手是不可以携带数据的,一旦完成三次握手,双方都处于 ESTABLISHED 状态,此时连接就已建立完成,客户端和服务端就可以相互发送数据了。【前两次不携带数据也是为了防止被攻击,如果携带大量的数据会对服务器造成影响】

为什么要三次握手?

三次握手的目的是建立可靠的通信信道,说到通讯,简单来说就是数据的发送与接收,而三次握手最主要的目的就是双方确认自己与对方的发送与接收是正常的。

  • 三次握手才可以阻止重复历史连接的初始化(主要原因)

    TCP 使用三次握手建立连接的最主要原因是防止历史连接初始化了连接。

  • 三次握手才可以同步双方的初始序列号

    TCP 协议的通信双方, 都必须维护一个「序列号」, 序列号是可靠传输的一个关键因素,它的作用:

    • 接收方可以去除重复的数据;
    • 接收方可以根据数据包的序列号按序接收;
    • 可以标识发送出去的数据包中, 哪些是已经被对方收到的;

    可见,序列号在 TCP 连接中占据着非常重要的作用,所以当客户端发送携带「初始序列号」的 SYN 报文的时候,需要服务端回一个 ACK 应答报文,表示客户端的 SYN 报文已被服务端成功接收,那当服务端发送「初始序列号」给客户端的时候,依然也要得到客户端的应答回应,这样一来一回,才能确保双方的初始序列号能被可靠的同步。

  • 三次握手才可以避免资源浪费

    三次握手足以,不需要四次。

以上是关于TCP三次握手过程及状态变迁的主要内容,如果未能解决你的问题,请参考以下文章

4-6:TCP协议之连接管理机制(三次握手四次挥手详解)

TCP建立连接的相关问题

简述TCP三次握手四次挥手过程及各过程中客户端和服务器端的状态。

TCP状态转换图

TCP连接状态详解及TIME_WAIT过多的解决方法

TCP三次握手及原因