工业以太网协议 以太网协议

经过上一篇的手把手教你手撸通讯协议(一) S7协议解析 中,大家有没有发现缺了很大一部分篇幅,而且也只讲到了UDP的包头;由于UDP是让大家简单的看到以太网的工作方式,接下去我们通过开源的LwIP协议栈来好好了解以太网的真实工作方式,我将会在这一期结束的时候,给大家实现一个基于STM32的modbusTCP 主站的小demo 。
第一节:协议层简介
首先我们还是根据标准的TCP/IP协议栈来分析传输层和链路层的网络是怎样打包的;
首先我们先了解几个基础协议及网络分层:
网络接口层:定义数据帧(对电信号0/1进行的特定分组)、确认主机的物理地址(MAC地址),通过传输介质在网络上传输数据帧 。网络接口有不同的实现方式,比如可以通过有线或无线的方式收发数据帧,不同的实现方式意味着不同的帧结构、传输速率等 。
网络层:定义网络地址(IP地址)、区分网段、对于子网内的数据包进行MAC寻址、对于不同子网的数据包进行路由,实现网络中主机到主机的通信 。主要有PPP协议、SLIP协议、ARP、ipv4等基础协议 。
传输层:定义端口(Port)、标识应用程序身份、实现端口到端口的通信,TCP协议可以保证数据传输的可靠性 。
应用层:定义数据格式并按照对应的格式解读数据(下层传送过来的是字节流,不能很好的被程序识别) 。应用层定义了各种各样的协议来规范数据格式,常见的有 HTTP、FTP、SMTP 等 。
第二节:数据包及内存存储结构
由上面的基础知识、我们根据理论知识,我们根据LwIP来进行学习 。其实其实网络层级来说:TCP和UDP类似,但TCP需要实现可靠连接,网卡接收的数据包,有可能是成千上万字节,也有可能是几个字节,所以我们需要对其数据进行打包处理 。
由于内存分配问题可以谈的很深、涉及到编译原理、字节对齐这些,篇幅有限,不展开 。反正主要是两种方式、一种是链表、一种是内存池方式,各种系统中也都会讲到,我们主要从数据包开始说明:
struct pbuf {struct pbuf *next;void *payload;u16_t tot_len;u16_t len;u8_ttype;u8_t flags;u16_t ref;};typedef enum {PBUF_RAM, /* pbuf data is stored in RAM */PBUF_ROM, /* pbuf data is stored in ROM */PBUF_REF, /* pbuf comes from the pbuf pool */PBUF_POOL /* pbuf payload refers to RAM */} pbuf_type;这两个看上去是不是很熟悉,就是一个链表节点 。分配完成后就是这样:

工业以太网协议 以太网协议

文章插图
工业以太网协议 以太网协议

文章插图
工业以太网协议 以太网协议

文章插图
工业以太网协议 以太网协议

文章插图
工业以太网协议 以太网协议

文章插图
工业以太网协议 以太网协议

文章插图
工业以太网协议 以太网协议

文章插图
工业以太网协议 以太网协议

文章插图
工业以太网协议 以太网协议

文章插图
工业以太网协议 以太网协议

文章插图
工业以太网协议 以太网协议

文章插图
工业以太网协议 以太网协议

文章插图
对这一期就先到这边,TCP的内容留在下一期 。
结尾
总结一下
Summary
1、LwIP协议栈主要用于嵌入式系统的以太网协开发 。该协议栈为很轻量级的以太网协议栈,通过该协议栈的学习,可以很好的理解以太网是怎么工作的,采用该协议栈,我在很多项目中实现了MQTT、S7协议、ModbusTCP协议等工业协议的开发,还有一些私有协议的开发,很好的用于网络中间件的开发 。
2、讲解了物理接口层、链路层、网络层、传输层的部分协议实现和打包方式 。讲的比较简单,也是给大家一个可以参考的方向 。
留两个问题
问题1:IP数据包失序后怎么处理?
问题2:TCP发生粘包问题如何处理(或者说S7协议、CIP协议等是怎么处理粘包问题)?
【工业以太网协议 以太网协议】2022年2月