• lwip_nat


    简介

      该记录基于RDA8910平台,主要记录NAT技术的使用。
    在这里插入图片描述

    步骤

    1. 初始化

    在这里插入图片描述

    1. 我们模块开启了自动注册功能,在net_thread中的CFW_NwSetFTA(0, 0); CFW_NwSetAutoAttachFlag(1, 0);就是开启自动注册,成功注册上网后,底层会上报EV_TCPIP_CFW_GPRS_ACT的消息。
    2. TCPIP_nat_wan_netif_create中主要做的是建立nat_wan的netif。获取PDP的主要信息用来绑定L2的接口。设置下行数据的回调函数lwip_nat_wan_pspathDataInput
    3. prvNdevLanSessionCreate
      1. 创建nat_lan网卡的netif(见名词解释),其中绑定了固定的IP地址和网关地址。
      2. 创建ndev_nat_entry,主要用于IP层的nat转换。在发送和接收的时候有大作用。
      3. 创建网卡上下文,该上下文作为USB网卡与模块之间的耦合层。用于USB设备与模块之间的数据通信。
    4. prvEthLanUploadDataCB 设置的设备端上行数据的回调函数。

    2. 从设备端收到数据

    在这里插入图片描述

    1. 这里为什么要先介绍上行数据(也就是模块收到网卡的数据将数据发送给网络端)

      因为所有的链接都是由客户端先发起链接。

    2. usb收到数据后会通过其注册的event_cb回调函数调用相应event的处理函数,当收到数据的时候就会调用_usbeRxWork(注意该函数的处理是放在task里面处理的),_usbeRxWork又会调用创建网卡时设置的回调prvEthLanUploadDataCB函数。

      因为模块采用的是固定的IP分配,所以ARP还有DHCP都是固定的回复。这里注意一般设备都会先发DHCP包(动态主机配置协议)获取到IP地址,网关地址,再发ARP包(地址解析协议)获取网关和MAC地址的映射关系。

      如果不是这两个包,就会进入prvNdevLanDataToPs

    3. prvNdevLanDataToPs从名字就可以看出主要作用就是将数据传到L2层。这里会申请一个pbuf,并判断包的类型,如果是PIV6就直接发出去,如果是IP包就需要进行NAT转换。

    4. ip4_nat_out的主要作用就是进行NAT转换。

      1. 获取nat配置信息,根据IP报头的源ip地址和目的地址在nat配置表中查找。该项是在LAN网卡创建的时候(ndev_nat_entry)添加到表中的。
      2. 判断IP包中协议字段,进行相应的处理(这里只拿TCP举例)
      3. 获取到TCP首部,进行源地址,目的地址,源端口,目的端口的比较,如果存在就返回ip4_nat_entries_tcp_t结构体,如果不存在就创建相应的映射关系。并添加到ip4_nat_tcp_table表中。NAT表需要定时刷新,所以有个TTL字段(见名词解释),将IP
        包的源地址用WAN口替换,端口使用NAT映射后的端口地址。
    5. IP包和TCP报头重新计算校验后,在通过绑定的WAN口发送到L2层。

    3. 从网络端收到数据

    在这里插入图片描述

    1. 初始化的时候第一步绑定了L2层下行数据的回调函数。当外网数据过来的时候通过gprs_data_ipc_to_lwip_nat_wan传入协议栈。参数是与PS绑定的netif。新建pbuf,将pbuf传给ip4_nat_input
    2. ip4_nat_input就是进行IP地址转换,转为LAN的IP地址。判断相应的IP协议,将端口和IP地址进行转换,重新校验。再传入NAT_LAN的netif绑定的input函数。wan_to_netdev_lan_datainput发送给网卡设备

    名词解释

    1. 网卡

    代码中表示网卡的结构体就是netif,每个设备要上网都需要一个或者多个网卡。多个网卡就会组成一个局域网,通常一个局域网都需要一个WAN,其它的设备可以称为LAN。WAN口连接着外部网络,连接LAN口的设备与外部网络通信都需要经过WAN口传输。

    2. pbuf

    协议栈中L2层以上所有的数据交替都使用同一个结构体就是pbuf,pbuf是个链表,该链表的大小是根据pbuf_alloc时传入的长度计算的。该结构体主要是:

    /** Main packet buffer struct */
    struct pbuf {
      struct pbuf *next; /*指向下一个pbuf*/
      /*该段pbuf的数据部分*/
      void *payload;
      /*该链表所有pbuf数据部分的总长度*/
      u16_t tot_len;
      /*改段pbuf的数据大小*/
      u16_t len;
    
      /** a bit field indicating pbuf type and allocation sources
          (see PBUF_TYPE_FLAG_*, PBUF_ALLOC_FLAG_* and PBUF_TYPE_ALLOC_SRC_MASK)
        */
      u8_t type_internal;
    
      /** misc flags */
      u8_t flags;
    
      /**
       该pbuf被引用次数,如果引用次数大于1,pbuf_free的时候就会出错
       */
      LWIP_PBUF_REF_T ref;
      /** For incoming packets, this contains the input netif's index */
      u8_t if_idx;
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    1. TTL(NAT表项保活时间)

    初始化nat的时候会创建一个循环定时器nat_timer,每隔LWIP_NAT_TMR_INTERVAL_SEC秒处理一下NAT表项,即将TTL减去30秒,如果TTL小于30秒就清除映射关系。默认TTL的值LWIP_NAT_DEFAULT_TCP_SOURCE_PORT为10分钟。每次发送的时候都会进行重置。

    NAT的优缺点

    优点

    NAT最大的优点就是节省了大量的IP资源

    缺点

    问题

    1. 什么是NAT,有什么作用?
    2. 一个设备需要具备哪些最基本的配置?
    3. 为什么NAT转发的时候还需要进行端口转换,为什么不能直接使用源端口号?
    4. 什么是内网穿透?
  • 相关阅读:
    关于分布式数据库 TiDB与OceanBase 哪家强?
    Android 蓝牙 OPP文件传输-Obex协议连接-socket连接 从framework到协议栈btif层 --- 全网最详细(一)
    图片怎么加满屏水印?
    python入门基础
    JSON是什么文件
    华为云x86架构下部署mysql
    VMware/kali使用小贴士(持续更新(吧
    JavaEE之HTTP协议 Ⅰ
    网站优化搜索引擎与关键词
    京东数据分析:2023年9月京东白酒行业品牌销售排行榜
  • 原文地址:https://blog.csdn.net/weixin_44570083/article/details/126362744