背景:为啥想着抓TCP,源于跟同事的一次讨论,在client端发起一次http请求(短连接),以client端的维度,从请求到响应的耗时,是否包括TCP四次挥手。因为,我们遇到一个问题:同一个集群去请求两个不同的集群,每0.5个rt 其中一个比另一个慢1.8ms,我们nodejs请求后端的http接口用得都是短链接,算上三次握手(1.5个rt)和实际数据传输(慢启动+接口数据有好几百k)加起来有3-4rt问题不大,累计下来,请求a集群比请求b集群稳定慢10ms。于是我们争论,这10ms里,是否包括了四次挥手(2个rt)的耗时diff。
Node.js Client端
var http = require('http');
var options = {
host: 'localhost',
port: '8080'
};
callback = function(response) {
var str = '';
//another chunk of data has been received, so append it to `str`
response.on('data', function (chunk) {
str += chunk;
});
//the whole response has been received, so we just print it out here
response.on('end', function () {
console.log('end: ', Date.now());
console.log(str);
});
}
console.log('start: ', Date.now());
http.request(options, callback).end();
Node.js Server端
const http = require('http');
const requestListener = function (req, res) {
res.writeHead(200);
res.end('Hello, World!');
}
const server = http.createServer(requestListener);
server.listen(8080);
抓包工具用WireShark
下载:https://www.wireshark.org/download.html
由于是抓本地服务的包,不经过以太网,所以选择loopback:
考虑到要比较TCP和HTTP两个层面的抓包时序,抓包的过滤条件设置为:tcp.port==8080||http
开始抓包
时序
tips:无论client端还是server端都可以主动发起第一次挥手。
结论:虽然nodejs里的打点应该不如wireshark里准,但是看起来是tcp四次挥手的第二次和第三次挥手之间,跟client端的res.end 是一致的啊
参考文献
wireshark抓取本地数据包
Wireshark loopback on mac os x [closed]
TCP四次挥手和服务器主动断开
What is Epoch time in Wireshark?
What is a TCP window update?
TCP三次握手和四次挥手、HTTP协议