MST

星途 面试题库

面试题:网络编程 - TCP连接建立与终止过程

请详细描述TCP协议三次握手建立连接和四次挥手终止连接的过程,并说明每一步的作用以及可能出现的异常情况及处理方式。
43.9万 热度难度
后端开发网络编程

知识考点

AI 面试

面试题答案

一键面试

TCP三次握手建立连接过程

  1. 第一次握手(客户端 -> 服务器)
    • 内容:客户端发送一个SYN(同步序列号)包,其中包含客户端随机生成的初始序列号(Sequence Number,seq),假设为x。此包的目的是向服务器表明客户端想要建立连接,并告知自己的初始序列号。
    • 作用:通知服务器客户端希望建立连接,并提供自己的初始序列号,为后续的数据传输序列号管理做准备。
    • 异常情况及处理:如果客户端长时间没有收到服务器的响应(即第二次握手的包),会重发SYN包,重发次数和时间间隔由TCP协议栈的实现决定,一般会逐渐增加重发间隔时间,超过一定重发次数后,客户端会认为连接建立失败,返回错误信息给应用层。
  2. 第二次握手(服务器 -> 客户端)
    • 内容:服务器收到客户端的SYN包后,回复一个SYN + ACK包。这个包中,ACK(确认号)字段是客户端的序列号x加1,即ACK = x + 1,表示服务器已成功收到客户端的SYN包;同时服务器也会随机生成自己的初始序列号y,并放入SYN字段中。
    • 作用:一方面确认收到了客户端的连接请求,另一方面向客户端发送自己的初始序列号,为后续服务器端的数据传输序列号管理做准备。
    • 异常情况及处理:如果服务器没有收到客户端的第一次握手包,就不会有此步骤。若服务器发出的SYN + ACK包丢失,客户端因未收到正确响应,会重发第一次握手的SYN包,服务器在重传超时时间内未收到客户端确认(第三次握手),也会重发SYN + ACK包。
  3. 第三次握手(客户端 -> 服务器)
    • 内容:客户端收到服务器的SYN + ACK包后,向服务器发送一个ACK包,其中ACK字段为y + 1,确认收到服务器的SYN包,而序列号字段为x + 1。
    • 作用:完成连接的建立,让服务器知道客户端已收到服务器的确认和初始序列号,双方都确认连接可以正常进行数据传输。
    • 异常情况及处理:如果服务器没有收到第三次握手的ACK包,会重发SYN + ACK包,客户端若收到重发的SYN + ACK包,会再次发送ACK包。若客户端发出的ACK包丢失,而服务器重发的SYN + ACK包也丢失,客户端重发超时后会重新发起第一次握手。

TCP四次挥手终止连接过程

  1. 第一次挥手(主动关闭方 -> 被动关闭方)
    • 内容:主动关闭方发送一个FIN(结束标志)包,其中包含主动关闭方当前的序列号seq = u,表示主动关闭方不再发送数据,但仍可以接收数据。
    • 作用:通知被动关闭方主动关闭方想要关闭连接。
    • 异常情况及处理:如果主动关闭方没有收到被动关闭方的确认(第二次挥手),会重发FIN包,重发机制与三次握手类似,超过一定重发次数后,主动关闭方可能返回错误给应用层。
  2. 第二次挥手(被动关闭方 -> 主动关闭方)
    • 内容:被动关闭方收到FIN包后,回复一个ACK包,ACK字段为u + 1,确认收到主动关闭方的FIN包,被动关闭方的序列号为v。此时被动关闭方进入CLOSE_WAIT状态,表明被动关闭方已经知道主动关闭方要关闭连接,但被动关闭方可能还有数据要发送。
    • 作用:确认收到主动关闭方的关闭请求,同时告知主动关闭方自己已收到请求。
    • 异常情况及处理:若被动关闭方发出的ACK包丢失,主动关闭方会重发FIN包,被动关闭方收到重发的FIN包后会再次发送ACK包。
  3. 第三次挥手(被动关闭方 -> 主动关闭方)
    • 内容:当被动关闭方所有数据发送完毕后,发送一个FIN包,序列号为w(w可能等于v,也可能v + 数据长度,取决于中间是否有数据传输),表示被动关闭方也不再发送数据。
    • 作用:通知主动关闭方被动关闭方也准备好关闭连接。
    • 异常情况及处理:如果主动关闭方没有收到第三次挥手的FIN包,被动关闭方会重发FIN包,重发机制与之前类似。
  4. 第四次挥手(主动关闭方 -> 被动关闭方)
    • 内容:主动关闭方收到被动关闭方的FIN包后,回复一个ACK包,ACK字段为w + 1,确认收到被动关闭方的FIN包,主动关闭方序列号为u + 1(这里u + 1假设中间无数据传输)。然后主动关闭方进入TIME_WAIT状态,等待2倍MSL(最长报文段寿命)时间后关闭连接,被动关闭方收到ACK包后立即关闭连接。
    • 作用:完成连接的彻底关闭,主动关闭方等待2MSL时间是为了确保最后一个ACK包能被被动关闭方收到,同时也保证在这段时间内网络中不会再有本连接的数据包。
    • 异常情况及处理:若被动关闭方没有收到第四次挥手的ACK包,会重发FIN包,主动关闭方收到重发的FIN包后会再次发送ACK包。若主动关闭方在TIME_WAIT状态下收到重复的FIN包,也会再次发送ACK包。