「客户端」学习网络编程,不了解TCP协议?难怪面试被刷下去,还不来学习!(12)


  • 客户端协议栈收到 ACK 之后 , 使得应用程序从 connect 调用返回 , 表示客户端到服务器端的单向连接建立成功 , 客户端的状态为 ESTABLISHED , 同时客户端协议栈也会对服务器端的 SYN 包进行应答 , 应答数据为 server_isn+1;
  • 应答包到达服务器端后 , 服务器端协议栈使得 accept 阻塞调用返回 , 这个时候服务器端到客户端的单向连接也建立成功 , 服务器端也进入 ESTABLISHED 状态 。
  • 从上面的描述过程 , 我们可以得知客户端 connect 成功返回是在第二次握手 , 服务端 accept 成功返回是在三次握手成功之后 。
    客户端调用 close 了 , 连接是断开的流程是什么?
    我们看看客户端主动调用了 close , 会发生什么?
    客户端调用 close 过程

    • 客户端调用 close , 表明客户端没有数据需要发送了 , 则此时会向服务端发送 FIN 报文 , 进入 FIN_WAIT_1 状态;
    • 服务端接收到了 FIN 报文 , TCP 协议栈会为 FIN 包插入一个文件结束符 EOF 到接收缓冲区中 , 应用程序可以通过 read 调用来感知这个 FIN 包 。 这个 EOF 会被放在已排队等候的其他已接收的数据之后 , 这就意味着服务端需要处理这种异常情况 , 因为 EOF 表示在该连接上再无额外数据到达 。 此时 , 服务端进入 CLOSE_WAIT 状态;
    • 接着 , 当处理完数据后 , 自然就会读到 EOF , 于是也调用 close 关闭它的套接字 , 这会使得会发出一个 FIN 包 , 之后处于 LAST_ACK 状态;
    • 客户端接收到服务端的 FIN 包 , 并发送 ACK 确认包给服务端 , 此时客户端将进入 TIME_WAIT 状态;
    • 服务端收到 ACK 确认包后 , 就进入了最后的 CLOSE 状态;
    • 【「客户端」学习网络编程,不了解TCP协议?难怪面试被刷下去,还不来学习!】客户端进过 2MSL 时间之后 , 也进入 CLOSED 状态 。


    推荐阅读