Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
abbshr opened this issue Aug 2, 2015 · 2 comments

Comments

@abbshr
Copy link
Owner

abbshr commented Aug 2, 2015

第二个针对性问题,很明显考的是对传输层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不会影响其他请求的正确性。

@skyline75489
Copy link

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

@abbshr
Copy link
Owner Author

abbshr commented Aug 10, 2017

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants