zoukankan      html  css  js  c++  java
  • 千兆以太网(1):网络基础知识

      计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备,通过通信线路连接起来,在网络操作系统、网络管理软件及网络通信协议的管理和协调下,实现资源共享和信息传递的计算机系统。计算机网络类型的划分标准各种各样,按网络所覆盖的地理范围的不同,计算机网络可分为局域网(LAN)、 城域网(MAN)、广域网(WAN)、互联网(Initernet)。局域网按传输介质所使用的访问控制方法可分为:以太网(Ethernet)、光纤分布式数据接口(FDDI)、异步传输模式(ATM)、令牌环网(Token Ring)、交换网(Switching) 等,它们在拓朴结构、传输介质、传输速率、数据格式等多方面都有许多不同,其中应用最广泛的当属以太网。

      以太网是为了实现局域网通信而设计的一种技术,它规定了包括物理层的连线、电子信号和介质访问层协议的内容。以太网根据最大传输速率的不同可以分为标准的以太网(10Mbit/s)、快速以太网(100Mbit/s)、千兆以太网 (1000Mbit/s)和万兆以太网(10Gbit/s)。百兆网和千兆网是目前应用最多的,顾名思义,百兆网的最大传输速率为 100Mbit/s,需要注意的是,我们常见的网速的单位是 MByte/s,而 1Byte 为 8bit,所以百兆网能达到的最大网速为 12.5MByte/s。同理,千兆网的最大传输速率为 1000Mbit/s,能达到的最大网速为 125MByte/s。

    一、计算机网络体系结构模型

      国际标准化组织(ISO)在 1978 年提出了“开放系统互联参考模型”,即著名的 OSI/RM 模型(Open System  Interconnection/Reference Model)。它将计算机网络体系结构的通信协议划分为七层,自下而上依次为:物理层(Physics Layer)、数据链路层(Data Link Layer)、网络层(Network Layer)、传输层(Transport Layer)、会话层(Session Layer)、表示层(Presentation Layer)、应用层 (Application Layer)。下面 4 层主要提供数据传输和交换功能,即以节点到节点之间的通信为主;第 4 层作为上下两部分的桥梁,是整个网络体系结构中最关键的部分;上 3 层则以提供用户与应用程序之间的信息和数据处理功能为主。

      除了标准的 OSI 七层模型以外,常见的 网络层次划分还有 TCP/IP 四层协议,它们之间的对应关系如图所示:

      不管是 OSI 七层模型还是 TCP/IP 的四层模型,它们每一层中都有自己的专属协议,需要完成相应的工作以及与上下层级之间进行沟通。由于目前 TCP/IP 协议已经成为 Internet 中的【通用语言】,任何和互联网有关的操作都离不开 TCP/IP 协议,没有它我们就根本不可能上网,所以下面就以 TCP/IP 协议为主来进行讲解。

    • 应用层:为操作系统或网络应用程序提供访问网络服务的接口,主要协议有文件传输协议(FTP),超文本传输协议(HTTP),简单邮件传输协议(SMTP),远程登录(Telnet);
    • 传输层:为两台主机上的应用程序提供端到端的通信,在 TCP/IP 协议簇中,有两个不同的传输协议:TCP(传输控制协议)和 UDP(用户数据报协议),它们分别承载不同的应用。TCP 协议是一种面向连接的传输,能够提供可靠的字节流传输服务,UDP 协议是一种简单的面向数据报的传输层协议,与 TCP 协议不同的是 UDP 无法保证数据报文准确达到目的地。
    • 网络层:负责提供基本的数据封包传送功能,让每个据包都能够到达目的主机,主要协议有 IP 协议(网际协议)、ICMP 协议(Internet 互连网控制报文协议)、ARP/RARP (地址解析/反向地址解析协议)以及 IGMP 协议(Internet 组管理协议)。
    • 网络接口层:通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡,它们一起处理与电缆的物理接口细节,主要协议有:以太网、令牌环、帧中继等;

      从该图中可以看出,当主机 A 向主机 B 发送数据时,用户数据将由应用层产生;当用户数据在经过传输层时,传输层对用户数据进行封装,在用户数据的基础上添加了一个 TCP/UDP 首部数据,此时数据包变成了 TCP/UDP 段;当它经过网络层时,网络层对 TCP/UDP 段进行封装,在 TCP/UDP 段的基础上添加了一个 IP 首部数据,此时 TCP/UDP 段变成了 IP 数据报;当 它经过网络接口层时,网络接口层对 IP 数据报进行封装,在 IP 数据报的基础上添加了以太网首部数据和以太网尾部(一般为 4byte CRC校验值)两个数据,此时 IP 数据报变成了以太网帧。由此可以看出,数据经过层层封装成帧后发到传输介质上,到达目的主机后每层协议再剥掉相应的首部数据,最后将应用层数据交给主机 B 处理。

    二、以太网帧结构

      以太网类型有很多种,如下所示:

       TCP协议比较难设计,这里仅说明 IP 协议的 UDP协议,顺便说一下简单的 ARP协议。如下图所示(单击图片可放大),上半部分为 IP - UDP 协议,下半部分为 ARP 协议,一图说明所有。

    1、前导码(Preamble)

      为了实现底层数据的正确阐述,物理层使用7个字节同步码(7个55),二进制表现为 0 和 1 交替,其作用是使发送方和接收方的时钟同步。

    2、帧起始界定符(SFD,Start Frame Delimiter)

      使用1个字节的SFD(0xd5),二进制表现为“10101011”,用来表示一帧的开始,即后面紧跟着传输的就是以太网的帧头。

    3、以太网帧头

    (1)目的MAC地址

      即接收端物理MAC地址,占用6个字节。MAC地址从应用上可分为单播地址、组播地址和广播地址。单播地址:第一个字节的最低位为0,比如00-00-00-11-11-11,一般用于标志唯一的设备;组播地址:第一个字节的最低位为1,比如01-00-00-11-11-11,一般用于标志同属一组的多个设备;广播地址:所有48bit全为1,即FF-FF-FF-FF-FF-FF,它用于标志同一网段中的所有设备。

    (2)源MAC地址

      即发送端物理MAC地址,占用6个字节。

    (3)长度/类型

      长度/类型具有两个意义,当这两个字节的值小于1536(十六进制为0x0600)时,代表该以太网中数据段的长度;如果这两个字节的值大于1536,则表示该以太网中的数据属于哪个上层协议,例如0x0800代表IP协议(网际协议)、0x0806代表ARP协议(地址解析协议)等。

    4、数据段

      长度最小46个字节,最大1500个字节。

      长度最小46个字节,总的以太网帧长度最小为 64 个字节,其原因是因为以太网是不可靠的,这意味着它并不知道对方有没有收到自己发出的数据包,但如果他发出的数据包发生错误,需要进行重传。以太网的错误主要是发生碰撞,碰撞是指两台机器同时监听到网络是空闲的,同时发送数据就会发生碰撞,碰撞对于以太网来说是正常的。要保证以太网的重传,必须保证收到碰撞信号的时候数据包没有传完,要实现这一要求,发送方和接收方之间的距离很关键,也就是说信号在发送方和接收方之间传输的来回时间必须控制在一定范围之内。IEEE 定义了这个标准,一个碰撞域内最 远的两台机器之间的 round-trip time 要小于 512 bit time(传输一个比特需要的时间),这也是我们常说的一个碰撞域的直径。512 个 bit time 也就是 64 字节的传输时间,如果以太网数据包 ≥ 64 个字节就能保证碰撞信号到达发送方的时候,数据包还没有传完。最小数据帧的设计和以太网电缆长度有关,为的是让两个相距最远的站点能够感知到双方的数据发生了碰撞,最远两端数据的往返时间就是争用期,以太网的争用期是 51.2 us,正好发送 64byte 数据。

      最大值1500称为以太网的最大传输单元(MTU,Maximum Transmission Unit),之所以限制最大传输单元是因为在多个计算机的数据帧排队等待传输时,如果某个数据帧太大的话,那么其它数据帧等待的时间就会加长,导致体验变差。另外还要考虑网络I/O控制器缓存区资源以及网络最大的承载能力等因素,因此最大传输单元是由各种综合因素决定的。为了避免增加额外的配置,通常以太网的有效数据字段小于1500个字节,现在电脑的配置都很高了,很多都支持巨型帧,巨型帧可以超过 1500 个字节。

      不同的协议,数据段的组成结构不同,后面再详细说明。

    5、帧检验序列(FCS,Frame Check Sequence)

      为了确保数据的正确传输,在数据的尾部加入了4个字节的循环冗余校验码(CRC校验)来检测数据是否传输错误。CRC数据校验从以太网帧头开始即不包含前导码和帧起始界定符。通用的CRC标准有CRC-8、CRC-16、CRC-32、CRC-CCIT,其中在网络通信系统中应用最广泛的是CRC-32标准。

    6、帧间隙(IFG,Interpacket Gap)

      帧间隙的时间就是网络设备和组件在接收一帧之后,需要短暂的时间来恢复并为接收下一帧做准备的时间,IFG的最小值是96 bit time,即在媒介中发送96位原始数据所需要的时间,在不同媒介中IFG的最小值是不一样的。不管10M/100M/1000M的以太网,两帧之间最少要有96bit time,IFG的最少间隔时间计算方法如下:

    • 10Mbit/s最小时间为:96*100ns = 9600ns;
    • 100Mbit/s最小时间为:96*10ns = 960ns;
    • 1000Mbit/s最小时间为:96*1ns = 96ns;

    三、ARP协议

    1、ARP 作用

      在网络通讯时,源主机的应用程序知道目的主机的 IP 地址和端口号,却不知道目的主机的硬件地址。而数据包首先是被网卡接收到再去处理上层协议的,如果接收到的数据包的硬件地址与本机不符则直接丢弃。因此在通讯前必须获得目的主机的硬件地址.ARP 协议就起到这个作用。简单的说就是当一个源主机要发包时,可能会发送 ARP 请求包去询问所有主机:“IP地址为xxxxxx的目的主机,你的MAC地址是多少?”,这个请求包会广播(全FF)到本地网段,目的主机发现这是自己的 IP 地址,于是返回 ARP 应答包,提供自己的 MAC 地址给主机。

      每台主机都有一个 ARP 缓存表,,我们可以用 arp -a 命令查看该表中的内容。缓存表中的表项有时间限制,一般为 20 分钟,如果 20 分钟内没有再次使用某个表项,则该表项将会失效,下次还要发 ARP 请求来获得目的主机的硬件地址。除此之外我们还可以通过 arp -s 命令手动向 ARP 缓存表中添加表项。

    2、ARP 字段

      当【以太网帧头】的【长度/类型】为 0x0806 时,表明这是 ARP 包,ARP部分字段详细说明如下:

    3、模拟 FPGA 发送 ARP 包

      使用小兵以太网测试仪可以组建 ARP 包,模拟 FPGA 发送 ARP 包的过程。

    (1)点击打开新建流界面。

    (2)在常用报文中选择 arp 请求格式报文。

    (3)修改以太网包和 arp 包中各字段内容如下所示。

     (4)配置好之后点击确定,将设置好的数据包导出为 16 进制格式文本文件。

     (5) 得到的文本中数据内容如下所示。

     (6)选中该数据包,执行开始发布。

     (7)使用 wireshark 软件抓包。

       注意,上面的发包过程中没有出现 CRC 校验的内容,实际采用 FPGA 发包时,是需要填充 CRC 校验值的。

    4、FPGA 发送 ARP 请求包

      像 ARP 包这种简单的固定的包,CRC 校验值可以通过软件 CRC Calculator 计算得出:

      CRC 软件计算结果:低字节在前,高字节在后。使用该 CRC 校验值时要调换高低顺序,即 7EADB6D8 应该调换为 D8B6AD7E:

     //CRC校验值,使用CRC计算软件计算得出。
    parameter CRC=32'h7eadb6d8;
    
    wire    [310]CRC_result;
    //为符合以太网包校验格式,调整CRC校验值顺序
    assign CRC_result = {CRC[7:0],CRC[15:8],CRC[23:16],CRC[31:24]};

      当然,也可以通过代码自动计算出 CRC 的值,本系列后面的讲解会说清 CRC 校验的结果。

      FPGA 发送 ARP 请求包时,目的地址设置为广播地址(全FF),源地址为板卡地址,可以选择某 Xilinx 官板的 MAC 地址,以避免和其他实际地址冲突,而且 wireshark 可以识别出来。

    5、FPGA 接收 ARP 应答包

      PC 得到 ARP 请求包后,会答复 ARP 应答包,FPGA可以接收 ARP 应答包,获得 PC 的 MAC 地址,对于 CRC 校验值,也可以选择不校验。

    6、补充说明

      关于 ARP 协议,可以查看小梅哥《FPGA系统设计与验证实战指南_V1.2》,CSDN博主春哥笔记根据该教程进行了实践,博客链接:https://blog.csdn.net/chengfengwenalan/article/details/83584325,此外这篇博客对 ARP 的知识点整理得非常好:https://www.cnblogs.com/zhangming-blog/articles/6004982.html 。

    四、IP协议和UDP协议

      当【以太网帧头】的【长度/类型】为 0x0800 时,表明这是 IP 包,【IP 首部】的协议为 17(0x11)时,表明这是 UDP协议。

    1、IP首部

      IP协议是TCP/IP协议簇中的核心协议,也是TCP/IP协议的载体,IP协议规定了数据传输时的基本单元和格式。IP协议内容由IP首部和数据字段组成。所有的TCP、UDP及ICMP数据都以IP数据报格式传输,如果发送某种错误,IP 会丢失该数据,然后发送 ICMP 消息给信源端。另外 IP 数据报可以不按发送顺序接收。前20个字节(前4行)和紧跟其后的可选字段(最后1行)是IP数据报的首部,前20个字节(前4行)是固定的,后面可选字段是可有可无的。

    • 版本:4位IP版本号(Version),这个值设置为二进制的0100时表示IPv4,设置为0110时表示IPv6,目前使用比较多的IP协议版本号是4。
    • 首部长度:4位首部长度(IHL,Internet Header Length),表示IP首部一共有多少个32位(4个字节)。在没有可选字段时,IP首部长度为20个字节,因此首部长度的值为5。
    • 服务类型:8位服务类型(TOS,Type of service),该字段被划分成两个子字段:3位优先级字段(现在已经基本忽略掉了)和4位TOS字段,最后一位固定为0。服务类型为0时表示一般服务。
    • 总长度:16位IP数据报总长度(Total Length),包括IP首部和IP数据部分,以字节为单位。我们利用IP首部长度和IP数据报总长度,就可以知道IP数据报中数据内容的起始位置和长度。由于该字段长16bit,所以IP数据报最长可达65535字节。尽管理论上可以传输长达65535字节的IP数据报,但实际上还要考虑网络的最大承载能力等因素。
    • 标识字段:16位标识(Identification)字段,用来标识主机发送的每一份数据报。通常每发送一份报文它的值就会加1。
    • 标志字段:3位标志(Flags)字段,第1位为保留位;第2位表示禁止分片(1表示不分片,0表示允许分片);第3位标识更多分片(除了数据报的最后一个分片外,其它分片都为1)。片偏移:13位片偏移(Fragment Offset),在接收方进行数据报重组时用来标识分片的顺序。可以全部设置为0。
    • 片偏移:13位片偏移字段,较长的分组在分片后,某片在原分组中的相对位置,,就是说相对用户数据字段的起点,该片从何处开始。片偏移以 8 个字节为偏移单位,也就是说每个分片的长度一定是 8 字节的整数倍。
    • 生存时间:8位生存时间字段TTL(Time To Live),设置了数据报可以经过的最多路由器数,表示数据报在网络上生存多久。TTL的初始值由源主机设置,一般为32、64或者128,一旦经过一个路由器,它的值就减 1,减到 0 时,数据报就丢弃,并发送 ICMP 消息通知源主机。TTL防止丢失的数据包在无休止的传播,
    • 协议:8位协议(Protocol)类型,表示此数据报所携带上层数据使用的协议类型,ICMP为01,TCP为06,UDP为17,当然还有很多别的协议类型。
    • 首部校验和:16位首部校验和(Header Checksum),该字段只校验数据报的首部,不包含数据部分;校验IP数据报头部是否被破坏、篡改和丢失等。
    • 源IP地址:32位源IP地址(Source Address),即发送端的IP地址,如192.168.1.123。
    • 目的IP地址:32位目的IP地址(Destination Address),即接收端的IP地址,如192.168.1.102。
    • 可选字段:是数据报中的一个可变长度的可选信息,选项字段以32bit为界,不足时插入值为0的填充字节,保证IP首部始终是32bit的整数倍,没有的话长度可以为 0 。

      IP首部校验和的计算方法:

    1、将16位检验和字段置为0,然后将IP首部按照16位分成多个单元;
    2、对各个单元采用反码加法运算(即高位溢出位会加到低位,通常的补码运算是直接丢掉溢出的高位);
    3、此时仍然可能出现进位的情况,将得到的和再次分成高16位和低16位进行累加;
    4、最后将得到的和的反码填入校验和字段。

    2、UDP首部

      数据是可以直接封装在IP协议里而不使用TCP、UDP或者其它上层协议的。然而在网络传输中同一IP服务器需要提供各种不同的服务,各种不同的服务类型是使用端口号来区分的,例如用于浏览网页服务的80端口,用于FTP(文件传输协议)服务的21端口等。TCP和UDP都使用两个字节的端口号,理论上可以表示的范围为0~65535,足够满足各种不同的服务类型。

      TCP协议与UDP协议作为传输层最常用的两种传输协议,这两种协议都是使用IP作为网络层协议进行传输。下面是TCP协议与UDP协议的区别:

    ①TCP协议面向连接,是流传输协议,通过连接发送数据,而UDP协议传输不需要连接,是数据报协议;
    ②TCP为可靠传输协议,而UDP为不可靠传输协议。即TCP协议可以保证数据的完整和有序,而UDP不能保证;
    ③UDP由于不需要连接,故传输速度比TCP快,且占用资源比TCP少;
    ④TCP协议常用在对数据文件完整性较高的一些场景中,如文件传输等。
      UDP协议常用于对通讯速度有较高要求或者传输数据较少时,如视频直播和QQ等。

      使用FPGA实现TCP协议是完全没有问题的,但是,FPGA发展到现在,却鲜有成功商用的RTL级的TCP协议设计,大部分以太网传输都是基于比较简单的UDP协议。TCP协议设计之初是根据软件灵活性设计的,如果使用硬件逻辑实现,工程量会十分巨大,而且功能和性能无法得到保证,因此,TCP协议设计并不适合使用硬件逻辑实现。UDP协议是一种不可靠传输,发送方只负责数据发送出去,而不管接收方是否正确的接收。在很多场合,是可以接受这种潜在的不可靠性的,例如视频实时传输显示等。

      UDP首部共8个字节,同IP首部一样,也是一行以32位(4个字节)为单位。

    • 源端口号:16位发送端端口号,用于区分不同服务的端口,端口号的范围从0到65535。
    • 目的端口号:16位接收端端口号。
    • UDP长度:16位UDP长度,包含UDP首部长度+数据长度,单位是字节(byte)。
    • UDP校验和:16位UDP校验和。UDP计算校验和的方法和计算IP数据报首部校验和的方法相似,但不同的是IP数据报的校验和只检验IP数据报的首部,而UDP校验和包含三个部分:UDP伪首部,UDP首部和UDP的数据部分。伪首部的数据是从IP数据报头和UDP数据报头获取的,包括源IP地址,目的IP地址,协议类型和UDP长度,其目的是让UDP两次检查数据是否已经正确到达目的地,只是单纯为了做校验用的,UDP校验和不是必须的,接收时可以不进行UDP校验和,发送时可以不填充 UDP校验和,目的主机仍然可以接收到该以太网帧,但是出错了就不能了,也就是说要么 UDP 校验和正确,要么 UDP 校验和为 0,否则都不行。

    3、ping、ICMP、IGMP

      https://www.cnblogs.com/AhuntSun-blog/p/12230712.html

      https://www.cnblogs.com/AhuntSun-blog/p/12331863.html

    五、接口说明

    1、以太网和 RJ45 接口

      常见的以太网接口类型有RJ45接口(电脑网口)、RJ11接口(电话线)、SC光纤接口等。其中RJ45接口是我们常见的网络设备接口,其采用差分传输方式,具有传输速率快、抗干扰、传输距离远等优点。

       RJ45接口定义以及各引脚功能说明如下图所示,在以太网中只使用了1、2、3、6这四根线,其中1、2这组负责传输数据(TX+、TX-),而3、6这组负责接收数据(RX+、RX-),另外四根线是备用的。

     

       总的来说,这一部分知道即可,不需要自己设计代码。

    2、连接关系

       我们的 FPGA 就看成是 MAC侧,接收或发送数据到 PHY侧,PHY侧再通过 RJ45 水晶头接口和其他设备进行连接。PHY 芯片有很多种,常见的有 RTL8201、RTL8211、VSC8601等,并不是一种 PHY 芯片就对应一种 MII等协议,例如 RTL8201支持百兆网 MII 协议,RTL8211除了支持百兆网 MII 协议,还支持千兆网 GMII 协议。PHY芯片是可以配置成不同模式的。

    3、MII、RMII、GMII、RGMII

      PHY在发送数据的时候,接收MAC发过来的数据(对PHY来说,没有帧的概念,都是数据而不管什么地址,数据还是CRC),把并行数据转化为串行流数据,按照物理层的编码规则把数据编码转换为模拟信号发送出去,收数据时的流程反之。PHY还提供了和对端设备连接的重要功能并通过LED灯显示出自己目前的连接状态和工作状态。当我们给网卡接入网线的时候,PHY芯片不断发出脉冲信号来检测对端是否有设备,它们通过标准的“语言”交流,互相协商并确定连接速度、双工模式、是否采用流控等。通常情况下,协商的结果是两个设备中能同时支持的最大速度和最好的双工模式。这个技术被称为Auto Negotiation,即自动协商。以太网MAC和PHY之间有一个接口,常用的接口有MII、RMII、GMII、RGMII等。
    • MII(Medium Independent Interface):MII支持10Mbps和100Mbps的操作,数据位宽为4位,在100Mbps传输速率下,时钟频率为25Mhz。
    • RMII(Reduced MII):RMII是MII的简化版,数据位宽为2位,在100Mbps传输速率下,时钟频率为50Mhz。
    • GMII(Gigabit MII):GMII接口向下兼容MII接口,支持10Mbps、100Mbps和1000Mbps的操作,数据位宽为8位,在1000Mbps传输速率下,时钟频率为125Mhz。
    • RGMII(Reduced GMII):RGMII是GMII的简化版,数据位宽为4位,在1000Mbps传输速率下,时钟频率为125Mhz,但是在时钟的上下沿同时采样数据

    七、常用CMD命令 

      netsh i i show in  :查询本地连接的网卡 ID 号,如下显示为12。

       arp -a      :查询自己PC的所有 IP 地址,12对应16进制的c。

      ipconfig -all    :查找自己PC的所有 MAC 地址。

       netsh -c i i add neighbors 12 192.168.1.123 00-11-22-33-44-55:将开发板 IP 绑定开发板 MAC,12为本地连接的网卡 ID 号,192.168.1.123 为想设置的开发板 IP,00-11-22-33-44-55为想设置的开发板MAC。

      arp -s 192.168.0.2 00-25-64-76-BD-40:和上面一样的功能,将开发板 IP 绑定开发板 MAC,192.168.0.2为想设置的开发板 IP,00-25-64-76-BD-40为想设置的开发板MAC。

      OK,网络基础知识就整理到这,后续会详细整理 RGMII 接口下的千兆网收发系统。

      计算机网络是一个很大的课题,如果对有些概念不理解,可以去B站看一下韩立刚教学的《计算机网络原理》,同时可以参阅博客:https://www.cnblogs.com/AhuntSun-blog/p/12390057.html,该博客是对这门课程的学习笔记,基本上课程讲过的内容都整理上了,非常值得一看!

    参考资料:

    [1]小梅哥FPGA教程

    [2]正点原子FPGA教程

    [3]锆石科技FPGA教程

    --------------------------------------------------------------------------------------
    作者:咸鱼FPGA
    本文版权归作者所有,如需转载请保留此段声明。
  • 相关阅读:
    neo4j︱与python结合的py2neo使用教程
    Neo4j 简介 2019
    110.Java对象的序列化
    109.Java序列流
    108.Java装饰器设计模式
    107.Java中IO流_字符流的缓冲区
    106.Java中IO流_字符流的异常处理
    105.Java中IO流_字符流拷贝文件
    104.Java中IO流_字符流_Writer
    103.Java中IO流_字符流_Reader
  • 原文地址:https://www.cnblogs.com/xianyufpga/p/13508948.html
Copyright © 2011-2022 走看看