之前在实现我自己私有的一个网络协议时,我发现了 HTTP 协议发送完数据直接就直接关闭连接的做法可能有问题。有两种场景下容易出问题:
1. 如果 HTTP 服务器与客户端之间,还有个 proxy,那直接关闭连接,那有一定的可能性因为实现错误,数据其实还没有发送到对端。
2. 调用 send() 返回成功,并不代表数据已经发送到了对端。此时直接 close() 连接并且退出进程,那接下来的数据会交由操作系统进行发送。操作系统会不会发送成功这事难说。
所以,如果一定要确定数据已经发送到对端,最好让对端发回一个确认关闭的数据包,或者等待对端关闭连接。
也是基于这个原因,WebSocket 关闭的一般会要求接收到对端的 Close Control Frame 之外才真正关闭连接。
--
FROM 222.76.77.*