为了方便定位区分性能瓶颈所在,也为了方便测试网络稳定性,对网络的分层测试尤为重要,特别是针对RTOS。
前言:
OSI的7层模型大而全,但也比价复杂,而且是先有了理论模型,没有实际应用。TCP/IP的四层模型是从实际应用发展总结出来的。他包含了如下层次:
应用层
传输层
网络层
物理+数据链路层
从实质上将TCP/IP只对最上面三层进行了定义,最下面的MAC+LLC层,TCP/IP参考模型并没有真正描述这一层的实现,只是要求能够提供给上层----网络互连层一个访问接口,以便为期向上传递IP分组。
MAC层测试
理论依据:
以太网是目前最流行的一种局域网组网技术,以太网技术的正式标准是IEEE 802.3标准,他规定了在以太网中传输的数据帧结构,如下所示:
前同步码 | SFD |目的地址 | 源地址 | 长度/类型 | 数据和填充 | CRC
7字节 | 1字节 | 6字节 | 6字节 | 2字节 | 46-1500字节 | 4字节
从物理层看,一个完整的以太网帧有7个字段,而事实上,前两个字段是以太网控制器在数据传输时自动加上去的。
在以太网帧中,目的地址可以分为三类:单播地址、多播地址、广播地址。单播地址与一个具体的以太网卡的MAC地址相对应,它要求第一个字节的bit0(最先发出出去的位)必须是0,;
多播地址则要求第一个字节的bit0是1;这样,在网络上中,多播地址不会和任何网卡的MAC地址冲突,多播数据可以被多个网卡同时接收;广播地址的所有位(48位)都是1,同一局域网中的所有网卡可以接收网络数据包。
上面的长度/类型有两个意义,当它的值小于1518的时候,代表是长度,如果大于,则表示该以太帧的数据属于哪个上层协议(例如0x800,代表IP数据包;0x806,代表ARP数据包)
驱动只需要将目的地址 | 源地址 | 长度/类型 | 数据和填充这些值写入网卡驱动(LLC控制器),网卡MAC层会自动填充另外三个字段,将数据帧发送出去;在接收数据时,控制器会自动截取这四个字段放到sram中给控制器读取。
数据链路层分为上层LLC(logic links control,逻辑链路控制)和下层MAC(媒体访问控制)。
实验:
根据源MAC和目的MAC构造以太帧,写入到MAC层驱动,MAC地址是初始化的时设置的:
static unsigned char eth_frame_src[6+6+2+1475] = {
0x00, 0x55, 0x7B, 0x5C, 0x6D, 0x7F, // 目的MAC地址
0x00, 0x55, 0x7B, 0xB5, 0x7D, 0xF7, // 源MAC地址
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //数据域随意给
}
static unsigned char eth_frame_dst[6+6+2+1475] = {
0x00, 0x55, 0x7B, 0xB5, 0x7D, 0xF7, // 目的MAC地址
0x00, 0x55, 0x7B, 0x5C, 0x6D, 0x7F, // 源MAC地址
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, //数据域随意给
}