学习嵌入式开发之以太网TCP/IP协议基础知识
1 引言在我们生活当中随处都可以见到网络,只需要一根网线我们的电脑就可以上网。那么我们的嵌入式产品是否可以通过网线连接与电脑或者其它设备通讯呢?答案肯定是可以的。这个时候就需要引入我们的以太网了。
2 以太网简介
以太网是一种计算机局域网技术。IEEE组织的IEEE 802.3标准制定了以太网的技术标准,它规定了包括物理层的连线、电子信号和介质访问层协议的内容。目前根据传输速度常见的有10Mbps以太网、100Mbps以太网、1Gbps以太网,而我们家庭中目前使用的基本都是100Mbps以太网。(100Mbps/8=12.5MB/s,所以我们的下载的网速说是100M宽带实际只有12.5MB/S左右的下载速度)以太网根据协议的不同可以分为很多种,如本文中讲述的TCP/IP协议、目前比较流行的工业以太网EtherCAT,他们只是传输的协议不同但是物理层都是一样的(电路一样)。TCP/IP协议又下分很多种如:IP或ICMP、TCP或UDP、TELNET或FTP、以及HTTP等。这里我们只讨论TCP和UDP两种。其以太网报文结构如下图所示:
3 嵌入式实现以太网
以太网的实现一般需要三部分,即:MAC、PHY、TCP/IP协议。
(1)MAC
MAC(Media Access Control)即媒体访问控制子层协议,该协议位于OSI七层协议中的数据链路层,主要负责控制与连接物理层的物理介质。也可以认为它是一个以太网控制器。
(2)PHY
PHY((Physical Layer,PHY))是IEEE802.3中定义的一个标准模块,主要用于收发以太网帧数据(数模转换),MAC通过RMII(简化媒体独立接口)或者MII(媒体独立接口)协议与其交换数据,通过SMI(Serial Manage Interface)协议配置PHY芯片的相关寄存器。属于OSI七层模型中的物理层。
(3)TCP/IP协议
TCP/IP是我们实现以太网协议的主要核心部分,主要用于解析以及封装(打包)以太网数据帧,它处于OSI七层模型中的网络层和传输层。
在我们嵌入式上实现以太网的方案中通常有两种选择。一种是MAC与PHY独立分开的,即MAC和PYH在两个不同的芯片当中,现在很多的ARM芯片都集成了一个或两个MAC因此只需在外部添加一个PHY芯片即可实现,这种方案可以做到传输速率比较高也是最常见的方案例如:STM32的F1/F4/H7都集成了一个MAC控制器,MAC与PHY芯片之间通过RMII或者MII接口进行数据通信,对于100Mbps的以太网采用RMII接口的话需要提供50MHZ的时钟如果采用MII接口的话只需要提供25MHZ的时钟即可;还有一种是MAC和PHY集成在一起例如W5500、DM9000。他们是通过串口或者SPI接口等来与其交换数据,并且W5500是集成了硬件TCP/IP协议栈,即我们只负责配置相关寄存器就可以直接在AMR中读取应用层的数据,不需要在ARM中额外编写移植TCP/IP对以太网帧进行解析。但是这种方式传输的速度没有第一种方式快且灵活。
OSI七层协议模型 | |
1 |
应用层 |
2 |
表示层 |
3 |
会话层 |
4 |
传输层 |
5 |
网络层 |
6 |
数据链路层 |
7 |
物理层 |
TCP与UDP最大的区别在于传输数据的可靠性。
(1)TCP
TCP是一种面向连接的传输,即在传输数据前需要经过三次握手等客户端与服务端建立连接以后才能传输数据,断开时需要经过四次挥手。并且具有超时重传机制(数据传输需要经过确认,固定时间内未确认会重新传输)和心跳检测机制(建立连接后会定时发送心跳帧来判断连接是否断开)等。
TCP还具有客户端和服务端的概念,服务端只能等待客户端的连接而不能主动发起连接,但是建立连接以后双方都是可以主动发送数据的,作为客户端去连接服务端时不仅要设置自己的IP地址和端口号还需要知道服务端的IP地址和端口号。如下图所示:
而作为服务端需要设置自己的IP地址和端口号以便客户端进行连接,通常一个服务端同时支持多个客户端(不同IP或者端口号)的连接,如下图所示:
需要注意的是客户端的IP地址前三段必须一样(同一网段),例如客户端的IP地址为192.168.1.35,那么它只能连接IP地址为192.168.1.x的服务端,其中x的取值范围:1~254。
(2)UDP
UDP是一种不需要建立连接的通信,也没有客户端和服务端的概念,只需要知道对方的IP地址和端口号即可,因此他是一种不可靠的连接,发送数据后无法保证数据可以准确的传输到对方。
在我们实际的应用中通常传输的数据量比较大要求传输速度比较快时采用UDP协议,例如:多播、组播发送时采用UDP协议,当需要传输的数据可靠时通常采用TCP协议例如:我们触摸屏上常用的Modbus TCP协议就是建立在TCP协议的基础上的。
5 总结本章的内容有点晦涩难懂,大家也不用丧失学习的信心;以太网这块的知识本身就比较难理解并不是一时半会可以掌握的也不是几句话就可以描述清楚的,本篇文章的目的主要是想给大家简单普及一下嵌入式以太网这块的知识并没有讲得太细,如果大家有想要了解更加详细的相关知识可以在评论区留言,如果我有时间且刚好我会的情况下我可以写出来与大家共同探讨学习。
,