LwIP 代码分析(闲话) – 第十四集

/ 0评 / 0

有人说以太网真他妈难学,其实,协议都是人为制定的一些标准而已.其实无论发送什么东西(撇开物理层不讲),都是一个一个字节的.
比如串口通信,要跟别人说话,那么直接发数据当然好,但是对方就不知道你什么时候开始说,什么时候说完,自然就有了协议,协议就是,我要加一些控制字符,知道我要说多少话.
TCP,UDP甚至是IP层的协议,他都是这样的,通过分析,分离协议,知道每一步在干什么,从以太网头分析出是不是以太网信息,要是把以太网信息用串口发出来,估计会很懵逼.因为对于串口就是一个一个的字节而已.
哪怕是跟读卡器通信之类的操作,他也是有协议的.所以协议不要怕,其实就是字节凑一块了而已,我们不设计芯片,他怎么发送,是芯片设计者的事情.
不过,通过学习LWIP,我学会了抓包,知道了各种协议分别是哪里的,比上网络课还容易接受.
其实LWIP就是实现了TCP,UDP协议,和一些DNS,ICMP这些最基础的东西,更高级的需要人去实现.LWIP也支持双网口,只不过在STM32这么紧张的资源下,用网口确实有点紧张.更多看看DNS,ICMP这些(ICMP不仅仅有Ping,还有不能到达通知之类的),开发过USB就知道,USB其实也很简单,只是实现EP的一些基础通信,更多的是高级的一些定义.
另外LWIP推荐用的是netconn,socket不是推荐的,raw只是个兼容.
LWIP的目录分system,src,apps,其中LWIP只做了src部分,system部分是移植用的,apps是我们做应用的,apps做的内容就是我们之前的,类似http client.
src目录下,api就是API MSG,互发各种东西,靠的就是API MSG机制,应用层不直接和底层打交道,都是通过这个叫API MSG的东西.记得那个叫netconn_apimsg的函数吧,core就是核心实现,分ipv4和ipv6,这里实现UDP,TCP,还有DNS,ICMP,DHCP这些(对于应用通信至关重要的东西,基本所有应用都要用到.),特别注意,ICMP不是UDP,TCP封装的,他跟TCP,UDP同一层的,include就是头文件目录,netif是最底层的,比如以太网对接层,PPP层这些,属于网络层,这也是LWIP能接触到的最底层.
之前有个timeout.c没分析,其实就是各种定时器,因为TCP重传要定时各种.
经过一段时间学习,其实发现STM32F107RC都能满足以太网HTTP Client+cJSON应用,就是很难再做别的东西了.比如dns定时器,就是检查下DNS状态的.当然,如果要节约节约压榨压榨性能,DNS,ICMP什么其实都可以去掉的.而且只需要一个宏定义.所有配置在opt.h找得到.
不过这样下来,对TCP/IP的理解,真是非常之大.

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注