ls0f / my-issues

0 stars 0 forks source link

网络编程Tip #51

Open ls0f opened 7 years ago

ls0f commented 7 years ago

假设进程a和b通信

socket在收到FIN后,虽然调用read会返回EOF,但进程依然可以其调用write,因为根据TCP协议,收到对方的FIN包只意味着对方不会再发送任何消息。 在一个双方正常关闭的流程中,收到FIN包的一端将剩余数据发送给对面(通过一次或多次write),然后关闭socket。

但是事情远远没有想象中简单。优雅地(gracefully)关闭一个TCP连接,不仅仅需要双方的应用程序遵守约定,中间还不能出任何差错。

假如b进程是异常终止的,发送FIN包是OS代劳的,b进程已经不复存在,当机器再次收到该socket的消息时,会回应RST(因为拥有该socket的进程已经终止)。a进程对收到RST的socket调用write时,操作系统会给a进程发送SIGPIPE,默认处理动作是终止进程。

"It is okay to write to a socket that has received a FIN, but it is an error to write to a socket that has received an RST."