精华内容
下载资源
问答
  • 以太网协议
    千次阅读
    2018-11-23 15:38:52

    以太网(Ethernet)

    以太网是一种局域网技术,其规定了访问控制方法、传输控制协议、网络拓扑结构、传输速率等,完成数据链路层和物理层的一些内容,它采用一种称作CSMA/CD的媒体接入方法,其意思是带冲突检测的载波侦听多路接入(Carrier Sense, Multiple Access with Collision Detection),另外的一些局域网技术有令牌环网,无线LAN等。

    以太网协议

    TCP/IP四层模型中,以太网协议采用RFC894格式,如下图:
    在这里插入图片描述

    其中目的地址和源地址指的是MAC地址,即设备的物理地址。MAC地址用于标示网卡,每个网卡都具有唯一的MAC 地址
    在这里插入图片描述

    当在同一个局域网中,主机A需要给主机B发送消息时,主机A将以太网桢发出,此时局域网中所有主机均可收到这个桢,主机中的网卡接收到以太网桢后,会将目的MAC地址和自己的MAC地址进行比较,如果不相同就会丢弃,如果相同则会接收,此时则B主机就收到了A的消息。
    以太网桢中的类型指的是,其内部数据的协议类型,如果中间是IP数据报则协议类型为0800, 如果是ARP请求或者应答,则为0806,类型占两个字节
    其最后面是CRC循环冗余码,用于差错控制,即检验桢的正确性
    最后就是以太网桢为了提供足够快的响应速度具有长度限制,其数据部分的最大长度受到MTU控制, 最小长度不能小于46字节,如ARP请求为28位,为了满足最小长度需要填充到46位(PAD)

    MTU(最大传输单元)

    MTU是根据不同类型的网络给出的最大传输单元的限制,如以太网的MTU为1500字节,16MB/s的令牌环(IBM)的MTU 为17914字节,其作用是为了保证网络有足够快的响应速度,另外MTU 指的是以太网桢数据部分的长度,并非以太网桢的长度。假设需要发送的UDP数据报长度大于MTU减去IP首部长度,此时数据报在IP层就会进行分片。
    在这里插入图片描述

    单播 多播 广播

    在以太网协议中,目的地址分为三种单播地址、广播地址、多播地址,其中单播地址如上面A给B主机发送,其接收者为一个,并且其目的地址的最高字节的低位为0,
    以太网多播地址48位中的最高字节的低位为1,如 01:00:00:00:00:00 ,只要这一位为1均为多播地址,‘
    以太网广播地址可以看作特殊的多播地址其48位全为1 11:11:11:11:11:11,
    当网卡收到一个桢后查看桢检验和,如果桢检验和出错则丢弃,然后进行桢过滤,检验其桢是否具有合法的桢类型,其目的地址是否和自己的物理地址相同,或者是否是多播地址,然后根据帧类型进行分用。
    另外网卡可以设置为混合模式,可以接受每个收到的桢的一个复制,tcpdump采用这种方法。

    参考:《TCP/IP详解卷1:协议》 LawrenceBerkeley

    更多相关内容
  • 存储区域网(SAN)采用光纤通道协议 ,...而 HyperSCSI是一种直接建立在以太网协议基础上的网络存储协议 ,具有协议层次少、通信效率高的优点。文中首先介绍了该协议的实现机制和性能分析结果 ,然后在以 PC机构建的网络存
  • 文章提出一种基于AMBA 协议的双通道以太网MAC 架构,通过设计RGMII 接口单元,实现双通道以太网MAC 接口 的引脚复用,有效地降低了芯片管脚数目,同时通过设计PLB2AHB 协议转换单元,实现通信数据AHB 总线与PLB 总 ...
  • 以太网一种产生较早,使用相当广泛的局域网技术,局域网就是一个区域的网络互联,可以使办公室也可以是学校等等,大小规模不一。 最初是由Xerox(施乐)公司创建(大概是1973年诞生)并由Xerox、 Intel和DEC公司...


    因为没有做过以太网的项目,也没有进行过以太网通信测试,本片博客仅仅是对以太网协议极小一部分的学习了解。如有不当之处,还请指正。

    一、以太网

    以太网是一种产生较早,使用相当广泛的局域网技术,局域网就是一个区域的网络互联,可以使办公室也可以是学校等等,大小规模不一。
    最初是由Xerox(施乐)公司创建(大概是1973年诞生)并由Xerox、 Intel和DEC公司联合开发的基带局域网规范,后来被电气与电子工程师协会( IEEE)所采纳作为802.3的标准。

    目前以太网根据速度等级分类大概分为:标准以太网(10Mbit/s),快速以太网(100Mbit/s),千兆以太网(1000Mbit/s),以及更快的万兆以太网(10Gbit/s)。但在平常使用中,快速以太网和千兆以太网已经足够了。

    因为以太网通信不是像蓝牙那样无限通信,而是通过连接线进行通信,所以以太网接发双方都会有接口。以太网接口类型有RJ45接口,RJ11接口(电话线接口),SC光纤接口。其中RJ45接口使我们最常用的以太网接口(电脑接口)。

    RJ45接口也称为水晶头,由插头和插座组成
    在这里插入图片描述
    在这里插入图片描述
    可以看到,RJ45接口和HDMI等接口一样,也是采用差分数据传输,这种传输有抗干扰能力强的特性(这在高速数据传输中很重要)。

    以太网常用于大型数据传输(如:视频数据),以太网也叫以太网协议,就是一种传输规则,发收双方必须遵守这种规则才能正确地进行数据传输和接收。
    以太网通信是以数据包的形式传输, 其单包数据量达到几十, 甚至成百上千个字节。

    二、网络模型

    在这里插入图片描述
    也有将TCP/IP分为四层的模型
    在这里插入图片描述

    而我们在使用FPGA设计以太网传输时,基本只需要考虑数据发送,即只需要考虑设计物理层,也就是生成比特流。
    如果是进行网络系统设计,就需要考虑各种接口(应用层),方便用户等调用。

    三、以太网数据包格式

    在这里插入图片描述

    可以看到,我们一帧能发送的真正的数据内容为:18-1472 Byte;然后将用户数据添加UDP首部,形成UDP层;再加上IP首部,形成IP层;最后加上前导码、SFD(帧起始界定符)、以太网帧头、以及FCS(帧检验序列),构成了MAC层(物理层,包括源MAC地址和目的MAC地址),也就是最终需要在通信线路上传输的数据。

    在设计物理层时,只需要计算得到各个首部、前导码、起始界定符、以及校验,就可以得到物理层,然后进行传输。

    以太网帧格式

    摘自《开拓者FPGA开发指南》

    在这里插入图片描述
    前导码( Preamble) : MAC物理层使用7个字节同步码( 0和1交替( 55-55-55-55-55-55-55))实现数据的同步。

    帧起始界定符SFD, Start Frame Delimiter):使用1个字节的SFD(固定值为0xd5)来表示一帧的开始,后面紧跟着传输的就是以太网的帧头。

    目的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,它用于标志同一网段中的所有设备。
    源MAC地址:即发送端物理MAC地址,占用6个字节。

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

    数据:以太网中的数据段长度最小46个字节, 最大1500个字节。最大值1500称为以太网的最大传输单元( MTU, Maximum Transmission Unit),之所以限制最大传输单元是因为在多个计算机的数据帧排队等待传输时,如果某个数据帧太大的话,那么其它数据帧等待的时间就会加长,导致体验变差,这就像一个十字路口的红绿灯,你可以让绿灯持续亮一小时,但是等红灯的人一定不愿意的。另外还要考虑网络I/O控制器缓存区资源以及网络最大的承载能力等因素, 因此最大传输单元是由各种综合因素决定的。为了避免增加额外的配置, 通常以太网的有效数据字段小于1500个字节。

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

    帧间隙( IFG,Interpacket Gap) :就是以太网相邻两帧之间的时间间隔,帧间隙的时间就是网络设备和组件在接收一帧之后,需要短暂的时间来恢复并为接收下一帧做准备的时间, IFG的最小值是96 bit time,即在媒介中发送96位原始数据所需要的时间,在不同媒介中IFG的最小值是不一样的。
    在这里插入图片描述

    三、TCP/IP协议簇

    TCP( 传输控制协议) /IP(网际协议)协议簇,虽然看上去TCP/IP协议簇只有两个协议,其实TCP/IP协议簇包含了上百种协议,最常用的有TCP、IP、UDP等。其中TCP协议和UDP协议应用最广泛。

    1、IP协议

    IP协议是TCP/IP协议簇中的核心协议,所有的TCP、 UDP及ICMP数据都以IP数据报格式传输。

    从以太网数据包格式中可以看出,IP数据报 包括IP首部和数据段。
    在这里插入图片描述
    IP数据报内容
    在这里插入图片描述
    版本:4位版本号,IPv4(0100),IPv6(0110),目前在以太网使用IPv4多,但是在计算机系统中,IPv6也已经流行起来,因为IPv4仅用32个bit来表示地址,IPv4 地址的总数为 4294967296,到现在,已经快用光了;而IPv6使用128bit来表示地址,理论来说根本用不完。

    首部长度:4位,表示IP首部一共有多少个32位(4Byte),假设无可选字段(一般来说没有),IP首部有20个Byte,则首部长度为5;最大为15,即60个Byte。

    服务类型:8位,普通服务的话,设置为0。可以参考:IP首部中的服务类型(TOS)

    总长度:16位,包括IP首部和IP数据部分,以字节为单位。我们利用IP首部长度和IP数据报总长度,就可以计算出IP数据报中数据内容的起始位置和长度。

    标识:16位,通常每发一份报文,就加1。

    标志:3位,用来表示分片还是不分片,第一位(最高位)保留,第二位(1-不分片,0-允许分片),第三位为1即表示后面“还有分片”的数据报。为0表示这已是若干数据报片中的最后一个。

    叶偏移:13位,在接收方进行数据报重组时用来标识分片的顺序。

    生存时间:8位,防止丢失的数据包在无休止的传播,一般被设置为64或者128。IPv6 地址有两个生存期:首选生存期和有效生存期,而首选的生存期总是小于等于有效的生存期。具体可以参考官方文档。

    协议:8位,表示此数据报所携带上层数据使用的协议类型,TCP为6, UDP为17。可以参考:IP协议号 IP首部中有8位协议号,用于指明IP的上层协议

    首部校验和:这部分需要自己计算,用来校验IP数据报头部是否被破坏、篡改和丢失等,不校验数据。

    源MAC地址,目的MAC地址:就是发送和接收IP地址。

    可选字段:是数据报中的一个可变长度的可选信息,选项字段以32bit为界,不足时插入值为0的填充字节,保证IP首部始终是32bit的整数倍。

    首部校验和计算
    1、将16位校验和字段置为0,将IP首部分为多个16位的单元;
    2、对各个单元采用反码加法运算
    3、假如得到的结果有溢出,则将结果再次分为两个16位相加,直到不出现进位
    如下例:
    在这里插入图片描述

    2、UDP协议

    在以太网数据包中,我们可以看到,TCP协议(IP层)比UDP层复杂,更为可靠,但是UDP运用场景也非常多。
    那为什么不所有传输都用更可靠的TCP协议呢,这就像卖手机,不可能都上最好的配置,毕竟有人不需要这么好的配置,我只需要打电话,一个骁龙835就够了,如果你叫我多花2000块,买一个865,那我没必要。所以这就是需求不同,所以UDP也常用。

    TCP与UDP的区别:TCP为可靠传输协议,而UDP为不可靠传输协议;TCP协议可以保证数据的完整和有序,而UDP不能保证;UDP由于不需要连接,故传输速度比TCP快,且占用资源比TCP少;

    应用场景TCP适用于对数据完整性要求很高的场合,比如文件传输;而UDP适用于对数据完整性要求不高的场合,比如说视频直播,毕竟直播的时候少传输几个像素点,影响也不大,而且视频直播要求数据传输很快。而文件数据要是少一个byte或者更多,可能会造成很大的问题。

    UDP格式数据
    在这里插入图片描述
    其中的UDP校验和和TCP协议的校验和计算方式一样,但是需要计算三个部分:UDP伪首部、UDP首部、UDP数据部分。

    伪首部的数据是从IP数据报头和UDP数据报头获取的,包括源IP地址,目的IP地址,协议类型和UDP长度,其目的是让UDP两次检查数据是否已经正确到达目的地,只是单纯为了做校验用的。在大多数使用场景中接收端并不检测UDP校验和。

    展开全文
  • 以太网数据包TCP、IP、ICMP、UDP、ARP协议头结构详解 以太网数据包TCP、IP、ICMP、UDP、ARP协议头结构详解
  • IEEE 802.3 通常指以太网一种网络协议。描述物理层和数据链路层的MAC子层的实现方法,在多种物理媒体上以多种速率采用CSMA/CD访问方式,对于快速以太网该标准说明的实现方法有所扩展。
  • 以太网学习(2)-- 网络协议简介

    千次阅读 2022-03-20 10:48:31
    TCP/IP是协议族,是个多层协议系统,每层完成不同的功能,且通过若干协议来实现,上层协议使用下层协议提供的服务。。对于开发人员听到最多就是就是应用层协议,比如HTTP、FTP、MQTT等。 TCP/IP是个庞大...

    目录

    一、协议简介

    二、协议间报文封装与拆封

    三、LWIP简介

    四、Lwip文件说明

    4.1)如何获取LWIP源码文件

     4.2)LWIP文件说明

    lwip目录

    src目录

    core目录

    4.3)查看lwip的说明文档

    五、LWIP的三种编程接口

    5.1) RAW/Callback API

    5.2)NETCONN API

    5.3)SOCKET API 


    一、协议简介

    互联网的本质是数字通信,任何数字通信都离不开通信协议的制定,任何通信设备只有按照约定的、统一的方式封装和解析数据才能够实现收发双方的通信交互。互联网通信所要遵守的众多协议被统称位TCP/IP。

    TCP/IP是一个协议族,是一个多层协议系统,每一层完成不同的功能,且通过若干协议来实现,上层协议使用下层协议提供的服务。。对于开发人员听到最多就是就是应用层协议,比如HTTP、FTP、MQTT等。

    TCP/IP是一个庞大的协议族,是众多协议的结合,这些协议按照功能可以划分为不同的层次,某些协议的实现要依赖于其它协议。依据这种依赖关系可以将协议进行分层,低层协议为相邻的上层协议提供服务,是上层协议得以实现的基础。

    TCP/IP分层如下图所示:

    物理层(PHY):规定了传输信号所需要的物理电平、介质特征。

    链路层(MAC):规定了数据帧能被网卡接收的条件,最常见的方式就是利用网卡的MAC地址,发送方会在欲发送的数据帧的首部加上接收方网卡的MAC地址信息,接收方只有监听到属于自己的MAC地址信息后,才会去接收并处理该数据。

    网络层:每台设备网络都应该有自己的网络地址,网络层规定了主机的网络地址该如何定义,以及如何在网络地址和MAC地址之间进行映射,及ARP协议。

    传输层:网络层实现了数据包在主机之间的传递,而每一台主机内部可能运行着多个网络程序,传输层的功能就是区分数据包是属于哪一个应用程序的,可以说传输层实现了数据包端到端的传递,另外,数据包在传输过程中可能出现丢包、乱序、和重复的现象,网络层并没有提供应对这些错误的机制,而传输层可以解决这些问题,如TCP协议。

    应用层:应用层以下的工作实现了数据的传递工作,应用层则决定了你如何应用和处理这些数据,之所以会有这么多的应用层协议,因为互联网中传输数据的种类很多,差异很大,应用场景也十分多样。

    二、协议间报文封装与拆封

    当用户发送数据时,数据会向下进行一层一层的封装,首先先将应用层数据向下交给传输层,这是应用层的操作,接下来传输层会在数据的前面加上传输层的首部,然后向下交给网络层。同样的网络层也会在数据前面加上网络层首部,完后将数据向下交给链路层,链路层会对数据进行最后一次封装,即在数据前面加上链路层首部,然后将数据交给网卡。最后网卡将数据转换为物理链路上的电平信号,数据就这样被发送到网络中了,数据发发送的过程可以概况为TCP/IP的个层协议对数据进行封装的过程,如下图所示:

    当设备的网卡接收到某个数据包后,会将其放在网卡的接收缓冲区中,并告知TCP/IP内核,然后TCP/IP内核就开始工作,它会将数据从接收缓冲区中取出,并逐层解析数据包中协议首部信息,并最终将数据交给某个应用程序,数据接收的过程与发送的过程正好相反,可以概括为TCP/IP的各层协议对数据进行解析的过程。

    三、LWIP简介

    lwip(Light Weight IP),轻量级TCP/IP协议,是瑞典计算机科学院的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈,LWIP设计的初衷是:用少量的资源消耗实现一个较为完整的TCP/IP协议栈。实现的重点是保持TCP协议的主要功能的基础上减少对RAM的占用。此外LWIP既可以移植到操作系统上运行,也可以在无操系统的情况下运行。

    LWIP主要有以下特性:

    1.支持ARP协议(以太网地址解析协议)

    2.支持ICMP协议(控制报文协议),用于网络的调与维护

    3.支持IGMP协议(互联网组管理协议),可以实现多包数据的接收

    4.支持UDP协议(用户数据报协议)

    5.支持TCP协议(传输控制协议)

    6.支持PPP协议(点对点通信协议),支持PPPoE

    7.支持DNS域名解析

    8.支持DHCP协议,动态分配IP地址

    9.支持IP协议,包括IPv4,IPv6协议,支持IP分片和重装功能,多网络接口下的数据包转发

    10.支持SNMP协议(简单网络管理协议)

    11.支持AUTOIP,自动IP地址配置

    12.提供专门的内部回调接口(Raw API),用于提高应用程序性能

    13.提供可供选择的Socket API、NETCONN API(在多线程情况下使用)

    四、Lwip文件说明

    4.1)如何获取LWIP源码文件

     http://savannah.nongnu.org/projects/lwip/

    这个主页简单的介绍了一下LWIP,然后给了许多链接,这里我们只关注两个地方。

     点击“project homepage”,会得到一个网页,这个网页可以看成是lwip的官网说明文档,我们可以通过这个网页获得关于lwip的很多信息,包括LWIP的使用注意、数据的拷贝、系统的初始化流程等。点击后的内容如下图所示:

     点击“Download Area”,会得到一个网页,通过这个网页,我们可以下载到LWIP所有的版本源代码包和contrib包(里面是移植和应用LWIP的一些demo,即应用实例),点击每一个红色字体的资源链接,浏览器就会开启一个ftp连接,帮助你下载想要的文件到电脑中。Download Area的内容如下所示:

    另外还有一些“.sig”后缀的文件,这是数字签名,大家忽略就好。

     4.2)LWIP文件说明

    lwip目录

    打开lwip2.1.3文件夹如下图所示

     该目录下的内容为:

    ①  CHANGELOG :文件记录了 LwIP 在版本升级过程中源代码发生的变化。

    ②  COPYING :文件记录了 LwIP 这个开源软件的 license。一个软件开源,不代表你 能无限制地使用它,你需要在使用它的过程中遵守一定的规则,这些规则就是 license。大 家可以用记事本打开这个 COPYING 文件看看它的内容。开源软件的 license 有很多种,LwIP 的属于 BSD License。LwIP 的开源程度是很高的,你几乎可以无限制地使用它。

    ③  FILES :文件用于介绍当前目录下的目录信息。

    ④  README :文件对 LwIP 进行了一个简单的介绍。

    ⑤  UPGRADING: 文件记录了 LwIP 每个大版本的更新,会对用户使用和移植 LwIP 造成的影响。所谓大版本更新指的是:1.3.x - 1.4.x – 2.0.x – 2.1.x。小版本更新,比如 2.0.1 – 2.0.2 – 2.0.3,这个过程只是一些 bug 的修复和性能的改善,不会对用户的使用造成影响。 用户只要将原有工程的目录中与 LwIP 相关的旧版本文件替换成新版本的文件,重新编译, 就能直接使用。

    ⑥  doc :文件夹里面是关于 LwIP 的一些文档,可以看成是应用和移植 LwIP 的指南。 但是这些文档比较零散,不成体系,而且纯文本阅读起来很费劲,阅读意义不是很大。

    ⑦  test :文件夹里面是测试 LwIP 内核性能的源码,将它们和 LwIP 源码加入到工程中 一起编译,调用它们提供的函数,可以获得许多与 LwIP 内核性能有关的指标。这种内核 性能测试功能,只有非常专业的人士才用的到。

    ⑧  src: 文件夹里面就是我们最关心的 LwIP 源码文件,下面会详细讲解

    src目录

    打开src文件夹如下图所示:

     该目录下的内容为:

    ①  api :文件夹里面装的是 NETCONN API 和 Socket API 相关的源文件,只有在操作系统的 环境中,才能被编译。

    ②  apps :文件夹里面装的是应用程序的源文件,包括常见的应用程序,如 httpd、mqtt、 tftp、sntp、snmp 等。

    ③  core: 文件夹里面是 LwIP 的内核源文件,后续会详细讲解。

    ④  include :文件夹里面是 LwIP 所有模块对应的头文件。

    ⑤  netif :文件夹里面是与网卡移植有关的文件,这些文件为我们移植网卡提供了模板,我 们可以直接使用。

    lwip内核是由一系列模块组合而成的,这些模块包括:TCP/IP协议栈的各种协议、内存管理模块、数据包管理模块、网卡管理模块、网卡接口模块、基础功能类模块、API模块。每个模块是由相关的几个源文件和头文件组成的,通过头文件对外声明一些函数、宏、数据类型,使得其它模块可以方便地调用此模块的功能。而构成每个模块的文件都被组织在include目录中,而源文件则根据类型被分散地组织在api、apps、core、netif目录中。

    core目录

    core存放的是LWIP的内核源文件,打开如下图所示:

     接下来我们逐一介绍这些源文件的功能:

    ipv4:文件夹里面是与IPv4模块相关的源文件,它实现了IPv4协议规定的对数据包的各种操作。ipv4文件夹中还包括一些并非属于IP协议,但会受IP协议影响的协议源文件包括DHCP、ARP、ICMP、IGMP。

    ipv6:文件夹里面是与IPv6模块相关的源文件,它实现了IPV6协议规定的对数据包的各种操作。IPv6文件夹中还包括一些并非属于IP协议,但会受IP协议影响的协议源文件,包括DHCP、ARP、ICMP、IGMP。

    altcp.c、altcp_alloc、altcp_tcp.c等文件是应用程序分层TCP连接API,从TCPIP线程使用,是一个抽象层,可以模拟应用程序的tcp回调API。

    def.c文件定义了一些基础类函数,比如主机序和网络字节序的转换、字符串的查找和比较、整数转换为字符串等,这些函数会被LWIP内核的很多模块所调用。在include 目录里面的def.h文件对外声明了def.c所实现的函数,同时定义了许多宏,能实现一些基础操作,比如取最大值、最小值、数值长度等。

    dns.c文件实现了域名的解析的功能,有了它,用户就可以在知道服务器域名的情况下,获得该服务器的IP地址。很多时候我们只记得服务器域名而不记得服务器IP地址,例如“”www.baidu.com“这就是一个域名,通过dns功能,我们就可以得到服务器域名对应的IP地址,这给用户使用带来了很大的方便。

    inet_chksum.c问价提供了LWIP所需的校验和功能,在IP、UDP、TCP协议的实现中,需要计算校验和。

    init.c文件对LWIP用户宏配置进行了检查,会将配置错误和不合理的地方,通过编译器的#error和#waring功能表示出来。另外,init.c定义了lwip_init初始化函数,这个函数会依次对lwip的各个模块进行初始化。

    ip.c文件实现了IP协议相关的函数,但是只封装了ipv4和ipv6文件夹中的函数

    mem.c文件实现了动态内存池管理机制,使得lwip内核的各个模块可以灵活的申请和释放内存。

    memp.c文件实现了静态内存堆管理机制,使得lwip内核的各个模块可以快速的申请和释放内存。

    netif.c文件实现了网卡的操作,比如注册/删除网卡、使能/禁能网卡、设置网卡IP地址等。netif与include目录中的netif文件公用构成了lwip的netif模块,它对网卡进行了抽象,使得LWIP内核可以方便的管理多个特性各异的物理网卡。

    pbuf.c文件实现了lwip网络数据包的各种操作。网络数据包在lwip内核中以pbuf结构体的形式存在,这提高了lwip内核对数据包的处理效率,以及提高了数据包在各层之间的传递效率。

    raw.c实现了一个传输层协议的框架,我们可以在它的基础上修改和添加代码,实现自定义的传输层协议,与UDP/TCP作为传输层协议。但有时,底层网络开发人员会嫌UDP的可靠性太差,或者TCP虽然可靠性强,但是很耗费时间和内存,他们需要根据实际需求,平衡利弊,定义自己的传输层协议。

    stat.c文件实现了lwip内核的统计功能,使用户可以实时的查看lwip内核对网络数据包的处理情况。

    sys.c文件和sys.h文件构成了LWIP的sys模块,它提供了与临界区相关的操作

    tcp.c、tcp_in.c和tcp_out.c文件实现了TCP协议,包括对TCP连接的操作、对TCP数据包的输入输出操作和TCP定时器,它们和include目录中名称带tcp的头文件共同构成了LWIP的TCP模块。

    timeouts.c定义了LWIP内核的超时处理机制。LWIP内核中多个模块的实现需要借助超时处理机制,包括ARP表项的时间统计、IP分片报文的重装、TCP的各种定时器、实现各种应用层协议需要的超时处理。

    udp.c文件实现了UDP协议,包括对UDP连接的操作和UDP数据包的操作。

    4.3)查看lwip的说明文档

    我们一般点击左侧的”Modules“,查看模块相关的说明,以及例子。如下图所示

     还有一些用户常用的API函数,也是可以在"Modules"中找到。

     还有应用层相关的说明可以在"Application"中找到,数据结构相关的可以在”Data Structures“中查看详细说明。

    五、LWIP的三种编程接口

    Lwip提供了三种编程接口,分别为RAW/Callback API 、NETCONN API、SOCKET API。它们的易用性从左到右依次提高,而执行效率从左到右依次降低。

    5.1) RAW/Callback API

    RAW/Callback API 是指内核回调型的API,这在许多通信协议的C语言实现中都有所应用。对于从来没有接触过回调式编程的人来说,可能理解起来比较困难。

    RAW/Callback API 是LWIP的一大特色,在没有操作系统支持的裸机环境中,只能使用这种API进行开发,同时这种API也可以应用在操作系统环境中。这里先简要说明一下”回调“的概念。你新建了一个TCP或者UDP的连接,你想等它接收到数据后去处理它们,这时你需要把处理该数据的操作封装成一个函数,然后将这个函数的指针注册到LWIP内核中,LWIP内核会在需要的时候去检测该链接是有接收到数据,如果接收到数据,内核会在第一时间调用注册的函数,这个或称被称为回调。这个注册的函数被称为”回调函数“。这个回调函数中封装着你想要的业务逻辑,在这个函数中,你可以自由的处理接收到的数据,也可以发送任何数据,也就是说这个回调函数就是你的应用程序。

    在回调编程中,LWIP内核把数据交给应用程序的过程就是一次简单的函数调用,这里是非常节省时间和空间资源的。每一个回调函数实际上就是一次简单的C函数,这个函数在TCP/IP内核中被调用。每一个回调函数都作为一个参数传递给当前TCP或UDP连接。而且,为了能够保存程序的特定状态,可以向回调函数传递一个指定的状态,并且这个指定的状态是独立于TCP/IP协议栈的。

    在有操作系统的环境中,如果使用RAW/Callback API,用户的应用程序就以回调函数的形式成为了内核代码的一部分,用户的应用程序和内核程序会处于同一个线程中,这就省去了任务间通信和切换任务的开销了。

    简单来说,RAW/Callback API 的优点有两个:

    (1)可以在没有操作系统的环境中使用

    (2)在有操作系统的环境中使用,对比另两种API,可以提高应用程序的效率、节省内存的开销。

    RAW/Callback API 的优点是显著的,但是缺点也是显著的;

    (1)基于回调函数开发应用程序的思维过于复杂。利用回调函数去实现复杂的业务程序时,会很麻烦,而且代码的可读性比较差。

    (2)在操作系统环境中,应用程序代码和内核代码处于同一线程,虽然能够节省任务间通信和切换任务的开销,但是相应的,应用程序的执行会制约内核程序的执行,不同的应用程序之间也会相互制约。在应用程序执行过程中,内核程序将不可能得到运行,这会影响到网络数据包的处理效率。如果应用程序占用的时间过长,而且碰巧这时又有大量的数据包到达,由于内核代码长期得不到执行,网卡接收缓存的数据包就持续积累,到时候很可能因为满载而丢弃一些数据包,而造成丢包的现象,

    5.2)NETCONN API

    在操作系统环境中,可以使用NETCONN API 或者 Socket API 进行网络应用程序的开发。

    NETCONN API是基于操作系统的IPC机制(即信号量和邮箱机制)实现的,它的设计将LWIP内核代码和网络应用程序分离成了独立的线程。如此一来,LWIP内核线程就只是负责数据包的TCP/IP封装和拆封,而不用进行数据的应用层处理,大大提高了系统对网络数据包的处理效率。

    前面提到,使用RAW/Callback API会造成内核程序和网络应用程序、不同网络应用程序之间的相互制约,如果使用NETCONN API 或者Socket API,这种制约将不复存在。在操作系统环境中,LWIP内核会被实现为一个独立的线程,名为tcpip_thread,使用NETCONN API 或者 Socket API的应用程序处在不同的线程中,我们可以根据任务的重要性,分配不同的优先级给这些线程,从而保证重要任务的时效性,分配优先级的原则具体见表格

     NETCONN API 使用了操作系统的IPC机制,对网络连接进行了抽线,用户可以像操作文件一样操作网络连接(打开/关闭、读/写数据)。但是NETCONN API并不如操作文件的API那样简单易用。比如NETCONN API的读数据API,用户获得的是一个特殊的数据结构netbuf,用户如果想要使用好它就要对内核的pbuf和netbuf结构体有所了解,我们会在后续进行讲解。NETCONN API之所以采用这种设计,就是为了避免数据包在内核程序和应用程序之间发生拷贝,从而降低程序运行效率。当然,用户如果不在数据递交时的效率问题,也可以把netbuf中的数据取出来拷贝到一个数组中,然后去处理这个数组。

    简单来说,NETCONN API的优缺点是:

    (1)相较于RAW/Callback API,NETCONN API 简化了编程工作,使用户可以按照操作文件的方式来操作网络连接。但是,内核程序和网络程序之间的数据包传递,需要依靠操作系统的信号量和邮箱机制完成,这需要耗费更多的时间和内存,另外还加上任务切换的时间,效率低。

    (2)相较于Socket API ,NETCONN API 避免了内核程序和网络程序之间的数据拷贝,提高了数据传递的效率。但是,NETCONN API 的易用性不如Sockst API 好,他需要用户对LWIP内核所使用的数据结构有一定的了解。

    5.3)SOCKET API 

    Socket ,翻译过来是套接字,它是对网络的高级抽象,使得用户可以像操作文件一样操作网络连接。他十分易用,Socket已经成为了网络编程的标准。在不同的操作系统中,运行着不同的TCP/IP协议,但是它只要实现了Socket的接口,那么Socket编写的网络应用程序就能在其中运行。所以Socket编写的网络应用程序具有很好的移植性。

    不同的系统有自己的一套socket接口。Windows系统中支持的是WinSock,UNIX/Linux 系统支持的是BSD Socket,它们虽然风格不一致,但是大同小异,如果想要移植不同操作系统的网络应用程序到使用LWIP的系统中,需要注意。

    相较于NETCONN API,Socket API具有更好的易用性。使用Socket API编写的程序可读性好,便于维护,也便于移植到其他操作系统中。Socket API 在内核程序和应用程序之间存在数据拷贝,所以数据的传递效率会差于NETCONN API。另外,lwip的Socket API 是基于NETCONN API 实现的,所以效率上不如前者。

    展开全文
  • 以太网完整协议

    万次阅读 多人点赞 2017-05-03 15:54:31
    以太网是目前最流行的一种局域网组网技术(其他常见局域网组网技术还有令牌环局域网、无线局域网、ATM局域网),以太网技术的正式标准是IEEE 802.3标准,它规定了在以太网中传输的数据帧结构,如下图所示。...

    一、以太网中数据帧结构

    以太网是目前最流行的一种局域网组网技术(其他常见局域网组网技术还有令牌环局域网、无线局域网、ATM局域网),以太网技术的正式标准是IEEE 802.3标准,它规定了在以太网中传输的数据帧结构,如下图所示。

                  

    在物理层上看,一个完整的以太网帧有7个字段,事实上,前两个字段并不能算是真正意义上的以太网数据帧,它们是以太网在物理层上发送以太网数据时添加上去的。为了实现底层数据的正确阐述,物理层使用7个字节前同步码(0和1交替的56位(55-55-55-55-55-55-55))实现物理层帧输入/输出同步;使用1个字节的SFD(帧首定界符,固定为10101011)标识帧的开始。上图中剩下的5个字段是真正的以太网数据,其中包含了目的地址和源地址,它们都是6字节长度(通常每个网卡都有1个6个字节MAC地址,以在以太网中唯一地标识自己)。网卡接收数据时,通过将目的地址字段和自身的MAC地址做比较,判断是否接收该数据包。通常,将这里的6字节目的地址按照下面的格式来书写,如:00-01-02-03-04-05。这6个字节在以太网中是按照从左到右的顺序发送的,同时对每个字节来说,最先发送的是最低位bit0,最后是最高位bit7。

          在以太网帧中,目的地址可以分为三类:单播地址、多播地址和广播地址。单播地址通常与一个具体网卡的MAC地址相对应,它要求第一个字节的bit0(即最先发出去的位)必须是0;多播地址则要求第一个字节的bit0为1,这样,在网络中多播地址不会与任何网卡的MAC相同,多播数据可以被很多个网卡同时接收;广播地址的所有48位全为1(即FF-FF-FF-FF-FF-FF),同一局域网中的所有网卡可以接收广播数据包。

    上图中的长度/类型具有两个意义,当这两个字节的值小雨1518时,那么它就代表其后数据字段的长度;如果这两个字节的值大于1518,则表示该以太网帧中的数据属于哪个上层协议(例如0x800,代表IP数据包;0x806,代表ARP数据包等。)

    在使用网卡进行数据包的发送与接收时,网卡已为我们完成了物理层的所有工作,驱动程序要做的是,在发送数据时,将目的地址、源地址、类型/长度、数据和填充这些值写入网卡,网卡自动计算其CRC并添加在数据帧尾部,同时对数据帧进行物理层的封装,最后将数据帧发送出去;在接收数据时,网卡会自动检测并接收数据包,验证校验和并把上述四个字段的值放在内部SRAM中供控制器读取。

    TCP/IP协议有自己的地址:32bit的IP地址(网络地址),网络层发送数据包时只知道目的地址的IP地址,而底层接口(如以太网驱动程序)必须知道对方的硬件地址才能将数据发送出去。

    二、ARP协议

    ARP的功能是在32bit的IP地址和采用不同网络技术的硬件地址之间提供动态映射,为上层将底层的物理地址差异屏蔽起来,这样上层的因特网协议就可以灵活地使用IP地址进行通信了。ARP协议的基本功能是使用目标主机的IP地址,查询其对应的MAC地址,以保证底层链路上数据包通信的进行。为了实现在网络接口物理地址与IP地址间的转换,ARP协议中引入了ARP缓存表的概念。ARP缓存表中记录了一条一条的<IP地址,MAC地址>对,他们是主机最近运行获得的关于周围其他主机的IP地址到物理地址的绑定,当需要发送IP数据包时,ARP层根据目的IP地址来查找ARP缓存表,并将匹配的MAC地址装入以太网帧首部,最后发送以太网数据。

    ARP缓存表的建立与ARP数据包是密切相关的。在以太网中,ARP数据包和IP数据包是两个独立的部分,它们都封装在以太网帧中发送。ARP数据包的种类有两种:一是ARP请求包,它是通过以太网广播的方式发送的,用于向具有某个IP地址的主机发送请求,希望该主机返回其MAC地址;二是ARP应答包,收到ARP请求的主机会比对该数据包中的IP地址与自己的IP地址是否符合,若是,则该主机向源主机返回一个ARP应答包。向源主机报告自己的MAC地址。源主机通过提取ARP应答包中的相关字段来更新ARP缓存表。在Windows控制台上输入arp -a,可以查看操作系统中使用的ARP缓存表。

    举一个简单的例子来看看ARP的功能。假如我们的主机(192.168.1.11)需要向开发板(192.168.1.37)发送一个IP数据包,当发送数据时,主机会在自己的ARP缓存表中寻找是否有目标IP地址。如果找到了,也就知道了目标MAC地址为(04-02-35-00-00-01),此时,主机直接把目标MAC地址写入以太网首部发送就可以了;如果在ARP缓存表中没有找到相对应的IP地址,此时比较不幸,我们的数据需要被延迟发送,随后主机会先在网络上发送一个广播(ARP请求,以太网目的地址为FF-FF-FF-FF-FF-FF),广播的ARP请求表示同一网段内所有主机将会收到这样一条信息:“192.168.1.37的MAC地址是什么?请回答”。网络IP地址为192.168.1.37(开发板)的主机接收到这个帧后,它有义务做出这样的回答(ARP应答):“192.168.1.37的MAC地址是(04-02-35-00-00-01)”。这样,主机就知道了开发板的MAC地址,先前被延时的数据包就可以被发送了,此外,主机将这个地址对保存在缓存表中,以便后续数据包发送时使用。

    ARP协议的核心就是对ARP缓存表的操作。发送数据包时,查找缓存表以得到目的MAC地址,此外,ARP还需要不断地处理ARP请求包和ARP应答包,以保证缓存表中各个表项的有效性。ARP的实质就是对缓存表的建立、更新、查询等操作。

    2.2 ARP报文

    要在源主机上建立关于目标主机的IP地址与MAC地址对应表项,则源主机和目的主机的基本信息交互式必须的,简单地说就是,源主机如何告诉目的主机:我需要你的MAC地址;而目的主机如何回复:这就是我的MAC地址。这时ARP报文(ARP数据包)就派上用场了。

    ARP请求和ARP应答都是被组装在一个ARP数据包中发送的,ARP包的组成结构如下图所示。需要注意的是:ARP包时被封装在以太网帧中发送的,所以在图中也列出了以太网帧头部。

          以太网帧头部中的前两个字段是以太网的MAC地址和源MAC地址,目的地址为全1的特殊地址是以太网广播地址。在ARP表项建立前,源主机只知道目的主机的IP地址,并不知道其MAC地址,所以在数据链路上,源主机只有通过广播的方式将ARP请求数据包发送出去,同一网段上的所有以太网接口都会接收到广播的数据包。

           两个字节长的以太网帧类型表示帧中数据的类型。对于ARP包来说,该字段值为0x0806;对IP包来说,该字段的值为0x0800。接下来就是ARP数据包部分了,第一个硬件类型字段表示发送方想要知道的硬件接口类型,对于以太网MAC地址,它的值为1.协议类型字段表示要映射的协议地址类型,它的值为0x0800时,即表示要映射为IP地址,该值与以太网数据帧头中的类型字段的值使用相同的一组值。

    接下来的两个单字节长度的字段,称为硬件地址长度和协议地址长度,它们分别指出硬件地址和协议地址的长度,长度单位为字节。对于以太网上ARP请求或应答来说,它们的值分别为6和4,代表MAC地址的长度和IP地址的长度。在ARP协议包中流出硬件地址长度和协议地址长度字段可以使得ARP协议在任何网络中被使用,而不仅仅只在以太网中。

          操作字段op指出ARP数据包的类型,它们可以使ARP请求(值为1)、ARP应答(值为2)。

          接下来的四个字段是发送端的以太网MAC地址、发送端的IP地址、目的端的以太网MAC地址和目的端的IP地址。





    展开全文
  • 网络协议以太网协议解析

    千次阅读 2020-04-18 18:03:34
    Ethernet :以太网协议,用于实现链路层的数据传输和地址封装(MAC) 封装原理: 以太网的数据帧格式如下图所示: 它由6个字节的目的MAC地址,6个字节的源MAC地址,2个字节的类型域(用于标示封装在这...
  • 最全工业以太网通讯协议

    千次阅读 2021-07-02 16:37:13
    工业以太网及工业自动化连接器的接线方式主要根据设备的协议来确定的,工业以太网和工业自动化主要有:Ethernet/以太网,CANopen,Devicenet,PROFIBUS,INTERBUS,PROFINET,ETHERCAT,Sercos,Varan,SFC-interface,CC-...
  • SOME/IP (Scalable service-Oriented MiddlewarE over IP) 是车载以太网通信引入的个概念,位于OSI 7层模型的层4之上。 ↑ SOME/IP数据在以太网报文中的位置 SOME/IP其实是构架在传输层之上的应用层通信协议,...
  • 【计算机网络学习笔记07】以太网帧结构、HDLC协议 以太网帧结构 1.1 两帧格式 1)Ethernet_II帧格式 2)IEEE802.3帧格式 1.2 帧的3发送方式 1)单播: 帧从单一的源端发送到单一的目的端。 在冲突域中,...
  • 以太网协议号字段定义

    千次阅读 2018-07-23 12:09:29
    当前使用的以太网协议一般指EthernetII协议,它是Xerox与DEC、Intel等公司在1982年制定的以太网标准帧格式,在当时是一种事实工业标准。到1985年,IEEE又发布了802.3/802.2以太网标准。这两种标准都规定以太网MAC...
  • 以太网MAC协议--CSMA/CD协议

    千次阅读 2019-11-27 11:38:55
    为了通信的方便,以太网采用了两重要的措施: CSMA/CD协议 采用无连接的工作方式:传输数据之前不用建立连接 对发送的帧不进行编号,也不要求接收方发回确认帧。这样做的理由:局域网的信道质量非常好,因为信道...
  • 汽车以太网对TCP/IP协议簇的应用

    千次阅读 2019-03-05 14:48:05
    汽车以太网与传统以太网的主要区别在于物理层及应用层,而网络层及传输层大多参考传统应用,即TCP/IP协议簇(TSN暂不讨论)。使用传统网络TCP/IP协议簇,既能加快汽车以太网数据传输的速度,又能与因特网无缝连接,...
  • POWERLINK 工业实时以太网协议简介

    千次阅读 2022-03-19 13:14:40
    工业以太网是应用于工业控制领域的以太网技术。在技术上与商用以太网(即IEEE 802.3标准)兼容,但是实际产品和应用却又完全不同。这主要表现普通商用以太网的产品设计时,在材质的选用、产品的强度、适用性以及实时...
  • 以太网的CSMA/CD协议

    万次阅读 2018-10-19 09:30:49
    以太网 Ethernet的核心的技术就是载波侦听访问协议(carrier sense Multiple access with collision detection,CSMA/CD) CSMA/CD协议 基本原理:站在发送数据之前,先侦听信道上是否有其他站发送的载波信号,若有...
  • 文章目录1.以太网帧的格式2. ARP协议2.1 ARP协议的作用2.2 ARP数据报的格式 ...帧协议类型字段有三值,分别对应IP,ARP,RARP 帧末尾是CRC校验码 2. ARP协议 2.1 ARP协议的作用 ARP协议建立了主机IP地...
  • 以太网--车载以太网

    千次阅读 2021-08-19 00:47:20
    以太网--车载以太网1 介绍1.1 以往车载总线技术1.2 车载以太网1.3 线束影响2 优点2.1 满足带宽2.2 减少ECU数量2.3 降低线束成本3 应用3.1 汽车2.4 ...CAN 是 Bosch 公司开发的一种共享串行总线,其传输速率可达到 1 Mb
  • 传统的以太网接入方案如下图,由 MCU+MAC+PHY 再加入网络接口实现以太网的物理连接,通过在主控芯片中植入TCP/IP 协议代码实现通信及上层应用。 硬件协议栈W5500芯片方案 www.w5500.com文档例程全在里面。 由 ...
  • 什么是以太网

    千次阅读 2020-03-26 23:12:30
    正如现在在IEEE 802.3标准中指出的,以太网原来由Xerox开发,后来由Xerox, DEC和Intel共同开发的。以太网一般使用同轴电缆和特种双绞线。最通常的以太网系统是10BASE-T,它的传输速率可达10 Mbps。...
  • DoIP是车载以太网通讯的重要部分,本文主要介绍ISO13400相关链路层、网络层、传输层相关协议、相关协议标准 二、DoIP应用场景(ISO13400-1相关): 三、网络连接方式: 四、物理层和链路层支持(ISO13400-3...
  • 第1关:抓取Ethernet包 任务描述 相关知识 以太帧类型 Ethernet帧格式 IEEE 802.3 帧格式: ... 学会抓取组以太帧结构。 以太帧类型 以太帧有很多类型。不同类型的帧具有不同的格式和 MT
  • 以太网数据帧格式及ARP协议

    千次阅读 2020-08-29 15:59:52
    以太网是目前最流行的一种局域网组网技术(其他常见局域网组网技术还有令牌环局域网、无线局域网、ATM局域网),以太网技术的正式标准是IEEE 802.3标准,它规定了在以太网中传输的数据帧结构,如下图所示。...
  • 以太网协议 变得通俗易懂

    千次阅读 多人点赞 2017-02-14 18:55:39
    容易理解的以太网协议
  • 西门子S7以太网通讯协议

    千次阅读 2019-09-22 21:10:48
    S7以太网协议属于TCP/IP协议族的一种,下图为S7以太网协议在ISO-OSI参考模型中的位置。 通过WireShark抓包,可以看出S7以太网协议的模型: ISO-OSI参考模型、TCP/IP模型及S7以太网协议模型对比 ...
  • 但是PPP协议虽然提供了通信双方身份验证的功能,其协议中没有提供地址信息,而以太网个广播类型的多路访问网络,因而PPP协议是无法直接应用在以太网链路上的。它通过在以太网上提供点到点的连接,建立PPP
  • 以太网数据链路层协议分析!

    千次阅读 2015-05-20 13:07:01
    相信很多新人在学习协议的时候会遇到很多问题,有些地方可能会总是想不明白(因为我自己也是新人^_^),所以,跟据我自己学习的经历和我在学习中所遇到的问题...局域网的几种协议,主要包括以太网第二版、IEEE802系列、
  • 以太网物理层(MAC)接口协议

    千次阅读 2020-03-14 21:09:30
    常见的以太网物理层接口协议项目总结常见的以太网物理层接口协议MII接口GMII接口RGMII接口总结 项目总结 ‘本次的以太网协议,我们将完成与前面DDR3相类似的实验内容,也就是FPGA开发板发送视频内容,在电脑的上位机...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 89,336
精华内容 35,734
关键字:

以太网是哪一种协议