Web 技术研究所

我一直坚信着,Web 将会成为未来应用程序的主流

TCP连接的半开与半关闭

  这又是一个不能望文生义的词,“半”字也许会很难理解。要理解这个“半”,我们还得先理解什么是“全”。TCP本身是全双工(Full-Duplex)的协议,这就是“全”的概念。而“半”就允许TCP把自己当做单工的来使用,这就是半开与半关闭的概念。
  单工就相当于二极管,数据只能从一端流向另一端。全双工就相当于一个完整的电路,数据可以从A流到B,也可以从B流动会到A,他们甚至还可以同时进行。这篇文章要用到的概念就是这俩。当然还有半双工的概念,虽然这篇文章没用到。它相当于一条导线,数据可以从A流到B,也可以从B流动会到A,但是不能同时进行。
  在NodeJS的文档的net部分可以找到关于halfOpen的资料(见net.createServer)。其中有这样一段描述:如果allowHalfOpen为true,在连接的另一端发送FIN包时socket不会自动发送FIN包。它为被标识为不可读但可写的状态。把socket标识为可写不可读的状态就意味着它并没有断开,只是认为对方告诉自己将不再发送数据了而已。如果是Socket程序,就需要手动调用方法去关闭这个连接,否则它会一直工作。有些恶意攻击的程序就利用这个机制让没有限制半开连接的服务器打开大量的半开连接,使对方的连接数消耗殆尽。所以很多操作系统都自带了半开连接数的使用限制。
  另一方面就是半关闭(见socket.end)。同半开一样。半关闭时连接端发送一个FIN包,而不是真正的断开。如果服务器允许半开状态,那么就会达到上面描述的状态。但如果服务器不允许半开,那么服务器也会发送一个FIN包,这样整个连接将真正断开。
网名:
34.203.213.*
电子邮箱:
仅用于接收通知
提交 悄悄的告诉你,Ctrl+Enter 可以提交哦
神奇海螺
[查看全部主题]
各类Web技术问题讨论区
发起新主题
本模块采用即时聊天邮件通知的模式
让钛合金F5成为历史吧!
次碳酸钴的技术博客,文章原创,转载请保留原文链接 ^_^