以太网帧格式
" 以太网是一种计算机局域网技术。IEEE组织的IEEE 802.3标准制定了以太网的技术标准,它规定了包括物理层的连线、电子信号和介质访问层协议的内容。以太网是目前应用最普遍的局域网技术,取代了其他局域网技术如令牌环、FDDI和ARCNET。" -- Wiki百科
从 Xerox 公布的 Ethernet I 发展到现在,有过6种以太帧格式:
- Ethernet I
- Ethernet II
- Ethernet 802.3 raw
- Ethernet 802.3 SAP
- 802.3/802.2 LLC
- 802.3/802.2 SNAP
其中主流应用的是 Ethernet II、802.3/802.2 LLC、802.3/802.2 SNAP 这三种,最常用的是 RFC894 定义,也就是 Ethernet II 的帧格式。
Ethernet II
![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2019/11/1/16e26d2f4fad6759~tplv-t2oaga2asx-jj-mark:3024:0:0:0:q75.png)
- 目标 MAC 地址:6个字节(48位),发送时会先检查目标 MAC 的地址,与当前适配器的物理地址是否一致,不一致就丢弃;
- 源 MAC 地址:6个字段(48位),发送帧的网络适配器物理地址
- 类型:上层协议的类型,常见的有,0x0800 表示是 IPV4 协议,0x0806 表示是 ARP 协议,0x86DD 表示是 IPV6 协议,更多详见
- 数据报文:最小 46 字节,最大 1500 字节(MTU)
802.3/802.2 LLC
![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2019/11/1/16e26d2f4fed9268~tplv-t2oaga2asx-jj-mark:3024:0:0:0:q75.png)
- DASP:1个字节,目的服务访问点
- SSAP:1个字节,源服务访问点
将 Ethernet II 帧头的
类型
字段替换为帧长度
,并且因为新增加了 DASP, SSAP,Control这三个各占1字节的字段,报文的长度也调整为:43~1497,它们三个字段作为 LLC 的头
802.3/802.2 SNAP
![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2019/11/1/16e26d2f5014f7c4~tplv-t2oaga2asx-jj-mark:3024:0:0:0:q75.png)
- 类型:2个字节,不同于 Ethernet II 的类型字段
- OUI ID:3个字节,通常都为 0 数据报文变为:38~1492字节
Ethernet 帧,从最上层(应用层)发送的数据单元(PDU),每经过一层,都会把上层整个的 PDU 作为下层 PDU 的 data 域,然后加上 自己的协议头;接受端,同下而上的层层拆掉每层的头部。了解了这些,我们尝试抓包具体分析每个字段
Tcp 报文
$ tcpdump -i eth1 port 9527 -s 0 -w ./target9527.cap
用 wireshark
打开抓到的二进制报文,如图所示:
![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2019/11/1/16e26d2f4f7013a2~tplv-t2oaga2asx-jj-mark:3024:0:0:0:q75.png)
建立连接
Frame 1,表示第1帧,源ip和目的ip分别是:172.24.31.67 和 10.96.77.128,都是内网ip。
![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2019/11/1/16e26d2f5005a490~tplv-t2oaga2asx-jj-mark:3024:0:0:0:q75.png)
- type:0x0800 表示 IPV4
- 源 MAC 地址:04:25:c5:83:f5:64
- 目标设备mac地址:5e:38:57:10:84:d9
- Flags:0x4000,没有拆包,如果请求报文大于 MTU,会拆多次发送
- Times to live:ttl,存活时间,数据包每经过一个三层路由器设备时,ttl域的值减1,当其存活次数为0时,便会取消数据包的转发。ttl,默认值是64,如下图,经过 14 次到达目标ip,所有64-13=51
- SYN:1,表示 请求及建立连接,包括剩下的两次握手请求包
发送数据包
![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2019/11/1/16e26d404ed98bda~tplv-t2oaga2asx-jj-mark:3024:0:0:0:q75.png)
![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2019/11/1/16e26d329b2c8964~tplv-t2oaga2asx-jj-mark:3024:0:0:0:q75.png)
- 在 GET 请求时,设置了标志位 ACK 和
PSH
,PSH
是告诉接收端,立即交由应用层处理而不必等到Recv socket buffer
写满 - 接收端回复 ACK 和 Seq number,接收端和发送端同样会再回复一个
PSH
标记的包,要求立即处理 - 最后,应用层通过 HTTP 协议回复报文,在回复报文时,这里要注意还有个标志位,在报文中,FIN=1,表示在返回的同时请求关闭连接
断开连接
![](https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2019/11/1/16e26d3492beff07~tplv-t2oaga2asx-jj-mark:3024:0:0:0:q75.png)
- Frame 8 和 Frame 9,分别回复的是,Frame 6
PSH
标志位的请求和 Frame 7 的 HTTP 请求 - Frame 10 是连接另一边发起了关闭连接的请求,标志位 FIN=1
- Frame 11 是发起关闭请求方,回复上一个 FIN=1 的 ACK 请求包
四次挥手全部结束。有同学可以会比较疑惑,不是应该是4次请求吗,这里只有三次。解释下这个问题:因为服务端在响应HTTP请求时,因为知道自己已经发送完全部数据,所以在响应包里加上了四次挥手中的第一次 FIN=1 的请求。