1.nodejs的源码http.createServer过程解析
2.nodejs之http模块
3.nodejs的http慢请求攻击问题
nodejs的http.createServer过程解析
解析Node.js中创建HTTP服务器的过程,以下代码示例展示了这一过程。源码
我们开始于lib/ingMessage的源码实例这个在后边写res.on('data',data=>{ //data就是返回过来的数据})})//ingMessage类
IncomingMessage分别存在于inMessage的方法closeconsole.log(agent.sockets)4console.log(agent.sockets)5complete属性
如果已经成功解析HTTP消息,则complete属性为true,源码否则为false最好在服务关闭的时候进行判断
console.log(agent.sockets)6destory关闭服务?或者?关闭请求
console.log(agent.sockets)7headers?httpVersionhttp版本httpAVersion接收到的headers在服务端是客户端发来请求的的headers和http版本在客户端是服务端返回数据的headers和http版本
console.log(agent.sockets)8method(仅使用于server)仅仅在服务端使用,客户端请求的源码方式,get或者Post等
console.log(agent.sockets)9socket获取互相连接的源码燕窝溯源码中的成本socket,可在服务端或者客户端获取
url仅在服务端获取,得到客户端的源码url
clientRequest类是由http.request返回给我们的,用于管理已经被放入请求队列中的源码请求,http.request是供给我们向服务端发起请求的,http.request创建请求后会返回给我们ClientRequest类,在请求创建时并不会发起,我们可以通过setHeader,源码getHeader,removeHead来对请求头进行操作,在request.end()之后请求才会发起0statucCode仅仅在客户端获取,源码得到请求响应的源码状态码
clientRequest类是由http.request返回给我们的,用于管理已经被放入请求队列中的源码请求,http.request是供给我们向服务端发起请求的,http.request创建请求后会返回给我们ClientRequest类,在请求创建时并不会发起,我们可以通过setHeader,源码getHeader,removeHead来对请求头进行操作,在request.end()之后请求才会发起1常见的源码http状态码clientRequest类是由http.request返回给我们的,用于管理已经被放入请求队列中的源码请求,http.request是供给我们向服务端发起请求的,http.request创建请求后会返回给我们ClientRequest类,在请求创建时并不会发起,我们可以通过setHeader,getHeader,removeHead来对请求头进行操作,在request.end()之后请求才会发起2http上的方法METHODS列出所有node支持的请求方法
clientRequest类是由http.request返回给我们的,用于管理已经被放入请求队列中的请求,http.request是供给我们向服务端发起请求的,http.request创建请求后会返回给我们ClientRequest类,在请求创建时并不会发起,我们可以通过setHeader,getHeader,removeHead来对请求头进行操作,在request.end()之后请求才会发起3STATUS_CODES返回一个对象,包含了所有http状态码,以及描述
clientRequest类是Pc彩盘源码由http.request返回给我们的,用于管理已经被放入请求队列中的请求,http.request是供给我们向服务端发起请求的,http.request创建请求后会返回给我们ClientRequest类,在请求创建时并不会发起,我们可以通过setHeader,getHeader,removeHead来对请求头进行操作,在request.end()之后请求才会发起4createServercreateServer方法,帮助我们快速搭建一个web服务器,它返回一个Server实例
clientRequest类是由http.request返回给我们的,用于管理已经被放入请求队列中的请求,http.request是供给我们向服务端发起请求的,http.request创建请求后会返回给我们ClientRequest类,在请求创建时并不会发起,我们可以通过setHeader,getHeader,removeHead来对请求头进行操作,在request.end()之后请求才会发起5gethttp.get方法,相当于http.request方法,主要用于请求,建材源码网区别就是它的method固定于get
clientRequest类是由http.request返回给我们的,用于管理已经被放入请求队列中的请求,http.request是供给我们向服务端发起请求的,http.request创建请求后会返回给我们ClientRequest类,在请求创建时并不会发起,我们可以通过setHeader,getHeader,removeHead来对请求头进行操作,在request.end()之后请求才会发起6maxHeaderSize设置请求头大小(默认是kb)
clientRequest类是由http.request返回给我们的,用于管理已经被放入请求队列中的请求,http.request是供给我们向服务端发起请求的,http.request创建请求后会返回给我们ClientRequest类,在请求创建时并不会发起,我们可以通过setHeader,getHeader,removeHead来对请求头进行操作,在request.end()之后请求才会发起7globalAgent设置全局的agent
clientRequest类是由http.request返回给我们的,用于管理已经被放入请求队列中的请求,http.request是供给我们向服务端发起请求的,http.request创建请求后会返回给我们ClientRequest类,在请求创建时并不会发起,我们可以通过setHeader,getHeader,removeHead来对请求头进行操作,在request.end()之后请求才会发起8requestrequest方法用于发起请求,淘宝plc源码它返回ClientRequest实例
clientRequest类是由htnodejs的http慢请求攻击问题
本文介绍nodejs中的http慢请求攻击问题。
首先,编写一个测试服务器。
然后,编写一个测试客户端。
客户端先发送一部分http报文,4秒后再继续发送。尽管服务器设置了3秒超时,但实际无效。连接在4秒后断开。查看源码(node.6.0)原因如下。arduino函数源码
node_http_parser.cc的OnStreamRead
以上是判断解析http头过期的逻辑,看起来没问题。nodejs处理了这个问题,那为什么在我们设定的时间内没有触发断开连接呢?问题在于这段逻辑(OnStreamRead函数)是有数据的时候执行的回调,因此依赖于客户端发送数据才能触发,否则就不会进入这个逻辑,也就无法断开连接。顺便看一下触发这段逻辑时的情况。
默认是断开连接,如果监听了server的timeout事件,则需要自己处理连接问题。至此我们明白了为什么服务器的设置无效了。
修改客户端代码再测试一下。
这次只发送一部分数据。超时后也不再发送数据了,这时候服务器会怎样呢?我们发现服务器会一直保持这个连接。经过上面的分析我们知道,当客户端不再发送数据时,是无法触发断连的逻辑的,这就会带来http慢请求攻击。那么如何解决这个问题呢?
nodejs中还有一个配置可以帮我们解决这个问题,那就是server.setTimeout();看看代码。
设置了一个值。这个值有什么用呢?接着看。
以上代码是建立tcp连接成功的回调,nodejs会设置socket的空闲超时时间。回调是socketOnTimeout
以上代码是建立tcp连接成功的回调,nodejs会设置socket的空闲超时时间。回调是socketOnTimeout
超时回调时,默认会关闭连接。所以我们可以通过这个配置解决慢请求攻击。
这个问题并非nodejs一直存在,在早期的版本(如..0)时是没有这个问题的。
我们看到nodejs早期版本里timeout的默认值是两分钟,这意味着nodejs默认处理了这个问题,而v.6.0中则是0。具体可以参考(http, http2: remove default server timeout · nodejs/node@cef3c)。这时候我们可能想到keepalive机制,但是linux下keepalive默认是不开启的,而且因为nodejs还没解析完http头,没有回调我们,我们也拿不到socket对象,从而也无法开启keepalive机制。