第十七章 路由交换机编程

来源:互联网 发布:油性漆与水性漆 知乎 编辑:程序博客网 时间:2024/06/05 19:33

                第十七章    路由交换机编程


     MTU = 64KB 毕竟是理想,现阶段实现起来还是有难度;牵涉到较多问题,与大网同步、流量平衡、时隙交换等。所以,APO还是决定MTU = 48E = 1536B,包含头部2E、帧同步头8B、尾部CRC的4B等;数据包的有效内容(不含头部)为45E = 1440B。头部2E = 64B,其中MAC头14B、IP头18B、TCP/UDP/ICMP头32B。
 
    二层交换机是以存储转发为主设计,三层以上的交换机是以256位差分总线的时隙交换为主设计。我们知道SATA3.0的差分串行总线速度可达6GBPS,理论上256位的就可到1.5Tbps;或说是6GE/s。那么,传送最大48E的一个数据包,需时隙48E/6GE/S = 8ns;上级端口2个、下级端口48个,我们需要50个时隙做时分交换。在50个时隙的400ns时间里,有50个数据包做交换(读、写),理论上就可到达1.25亿个数据包/s的速度。端口速度平均是30Gbps,在骨干网使用时、可以使端口数减少来提升速度,比如15个端口,那么端口速度就可达到100Gbps。使用增加总线数为512对有难度,另一种方法就是增加时钟频率,使差分串行总线速度达12GBPS;这样、速度就可快一倍;背板速度可到3000Gbps。嗯、画出来,和做出来是不一回事!要知道光的速度也就1ns走0.3米,必须把端口、总线都集成到一片IC才可能,让电子走的距离是微米级,这样、时钟同步、串-并转换等问题才能解决;还需有光-电、电-光转换电路。成本飞涨,这是专业钉子户的事情、本文不讨论。

一、端口硬件设计

     不用说,必定有端口接收电路:串到256位并的转换、最少48E的接收缓冲、数据包IP头1E的硬件判断和中断电路、256位差分总线接口、控制电路等。那同样有端口发射电路:256位并到串的转换、最少48E的发射缓冲、数据包IP头的目标和源反转电路和中断电路、256位差分总线接口、控制电路等。

1、硬件判断和中断电路

    每一个端口都有一个标志寄存器FLAG,低16位中的低8位是本端口号、高8位是需转发到的另一个端口号,高16位是标志;所有的标志都是硬件产生的。FLAG.29-24有一位标志置1、则产生中断信号;对于二层交换机、中断信号传给CPU(使用存储转发机制);对于三层交换机、中断信号传给硬件总线时分交换控制器(为了速度、直接硬件处理)。

BU32  FLAG; // 端口标志寄存器。

FLAG.31  TLS; 1、为三层交换机,0、为二层交换机。

FLAG.30  FSP; 1、数据包从上级端口过来,0、数据包从下级端口过来。

FLAG.29  BTD; 如果数据包头EMAC.TYPE低11位长度值大于1536B、会置包太大标志

FLAG.28  ICMPAPO; 高5位是协议标识,如果是0、那么ICMPAPO标志置位。

FLAG.27  TTL0; 如果TTL-后为0,TTL0置1。

FLAG.26  DTP; 丢弃包标志;1、会使端口接收硬件复位,重新检测下一个帧头。

FLAG.25  TBE; 发送缓冲区空标志。

FLAG.24  DPHE; 数据包已经进入接收缓冲区、并到达电梯口(高速数据总线可读了)。

FLAG.23  DPBE; 数据包头2E已经进入接收缓冲区,且已经硬件检测到与另一个端口表的MAC地址符合;且TSOP = 0,另一个端口号在FLAG.15-8。

FLAG.22  TSOP; 如果数据包EMAC.DLADD != 本节点链路地址,且FSP = 0;那么往上级端口转发标志TOSP置位;如果TOSP AND FSP = 1,那么丢弃包标志置位。

FLAG.21  HTN; 如果TSOP= 0,是本网段的包且数据包的EMAC.MDA = 本节点MAC地址,那么、命中本节点标志HTN置位。如果HTN AND ICMPAPO = 1, 那么丢弃包标志置位。

FLAG.20  MF; 分段标志,0是最后分段或没有分段。

FLAG.19  SDI; 正在发送标志。

FLAG.18  RVI; 正在接收标志。

FLAG.17-16 RATA; 接收发送速率:10M/100M/1G/10Gbps。

FLAG.15-8  LPORTN; 需要转发的另一个端口号。

FLAG.7-0   PORTN; 端口号。0、1是上级端口,其它下级端口。

2、控制电路和差分总线接口

    对于二层交换机,就是CPU如何对端口收发缓冲区的读、写。对于三层交换机、就是在硬件总线控制器的指示下,端口收发缓冲区对分配的时隙进行读、写。


二、二层交换机的编程

    三层交换机是硬件实现的,本文不讨论。存储转发机制才需要CPU来操控,其实、我们不需要复杂的操作系统,只是简单的中断程序实现。中断源除了50个端口外,还有一个RS232/RS485、或MAC之类的控制端口、及定时器中断等。这里、不可能说得太详细,只是凭想象介绍。可以用32位的CPU、或单片机来具体实现。

Main{     // 主程序,占内存空间2W。

  init(); // 用户CPU初始化、片内RAM初始化、属性表初始化

L:

  JMP  L; // 无限循环。

}

//
   在CPU核内有50个端口标志寄存器,一个64位的端口中断寄存器。每个MAC端口都有一张端口 MAC地址表MAC_TAB:MAC地址、流量与活动标志、主机名字。

   50个端口的32位接收定时器、单位us,如果最高位为1(约36分钟)则会使相应端口的活动标志清0并产生向上级发有端口不活动的宣告报文的中断,指示该端口不通信;所以、从端口接收到一个数据包后、需要清0相应的活动定时器。

   50个端口的发送数据包缓冲队列,每个队列最少16个数据包、即占内存空间16*48E。端口接收了一个数据包,会判断其:是否丢弃、是否变成为差错数据包、是否ICMPAPO处理、如果是转发到另一个端口的某个MAC,该端口或MAC是否活动、否,发目标不可达到差错报文(如果是接入交换机则发用户主机不可到达、否发端口或网络不可到达差错报文);是活动,将该数据包从端口接收缓冲区拷贝加入到另一端口的发送队列(并打开发送缓冲区空的中断屏蔽)。如果是端口的发送缓冲区空中断,则查看相应端口的发送队列是否空、空则屏蔽该中断,有则拷贝一个数据包到相应的端口发送缓冲区,中断返回。
//

pirq{ // MAC端口中断程序,进入时、自动清除中断标志。代码量6W +

   BT1 FLAG.BTD, BTDICMP; // 跳发包太长差错ICMP报文并中断返回

   BT1 FLAG.ICMPAPO, ICMPIL; // 跳ICMPAPO处理。

   BT1 FLAG.TTL0, TTLICMP; // 跳发超时差错ICMP报文并中断返回

   BT1 FLAG.TBE, TBET; // 跳、拷贝一个数据包到端口发送缓冲区

   BT1 FLAG.DPBE, DPBET; // 跳、转发数据包到另一个端口。

   JMP TSOPT; // 跳、转发数据包到上级(0、或1)端口。
}

    简单介绍到此、后面的TCP/UDP/ICMP类的实现,还会详细说明。总之,交换机的编程是很简单的,加上流量控制、用户设置等,代码量估计也就约200行。

 

0 0