版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Function_Dou/article/details/87827178
本节介绍TCP可能会出现的异常的时候以及部分原因, 提出来的问题大概都会在后面实验中会有所涉及. TCP异常会出现在连接的任何时候, 比如三次握手, 四次挥手等阶段.
三次握手
TCP在三次握手过程中的每一步都可能出错, 这里也就介绍以下问题.
- 服务端没有监听, 所以服务端TCP协议返回一个RST段, 而客户端收到后立即返回并停止连接. 客服端调用
connect
返回错误, 错误类型是ECONNREFUSED. - 客户端一直没有收到对端的
ACK
确认报文, 当超时后继续发送FIN, 多次失败之后客户端停止尝试连接. 客户端connect
函数返回错误, 错误类型是ETIMEOUT. - 如果客户机的SYN段导致某个路由器产生“目的地不可到达”类型的ICMP消息, 超时重发后也是一样, 最后断开连接. 客服端调用
connect
返回错误, 错误类型是EHOSTUNREACH/ENETUNREACH. - 虽然三次握手成功了, 但是客户端立马发送一个
RST
段后断开而服务端处于繁忙状态, 等服务端返回时才发现对端已经关闭, 此时服务端也关闭. 客户端connect
后立即断开, 服务端在accept
函数返回前收到RST
段, 则accept
函数返回ECONNABORTED.
通信过程
在通信过程中经常一端可能会突然断网之类的, 导致通信错误.
- 在通信过程中, 对端因为断网等原因断开并且一直没有联网或重启等, 但是另一端并不知情继续发送报文段, 直到超时重传多次也没有回应才知道对端已经断开, 这时另一端发送RST段表示错误并断开
- 如果在通信过程中, 对端因为断网等原因断开但是马上一直联网或重启等原因, 那么另一端发送报文段过来, 重启的的服务端没有监听, 所以服务端TCP协议返回一个RST段(回到了三次握手中的第一种错误).
四次挥手
四次挥手的任意过程都可能发生错误, 这里也就介绍以下问题.
- 主动断开一端发送FIN段, 对端一直没有ACK确认, ….后续??
- 主动断开一端发送FIN段并接收到ACK, 却始终没有收到对端的FIN, …后续??
TCP可以通过探测来检测对端是否已经断开, 这里也有一个详细的介绍TCP 连接断连问题剖析.