精华内容
下载资源
问答
  • 以太网协议栈篇一:内核网络协议栈浅析这个标题起得比较纠结,之前熟知的PPPOE是作为PPP协议的底层载体,而实际上它也是一个完整的协议,不过它的实现比较简单,由它出发,可以很容易理清楚Linux网络栈的实现方式。...

    以太网协议栈

    篇一:内核网络协议栈浅析

    这个标题起得比较纠结,之前熟知的PPPOE是作为

    PPP协议的底层载体,

    而实际上它也是一个完整的协议,不过它的实现比较简单,由它出发,可以很容易理清楚Linux网络栈的实现方式。

    1.总述

    Linux中用户空间的网络编程,是以socket为接口,一般创建一个sockfd =

    socket(family,type,protocol),之后以该sockfd为参数,进行各种系统调用来实现网络通信功能。其中family指明使用哪种协议域(如INET、UNIX等),protocol指明该协议域中具体哪种协议(如INET中的TCP、UDP等),type表明该接口的类型(如STREAM、DGRAM等),一般设protocol=0,那么就会用该family中该type类型的默认协议(如INET中的STREAM默认就是TCP协议)。

    Linux中利用module机制,层次分明地实现了这套协议体系,并具有很好的扩展性,其基本模块构成如下:

    先看右边,顶层的socket模块提供一个sock_register()函数,供各个协议域模块使用,在全局的net_family[]数组中增加一项;各个协议域模块也提供一个类似的

    register_xx_proto()函数,供各个具体的协议使用,在该协议域私有的xx_proto[]数组中增加一项。这两个数组中的存放的都是指针,指向的数据结构如下图所示:

    很明显它们是用来创建不同类型的socket接口的,且是一种分层次的创建过程,可想而知,顶层socket_create()完成一些共有的操作,如分配内存等,然后调用下一层create;协议域内的create()完成一些该协议域内共有的初始化工作;最后具体协议中的create()完成协议特有的初始化。具体的下一节讲。

    再来看上图右边的,也是顶层socket模块提供的4个函数,前两个一般由具体协议模块调用,由于协议栈与应用层的交互,具体的后面会讲到。后两个一般有协议域模块调用,用于底层设备与协议栈间的交互。但这也不绝对,如在PPPOE协议中,这4个函数都由具体协议模块调用,这是因为PPPOX协议域内的共有部分不多,各个协议间几乎独立。这4个函数的功能及所用到的数据结构,在后面具体用到时会详细说明。

    2.socket插口创建

    首先来看一下最终创建好的socket插口由哪些部分组成,该结构是相当庞大的,这里只给出框架:

    1. 基本属性有state(listen、accept等),flags标志(blocked等),type类型,这里family

    和protocol都没有了,因为它们再创建时使用过了,已经被融入到socket结构中。

    2. File指

    针指向一个file结构,在Linux中一个socket也被抽象为一个文件,所以在应用

    层一般通过标准的文件操作来操作它。

    3. Ops指向一个structproto_ops结构,它是每种协议特有的,应用层的系统调用,最终

    映射到网络栈中具体协议的操作方法。

    4. Sk指向一个struct sock结构,而该结构在分配空间时,多分配了一点以作为该协议的

    私有部分,这里包含了该协议的具体信息,内容相当多。首先是一个structsock_common结构,包含了协议的基本信息;然后是一个sk_prot_create指针,指向一个struct proto结构体,该结构体就是第一节中所述的,用proto_regsiter()注册到内核中的,它包含应用层到协议栈的交互操作和信息(也可以说成是App ? transport layer的交互信息);

    然后还有一个sk_backlog_rcv函数指针,所指函数在协议栈处理完接收到的包之后调

    用,一般仅是把数据包放到该socket的接收队列中,等待APP读取;最后协议的私有部分里存放该协议的私有信息,如pppoe的sessionID、daddr,tcp的连接4元组等,这些信息很重要,利用它们来区分同一个协议中的多个socket。

    创建的总体过程,第一节已讲过了,下面以pppoe为例,描述一个socket插口的具体创建过程:

    之前所述的关键点这里几乎都涉及到了,要注意的是这里的struct proto结构非常简单,因为PPPOE协议几乎没有传输层,所以不需要有太多的中间操作,仅需要一个obj_size来指明struct sock结构后需分配的私有结构大小,关于私有结构的内容,一般在connect操作时才能初始化。

    创建好socket之后,其中的fops,proto_ops,sk_backlog_rcv等操作是如何作用,来实现网络通信的功能?这是后面要讲述的内容。

    3.主动过程

    主动过程即在应用层中通过系统调用

    展开全文
  • 以太网协议栈芯片 CH395DS1技术手册CH9121DS1 CH395 是以太网协议栈管理芯片,用于单片机系统进行以太网通讯。CH395 支持三种通讯接口:8 位并口、SPI 接口或者异步串口,单片机/DSP/MCU/MP
  • CH392 是以太网协议栈管理芯片,用于单片机系统进行以太网通讯。 CH392 芯片自带 10M 以太网介质传输层(MAC)和物理层(PHY),完全兼容 IEEE802.3 协议, 内置了 IP、DHCP、ARP、ICMP、IGMP、UDP、TCP 等以太网协议...
  • 一、简介 1、uIP概述 uIP协议栈去掉了完整的TCP/IP中不常用的功能,简化了通讯流程,但保存了网络通讯必须使用的协议,设计重点放在了IP/TCP/ICMP/UDP/ARP这些网络层和传输层协议上,保证了其代码的通用性和结构的...

    一、简介

    1、uIP概述

    uIP协议栈去掉了完整的TCP/IP中不常用的功能,简化了通讯流程,但保存了网络通讯必须使用的协议,设计重点放在了IP/TCP/ICMP/UDP/ARP这些网络层和传输层协议上,保证了其代码的通用性和结构的稳定性。

    由于uIP协议栈专门为嵌进式系统而设计,因此还具有如下优越功能:

    (1)    代码非常少,其协议栈代码不到6K,很方便阅读和移植。

    (2)    占用的内存数非常少,RAM占用仅几百字节。

    (3)    其硬件处理层、协议栈层和应用层共用一个全局缓存区,不存在数据的拷贝,且发送和接收都是依靠这个缓存区,极大的节省空间和时间。

    (4)    支持多个主动连接和被动连接并发。

    (5)    其源代码中提供一套实例程序:web服务器,web客户端,电子邮件发送程序(SMTP客户端),Telnet服务器, DNS主机名解析程序等。通用性强,移植起来基本不用修改就可以通过。

    (6)    对数据的处理采用轮循机制,不需要操纵系统的支持。

    由于uIP对资源的需求少和移植轻易,大部分的8位微控制器都使用过uIP协议栈, 而且很多的著名的嵌进式产品和项目(如卫星,Cisco路由器,无线传感器网络)中都在使用uIP协议栈。

    2、源码文件介绍

    下载完uIP源码后,解压打开如下:(具体文件说明看图片上的注释,源码下载地址:

    展开全文
  • 关于铁路,地铁的网络通讯协议栈
  • 有没有人改过TCP/IP协议栈,最近在vxworks6.6上有个项目,要改vxworks源码,不知有没有尝试过,我知道一种方法,改完TCP源码后重新建一个库工程,编译后把生成的.a库都拷贝到vxworks的库目录下,但是这样太麻烦了,...
  • 工业以太网协议EtherCAT主开源协议栈,在mbed上有对应的移植到STM32上应用。 工业以太网协议EtherCAT主开源协议栈,在mbed上有对应的移植到STM32上应用。
  • 工业以太网协议EtherCAT从开源协议栈,在mbed上有对应的移植到STM32上应用。 工业以太网协议EtherCAT从开源协议栈,在mbed上有对应的移植到STM32上应用。
  • 本科程序 小型以太网tcpip协议栈源代码,keil下。基于rtl8019as。
  • 对以太网全硬件TCP/IP协议栈的简单认识-w5500以太网协议基本认识.pdf
  • 硬件协议栈和软件协议的区别: MCU+MAC+PHY方案 传统的以太网接入方案如下图,由 MCU+MAC+PHY 再加入网络接口实现以太网的物理连接,通过在主控芯片中植入TCP/IP 协议代码实现通信及上层应用。 硬件协议栈...

    硬件协议栈和软件协议的区别:

    MCU+MAC+PHY方案

    传统的以太网接入方案如下图,由 MCU+MAC+PHY 再加入网络接口实现以太网的物理连接,通过在主控芯片中植入TCP/IP 协议代码实现通信及上层应用。

     

    硬件协议栈W5500芯片方案

    www.w5500.com文档例程全在里面。

    由 MCU+硬件协议栈芯片(内含 MAC和 PHY)直接加网络接口,便可方便的实现单片机联网,所有的处理 TCP/IP 协议的工作都是通过硬件协议栈芯片来完成。

     硬件协议栈是指通过将传统的软件 TCP/IP 协议栈用硬件化的逻辑门电路来实现:

     两种方案对比

    方案分类

    MCU资源利用

    代码量

    安全性

    灵活型

    MAC+PHY方案

    频繁响应中断,占用MCU运算/时钟资源

    轻量级TCP/IP协议栈,约40KB代码量。

    软件协议栈容易受到恶意攻击

    软件协议栈具备灵活性

    W5500硬件协议栈芯片方案

    MCU 只需要处理面向用户的应用层数据

    完成对Socket 的编程以及寄存器的调用,仅有 10K 左右的代码量

    硬件化的电路处理协议会更加快速、稳定

    只支持 4 /8 Socket

    Socket是应用层与TCP/IP协议族通信的中间软件抽象层,它是一组接口。在设计模式中,Socket其实就是一个门面模式,它把复杂的TCP/IP协议族隐藏在Socket接口后面,对用户来说,一组简单的接口就是全部,让Socket去组织数据,以符合指定的协议。

    W5500硬件方案

    硬件连接主要如下:

    注: 一号片选引荐SCS低电平有效。

     程序文件分类

    W5500初始化需要以下几个文件:

    W5500初始化

    操作W5500需要配置下列寄存器参数:

    1. 模式寄存器(MR)
    2. 中断屏蔽寄存器(IMR)
    3. 重发时间寄存器(RTR)
    4. 重发计数寄存器(RCR)

    网络信息设置:

    1. 网关地址寄存器(GAR)
    2. 本机物理地址寄存器(SHAR)
    3. 子网掩码寄存器(SUBR)
    4. 本机 IP 地址寄存器(SIPR)

    代码分析

    SOCKET 接收TX和发送缓存RX的大小配置文件

    void socket_buf_init( uint8 * tx_size, uint8 * rx_size  )
    {
      int16 i;
      int16 ssum=0,rsum=0;
     
      for (i = 0 ; i < MAX_SOCK_NUM; i++)       // Set the size, masking and base address of Tx & Rx memory by each channel
      {
              IINCHIP_WRITE( (Sn_TXMEM_SIZE(i)), tx_size[i]);
              IINCHIP_WRITE( (Sn_RXMEM_SIZE(i)), rx_size[i]);
              
    #ifdef __DEF_IINCHIP_DBG__
             printf("tx_size[%d]: %d, Sn_TXMEM_SIZE = %d\r\n",i, tx_size[i], IINCHIP_READ(Sn_TXMEM_SIZE(i)));
             printf("rx_size[%d]: %d, Sn_RXMEM_SIZE = %d\r\n",i, rx_size[i], IINCHIP_READ(Sn_RXMEM_SIZE(i)));
    #endif
        SSIZE[i] = (int16)(0);
        RSIZE[i] = (int16)(0);
    	
        if (ssum <= 16384)
        {
    			SSIZE[i] = (int16)tx_size[i]*(1024);
        }
    
    	if (rsum <= 16384)
    	{
    			RSIZE[i]=(int16)rx_size[i]*(1024);
        }
    			ssum += SSIZE[i];
    			rsum += RSIZE[i];
    
      }
    }
    

    初始化接收和发送缓存的大小:

    	socket_buf_init(txsize, rxsize);		/*初始化8个Socket的发送接收缓存大小*/

    W5500 有 1 个通用寄存器,8 个 Socket 寄存器区,以及对应每个 Socket 的收/发缓存区。开启8个通道,每一个 Socket 的发送缓存区都在一个 16KB 的物理发送内存中,初始化分配为 2KB。每一个 Socket 的接收缓存区都在一个 16KB 的物理接收内存中,初始化分配为 2KB。无论给每个 Socket 分配多大的收/发缓存,都必须在 16 位的偏移地址范围内(从 0x0000 到 0xFFFF)。
    16KB 的发送内存初始化被分配为每个 Socket 2KB 发送缓存区(2KB X 8 =16KB)。初始化分配的 2KB Socket 发送缓存,可以通过使用 Socket 发送缓存大小寄存器(Sn_TXBUF_SIZE)重新分配。一旦所有的 Socket 发送缓存大小寄存器(Sn_TXBUF_SIZE)配置完成,16KB 的发送内存就会按照配置分配给每个 Socket的发送缓存,并按照从 Socket 0 到 7 顺序分配。

    uint8 txsize[MAX_SOCK_NUM] = {2,2,2,2,2,2,2,2};//tx buffer set	K bits
    uint8 rxsize[MAX_SOCK_NUM] = {2,2,2,2,2,2,2,2};//rx buffet set  K bits

    展开全文
  • 利用W5100本身携带的硬件协议栈以太网进行设计
  • 以太网LWIP协议栈调试记录7.1

    千次阅读 2013-07-12 14:50:45
    下面是测试记录 1、 根据阅读资料的体会,...然后,在板子的以太网口初始化之后,任务栏本地连接图标会变成下图所示。如果是硬件上没连接好,那么就是红叉叉。 开接收中断,可以进入中断服务程序。但是从中

    下面是测试记录

    1、  根据阅读资料的体会,进行一些尝试性的测试,有一些结果。方法如下。

    2、  现在的操作流程是,网线一端连接PC,一端连接板子,板子不上电。此时要把任务栏本地连接图标设置为显示在任务栏状态,给板子上电,网线插紧。然后,在板子的以太网口初始化之后,任务栏本地连接图标会变成下图所示。如果是硬件上没连接好,那么就是红叉叉。


    开接收中断,可以进入中断服务程序。但是从中断返回后,就进入FaultISR,原因不明。

    测试到这,作相关说明:上面的过程,按我的理解是这样的。以太网初始化之后,都是在全双工模式下,PC机与板子互相发一些带有数据包的快速链路脉冲来进行自协商,所以板子能进入接收中断,也能看到数据。一直到自协商成功之后不再发数据,而只是定时的发快速链路脉冲,相当于心跳检测,从此以太网MAC层连接成功,可以进行底层数据收发。

    查看以太网数据波形,测量结果如下图:




    测试疑问:

    1、  对这个数据波形不太理解。

    2、  由于不知道PC机向板子发的数据是什么,无法对数据进行检查,目前只知道有数据可以进来。

    3、  板子底层向PC机发的数据无法在PC机上识别,PC机的网络调试助手软件是带协议栈的,如果不符合协议栈格式的数据包可能会丢弃。如果想知道底层的数据对不对,可以拿两块板子互连测试。

     

     


     

    7月1日上午

    1、  有了上面的基础,再次测试UDP工程,看看协议栈是不是一次可以连通。

    2、  这次udp_bind,和udp_connect都返回成功,开接收中断,进入while(1)循环。此时应该已经建立了UDP连接,中断里加断点,用PC机软件向板子发数据,可以进入中断。但是,中断处理里,底层的low_level_receive中,从FIFO中读取数据时,程序对数据的解析有问题。第一次读出来的数是目标IP地址,但是程序里认为第一次读出来的数的低16位是packet的长度len。导致后面为收到的packet分配缓冲区失败。分配缓冲区失败,那么就要清空RXFIFO,即按照刚才错误的长度,把RXFIFO里的数全部读出来。在把FIFO中数读出来的过程中,我没有发现有我发的数据。

    3、  查看芯片资料,从RXFIFO的组成来看,程序的解析是没错的。那就是数据错误。但是数据的第一个字是目的地址,判断数据不对的原因应该不是数据错位,而可能是协议上的问题。

     

    7月1日下午

    1、  在可以正确进接收终端的情况下,将FIFO中的数读出来。结果是,接收FIFO中并没有PC机发出去的数值,而只是周期性的未知数据。100个字节1个循环。见下图



    总结:到此为止,基本可以确定硬件没有问题,因为在数据中已经看到了IP地址的正确报文,此时就需要去了解整个的报文交互过程,另外在调试方法上,带操作系统的调试方法和不带操作系统的调试方法有略有区别,需要增加调试经验。


    注意点:

    在IAR中开启寄存器窗口时,在读以太网FIFO时会出现单步运行FIFO指针跳跃情形,这是由于程序在读FIFO,IAR工具寄存器窗口也在读FIFO,导致的单步一次其实读了两次FIFO。

    确认中断后,中断里的断点就可以去掉了,否则由于tcp协议有重发机制,后续的单步调试会被新来的报文所打断,干扰调试。



    展开全文
  • WIZnet,是全球第一家专注于全硬件TCP/IP协议栈技术(iOffloadTM Tech)的半导体公司,精心为用户提供高速稳定的以太网解决方案,广泛应用在工业自动化、智能电网、安防门禁、金融机具等众多领域。该方案有效地卸载...
  • 基于以太网交换机的Linux协议栈虚拟化技术.pdf
  • 基于硬件协议栈芯片的高速以太网接口设计.pdf
  • 基于uCOS的以太网移植(LwIP协议栈

    热门讨论 2012-03-27 21:13:04
    硬件为金牛开发板STM32F107、软件是以一个简单的uCOS系统为基础,一步一步教你如何把LWIP移植到操作系统中来,过程全部截图、非常详细,绝对是非常有价值的一篇技术文档。
  • 基于uip协议栈和网络传输芯片ENC28J60的例程代码,对于刚刚接触uip协议栈的人,是个不错的切入点。
  • 基于协议栈芯片的以太网数据通信接口的设计与实现.pdf
  • 意法的基于CM3内核的STM32F107带以太网功能的芯片上移植的LWIP协议栈,完整工程源码。
  • 协议栈

    2018-11-30 21:35:14
    使用最广泛的是英特网协议栈,由上到下的协议分别是:应用层(HTTP,TELNET,DNS,EMAIL等),运输层(TCP,UDP),网络层(IP),链路层(WI-FI,以太网,令牌环,FDDI等) 入协议栈的过程(请求的过程) 出协议栈的过程...
  • FPGA以太网 TOE TCP/IP协议栈 源码 千兆,万兆
  • 2.网络协议栈结构展示(自己实现协议栈就是封装传输层、网络层和数据链路层)3.举例udo数据的发送4.各层的消息头5.柔性数组的使用条件6.如何获取网卡原始数据 1.如何自己实现一个协议栈? ①协议栈的数据如何封装 ②...
  • 这是一个我从别处下载来的资源。论文很有价值,请各位将仅作学习之用。
  • 网络协议栈(三)本篇将给大家带来网络协议栈设计的数据链路层以太网设计。 前边介绍过我们负责发送方代码编写,那么,先看看在数据链路层的工业以太网中,我们发送方需要做哪些事情。 要求: 主要设计和实现一...
  • 以太网&&lwip协议栈调试笔记之邮件

    千次阅读 2013-07-12 15:09:47
    1、 调试时再TCP主任务中接收消息的函数的下一行设置断点,跟踪发送报文,按照TCP/IP协议一层一层查看报文内容,在报文写到FIFO前全速运行。等待服务器的应答报文。收到服务器应答报文,会停在断点地方,然后再一层...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,126
精华内容 8,450
关键字:

以太网协议栈