从 Ethernet 到 TCP

2019-11-01 19:56:07 +08:00
 such

以太网帧格式

" 以太网是一种计算机局域网技术。IEEE 组织的 IEEE 802.3 标准制定了以太网的技术标准,它规定了包括物理层的连线、电子信号和介质访问层协议的内容。以太网是目前应用最普遍的局域网技术,取代了其他局域网技术如令牌环、FDDI 和 ARCNET。" -- Wiki 百科

从 Xerox 公布的 Ethernet I 发展到现在,有过 6 种以太帧格式:

其中主流应用的是 Ethernet II、802.3/802.2 LLC、802.3/802.2 SNAP 这三种,最常用的是 RFC894 定义,也就是 Ethernet II 的帧格式。

Ethernet II

802.3/802.2 LLC

802.3/802.2 SNAP

Ethernet 帧,从最上层(应用层)发送的数据单元( PDU ),每经过一层,都会把上层整个的 PDU 作为下层 PDU 的 data 域,然后加上 自己的协议头;接受端,同下而上的层层拆掉每层的头部。了解了这些,我们尝试抓包具体分析每个字段

Tcp 报文

$ tcpdump -i eth1 port 9527 -s 0 -w ./target9527.capwireshark 打开抓到的二进制报文,如图所示:

建立连接

Frame 1,表示第 1 帧,源 ip 和目的 ip 分别是:172.24.31.67 和 10.96.77.128 ,都是内网 ip。

发送数据包

从 Frame 4 至 Frame 7 是建立连接后,发送具体请求的数据包。首先,发送了 HTTP 协议的 GET 请求,收到请求后回复了 ACK。具体看下:

断开连接

tcp 连接是双工的,所以任何建立连接的双方都可以发起关闭连接的请求。自己之前面试也总喜欢问这些问题,看看候选人到底理解的是否透彻, 可是大多数都不怎么清楚。言归正传,剩下的 Frame 8 至 Frame 11 是回复详情的 ACK 和 端开连接的 tcp 包。

四次挥手全部结束。有同学可以会比较疑惑,不是应该是 4 次请求吗,这里只有三次。解释下这个问题:因为服务端在响应 HTTP 请求时,因为知道自己已经发送完全部数据,所以在响应包里加上了四次挥手中的第一次 FIN=1 的请求

1920 次点击
所在节点    程序员
10 条回复
fvckDaybyte2
2019-11-02 11:34:43 +08:00
为什么用 tcpdump 抓而不是 wireshak 命令,这两个命令功能上有区别吗?
julyclyde
2019-11-04 17:58:19 +08:00
错误比较多啊
TTL 不在传输层而是三层
TCP 的叫 segment 而不是 datagram
such
2019-11-06 17:23:23 +08:00
@julyclyde 首先,我没有说 ttl 在非三层。而且全篇文章,也没有提到 tcp 的 segment,不知您是怎么得到的错误结论?
such
2019-11-06 18:01:27 +08:00
@fvckDaybyte2 server 端不在本机,没法直接用 wireshak 抓
julyclyde
2019-11-07 10:08:46 +08:00
@such 确实没提到 tcp 的 segment 啊,你说的是“tcp 报文”
julyclyde
2019-11-07 10:16:08 +08:00
@fvckDaybyte2 wireshark 依赖于 Xwindow,而 lz 不会做远程 X 显示
fvckDaybyte2
2019-11-07 10:34:34 +08:00
@julyclyde wireshark 命令行版本也会依赖 xwindow ?并没有界面啊……
such
2019-11-07 14:26:06 +08:00
@julyclyde 通篇仔细校验了一遍,讲真,没找到哪里有错误
such
2019-11-07 14:31:29 +08:00
@fvckDaybyte2 没所谓的,我没用过 wireshark 的命令行工具,但是从 tshark,tcpdump,这些应该差别都不太大,底层应该都是依赖 Unix 的 libpcap 库
julyclyde
2019-11-10 13:26:47 +08:00
@fvckDaybyte2 wireshark 的命令行版不依赖 x 的,只很少有人用吧。用那个 tshark 还不如 tcpdump 呢,至少参考资料一抓一大把。用 wireshark 主要就是为了它的交互式展现能力

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/615395

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX