如果正常的关闭连接或者 管道

其实一般我们关闭连接或者是管道,都是 先关闭 输出 流或者输出管道的。但是我们不知道为什么,或者说这个才是规范。

HTTP 规范建议, 当客户端或服务器突然要
关闭一条连接时, 应该“正常地关闭传输连
接”, 但它并没有说明应该如何去做。
总之, 实现正常关闭的应用程序首先应该关
闭它们的输出信道, 然后等待连接另一端的
对等实体关闭它的输出信道。 当两端都告诉
对方它们不会再发送任何数据(比如关闭输
出信道) 之后, 连接就会被完全关闭, 而不
会有重置的危险。
但不幸的是, 无法确保对等实体会实现半关
闭, 或对其进行检查。 因此, 想要正常关闭
连接的应用程序应该先半关闭其输出信道,
然后周期性地检查其输入信道的状态(查找
数据, 或流的末尾) 。 如果在一定的时间区
间内对端没有关闭输入信道, 应用程序可以
强制关闭连接, 以节省资源。

总之, 关闭连接的输出信道总是很安全的。
连接另一端的对等实体会在从其缓冲区中读
出所有数据之后收到一条通知, 说明流结束
了, 这样它就知道你将连接关闭了。
关闭连接的输入信道比较危险, 除非你知道
另一端不打算再发送其他数据了。 如果另一端向你已关闭的输入信道发送数据, 操作系
统就会向另一端的机器回送一条 TCP“连接
被对端重置”的报文, 会导致 连接的另一端 读取不到缓存的数据。


《 HTTP 权威指南 》

猜你喜欢

转载自my.oschina.net/u/2419285/blog/1806152