Web3域名的注册教程(.eth .sol .bnb等后缀)
虽然这个系列的文章都是聚焦于如何通过分析网络抓包文件,结合网络知识,来解决实际的问题的,但是分析之前的步骤——抓包,也是同样重要!很显然,如果不会抓包,那么网络分析去分析什么呢?
抓得一手好包也是很厉害的!笔者遇到过很多次情况,虽然我们无法直接定位根因,但是同事能够精准地捕获到问题的现象,把问题描述给相关的网络专家,传给他们抓包文件,专家一看到准确的抓包文件,就可以很快解决问题了!
可惜的是,抓包的技巧无法像网络分析那样可以通过文章来出谜题,来让读者小试牛刀。所以,这篇文章就来写一下一些常用的抓包方式和技巧,希望能补齐这一块内容。
tcpdump 命令是我们最常用的抓包工具了1。
tcpdump -i eth0 icmp and host 1.1.1.1
这个命令就可以抓取到所有通过 eth0 去 ping 1.1.1.1 这个地址的包。
-i eth0 的意思是抓取指定的 interface,如果不指定,tcpdump 会默认选择一个。但是推荐每次都指定好这个参数,这样就没有不确定性了。如果使用 -i any 就可以抓取所有常规端口(文档的原文是 all regular network interfaces),但是什么属于「常规端口」就取决于操作系统的实现了。所以,建议也是如果要抓取多个 interface 来分析的话,就多开几个 tcpdump 进程,这样更加稳定一些。
这个参数非常有用,比如,在定位 ARP 问题的时候,我们需要确定每一个物理接口收发 ARP 的情况,就可以开多个进程分别 dump 每一个 interface 的网络;在定位 Linux 网络栈不通的情况时2,比如有 macvlan,vlan,veth 等复杂的 driver,可以用 tcpdump 对每一个接口 dump,看下包丢在哪里。
icmp and host 1.1.1.1 这个就是包过滤的表达式了,icmp 表示只抓取 icmp 协议,host 1.1.1.1 表示只抓取 src ip 或者 dst ip 是 1.1.1.1 的包。这种包过滤表达式其实是 pcap-filter(7)3 提供的,所以要想看语法是怎么定义的,看 pcap-filter 的文档就可以了。pcap-filter 支持的语法很灵活,能做的事情很多,基本上想抓什么样的包都可以写出来。但是我们没有必要把所有的语法都记住,因为常用的抓包都是比较简单的。可以找一个 tcpdump exmaple4 看一下,基本就够用了。其次,我们一般不会直接从 tcpdump 就分析出来问题原因,所以这个语法最重要的作用是把我们想要的包抓到,然后为了抓包性能更高,抓包文件更小,我们想要对抓包定义的更精确一些。其实,多抓一些包也没有什么问题,如果不确定怎么过滤出来 TCP SYN+ACK 的包,那不妨就把所有的 SYN 包全抓到,然后再用 Wireshark 这种工具来分析吧。最后,我们现在有 AI 了,用 AI 来写 pcap-filter 也是一个不错的方法,因为这种语法难写,但是很容易验证正确性。
Tcpdump 一些常用的其他参数如下:
-n 不解析主机名和端口号,保留原始的数字-v, -vv, -vvv v 越多表示输出的信息越详细-c 5 表示抓到 5 个包之后就退出-e 显示二层的 link layer header,这样就可以看到 MAC 地址了-Q 可以指定抓包方向,可以选的有 in, out, inout-A 可以展示包的内容,tcpdump 默认是只根据不同的协议展示 header 信息的。在线上排查问题的时候,我们往往需要通过特殊请求的关键字来定位到单个请求的情况进行排查,这样 -A 展示出来包的内容就格外有用。
这里分享一个特殊的技巧,就是发标记请求来定位问题。比如 A 通过 B 代理发请求给 C,现在网络不通,我们要定位 B 收到了请求没有,才知道是 B 的问题还是 C 的问题。但是 B 本身就有很多线上流量,怎么知道 A 发送的请求到达 B 了没有呢?我们可以在 B 进行 tcpdump:tcpdump -i eth0 tcp | grep asdf123 -A 10,然后我们从 A 发送一个请求:curl http://host-C.com/asdf123。asdf123 就是我们在请求里面放上的标记,如果 B 能够正常转发,我们就可以 match 到这个请求。当然了,这种技巧只适用于 HTTP 这种明文协议。
有些问题很难直接在 tcpdump 的终端分析出来问题,比如涉及 sequence number 分析的,重传分析之类的,我们需要人工对比 seq number,真是一项费眼睛的工作!所以如上所说,我们也经常在机器上用 tcpudmp 抓包保存成 .pcap 文件,下载到本地用 Wireshark 分析。Wireshark 就可以自动根据 sequence number 告诉我们重传等信息了!
具体的操作方式是,用 tcpdump -i eth0 -w file.pcap icmp 来进行抓包,-w file.pcap 表示把抓包文件保存为 file.pcap,抓包结束后,就可以把这个文件用 rsync 或者 scp 下载到本地,用 Wireshark 打开了。
.pcap 文件是一种标准的二进制抓包文件5,很多抓包分析工具都支持这种格式的解析,比如 tcpdump, wireshark, scapy 等等,如果想写代码进行更加定制化的分析,也可以用已有的库6解析,就如同用 json 库来解析 json 文件一样。

