Open abbshr opened 9 years ago
第二个针对性问题,很明显考的是对传输层TCP协议的理解程度。如何做呢?可能是对自己的计网知识过于自信了,当时想都没想就说res.end(),紧接着发现自己脑残了,如果能end掉底层socket的话,"Connection: keep-alive" 还起个毛作用啊?不对。明知道不对,可是我仍然朝错误的方向去考虑了问题:我在想如何在server的"request"事件回调里处理这个逻辑,并给出了好几种方案,然而这绝壁是做无用功啊。。,面试官都笑了。
res.end()
"Connection: keep-alive"
"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不会影响其他请求的正确性。
"就算浏览器的几个页面同时对同一个Socket写入" 这个是想表达哪种情况,没有读懂。。
@skyline75489 想表达 TCP 多路复用而已,如 HTTP/2。这里“几个页面共享一个socket”是广义上讲。
第二个针对性问题,很明显考的是对传输层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。这些概念本应该是了然于胸的,可能是所学知识碎片化导致的后果吧。
下面写了一个例子,和我一样健忘的同学打开浏览器,注意控制台。加深一下印象吧~
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不会影响其他请求的正确性。