下面7种情况是我认为最容易出现的TCP/IP连接错误。
[1] kill pid/应用崩溃/正常关机
这几种情况下操作系统会正常将连接关闭,主动发送FIN完成4次分组交换
[2] 操作系统崩溃/机器断电
两种情况
1 如本端不再启动则不会有任何响应到对端,对端会执行[6]的超时重传重过程
2 如果机器后来又启动了,则会在对端写时返回RST给对方,因为原来的端口已经不存在
[3] 拔掉网线
由于物理线路断开,等效于[2],本端没任何响应,对端会执行[6]的超时重传过程
[4] 服务端的listen接收队列满
客户端再调用connect,服务器将不做任何回应,因为这种情况是暂时的,很可能在短时间内解决,客户端会执行[6]重新发送SYN
[5] RST
当socket的一端认为对方对一个不存在的4元组发来了请求的时候,会回复一个RST响应,在epoll上会响应为EPOLLHUP事件,目前我已知的两种情况会发送RST
1 客户端connect到一个没有在listen的端口
2 连接已经建立好后,客户端意外断电后重启,客户端端口已经不在使用,但是服务器直接在原来的socket上发送数据。
[6] 超时重传
如果一端无任何响应,另一端会按照下面的时间序列重发请求(秒),|1.5|3|6|12|24|48|64|64|...|9分钟|,9分钟后会发送给对方一个RST分组,然后本端返回。
[7] connect出错
两种情况
1 connect到一个没有在listen的端口,收到RST回应
2 connect到的ip不能定位到一台机器,或者说发出去的请求无任何响应,这时会执行[6],connect会不断重试,然后因为9分钟后收到RST分组而返回-1