TCP异常之TCP可能出现异常的原因

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Function_Dou/article/details/87827178

本节介绍TCP可能会出现的异常的时候以及部分原因, 提出来的问题大概都会在后面实验中会有所涉及. TCP异常会出现在连接的任何时候, 比如三次握手, 四次挥手等阶段.

三次握手

TCP在三次握手过程中的每一步都可能出错, 这里也就介绍以下问题.

  1. 服务端没有监听, 所以服务端TCP协议返回一个RST段, 而客户端收到后立即返回并停止连接. 客服端调用connect返回错误, 错误类型是ECONNREFUSED.
  2. 客户端一直没有收到对端的ACK确认报文, 当超时后继续发送FIN, 多次失败之后客户端停止尝试连接. 客户端connect函数返回错误, 错误类型是ETIMEOUT.
  3. 如果客户机的SYN段导致某个路由器产生“目的地不可到达”类型的ICMP消息, 超时重发后也是一样, 最后断开连接. 客服端调用connect返回错误, 错误类型是EHOSTUNREACH/ENETUNREACH.
  4. 虽然三次握手成功了, 但是客户端立马发送一个RST段后断开而服务端处于繁忙状态, 等服务端返回时才发现对端已经关闭, 此时服务端也关闭. 客户端connect后立即断开, 服务端在accept函数返回前收到RST段, 则accept函数返回ECONNABORTED.

通信过程

在通信过程中经常一端可能会突然断网之类的, 导致通信错误.

  1. 在通信过程中, 对端因为断网等原因断开并且一直没有联网或重启等, 但是另一端并不知情继续发送报文段, 直到超时重传多次也没有回应才知道对端已经断开, 这时另一端发送RST段表示错误并断开
  2. 如果在通信过程中, 对端因为断网等原因断开但是马上一直联网或重启等原因, 那么另一端发送报文段过来, 重启的的服务端没有监听, 所以服务端TCP协议返回一个RST段(回到了三次握手中的第一种错误).

四次挥手

四次挥手的任意过程都可能发生错误, 这里也就介绍以下问题.

  1. 主动断开一端发送FIN段, 对端一直没有ACK确认, ….后续??
  2. 主动断开一端发送FIN段并接收到ACK, 却始终没有收到对端的FIN, …后续??

TCP可以通过探测来检测对端是否已经断开, 这里也有一个详细的介绍TCP 连接断连问题剖析.

参考

TCP/IP 错误

猜你喜欢

转载自blog.csdn.net/Function_Dou/article/details/87827178
今日推荐