车载以太网中数据段的 帧结构
时间: 2024-12-31 19:18:26 浏览: 6
### 车载以太网数据段帧结构详解
车载以太网的数据传输基于IEEE 802.3标准,该标准定义了物理层和数据链路层的操作。对于车载环境中的应用,特别强调低延迟、高可靠性和实时性能的要求。
#### 帧头 (Preamble)
每一帧开始前都有一个7字节的前导码(Preamble),其作用是在接收方同步时钟频率并准备接受实际数据之前的状态调整[^1]。
#### 开始定界符 (Start Frame Delimiter, SFD)
紧跟在前导序列之后的是SFD字段,它标志着有效负载数据即将到达。这个字段长度为1字节,在大多数情况下固定值为`10101011`二进制数。
#### 目标MAC地址与源MAC地址
随后是目标设备的硬件(MAC)地址(6字节),接着发送者的硬件地址同样占用6个字节的空间。这些信息帮助网络识别消息的目的地以及来源位置。
#### 类型/长度字段
此字段可以有两种解释方式:
- 如果数值大于等于1536,则表示后面跟随的是上层协议类型;
- 若小于1536则代表整个数据部分的实际大小(不包括FCS校验位),单位为字节数。
#### 数据载荷 (Payload)
这是真正携带应用程序所需传递的信息的部分,最小尺寸为46字节,最大可达1500字节(对于标准Ethernet)。当数据量不足46字节时,会填充额外的零直到满足最低限度要求。
#### 填充 (Padding)
为了确保每帧至少有64字节长,如果原始数据加上其他所有头部信息后的总长度少于64字节,则会在payload后追加适当数量的null字符作为填充材料。
#### 帧检验序列 (Frame Check Sequence, FCS)
最后一项是用于错误检测目的而计算得出的一个四字节CRC冗余校验码。这有助于确认接收到的数据是否完好无损,并允许收件者验证所收到的内容准确性。
```python
class EthernetFrame:
def __init__(self, dst_mac, src_mac, payload):
self.preamble = b'\x55' * 7 # Preamble
self.sfd = b'\xD5' # Start Frame Delimiter
assert len(dst_mac) == 6 and len(src_mac) == 6, "Invalid MAC address length"
self.dst_mac = dst_mac # Destination MAC Address
self.src_mac = src_mac # Source MAC Address
if isinstance(payload, int):
self.type_length = payload.to_bytes(2, byteorder='big')
self.payload = None
elif type(payload).__name__ in ['bytes', 'bytearray']:
pl_len = len(payload)
if pl_len >= 1536:
raise ValueError("Payload too large for a single frame")
self.type_length = pl_len.to_bytes(2, byteorder='big') if pl_len < 1536 else \
struct.pack('!H', socket.htons(pl_len))
self.payload = payload
padding_needed = max(0, 64 - sum([len(x) for x in [
self.preamble,
self.sfd,
self.dst_mac,
self.src_mac,
self.type_length,
self.payload or b''
]]))
self.padding = bytes(padding_needed)
crc_data = b''.join([
self.preamble,
self.sfd,
self.dst_mac,
self.src_mac,
self.type_length,
self.payload or b'',
self.padding
])
self.fcs = binascii.crc_hqx(crc_data, 0xFFFF).to_bytes(4, byteorder='little')
@property
def full_frame(self):
return b''.join([
self.preamble,
self.sfd,
self.dst_mac,
self.src_mac,
self.type_length,
self.payload or b'',
self.padding,
self.fcs
])
```
阅读全文