Nodejs-HTTP模块抓包分析
2018-06-15 本文已影响50人
miiiiiiiiiiiii
例1:
http.createServer((req, res) => {
res.end(" world");//step1
}).listen(3000, () => {
console.log("listening at port 3000....")
});
image.png
TCP的数据部分是http报文,例1是没有分包的,http请求和响应报文都是以TCP为载体的。
例2:
http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain' });//step1
res.write("hello");//step2
res.write("zhizhi ");//step3
res.end(" world");//step4
}).listen(3000, () => {
console.log("listening at port 3000....")
});
image.png
(1)前三个报文是tcp的三次握手,报文5是发送的http的get请求。
(2)红笔标记1:对应step1和step2。(head会随着第一chunk的数据发送)
(3)红笔标记2:对应step3
(4)红笔标记3:对应step4
响应报文分为了3个包
标记1:服务器先把http的头和http的body的第一份数据(hello)放到tcp的包发送给客户端
image.png
标记2:服务器将httpbody的第二份数据zhizhi作为tcp包的数据部分,发送给客户端
image.png
标记3: end 将最后一份数据world作为tcp包的数据部分发送给客户端,并告诉客户端数据发送完毕,客户端将之前收到的tcp包数据部分的,http头取出来,http数据取出来组装,组成http报文,就是标记3的响应报文。
image.png
例3: 服务器发两次writeHead,在第二次writeHead的时候,客户端会单向终止socket
http.createServer((req, res) => {
res.writeHead(200, {'Content-Type': 'text/plain' });//step1
res.write("hello");//step1
res.writeHead(200, {'Content-Type': 'text/js' });//step2
res.write("zhizhi ")//step2
res.write("haha ")//step3
res.end(" world");//step4
}).listen(3000, () => {
console.log("listening at port 3000....")
});
image.png
step2:再次发送了head(此时,程序已经报错了'can't set headers after they are sent'),tcp报文数据部分如下:
image.png
包含了第二次发送的http头和数据部分;再次writeHead导致客户端发送了FIN报文, step3是服务端write触发的报文:
image.png
在服务端第二次writeHead之后的每一次write都是一个info为Continuation的HTTP报文,装载体TCP报文的数据部分是write的内容。