abbshr.github.io icon indicating copy to clipboard operation
abbshr.github.io copied to clipboard

如何在Keep Alive情况下做到防止非法HTTP数据以及及时处理正确HTTP数据?

Open abbshr opened this issue 8 years ago • 2 comments

第二个针对性问题,很明显考的是对传输层TCP协议的理解程度。如何做呢?可能是对自己的计网知识过于自信了,当时想都没想就说res.end(),紧接着发现自己脑残了,如果能end掉底层socket的话,"Connection: keep-alive" 还起个毛作用啊?不对。明知道不对,可是我仍然朝错误的方向去考虑了问题:我在想如何在server的"request"事件回调里处理这个逻辑,并给出了好几种方案,然而这绝壁是做无用功啊。。,面试官都笑了。

为啥?现在就来谈谈因简单而常被忽视的HTTP。

可能Web开发做久了的工程师都会产生这样一种错觉:把无连接的HTTP当成一种连接。毕竟Web接触的大都是应用层协议并且主要为HTTP协议,其他少的可怜。但是现在头脑冷静一下,HTTP怎么会和connection establish联系在一起?不是,当然不是,别忘了HTTP是一种无连接无状态协议,它只负责HTTP报文,真正维护那个连接的是传输层的TCP协议啊。

“request”事件对应的是HTTP的request,而“connect/connection”事件才对应着TCP connection。这些概念本应该是了然于胸的,可能是所学知识碎片化导致的后果吧。

下面写了一个例子,和我一样健忘的同学打开浏览器,注意控制台。加深一下印象吧~

{createServer} = require 'http'

createServer (req, res) ->
  res.end ''
  # req.socket.end()
  console.log "new HTTP Request"
.on "connection", () ->
  console.log "new TCP connection established"
.listen 80

HTTP 1.1是默认设置keep-alive的,所以控制台会得到一个"new TCP connection established"和一堆"new HTTP Request"。这说明keep-alive确实是几个对同一主机的HTTP请求共享一个TCP socket。

那么仍是最初的问题,如何做到第七层防止非法数据以及及时处理正确数据?或许这么问有一种误导作用,让你偏偏往在应用层如何做这条路想。其实这是一个很简单的问题,发现有问题当然是end掉,不过要做到胸有成竹的回答,前提是必须了解TCP的特点,特别是可靠传输,TCP提供了一种保证传输数据可靠性的机制,也就是说,就算浏览器的几个页面同时对同一个Socket写入,到另一端的这些HTTP报文也不会出现差错的。所以end掉当前HTTP Request不会影响其他请求的正确性。

abbshr avatar Aug 02 '15 13:08 abbshr

"就算浏览器的几个页面同时对同一个Socket写入" 这个是想表达哪种情况,没有读懂。。

skyline75489 avatar Aug 09 '17 14:08 skyline75489

@skyline75489 想表达 TCP 多路复用而已,如 HTTP/2。这里“几个页面共享一个socket”是广义上讲。

abbshr avatar Aug 10 '17 03:08 abbshr