使用 -w 写入文件的时候有一个小问题,就是 tcpdump 原本的到终端的输出没有了。有两种方式可以解决,第一种是用 tcpdump 自带的 --print 功能:
tcpdump -i eth0 -w file.pcap --print
--print 会让 tcpdump 把内容输出到屏幕,即使当前使用了 -w 参数。
第二种就是用 tee,在写入文件的同时,也写入到 stdout。
tcpdump -i eth0 -U -w - | tee test.pcap | tcpdump -r -
其中,第一个 tcpdump 把抓包文件写入到 stdout(-w stdout,注意其中的 -U 表示按照 packet buffer,即来一个 packet 就输出一个到 stdout,而不是等 buffer 满了才进行输出),然后 tee 这里做了分流,把 stdin(tcpdump 的 stdout)同时输出到文件和 stdout。由于这里的 stdout 是 tcdpump 输出的二进制抓包内容,所以我们需要再用 tcpdump 解析这个二进制内容,-r - 表示从 stdin 读入。
还有一个技巧是 -s 参数,默认情况下 tcpdump 会保存所有抓到的内容,但是在分析某些问题的时候,尤其是 TCP 性能问题,我们其实不需要 TCP 传输的 payload 内容,只看 TCP 包的 header(序列号部分)就知道传输的速度了,所以可以用 -s 40 来只抓取前 40 个 bytes,有了 IP header 和 TCP header,就足够分析了。(如果担心有 TCP option 的存在,可以用 -s 54)
知道包是从哪里抓到的,很重要。在排查问题的时候,拿到抓包文件,应该第一时间确认抓包的位置。否则,就可能连自己看到的问题是现象还是根因都分不清楚。建议在复杂的结构中画一个拓扑图来对照分析,在定位 Linux 网络栈的问题时,如果接口拓扑非常复杂,也建议画一个拓扑图来分析。
可以从网络的多端抓包对照分析。发送端的抓包不一定等于接受端,尤其分析 TCP 问题的时候。可以同时在发送端和接收端进行抓包,然后对照分析。
在使用 tcpdump 的时候,要尤其注意,我们抓到的包已经经过了网卡驱动的处理,网卡驱动经常会帮 CPU 做一些 offload 的工作,比如把可能因网卡的 GRO/LRO 等特性,导致多个小包在抓包时被合并为一个较大的数据包,或者网卡帮助卸载了 vlan tag 等,我们用 tcpdump 抓到的包不一定是真正在网络上传输的包7。要格外注意。
注意抓包不要抓重。比如有人很喜欢用 tcpdump -i any ... 抓全部的包回来慢慢分析。然后下载下来抓包文件就吓坏了——重传率高达 50%!

在 Linux 中的网卡配置有 slave 和 master 的时候很容易发生这种情况,比如有 bonding 配置8,-i any 会从 slave 抓包包,从 master 又抓到一次,然后在 Wireshark 看来,所有的包都被重传了。实际是同一个包先后经过 slave 和 master 而已。
抓包的时候最好把相关 host 的 ICMP 协议包也一起抓了。因为 ICMP 是重要的 control message,TCP 在传输的时候,不光有 TCP 协议,可能还会用 ICMP 协议来传递一些信息。比如 PMTUD9,以及之前遇到过的这个问题10,都是涉及到 ICMP 包。如果只按照 TCP 协议来抓包,那这个重要的信息就错过了。
除了我们熟悉的 Linux 抓包,其实网络设备上也可以抓包的。我们一般叫它「端口镜像」技术,故名思义,原理就是把网络设备的一个端口的流量全部复制到另一个端口,而另一个端口连接的就是我们的抓包程序。

