当前任何的计算机系系统,不可能不通过网络传输数据,逻辑上的一个系统,在物理世界往往对应若干小系统——一个集群。对外需要与其他系统交换信息,对内各小系统也需要互相交换信息。世界就是这样联结在一起的。

对于一个确定的系统,通过日志来观察系统往往不那么确定,因为日志仅仅揭示了系统的很小一部分运行时行为,更大的一部分依旧隐藏在黑暗里——想想单步调试 springboot 的调用过程,更别说 cpu 执行的指令序列了。这是采用自底向上方法论,对计算逻辑进行层层抽象所不可避免带来的问题。

相比于日志揭示的不确定性,网络则显得确定得多,通过抓包,可以完整地观察到网络的所有行为,快速定位请求停留在哪个节点上,不存在没有对应报文的行为。

进入云原生时代后,往往建议通过调用链跟踪或者指标监控来进行问题定位,存在同样的问题——调用链和指标都只揭示了系统运行行为空间的一部分,很多时候还是需要结合抓包来做进一步分析,但云环境对抓包行为的支持并不理想,这是目前感到束手束脚的一个地方。

windows 系统一般可以采用 wireshark 或者 network monitor 进行抓包。linux 系统则可以采用自带的命令行工具 tcpdump。

过滤表达式格式(tcpdump -i eth0 “ip and udp”)

  • 协议类型:
    • tcp
    • udp
    • ip
    • ip6
    • icmp
    • icmp6
  • 协议字段:
    • ether src <source mac> ;
    • ether dst <destination mac> ;
    • src host <source ip> ;
    • dst host <destination ip> ;
    • src net <source net> ;
    • src port <source port> ;
  • 报文某处值:
    • ip[0:2]=0xcafe,ip报文的头两个字节为16进制的cafe ;
    • ether[0]=0xca,帧的头一个字节为16进制的ca ;  
    • ether[0] & 1 = 0 and ip[16] >= 224,筛选条件的组合使用 ; 
    • tcp port 80 and (((ip[2:2] – ((ip[0]&0xf)<<2)) – ((tcp[12]&0xf0)>>2)) != 0),这是一个复杂一些的例子 ;

大部分情况下,采用以下选项组合组合就够用了

参数说明
-i  eth0监听 eth0 接口
-n不进行 rarp 转换
-s0不限制抓取的报文大小
-w <filename>写入文件
“dst host <destination ip>”限定目标地址
“src host <source ip>” 限定源地址
-c 100抓取前 100 个报文
“dst port 22”限制目标端口
“src net 192.168.1.0/24”限制源网段
“(src port 21) and (dst port 22)”
or
分类: CODE

0 条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注