记一次TCP抓包

Posted zhulin2609

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了记一次TCP抓包相关的知识,希望对你有一定的参考价值。

背景:为啥想着抓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协议

以上是关于记一次TCP抓包的主要内容,如果未能解决你的问题,请参考以下文章

记一次TCP抓包

记一次微信小程序页面加载慢的排查过程

记一次TCP丢包带来的重大性能问题

记一次单机系统的性能优化:最后竟是 TCP 的锅

记一次lvs-tunnel模式的故障分析(SYN_REC)

记一次挖洞示例