TCP echo 中断崩溃情况分析及讨论

 

1. termination of server process

当服务器和客户端正常连接的时候,通过kill命令将连接好的服务器子进程结束掉,此时服务器子进程会关闭所有描述符,然后向客户端发送一个FIN ,此时客户端的TCP会回复一个ACK,导致TCP连接前半部分终止。

  • 在这个时间点上,客户端不会发生任何事件,因为现在客户端进程正在阻塞在fgets-即等待用户的输入

 

此时如果输入一行数据并发送,服务器接收到数据后会回复一个RST,因为此时套接字已经关闭。

  • 这种情况也会取决于时间,客户端readline时,若先收到第二步中的FIN,则立即返回0,显示“服务器意外终止”,如果先接收到RST,则返回一个ECONNRESET

2.crashing of server host :

当服务器和客户端正常连接的时候,服务器主机崩溃,此时服务器不会发送任何数据给客户端,包括FIN等都不会发送

  • 在这个时间点上,客户端不会发生任何事件,因为现在客户端进程正在阻塞在fgets-即等待用户的输入

 

此时如果再输入一行数据并发送,因为此时服务器已经崩溃,不会发送任何数据

  • 客户端会阻塞在对readline的调用上,即服务端发送数据后不显示会送内容,此时客户端会不断重传数据,以期得到服务端的ACK的响应,一般会尝试重传12次大约9分钟,最终放弃。最终readline会返回一个错误,即ETIMEOUT    ,或者可能中间路由器认定服务主机不可达,错误类型可以为EHOSTUNREACH或者ENETUNREACH

3. crashing of server host and reboot

当服务器和客户端正常连接的时候,服务器主机崩溃,此时服务器不会发送任何数据给客户端,包括FIN等都不会发送

  • 在这个时间点上,客户端不会发生任何事件,因为现在客户端进程正在阻塞在fgets-即等待用户的输入

 

此时如果再输入一行数据并发送,并将崩溃的服务器主机重启,由于服务器tcp已经丢掉了所有有关连接的信息,因此在接收到来自服务端的数据后会直接返回一个RST

  • 客户端会阻塞在readline上,此时接收到服务器的RST,立马返回一个ECONNRESET类型的错误

 

4. host shutdown of server

这种情况和第一种情况类似,服务器主机关机时,init进程会发送一个SIGTERM 信号给所有的进程,告知他们主机将要关机,然后发送一个SIGKILL,此时若不捕获SIGTERM,服务器将会被终止,然后发送FIN给客户端,类似于第一种情况

5. connection abort befor accept returns

TCP echo 中断崩溃情况分析及讨论

当连接发生这种情况的时候,被丢掉的连接接下来的情况取决于不同系统的实现

  • 伯克利驱动实现下,回直接无视这种情况
  • 大多数MVR4实现下,一般会返回一个错误值-EPROTO,但POSIX系统会返回另一种错误值-ECONNABORTED