精华内容
下载资源
问答
  • 在开始阅读之前,如果你对已介绍的总线技术还不了解的话,可以先阅读以下文章快速温习一下,等补完车载以太网和MOST,汽车总线技术楼主基本分享结束了。说一说LIN总线CAN总线基础(一)CAN总线基础(下)CAN FD 介绍...

    我们之前已经分享了LIN、CAN、CAN FD、FlexRay总线。在开始阅读之前,如果你对已介绍的总线技术还不了解的话,可以先阅读以下文章快速温习一下,等补完车载以太网和MOST,汽车总线技术楼主基本分享结束了。

    说一说LIN总线

    CAN总线基础(一)

    CAN总线基础(下)

    CAN FD 介绍

    FlexRay 介绍

    背景

    车载以太网的出现背景楼主就不多做赘述了,其实主要是因汽车E/E架构和功能的复杂度提升而带来的对车辆数据传输带宽提高和通讯方式改变(基于服务的通讯-SOA)的需求。

    就目前汽车总线的应用情况,成本低、可靠性高、应用普遍的有Lin、CAN通讯,CAN FD也是最近几年才逐渐得到应用,而FlexRay、车载Ethernet等基于成本因素,目前主要在高端车型中使用。

    其中楼主之前介绍的FlexRay后续得到普遍应用的可能性楼主认为不是很大,首先成本方面与车载以太网差不多而通讯速率又远低于它,而伴随着未来智能化、网联化的趋势,车载Ethernet在未来得到推广的可能性要比FlexRay高很多。需要注意的是CAN FD在市场推广实施还没有几年,第三代CAN总线-CAN XL也即将登场,CAN XL传输速率将达到10Mbit/s,可填补CAN FD和百兆车载以太网(100BASE-T1)之间的鸿沟,从这点也可以看出车载通讯的快速发展及对通讯带宽的越来越高的要求,同时也可从另一方面说明FlexRay的尴尬。当然所有总线的应用都是分所在的域和场景的,例如对于安全要求很高的场合,采用了基于时间触发机制的FlexRay因实时性和确定性更高则更合适。

    标准

    在车载网络方面,玩家是很多的,也推出了各自的标准,如下:

    其中OPEN Alliance和电气与电子工程师协会(IEEE)制定的标准是车载以太网领域比重最大和应用最广泛的,例如我们熟知的100BASE-T1和1000BASE-T1。

    自1980年以来,IEEE一直负责以太网的维护、开发和标准化。尽管各个公司都可提供专有的以太网解决方案,但大多数时候公司都会交给IEEE进行标准化以确保更广泛的应用。802工作组则专门负责以太网,因此,所有与以太网相关的标准都以802开头(例如,IEEE 802.1,IEEE 802.2,IEEE 802.3等)。

    OPEN Alliance SIG是由汽车制造商和供应商组成的联盟,目的是促进以太网在汽车工业中的进一步发展。OPEN Alliance SIG与IEEE合作,将汽车以太网转换为通用标准。就目前的车载以太网标准方面,主流标准的是如下几个,目前主要是第二个100BASE-T1:用单对双绞线实现100Mbit/s的数据传输,走的靠前的OEM则使用更快的千兆以太网。

    车载以太网的网络分层和拓扑

    OSI七层网络模型(OSI=Open Systems Interconnection)是互联网发展过程中一个很重要的模型。OSI是一个开放性的通信系统互连参考模型,其含义就是建议所有公司使用这个规范来控制网络。只有统一通信规范时,才能实现真正的互联化。OSI 七层模型及通信互联的传输过程,如下图所示:

    OSI 七层网络模型是一个理想的网络参考模型,TCP/IP模型是已经被实际广泛应用于因特网的网络分层模型。TCP/IP 模型没有对 OSI 的 5~7 层做严格区分,统称为应用层

    车载以太网是基于 TCP/IP 的网络分层模型,并由 OPEN 和 AUTOSAR 等联盟对以太网相关协议进行了规范和补充。

    以太网的网络拓扑结构有点对点形式、类似于CAN或LIN的总线形式、链式和星型等形式:

    也有由上面几种形式的组合形式:

    当然现在多个节点的车载以太网的互联互通需要交换机Switch,Switch的作用如下:

    车载以太网的物理连接

    从硬件的角度看,以太网接口电路主要由MAC(Media Access Control)控制器和物理层接口PHY(Physical Layer,PHY)两大部分构成,如下图所示:

    MAC及PHY工作在OSI七层模型的数据链路层和物理层,如下

    PHY和MAC之间是如何传送数据和相互沟通的呢?MAC与PHY之间通过两个接口连接,分别为SMI接口和MII接口。

    MII(Media Independent Interface)即媒体独立接口,MII接口是MAC与PHY连接的标准接口,以太网MAC通过该接口发出数据帧经过PHY后传输到其他网络节点上,同时其他网络节点的数据先经过PHY后再由MAC接收。MII是IEEE-802.3定义的以太网行业标准,MII接口提供了MAC与PHY之间、PHY与STA(Station Management)之间的互联技术,该接口支持10Mb/s与100Mb/s的数据传输速率,数据传输的位宽为4位。"媒体独立"表明在不对MAC硬件重新设计或替换的情况下,任何类型的PHY设备都可以正常工作。802.3协议最多支持32个PHY,但有一定的限制:要符合协议要求的connector特性。

    SMI叫串行管理接口,以太网MAC通过该接口可以访问PHY的寄存器,通过对这些寄存器操作可对PHY进行控制和管理。SMI接口包括MDIO(控制和管理PHY以获取PHY的状态)和MDC(为MDIO提供时钟)。MDC由MAC提供,MDIO是一根双向的数据线。用来传送MAC层的控制信息和物理层的状态信息。MDIO数据与MDC时钟同步,在MDC上升沿有效。

    由此可见,MAC 和PHY,一个是数据链路层,一个是物理层;两者通过MII传送数据。 因此Ethernet的接口实质是MAC通过MII总线控制PHY的过程

    MII接口后续又衍生了很多其他版本,如RMII、GMII、SGMII、RGMII等。这里简要介绍其中的MII和RMII,如下图所示。MII共使用了16根线。其中CRS与COL只在半双工模式有效,而车载以太网固定工作在全双工模式下,故应用在汽车环境需要14根线

    RMII是精简版的MII,数据发送接收均为两根,相比MII减少了4根,另外它整合或减去了一些线,最终RMII只有8根线RMII的接口如下:

    在实际的设计中,以上三部分并不一定独立分开的。由于,PHY整合了大量模拟硬件,而MAC是典型的全数字器件。考虑到芯片面积及模拟/数字混合架构的原因,通常,将MAC集成进微控制器而将PHY留在片外。更灵活、密度更高的芯片技术已经可以实现MAC和PHY的单芯片整合,可分为下列几种类型:

    CPU集成MAC与PHY,目前来说并不多见:

    CPU集成MAC,PHY采用独立芯片,这种在车载以太网上是主流方式,因嵌入式芯片厂商一般都将MAC集成在MCU内部,而PHY芯片则由OEM或控制器供应商自己选择:

    CPU不集成MAC与PHY,MAC与PHY采用集成芯片。这种在消费用以太网上比较比较常见,如电脑的网卡有这种方式的。

    在以太网连接线束上,车载以太网与消费用以太网也是不同的,首先消费用以太网的标准主要采用10BASE-2、10/100BASE-TX和1000BASE-T,其中1000BASE-T是使用RJ45接口,需要四对双绞线共8根线进行数据传输,而10/100BASE-TX则是只使用四对双绞线其中的两对共4根线进行数据传输,如下是100BASE-TX的示意图(使用了两对双绞线)。

    在很早之前的10BASE-2则是同轴电缆进行数据传输,因此消费类以太网采用线束总结如下:

    车载以太网一般都基本采用带T1的标准,如IEEE 100BASE-T1(以前称为OABR)、IEEE 1000BASE-T1,这些都使用一对双绞线共两根线进行数据传输:

    其次在编码方式上,1000BASE-T主要采用PAM5的编码方式:

    车载以太网100BASE-T1和1000BASE-T1主要采用PAM3的编码方式。

    从上面可知,车载以太网主要采用基于一对双绞线进行数据传输的100BASE-T1或1000BASE-T1标准,而我们电脑则使用RJ45接口采用基于4对双绞线进行数据传输的1000BASE-TX标准,因此当我们用电脑测量控制器以太网时,有时需要转换器,如下:

    车载以太网帧结构

    以太网帧的格式如下:

    以太帧有多种类型,不同类型的帧具有不同的格式和MTU值,但在同种物理媒体上都可同时存在。常见有两种帧格式,第一种是上世纪80年代初提出的DIX v2格式,即Ethernet II帧格式。Ethernet II后来被IEEE802标准接纳,并写进了IEEE802.3x-1997的3.2.6节。

    第二种是1983年提出的IEEE802.3格式

    这两种格式的主要区别在于,Ethernet II格式中包含一个Type字段,标识以太帧处理完成之后将被发送到哪个上层协议进行处理。IEEE802.3格式中,同样的位置是长度字段。

    不同的Type字段值可以用来区别这两种帧的类型,当Type字段值小于等于1500(或者十六进制的0x05DC)时,帧使用的是IEEE802.3格式。当Type字段值大于等于1536(或者十六进制的0x0600)时,帧使用的是Ethernet II格式。以太网中大多数的数据帧使用的是Ethernet  II格式

    以太帧中还包括源和目的MAC地址,分别代表发送者的MAC和接收者的MAC,此外还有帧校验序列字段,用于检验传输过程中帧的完整性。

    汽车行业通常使用Ethernet  II格式,该格式还可包含VLAN信息作为扩展,因此,又分基本MAC帧(无VLAN)和标记MAC帧(包括VLAN)两种。

    MAC addresses: Ethernet II帧通常以接收者目标地址开头。 作用是指定要接收消息的网络节点。 与随后的发送者源地址相反,除单播地址外,还可以使用多播或广播地址。对于以太网帧,只能有一个发送方,但可以有多个接收方。

    Ether type: 基本和标记的MAC帧通过类型字段(以太类型)进行区分。 这通常标识有效载荷数据区域中包含的分组,并给出有关较高层中使用的协议(例如,IPv4)的信息。如果以太类型的值为0x8100,则将类型字段向后移四个字节,并在其原始位置插入一个VLAN标签。

    VLAN Tag:VLAN标签由协议标识符(TPID)和控制信息(TCI)组成。 TPID包含原始类型字段的值,而TCI由优先级(PCP),符合丢弃要求或规范的形式指示符(DEI或CFI)和标识符(VID)组成。标识符和优先级主要用于汽车行业。标识符区分不同应用区域的相应虚拟网络。优先级允许通过交换机优化运行时间,以便优先转发重要信息。

    Payload:在类型字段之后,以太帧包含有效载荷数据区域。 有效负载的最小长度为不带VLAN标记的46字节或带VLAN标记的42字节, 在汽车工业中,它最多可以包含1500个字节

    CRC校验:CRC校验在以太帧的末尾发送。 校验中包含的值是使用标准化算法计算的,该算法在发送方和接收方中以相同的方式实现。该计算是在以太帧的所有字段中进行的,因此可以确保整个消息的完整性。

    以太网Packet: 对于以太网II帧的传输,以太网控制器在开头插入前同步码和起始帧定界符(SFD),用于指示传输开始。前同步码,开始帧定界符和以太帧的组合称为以太网数据包

    车载以太网帧传输过程

    上面我们已经提到,车载以太网是基于TCP/IP的网络模型,因此我们先不考虑应用层数据是根据哪种应用层协议组织的,从应用层来的数据,经过传输层会加上TCP/UDP报头,再到网络层的IP报头,然后到链路层增加MAC地址等信息,最后由PHY转换成线路上的二进制流实现在发送端和接收端的数据传输。

    其中上面传输层的TCP协议和网络层的IP协议,楼主在本篇文章中就不过多赘述了,大家感兴趣的请自行查询了解。而应用层协议有不少,例如DoIP、DHCP、SOME/IP等,而最重要的车载以太网应用层协议主要是SOME/IP协议,关于这部分的阐述楼主放到下一篇。

    参考文献:

    1、Ethernet introduction(BOSCH、Tektronix、Vector、CSDN等资料)

    点个“在看”再走!

    展开全文
  • 本文主要记录使用抓包工具抓取网络数据包的过程,可以更好的理解Linux网络协议栈。 1、实验环境 一个嵌入式开发板:加载好网卡驱动...数据包包含内容如下(https://xingxingzhihuo.blog.csdn.net/article/details...

    本文主要记录使用抓包工具抓取网络数据包的过程,可以更好的理解Linux网络协议栈。

    1、实验环境

    一个嵌入式开发板:加载好网卡驱动程序

    一台笔记本:装好抓包工具,如wireshark,装一个网络通信助手。

    开发板通过直连接到PC的网口。

    2、抓取UDP通信数据包

    数据包包含内容如下(https://xingxingzhihuo.blog.csdn.net/article/details/94360079):

    2.1 环境装备

    1、配置PC的IP:

    2、PC端启动udp server

    3、启动抓包工具,抓取本地网卡的数据包

    4、启动开发板,并为开发板配置PC同网段IP:

    5、查看开发板的arp表,并未开始学习到任何mac

    6、开发板中执行udp发包 APP,可通过如下代码交叉编译得到

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
    #include <errno.h>
     
    int main(int argc, char *argv[])
    {
        struct sockaddr_in srvAddr;
        bzero(&srvAddr, sizeof(srvAddr));
        srvAddr.sin_family = AF_INET;
        srvAddr.sin_addr.s_addr = inet_addr("10.100.70.140");
        srvAddr.sin_port = htons(8765);
     
        int iSock = socket(AF_INET, SOCK_DGRAM, 0); // udp
    	#define N 2000
    	char szBuf[N] = {0};
    	for(unsigned int i = 0; i < N; i++) //字符数组最后一个字符不要求是‘\0’
    	{
    		szBuf[i] = 'a';	
    	}
    	
        int iRet = sendto(iSock, szBuf, sizeof(szBuf), 0, (struct sockaddr *)&srvAddr, sizeof(srvAddr));
    	printf("send size is %d, iRet is %d, errmsg[%s]\n", sizeof(szBuf), iRet, strerror(errno));
        
    	close(iSock);
        return 0;
    }

    7、查看抓包工具抓取的数据包和PC端收到的数据

    收到的数据前一部分:

    8、查看开发板arp表,里面记录了刚才通信时学习到的MAC

    9、分析数据包

    客户端主要是向服务端发2000个字符a,数据包分析主要分析,在网络协议栈中数据包被封装的UDP头、IP头、MAC头等

    2.2 数据包分析

    2.2.1 UDP头【8字节】

    udp头内容:e6 a1 22 3d 07 d8 00 83

    typedef struct _UDP_HEADER 
    {
         unsigned short m_usSourPort;       // 源端口号16bit                    
         unsigned short m_usDestPort;       // 目的端口号16bit
         unsigned short m_usLength;        // 数据包长度16bit
         unsigned short m_usCheckSum;      // 校验和16bit
    }__attribute__((packed))UDP_HEADER, *PUDP_HEADER;

    源端口号:e6 a1 = 59041

    目的端口:22 3d = 8765

    数据包长度:07 d8 = 2008 (8字节UDP头+2000数据载荷)

    校验和:00 83

    2.1.2 IP头【20字节】

    ip头内容:45 00 05 dc 84 16 20 00 40 11 4e 83 c0 a8 00 a7 c0 a8 00 80

    include/uapi/linux/ip.h

    struct iphdr {                           
    #if defined(__LITTLE_ENDIAN_BITFIELD)    
        __u8    ihl:4,                       
            version:4;                       
    #elif defined (__BIG_ENDIAN_BITFIELD)    
        __u8    version:4,                   
            ihl:4;                           
    #else                                    
    #error  "Please fix <asm/byteorder.h>"   
    #endif                                   
        __u8    tos;                         
        __be16  tot_len;                     
        __be16  id;                          
        __be16  frag_off;                    
        __u8    ttl;                         
        __u8    protocol;                    
        __sum16 check;                       
        __be32  saddr;                       
        __be32  daddr;                       
        /*The options start here. */         
    };   

    版本:4(iPV4)

    首部长度:5(单位是4字节,5*4=20字节头部)

    服务类型:00 

    为应用程序、主机或路由器处理报文提供一个优先级服务标志。TOS占8 bit,其中3 bit的优先权子字段(现在已被忽略),4 bit的TOS子字段,分别代表:最小时延、最大吞吐量、最高可靠性和最小费用。4 bit中只能置位其中1 bit为1。如果所有4 bit均为0,那么就意味着是一般服务。1 bit未用位但必须置0。交互应用如Telnet和Rlogin要求最小的传输时延(主要用来传输少量的交互数据),FTP文件传输要求有最大的吞吐量,而网络管理(SNMP)和路由选择协议要求有最高可靠性。需要注意的是并非所有的TCP/IP实现都支持TOS特性。

    总长度:05 dc(1500)

    指整个IP数据报以字节为单位的长度,占16 bit,因此IP数据报最长可达65535字节。由于链路层MTU的限制,较长的IP数据报会被分片。当数据报被分片时,该字段的值也随着变化,因为该值只是表示当前IP数据报的长度。 实际上,大量使用UDP的应用( RIP,TFTP,BOOTP,DNS以及SNMP)都限制用户数据报长度为512字节。 IP数据报中没有数据内容部分的长度,但借助报头中的首部长度可以很容易得出数据内容的长度是总长度减去首部长度。

    标识符:84 16

    唯一地标识主机发送的每一份数据报,占16 bit。主机为自己发送的IP报文设置一个报文计数器,通常每发送一份报文其值就会加1。标识符字段通常应该由让IP发送数据报的上层来选择。

    标志:20 (001)

    说明IP报文的分片信息和控制是否允许IP报文分片,占3bit。目前只有后两位有意义。标志字段的最低位是MF (More Fragment),为1表示后面还有分片,即本报文不是分片报文的最后一个分片,为0则表示本报文是最后一个分片。标志字段中间的一位是DF (Don't Fragment),只有当DF为0时才允许分片。

    片偏移:(20 00

    本片在原分组中的相对位置,占12bit。片偏移以 8 个字节为偏移单位,指示出较长的分组在分片后本片在原分组中的相对位置。

    生存时间TTL(time-to-live):40

    用于设置数据报可以经过的最多路由器数,占8 bit。TTL的初始值由源主机设置,即指定了数据报的生存时间,推荐的初始TTL值为64。一旦经过一个处理报文的路由器,TTL的值就减去1。当该字段的值为0时,数据报就被丢弃,并发送ICMP报文通知源主机。防止路由成环时,IP被无限次转发。

    类型:11 (UDP 17)

    也叫协议字段,表示向IP传送数据的上层协议,占8 bit。类型字段实质上是表示IP报文数据区数据的格式,例如创建IP数据的高层协议是TCP还是UDP。需要指出的是IP首部的版本字段指定的是IP报头格式,属于网络层范畴,类型字段指定的是IP数据区数据的格式,属于传输层的范畴。

    首部检验和:4e 83

    首部数据的二进制反码求和,占16 bit。检验和不对首部后面的数据进行计算。计算时首先把检验和字段置为0,然后,对首部中每个16 bit进行二进制反码求和(整个首部看成是由一串16 bit的字组成)。接收方在收到IP数据报后对首部进行检验时,直接对首部中每个16 bit进行二进制反码求和,若计算结果全为1,则说明首部在传输过程中没有发生任何差错;若计算结果不全为1,则表明检验和错误,那么IP就丢弃收到的数据报,但是不生成差错报文。

    源IP地址:c0 a8 00 a7 (192.168.0.167)

    目的IP地址: c0 a8 00 80(192.168.0.128)

    每一份IP数据报都包含源IP地址和目的IP地址,它们都是32 bit的值。

    选项:

    IP数据报中的一个可变长的可选信息,作为附加的特殊处理的信息域,以32 bit作为界限,在必要的时候插入值为0的填充字节,保证IP首部始终是32 bit的整数倍。选项包括安全和处理限制、记录路由、时间戳、宽松的源站选路、严格的源站选路等选项。实际上选项被使用的时候并不是很多,而且并非所有的主机和路由器都支持这些选项。

    数据:

    IP数据报的数据部分,长度由首部的总长度字段和首部长度字段的差值决定。数据通常包含一个完全的TCP段或UDP数据报,也可以包含其他协议的报文,如ICMP报文。

    /*IP头定义,共20个字节*/
    typedef struct _IP_HEADER 
    {
     char m_cVersionAndHeaderLen;       //版本信息(前4位),头长度(后4位)
     char m_cTypeOfService;            // 服务类型8位
     short m_sTotalLenOfPacket;        //数据包长度
     short m_sPacketID;              //数据包标识
     short m_sSliceinfo;               //分片使用
     char m_cTTL;                  //存活时间
     char m_cTypeOfProtocol;          //协议类型
     short m_sCheckSum;             //校验和
     unsigned int m_uiSourIp;          //源ip
     unsigned int m_uiDestIp;          //目的ip
    } __attribute__((packed))IP_HEADER, *PIP_HEADER ;

    2.2.3 MAC头 【14字节】

    mac头:54 ee 75 e8 1b 11 12 49 c9 79 62 aa 08 00

    目的MAC:54 ee 75 e8 1b 11

    源MAC:12 49 c9 79 62 aa

    上一层协议:08 00(ip)

    typedef struct _MAC_FRAME_HEADER
    {
     char m_cDstMacAddress[6];    //目的mac地址
     char m_cSrcMacAddress[6];    //源mac地址
     short m_cType;            //上一层协议类型,如0x0800代表上一层是IP协议,0x0806为arp
    }__attribute__((packed))MAC_FRAME_HEADER,*PMAC_FRAME_HEADER;

     

    展开全文
  • [FPGA]以太网帧数据UDP报文解析接收

    千次阅读 多人点赞 2019-05-06 21:20:38
    网口发来的格式是以太网帧格式,上一层使用IP协议,传输的UDP报文。 系统:WIN10, 开发平台:ISE 14.7 编程语言:VHDL 硬件平台:Virtex-6 FPGA ML605开发板 项目描述:将网口发来的以太网帧进行接收,层层解析,...

    前言:做的项目需要读取网口发来的数据,发现做一遍真的是对这几种帧格式熟悉了一遍。
    网口发来的格式是以太网帧格式,上一层使用IP协议,传输的UDP报文。

    系统:WIN10, 开发平台:ISE 14.7
    编程语言:VHDL
    硬件平台:Virtex-6 FPGA ML605开发板
    项目描述:将网口发来的以太网帧进行接收,层层解析,最后得到UDP报文内容。

    一、数据格式

    1.1、各层的数据格式

    • TCP和UDP同属运输层的传输协议, 不过UDP的首部是8Byte, TCP为20Byte.
      在这里插入图片描述

    1.2、以太网帧格式

    • 802.3 以太网帧结构
    前导码帧起始MAC 目标地址MAC 源地址类型负载帧序列检测
    7 Byte 的0x551 Byte 的0xD56 Byte6 Byte2 Byte46-1500 Byte4 Byte

    (还有一种 Ethernet II 格式的帧, 是当数据大于1500字节时使用, ‘类型’字段换做’长度’)

    • 前导码 和 帧起始 是我们判断一帧数据起始位置的重要依据, 当检测到7个0x55且第8 Byte是0xD5时, 就可以读取接下来的有用数据了.
    • 类型 : 这个字段存储的是负载装的数据报是什么类型, 例如常用的 IP数据报是"0x0800".

    1.3、IP数据报格式

    版本号(4 bit)IP头长度(4bit)服务类型(8 bit)总长度(16 bit)
    标识(16 bit)标志(3 bit)片偏移(13bit)
    生存时间(8 bit)上层协议标识(8 bit)头部校验和(16 bit)
    源IP地址(32 bit)
    目的IP地址(32bit)
    选项(选填)
    数据
    • IP头一般是20Byte(如果没有附加选项), 所以第21byte就是向上一层协议的数据了(我只写了一些会用到的意义)
    • 版本号(4 bit): IPv4是"B0100" 值是4 , IPv6 是"B0110" 值是6 .
    • 数据包头部长度(4 bit): 它表示数据包头部包括多少个32位长整型,也就是多少个4字节的数据。无选项则为5(“B0101”).
    • 段偏移量(13位): 当大段的数据被分片传输, 为了与更多段位组合, 帮助接收方组合分段的报文, 以字节为单位, 便于分片重组.
    • 上层协议标识(8 bit): 表明使用该报文的上层协议,如TCP=6,ICMP=1,UDP=17等.

    1.4、UDP段格式

    源端口(16 Bit)目的端口(16 Bit)
    UDP长度(16 Bit)校验和(16 Bit)
    数据
    • UDP首部总共8Byte, '长度’这个字段包含的是整个UDP段的长度,包括首部.

    二、传输的数据例举

    使用Wireshark保存下的发送的一帧MAC帧,如下:

    1    ff ff ff ff ff ff 00 21 86 f6 9f cb 08 00 45 00   
    2    00 9c 00 00 00 00 80 11 db 78 0a 6c 54 6d ff ff   
    3    ff ff ec 32 12 34 00 88 9f 9c 08 08 08 08 08 08   
    4    08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08   
    5    08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08   
    6    08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08  
    7    08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08  
    8    08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08  
    9    08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08  
    10   08 08 08 08 08 08 08 08 08 08 08 08 08 08 08 08  
    11   08 08 08 08 08 08 08 08 08 08     
    
    1. MAC帧的首部被去掉了,是7个0x55和1个0xD5.
    2. 根据第一节中说到的帧格式可以判断出:
      目的物理地址: Broadcast (ff:ff:ff:ff:ff:ff);
      源物理地址: Universa_f6:9f:cb (00:21:86:f6:9f:cb);
      0800表示IP数据报协议;
    3. 4500进入IP头.
      4500表示Internet Protocol Version 4 , 报文长度5个32位, 服务类型 00;
      第二行的11表示 值为17 ,所以使用的UDP传输协议;
      源IP: 10.108.84.109(0a:6c:54:6d)
      目的IP: 255.255.255.255(ff:ff:ff:ff)
    4. 第三行从ec32进入UDP部分, ec32表示源端口为 60466,1234表示目的端口为 4660;
      0088表示UDP段算上首部一共136字节,也就是128字节的数据
      9c9f是16位的校验和;
      在这之后是我发的128Byte的0x08;

    三、UDP报文解析程序

    • 使用了7种状态的状态机, 状态转换都是只能由上一个状态转换过来(除了GetUDPHead, GetTCPHead, 这两个是同一位置的两个分支)
    • 七种状态:
       Idle,FindMacHead, GetMacHead, GetIPHead, GetUDPHead, GetTCPHead, GetUDPDate
       空闲→寻找找MAC头状态→获取MAC头→获取IP头→获取UDP/TCP头→ 获取UDP数据
      1. Idle(空闲状态)
        这个状态是除以上6种状态之外的其他状态的总和.

      2. FindMacHead(寻找MAC头状态)
        由Idle状态下, 会直接转到此状态, 当匹配到7个0x55和1个0xD5 会进入GetMacHead状态

      3. GetMacHead(获取MAC头状态)
        当进入GetMacHead状态时, 同时有一个process进行时钟计数, 用来控制取各个字节的内容, 例如,进入此状态时, 数据是一个字节一个字节过来的, 前6个字节是目的MAC地址, 当计数器记到6说明,前六个字节已经取完. 直到取到 数据类型的字段位置时, 值为X"0800"就转到GetIPHead状态

      4. GetIPHead(获取IP头状态)
        同上,进入此状态时,同时也有一个计数器开始计数, 需要记录第10Byte的数字,用来判断使用的传输协议(6-TCP, 17-UDP)用来转到不同的状态.

      5. GetUDPHead / GetTCPHead(获取UDP / TCP头状态)
        同上,因为我没有获取之歌UDP头的信息,所以直接使用计数器过掉这个状态,也就是当他等于8时,转到GetUDPDate状态

      6. GetUDPDate(获取UDP数据)
        直接用计数器获取UDP数据.

    这个VHDL文件我放在了GitHub上,希望大家点星星 .

    展开全文
  • 以太网帧长度大小限制

    万次阅读 2019-03-31 17:22:37
    表示以太网传输的最大帧长度。 为什么要有最大帧长度限制呢? 这是因为以太网采用的是CSMA/CD方法在介质上传输数据。CSMA/CD叫做带冲突检测的载波监听多路访问技术,在发送数据之前需要检测链路是否空闲,只有链路...

    最大长度限制

    网卡上一个参数是MTU值。一般都是1500。表示以太网传输的最大帧长度。
    为什么要有最大帧长度限制呢?
    这是因为以太网采用的是CSMA/CD方法在介质上传输数据。CSMA/CD叫做带冲突检测的载波监听多路访问技术,在发送数据之前需要检测链路是否空闲,只有链路空闲时才发送数据,并且边发送边检测。发送的过程中一旦检测到冲突则立即停止。所以也就是说,数据发送的过程中,整个链路是被独占的。所以需要限制一次传输数据的最大长度,如果一个人占用时间过长,这对其他人而言是不可接受的。
    而且限制最大长度还有以下好处:
    1)帧传输的过程中,一旦出错,需要全部重传,长度太长反而效率不高。(可能现在的传输介质已经不存在这种问题了)
    2)帧越长,需要的缓存越大,1979年在设计网卡时,缓存的价格非常昂贵,所以当时选用1500 bytes作为最大的长度。

    需要注意的是,以长帧长度限制是1518字节。减去18字节的以太网帧长度,所以ip层的报文长度限制为1500。

    最小长度限制

    最大长度还是比较直观易于理解,那么为什么又有最小长度限制呢?
    还是因为CSMA/CD。
    AB之间通信。
    当A检测到链路空闲,然后发送报文,巧的是B跟你一样,这不就冲突了嘛。
    最坏的情况,AB俩隔得最远。当A发送的报文刚好要到达B时,B开始发送报文。
    如果在B的报文到达A之前,A就已经发送完了,那么A就不知道冲突了。所以,需要限制发送的报文最小长度。
    最小长度是多少呢?
    显然,最小长度同时受两个节点最远距离和传输速度的影响。最远距离越长,传输速度越快,所需要的最小长度也就越大。

    针对不同带宽的网络,标准组织定义了不同的slot time。

    SpeedSlot timeTime Interval
    10 Mbit/s512 bit times51.2 microseconds
    100 Mbit/s512 bit times5.12 microseconds
    1 Gbit/s4096 bit times4.096 microseconds
    2.5 Gbit/s onwardno half-duplex operation

    所以,不同的网络,其实最小长度是不一定的,两个节点能相隔的最远距离也是不一样的。
    10Mbit/s的网络,报文最小长度为64字节。两个节点最远距离不能超过:
    51.210(-6)*(0.7*3*108)/2=5.376km
    在1Gbit/s的网络中,报文最小长度为512字节。最远距离不超过约0.43km

    不足的长度填充全0补齐。这些数据是不计算入ip层的。
    使用tcpdump抓包时,经常看见length=0的报文。其实这个长度指的是TCP层数据报文的长度。

    参考:
    以太网最小,最大字节长度 https://blog.51cto.com/19880206/890070
    https://en.wikipedia.org/wiki/Slot_time
    https://stackoverflow.com/questions/33039394/why-is-the-minimum-ethernet-frame-64-bytes

    展开全文
  • 【计算机网络】——习题解析:一个UDP用户数据的数据字段为8192字节,在数据链路层要使用以太网来传输,试问应当划分为几个IP数据报片?说明每一个IP数据报字段长度和片偏移字段的值 答:6个数据字段的长度:前5个是...
  • 以太网头部的最后两个字段:0800表示IP协议 上层协议为IP协议 源以太网地址 :08:00:27:73:a8:bf ;有一个是本地的mac地址 目的以太网地址:52:54:00:12:35:02 ;有一个是本地的mac地址 ----------- IP协议 ----------- ...
  • 目的地址 源地址 类型 数据 校验...数据字段长度(2字节):指示其后的逻辑链路控制(LLC)数据字节的长度 逻辑链路控制LLC:携带的用户数量 填充字段PAD:以保证有足够长度来适应碰撞检测的需要 校验序列...
  • 以太网帧格式的各字段解释

    千次阅读 2013-06-25 15:40:21
    如上图为以太网格式,以下是对每字段的字段、字段长度及作用的1、前导码(Preamble) 7B 不算在以太里面,只是用定制开始,起同步作用。2、开始符(SFD) 1B 标识一个的开始,代码为:10101011. 3、目的...
  • 10Mbps以太网帧长度

    千次阅读 2016-07-23 14:28:42
    或者帧中的数据不得少于46个字节,其中以太网帧头有18字节(以太网2的值为:MAC+2类型+4CRC,注意,如果是802.3的规范,它支持SNAP和802.3以太,其中的2个字节的类型字段就变为帧的长度),小于以上长度的帧或数据需要在帧中...
  • 以太网数据帧最短长问题

    万次阅读 2019-09-06 20:41:13
    或者帧中的数据不得少于46个字节,其中以太网帧头有18字节(以太网2的值为:MAC+2类型+4CRC,注意,如果是802.3的规范,它支持SNAP和802.3以太,其中的2个字节的类型字段就变为帧的长度),小于以上长度的帧或数据需要在帧中...
  • 1 【单选题】 下面哪个不是TCP/IP协议中的层次 A、 网络层 B、 传输层 C、 应用层 D、 ...TCP/IP协议中网络层的数据被称为 ...802.3以太网帧中length的最大...以太网帧的最小长度为 A、 38 B、 46 C、 64 D、 76 我的答案:C
  • EtherType 是以太帧里的一个字段,用来指明应用于帧数据字段的协议。根据 IEEE802.3,Length/EtherType 字段是两个八字节的字段,含义两者取一,这取决于其数值。在量化评估中,字段中的第一个八位字节是最重要的。...
  • 以太网数据帧格式及ARP协议

    千次阅读 2020-08-29 15:59:52
    在物理层上看,一个完整的以太网帧有7个字段,事实上,前两个字段并不能算是真正意义上的以太网数据帧,它们是以太网在物理层上发送以太网数据时添加上去的。为了实现底层数据的正确阐述,物理层使用7个字节前同步码...
  • 以太网帧

    千次阅读 2018-05-20 20:46:59
     以太网帧(Ethernet frame)是符合以太网标准的链路层协议数据单元(PDU),其格式有Ethernet V1、Ethernet V2、RAW 802.3、IEEE 802.3/802.2 LLC和IEEE 802.3/802.2SNAP。现在大多数网络应用都使用Ethernet V2...
  • 链路层上最常见的封装就是以太网和IEEE 802封装,这里就使用以太网作为...这个长度是提供给上层协议的数据负载,也就是上层协议封装的数据长度不要超过以太网帧数据长度。最小数据帧尾46,最大数据帧长为1500.  在
  • 以太网帧格式

    2013-12-19 20:46:06
    以太网帧格式,即在以太网帧头、帧尾中用于实现以太网功能的域。 图2 IEEE802.3以太帧头   字段 字段长度(字节) 目的 前导码(Preamble) 7 同步 帧开始符(SFD) 1 标明下一个字节为目的...
  •   dev_add_pack加载ETH_P_ALL自定义函数fucntion: static int fucntion(struct sk_buff *skb, struct net_device *dev, struct packet_type *pt) { //截获包,修改桢类型字段为自己...
  • 以太网(IEEE 802.3)格式: 1、前导码:7字节0x55,一串1、0间隔,用于信号同步 2、起始定界符:1字节0xD5(10101011),表示一开始 3、DA(目的MAC):6字节 4、SA(源MAC):6字节 5、类型/长度:2字节,0~...
  • 以太网帧结构详解

    万次阅读 多人点赞 2019-07-15 21:52:59
    以太网帧结构详解前言分层模型- OSI分层模型– TCP/IP数据封装终端之间的通信帧格式Ethernet_II 帧格式IEEE802.3 帧格式数据帧传输以太网的MAC地址数据帧的发送和接收单播广播组播发送与接收 前言 20世纪60年代以来...
  • 以太网帧解析

    2021-05-08 10:56:20
    注:本文参考了CSDN博主「OshynSong」的原创文章...以太网帧数据格式: 1.前同步码 前7B都是10101010,最后1B是10101011。 用于将发送方与接收方的时钟进行同步,由网卡适配器接收帧时同步时钟使用,不会在
  • 以太网帧长度1518、1522、1536的说明

    千次阅读 2018-01-15 14:13:15
    一、IEEE802.3 以太网帧结构:  Preamble (7-bytes) --前导码 Start Frame Delimiter (1-byte) --定界符  Dest. MAC Address (6-bytes) --目的地址  Source MAC Address (6-bytes) --...
  • 数据链路层——以太网帧结构

    千次阅读 2020-05-16 22:28:13
    目录前言格式Ethernet_II格式IEEE802.3格式数据帧传输以太网的MAC地址 前言        数据包在以太网物理介质上传播之前必须封装头部和尾部信息,封装后的数据包称为数据帧...
  • 02以太网帧格式

    2020-07-12 10:02:32
    以太网(RFC 894)帧格式 ...以太网帧中的数据长度规定最小46字节,最大1500字节,ARP和RARP数据包的长度不够46字节,要在后面补填充位。最大值1500称为以太网的最大传输单元(MTU),不同的网络类型有不
  • 以太网数据帧(802.3)最大与最小长度2017年03月20日 19:40:01 Farmwang 阅读数:5370更多个人分类: TCP/IP以太网(IEEE 802.3)格式: 1、前导码:7字节0x55,一串1、0间隔,用于信号同步2、起始定界符:1字节0...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,129
精华内容 6,451
关键字:

以太网帧数据字段的长度