Socket连接出错总结

下面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

你可能感兴趣的:(linux,tcp,socket,rst)