概述
目录
????点击这里查看所有博文
随着自己工作的进行,接触到的技术栈也越来越多。给我一个很直观的感受就是,某一项技术/经验在刚开始接触的时候都记得很清楚。往往过了几个月都会忘记的差不多了,只有经常会用到的东西才有可能真正记下来。存在很多在特殊情况下有一点用处的技巧,用的不多的技巧可能一个星期就忘了。
想了很久想通过一些手段把这些事情记录下来。也尝试过在书上记笔记,这也只是一时的,书不在手边的时候那些笔记就和没记一样,不是很方便。
很多时候我们遇到了问题,一般情况下都是选择在搜索引擎检索相关内容,这样来的也更快一点,除非真的找不到才会去选择翻书。后来就想到了写博客,博客作为自己的一个笔记平台倒是挺合适的。随时可以查阅,不用随身携带。
同时由于写博客是对外的,既然是对外的就不能随便写,任何人都可以看到。经验对于我来说那就只是经验而已,公布出来说不一定我的一些经验可以帮助到其他的人。遇到和我相同问题时可以少走一些弯路。
既然决定了要写博客,那就只能认真去写。不管写的好不好,尽力就行。千里之行始于足下,一步一个脚印,慢慢来
,写的多了慢慢也会变好的。权当是记录自己的成长的一个过程,等到以后再往回看时,就会发现自己以前原来这么菜????。
本系列博客所述资料均来自互联网
,并不是本人原创(只有博客是自己写的)。出于热心,本人将自己的所学笔记整理并推出相对应的使用教程,方面其他人学习。为国内的物联网事业发展尽自己的一份绵薄之力,没有为自己谋取私利的想法
。若出现侵权现象,请告知本人,本人会立即停止更新,并删除相应的文章和代码。
简介
该记录基于RDA8910平台,主要记录NAT技术的使用。
步骤
1. 初始化
- 我们模块开启了自动注册功能,在
net_thread
中的CFW_NwSetFTA(0, 0); CFW_NwSetAutoAttachFlag(1, 0);
就是开启自动注册,成功注册上网后,底层会上报EV_TCPIP_CFW_GPRS_ACT
的消息。 TCPIP_nat_wan_netif_create
中主要做的是建立nat_wan的netif。获取PDP的主要信息用来绑定L2的接口。设置下行数据的回调函数lwip_nat_wan_pspathDataInput
prvNdevLanSessionCreate
- 创建nat_lan网卡的netif(见名词解释),其中绑定了固定的IP地址和网关地址。
- 创建
ndev_nat_entry
,主要用于IP层的nat转换。在发送和接收的时候有大作用。 - 创建网卡上下文,该上下文作为USB网卡与模块之间的耦合层。用于USB设备与模块之间的数据通信。
prvEthLanUploadDataCB
设置的设备端上行数据的回调函数。
2. 从设备端收到数据
-
这里为什么要先介绍上行数据(也就是模块收到网卡的数据将数据发送给网络端)
因为所有的链接都是由客户端先发起链接。
-
usb收到数据后会通过其注册的
event_cb
回调函数调用相应event的处理函数,当收到数据的时候就会调用_usbeRxWork
(注意该函数的处理是放在task里面处理的),_usbeRxWork又会调用创建网卡时设置的回调prvEthLanUploadDataCB
函数。因为模块采用的是固定的IP分配,所以ARP还有DHCP都是固定的回复。这里注意一般设备都会先发DHCP包(动态主机配置协议)获取到IP地址,网关地址,再发ARP包(地址解析协议)获取网关和MAC地址的映射关系。
如果不是这两个包,就会进入
prvNdevLanDataToPs
-
prvNdevLanDataToPs
从名字就可以看出主要作用就是将数据传到L2层。这里会申请一个pbuf
,并判断包的类型,如果是PIV6就直接发出去,如果是IP包就需要进行NAT转换。 -
ip4_nat_out
的主要作用就是进行NAT转换。- 获取nat配置信息,根据IP报头的源ip地址和目的地址在nat配置表中查找。该项是在LAN网卡创建的时候(
ndev_nat_entry
)添加到表中的。 - 判断IP包中协议字段,进行相应的处理(这里只拿TCP举例)
- 获取到TCP首部,进行源地址,目的地址,源端口,目的端口的比较,如果存在就返回
ip4_nat_entries_tcp_t
结构体,如果不存在就创建相应的映射关系。并添加到ip4_nat_tcp_table
表中。NAT表需要定时刷新,所以有个TTL字段(见名词解释),将IP
包的源地址用WAN口替换,端口使用NAT映射后的端口地址。
- 获取nat配置信息,根据IP报头的源ip地址和目的地址在nat配置表中查找。该项是在LAN网卡创建的时候(
-
IP包和TCP报头重新计算校验后,在通过绑定的WAN口发送到L2层。
3. 从网络端收到数据
- 初始化的时候第一步绑定了L2层下行数据的回调函数。当外网数据过来的时候通过
gprs_data_ipc_to_lwip_nat_wan
传入协议栈。参数是与PS绑定的netif。新建pbuf,将pbuf传给ip4_nat_input
。 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;
};
- 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资源
缺点
问题
- 什么是NAT,有什么作用?
- 一个设备需要具备哪些最基本的配置?
- 为什么NAT转发的时候还需要进行端口转换,为什么不能直接使用源端口号?
- 什么是内网穿透?
那么本篇博客就到此结束了,这里只是记录了一些我个人的学习笔记,其中存在大量我自己的理解。文中所述不一定是完全正确的,可能有的地方我自己也理解错了。如果有些错的地方,欢迎大家批评指正。如有问题直接在对应的博客评论区指出即可,不需要私聊我。我们交流的内容留下来也有助于其他人查看,说不一定也有其他人遇到了同样的问题呢????。
最后
以上就是愉快学姐为你收集整理的5、4G杂项:lwip_nat机制简述(以8910平台为例)目录简介步骤名词解释NAT的优缺点问题的全部内容,希望文章能够帮你解决5、4G杂项:lwip_nat机制简述(以8910平台为例)目录简介步骤名词解释NAT的优缺点问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复