︎
︎
︎
︎
︎
︎
︎
︎
︎
︎这篇文章是计算机网络实用技术系列文章中的一篇,这个系列正在连载中,我计划用这个系列的文章来分享一些网络抓包分析的实用技术。这些文章都是总结了我的工作经历中遇到的问题,经过精心构造和编写,每个文件附带抓包文件,通过实战来学习网路分析。
如果本文对您有帮助,欢迎扫博客右侧二维码打赏支持,正是订阅者的支持,让我公开写这个系列成为可能,感谢!
没有链接的目录还没有写完,敬请期待……
与本博客的其他页面不同,本页面使用 署名-非商业性使用-禁止演绎 4.0 国际 协议。
以太坊(Ethereum)是一个开源的区块链平台,它允许开发者构建去中心化应用程序(DApps)和智能合约(Smart Contract)。以太坊目前使用权益证明(PoS)共识机制。与PoW共识机制不同,PoS允许用户暂时锁定32个ETH成为验证节点,而不需要昂贵的挖矿设备。这将使更多的人能够参与到以太坊网络中,从而提高其去中心化程度和安全性。
去年以太坊社群经过数年的开发和测试成功实施了重大升级,即以太坊合并。在2020年,以太坊推出采用权益证明共识机制的信标链(Beacon Chain),开始与以太坊主链并行运作。权益证明共识机制(Proof of Stake)是指通过让网络节点锁定加密货币的方式来替代矿工挖矿,从而维持区块链网络正常运作和处理交易。这种机制消除了挖矿所需的大量能源和成本,旨在将以太坊的能源消耗降低99.9%以上。
信标链成功运作一段时间后,以太坊区块链顺利合并。简单来说,以太坊合并即是将以太坊原本的执行层 (execution layer),与新的权益证明共识层(即“信标链beacon-chain”)结合起来。
在以太坊采用权益证明机制下,成为以太坊网络的验证节点并生产区块的门槛之一是要通过以太坊智能合约锁定至少32个以太币(也称为“质押”)。此外,在市场上还出现了多家质押服务提供商,它们接受用户将以太币委托给服务商进行锁定并提供奖励。在权益证明机制下,验证节点负责验证交易、保护以太坊区块链的正常运作。这种设计消除了像“工作量证明”(Proof-of-Work)挖矿模式这样需要大量能源支持的方式,旨在使以太坊的能源损耗降低99.9%以上。
以太坊合并的技术难度甚大、堪比为持续飞行中的火箭更换引擎。在2022年9月15日,以太坊顺利实行合并。完成后,以太坊就迎来下一个重大更新:上海升级 (Shanghai Upgrade),主要旨在让已质押的以太币可以开放提币。
其中,以太坊上海升级(EIP-4895)是推进这一转变的关键步骤之一。该更新将允许抵押ETH的用户提取其资金,这将释放巨额流动性,并对以太坊市场产生积极影响。此外,该更新还带来了其他改善与变化,从整体上进行了EVM虚拟机优化以及开放了信标链的质押提币。
首先,在上海升级后,得益于ETH基础能力的提升,Gas 花费会减少,不管是撸空投还是卷小图片,省钱了。
上海升级允许抵押ETH的用户提取他们的资金,这释放了大量流动性,并有助于解决以太坊的流动性问题。目前通过(Lido、Kraken、Binance、Coinbase)质押数目大于1498万,占总供给量的13.23%,成为潜在的抛压,所以在上海升级后可能会导致ETH价格的波动,因为更多的ETH将被释放到市场上(每日最多解锁5.04万枚的潜在抛压),同时,由于链上活动更为频繁,ETH更加通缩,反而有可能推动币价上升。
文章说明了上海升级对普通用户的影响。抵押ETH的用户现在可以随时提取他们的资金,而不必等待整个周期结束。对于那些使用抵押产品的用户来说,他们也可以享受到这一好处。对于持有ETH的投资者来说,他们需要密切关注市场情况,尤其是当更多的ETH被释放到市场上时。
上海升级,依旧是作为币圈在近期市场上的最大叙事和公众预期。同时升级附近消息日鸡飞狗跳,空头被拉爆,多头被活埋可能会在同一填发生。
以太坊(ETH)上海升级是什么意思?最先出现在Moby。