计算机网络_以太网帧中的前导码和帧间隙

以太网帧长中的前导码和帧间隙

1 、概述

目前出现三个bug都涉及到L1和L2限速不准确的问题:在计算网络带宽时,报文设置的越小,差距就越大。
这个问题几乎所有新手都会遇到,在此梳理一下,以此与该问题做个了断。

2、以太网帧格式

首先弄清楚以太网帧格式,其包含:Preamble、SFD、帧长和IFG,帧格式如图1 所示,图2是以太网帧长部分包含字段。
图1 以太网帧长
图2 以太网帧长部分包含字段
平常所说的帧长是图2包含的内容,而不包含Preamble、SFD 和IFG这三个字段,那这三个字段是什么意思呢?下面分别说明。

  1. Preamble ,前导码	
    

Preamle包含7个字节,由10循环组成,每个字节内容为:10101010。七个字节的前导码内容如图3所示。
图3  7个字节前导码
Preamle的作用是在发送方和接收方之间进行时钟同步。当发送方发送数据时,加上这7个字节的前导码作为报文首部,发送给接收方;当接收方收到10101010时,会按照协议规定,调整自己的字节时钟,准备接收发送方来的数据。
2. SFD(start of frame delimiter)
SFD翻译为:帧开始定界符,长度为1B,内容为10101011.这段代码的意思是通知接收方,当收到11后边的内容时,不是同步信号了,是真正的数据了。
通常说的前导码包含了Preamle和SFD,一共8字节,但实际上是7+1,知道每个字节的作用即可。
3. IFG(inter Frame Gap)
IFG中文翻译为“帧间隙”,它表示两个Frame之间相隔大小。发送端发送完一个Frame之后,不会立即发送下一个,而是等待IFG时间之后才继续发送。
最小的帧间隙是12Byte,即等待12字节时间之后再发送下一帧,这与CSMACD特性有关,避免冲突。

3、以太网带宽计算

图4是经典的FPS和带宽的关系图。
图4 带宽和FPS关系图,来源网络
计算上面图的帧(Frame)数量时,首先明确如下转换:
4. 1. 10M=10^7bps,
5. 2. 64Byte+20(12+8帧间隙)=84Byte=848=672b,即一个64B的帧,加上帧间隙后为672b。
6. 3. 同理,128B+20=148
8=1184b,一个128B的帧,加上帧间隙后为1184b。
从上图中可以看出,10M速率64B的帧对应的帧数量为:10^7/672=14880,100M对应的帧数量为148809,从testcenter测试仪中可看出。
图5 testcenter测试仪验证

3.1 完整帧长度

带宽指的是1s内处理的bit数量,公式为:带宽=速率帧长度。
以64B的帧长度为672,10M的速率的帧数量为:14881,根据公式:带宽=14881
672=10 000 032=10M;同理148809*672=99 999 648 = 100M
图6 Testcenter上验证

3.2 普通帧长度

假设我们不加上前导码和帧间隙,64B=648=512b;
10M对应的实际带宽为:带宽=512
14881=7 619 072=7.6M。
这种方式计算出的值有一个专有名词,以太网有效负载带宽,它表示传输传输10M数据,有效内容只有7.6M,其他的都是以太网的消耗。
图7 Testcenter上验证

4. TestCenter上L1和L2速率

L1指的是物理层速率,即加上帧间隙的速率;
L2(Total Tx(Rx) Rate)实际指的是L2速率(去掉帧间隙和前导码),即数据链路层的速率。

5. 总结

  1. 完整的帧长度包含8字节前导码和12字节空闲帧;
  2. 前导码用于同步接收方和发送方bit流,表示有效帧内容的考试;
  3. 计算带宽时,使用完整帧长计算出的带宽和有效帧长计算出的带宽不同。
  4. L1对应的是包含前导码和帧间隙的速率,如图6;L2对应的TotalTxRate(bps),不包含前导码和帧间隙的速率,如图7.
以下是一个基于Verilog语言实现的以太网CRC32校验电路,其包括了对输入信号的处理和对CRC32校验算法的实现。 ```verilog module crc32 ( input clk, // 时钟信号 input [7:0] rxd, // 以太网数据输入信号 input sop, // 头指示信号 input eop, // 结束指示信号 input rxdvld, // rxd有效指示信号 output reg [31:0] crc32 // CRC32校验结果输出 ); reg [7:0] shift_reg [0:31]; // 移位寄存器,存储CRC计算结果 reg [7:0] data_reg; // 数据寄存器,存储当前输入数据 reg [7:0] poly = 8'h04c1; // CRC多项式,对应IEEE 802.3标准 reg [4:0] bit_cnt = 5'h00; // 移位计数器,用于指示当前移位的位数 reg [4:0] byte_cnt = 5'h00; // 字节计数器,用于指示当前输入的字节数 reg [31:0] crc = 32'hffffffff; // 初始值,对应IEEE 802.3标准 always @(posedge clk) begin // 处理头信号,重置计数器和CRC寄存器 if (sop) begin byte_cnt <= 5'h00; bit_cnt <= 5'h00; crc <= 32'hffffffff; for (int i = 0; i < 32; i = i + 1) begin shift_reg[i] <= 8'h00; end end // 处理数据输入信号 else if (rxdvld) begin // 将输入数据存入数据寄存器 data_reg <= rxd; // 将数据寄存器的值送入移位寄存器的第0个元素 shift_reg[0] <= data_reg; // CRC计算 for (int i = 0; i < 8; i = i + 1) begin if ((crc & 32'h80000000) == 32'h80000000) begin crc = {crc[30:0], 1'b0} ^ poly; end else begin crc = crc << 1; end end crc = crc ^ shift_reg[31]; // 移位寄存器移位 for (int i = 31; i > 0; i = i - 1) begin shift_reg[i] <= shift_reg[i - 1]; end // 更新计数器和CRC寄存器 bit_cnt <= bit_cnt + 5'h01; if (bit_cnt == 5'h08) begin byte_cnt <= byte_cnt + 5'h01; bit_cnt <= 5'h00; end if (eop) begin crc32 <= ~crc; end end end endmodule ``` 该电路通过处理输入的头指示、结束指示和数据有效指示信号,实现了对以太网数据包的处理和CRC32校验算法的实现。其,移位寄存器存储了CRC计算结果,数据寄存器存储了当前输入的数据,多项式poly对应了IEEE 802.3标准的CRC多项式。在每个时钟上升沿时,电路会将当前输入的数据存入移位寄存器,并进行CRC计算和移位操作,最终输出CRC校验结果。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值