记一次TCP抓包

本文探讨了在Node.js环境中,HTTP短连接请求时TCP四次挥手是否包含在客户端请求到响应的总耗时中。通过Wireshark抓包分析,发现TCP挥手的第二次和第三次挥手与客户端响应结束几乎同步,暗示挥手过程可能并未显著影响整体耗时。文章详细介绍了实验设置和观察结果,并引用相关技术文献进行解释。
摘要由CSDN通过智能技术生成

背景:为啥想着抓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:
loopback
考虑到要比较TCP和HTTP两个层面的抓包时序,抓包的过滤条件设置为:tcp.port==8080||http
过滤条件

开始抓包

TCP三次握手
TCP窗口大小

client发起http请求
server响应数据给client
client成功收到响应数据
client告知server响应接受完毕,可以断开TCP连接
TCP四次挥手

时序

client端收到响应
第二次挥手
第三次挥手
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协议

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值