![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
LWIP
文章平均质量分 75
lwip源码简单分析
killer-p
欢迎指出博客中的错误,如果你觉得对你有用,记得点赞三连,有问题可留言,会及时回复
展开
-
lwip源码分析之 TCP层
文章目录一,TCP层简介二,tcp.h简介接口函数一,TCP层简介二,tcp.h简介tcp.h与tcp.c是tcp层协议实现的重要代码,tcp.h定义了实现该层功能的数据结构tcp_pcb和所有的接口函数。首先介绍tcp层的主角,tcp_pcb结构体的功能大概如图,结构体成员的具体含意在代码注释中给出。struct tcp_pcb { IP_PCB; //ip层的成员(ip地址等) TCP_PCB_COMMON(struct tcp_pcb); u16_t remote_port原创 2021-03-31 16:19:46 · 1049 阅读 · 5 评论 -
lwip源码分析 之 网络接口netif
文章目录一,简介二,源码分析三,示例一,简介以太网通信中,硬件层的实现是靠网卡,每个网卡都有ip地址,mac地址,最大传输包长度,输入输出功能,。lwip使用netif来描述这些网卡,并将网卡的输入输出数据传递给ip层。二,源码分析首先是网口的结构体,结合上图struct netif { struct netif *next; //指向下一个网口 ip_addr_t ip_addr; //网口ip地址 ip_addr_t netmask; //网口子网掩码,用来判断ip是否处于原创 2021-02-26 11:49:51 · 930 阅读 · 0 评论 -
lwip源码分析 文章导航
文章目录lwip基础部分:lwip源码分析 之 内存池管理lwip源码分析 之 内存堆lwip协议栈源码分析之pbuflwip协议栈 网络层lwip源码分析 之 IP协议 数据输出lwip源码分析 之 IP协议 数据输入(一)lwip源码分析 之 IP协议 数据输入 (二)lwip协议栈 传输层lwip源码分析 之 UDP协议lwip源码分析 之 TCP协议 数据输出 (一)lwip源码分析之 TCP协议 数据输出(二)lwip源码分析之 TCP协议 数据输入 (一)原创 2021-02-26 01:00:34 · 836 阅读 · 2 评论 -
lwip源码分析 之 内存堆
文章目录一,内存堆简介二,内存堆数据结构三,内存堆实现函数1,内存堆初始化2,内存申请3,内存释放一,内存堆简介lwip使用内存堆进行动态内存分配,弥补了内存池的缺点。内存堆的灵活性表现在,每个内存块的大小是可以随意变化的,每次用户申请内存时,都会从内存堆中寻找第一个长度不小于所需大小的内存块,然后将该内存块裁剪合适后,将剩余的内存组成新的内存块返回内存堆中。回收内存块时,若其前后的内存块也处于空闲,则可将多个内存块合并成一个大内存块。防止内存的碎片化。一开始的内存堆就是一个大的内存块,经过不断的原创 2021-02-26 00:49:52 · 703 阅读 · 0 评论 -
lwip源码分析 之 内存池管理
文章目录一,lwip内存池简介二,内存池的数据结构三,内存管理函数1,初始化函数2,内存分配函数3,释放内存一,lwip内存池简介**lwip内存池就是把一块大的连续内存区域,按照用户定义的pool的种类和数量,切分成固定大小的内存区域。当使用动态内存分配时,会为用户分配一个指定的pool,释放时也会将该pool整个的回收。**这种动态内存分配方法的优点是速度快,缺点是pool中的内存可能没被利用。故适合用来为固定大小的数据结构分配内存,提供空间利用。二,内存池的数据结构lwip的内存池结构体非常原创 2021-02-25 21:02:08 · 795 阅读 · 3 评论 -
lwip源码分析 之 DHCP协议 (二)
文章目录一,定时器1二 定时器2一,定时器1继续上一章,dhcp客户端运行两个定时器,分别周期为1分钟的 void dhcp_coarse_tmr(void); 和 每周期为500ms的 void dhcp_fine_tmr(void);先看dhcp_fine_tmr()定时任务//处理dhcp请求超时voiddhcp_fine_tmr(){ struct netif *netif = netif_list; //遍历所有网口 while (netif != NULL) {原创 2021-02-25 15:20:15 · 1401 阅读 · 2 评论 -
lwip源码分析 之 DHCP协议实现(一)
文章目录一,dhcp协议简介二,源码解析2.1 dhcp结构体2.2 开始广播2.3 回调接口一,dhcp协议简介dhcp协议是动态主机配置协议,是互联网的基本协议。lwip内核也实现了该协议。关于lwip协议的具体内容,请先转到:https://blog.csdn.net/lm409/article/details/80298225lwip实现dhcp的代码在core/dhcp.c中。二,源码解析应用程序要使用dhcp协议,只需要在代码中调用:err_t dhcp_start(struct原创 2021-02-25 12:02:49 · 5603 阅读 · 3 评论 -
一文搞定stm32移植LWIP及代码逻辑
一,使用以太网所需要的代码为了再stm32中使用以太网进行通信,需要使用两个部分的代码。分别是由ST官方提供的以太网库,以及LWIP库。其中ST提供的以太网库负责处理硬件PHY与软件的数据交换逻辑,也可以理解成物理层,数据链路层的实现。而LWIP则负责在软件上实现网络层,传输层等上层协议。所以下面分两个部分进行移植二,ST以太网库的移植首先我使用的是正点原子的stm32f4探索者,其中的MCU为stm32f407,它拥有mac控制器,可以与phy芯片进行数据交换。开发板使用的phy芯片为LAN原创 2021-02-24 15:46:23 · 10617 阅读 · 8 评论 -
lwip协议栈源码分析之pbuf
文章目录一,数据在tcp/ip层中的传递二,认识pbuf结构体二,创建一个pbuf三,释放pbuf四,给pbuf链表减肥五,移动payload六,小结lwip使用pbuf对数据进行发送与接收,灵活的pbuf结构体使得数据在不同网络层之间传输时可以减少内存的开销,内存复制所占用的时间,一切都是为了节约内存,增加数据在不同层之间传递的速度。一,数据在tcp/ip层中的传递数据如何从tcp层一层层传递到最底层的物理层并发送出去呢?应用层需要发送的数据传递到tcp层时,tcp层给数据添加首部数据,tcp原创 2020-12-13 14:35:37 · 5073 阅读 · 1 评论 -
lwip源码分析 之 IP协议 数据输出
文章目录一,导读二,源码分析1,ipv4输出2,ip数据分片发送一,导读二,源码分析运输层,以TCP协议为例,调用ip_output_if()将tcp数据报传递给ip层,ip_output_if()会根据目的ip选择不同ip版本发送函数。1,ipv4输出若目的ip是ipv4,则使用以下函数发送。该函数将上层数据报封装成ip数据,并填充ip首部,调用网络接口的发送函数发送数据。//通过netif输出ip数据报 pbuferr_t ip4_output_if_src(struct pbuf *p原创 2020-12-25 11:19:02 · 1064 阅读 · 0 评论 -
lwip源码分析 之 IP协议 数据输入 (二)
文章目录一 导读二,重装数据结构三,代码分析1, 分片处理2,分组插入一 导读在上一章 ip数据输入中,输入的ip分组会被判断是否是一个被分片的分组。若是一个分片的ip数据,则需要将分片暂存起来,等接收完所有的分片再将分片重装成一个完整的ip数据传递给传输层。这章就介绍lwip如何实现分片的重装。二,重装数据结构由于ip分组在网络传输过程中到达目的地点的时间是不确定的,所以后面的分组可能比前面的分组先达到目的地点。如图所示,分片A,B,C代表一个完整的ip数据报,他们的目的地址都是192.168原创 2020-12-24 22:03:06 · 701 阅读 · 0 评论 -
lwip源码分析 之 IP协议 数据输入(一)
文章目录一 导读二,输入代码1,接口函数2,ipv4 输入3,ipv6 输入一 导读ip层是lwip代码的核心领域,它负责将以太网数据传递上来的数据整理并传递给传输层,或者将数据转发到其他网络。其中涉及ICMP,IGMP,DHCP等辅助协议。这章先介绍ip层的输入函数,搞清楚以太网将数据传递给ip层后,ip层如何将数据整理或转发。二,输入代码1,接口函数网络接口接收到数据后,调用以下函数将数据传递给ip层。该函数将根据ipv4 or ipv6 调用真正的处理函数。//以太网调用该函数err_t原创 2020-12-24 18:02:07 · 701 阅读 · 1 评论 -
lwip源码分析 之 UDP协议
文章目录一,udp.h二,udp数据输出三,udp数据输入四,小结一,udp.hudp协议呢比tcp简单,其数据结构也简单了许多。lwip的udp代码结构简单如下:比较复杂的是udp_input()函数。(图侵删)下面来看看udp.h这个udp协议接口文件struct udp_pcb { IP_PCB; //ip地址等 struct udp_pcb *next; u8_t flags; u16_t local_port, remote_port; //本地,远端端口号原创 2020-12-21 20:46:54 · 1220 阅读 · 0 评论 -
lwip源码分析 之 TCP协议 数据输出 (一)
文章目录一,简介二,代码分析1,写入最后一个pbuf2,新建pbuf3,新建报文4,将数据入队三,小结应用层的数据发送需要通告tcp传递,在已经建立tcp连接中,通过tcp_write()函数向对方发送数据。一,简介tcp_write()通过已建立连接的tcp控制块给对方发送数据。代码的实现逻辑是将数据复制到控制块的unsent队列,代码中为节省内存,分多种情况将发送数据连接到unsent。二,代码分析发送数据插入unsent队列时,需要考虑三种情况:1,写入最后一个pbuf由于tcp是面原创 2020-12-18 16:31:42 · 5677 阅读 · 11 评论 -
lwip源码分析之 TCP协议 数据输出(二)
文章目录一,简介二,源码分析三,小结一,简介上一章提到的tcp_write()函数的作用是将数据插入unsent队列,其并无真正的把数据交给ip层发送。tco_output()的功能就是将unsent队列中的tcp报文交给ip层发送。一般情况下,tcp_output()函数会在500ms定时任务中被循环调用。所以当用户使用tcp_write()将数据写入unsent队列后,会在定时任务中将数据传递给ip层发送。二,源码分析首先需要先判断能不能发送unsent队列,若当前的PCB正在接收数据或者当前原创 2020-12-19 14:53:20 · 2104 阅读 · 1 评论 -
lwip源码解析之 TCP协议 定时器 tcp_slowtmr();和tcp_fasttmr();
文章目录一,定时器时钟二,快速定时任务三,低速定时任务1,超时重传2,保活keepalive3,删除超时PCB四,小结TCP协议中许多地方是需要使用到定时功能的,如定时重传功能,保活keepalive功能,坚持定时器功能,这些定时功能会在lwip中的两个定时器函数中实现。一,定时器时钟二,快速定时任务void tcp_fasttmr(void)比较简单,它的功能主要是每250ms处理延时发送的ack报文和fin报文,同时通知上层应用处理数据。voidtcp_fasttmr(void){原创 2020-12-18 21:17:44 · 7693 阅读 · 7 评论 -
lwip源码分析之 TCP协议 数据输入 (一)
文章目录一,简介二,ip数据解析三,给谁的报文?1,在active链表?2,在timewait链表?3,给listen链表的?四,数据处理后一,简介void tcp_input(struct pbuf *p, struct netif *inp)是由ip调用的,ip层通告该函数将接收到的数据传递给tcp层,在此函数中,从ip数据包中提取tcp报文,检验报文的正确性,读取tcp数据,然后再将tcp报文交给相应的tcp控制块进行处理,最后根据处理结果,作出反应。二,ip数据解析ip层递交的数据仍然是以p原创 2020-12-17 22:29:41 · 1465 阅读 · 0 评论 -
lwip源码分析之 TCP协议 数据输入 (二)
文章目录一,简介二,源码分析一,简介在上一章输入的tcp报文在找到了其对应的TCP控制块后,需要根据tcp控制块的不同状态,对报文有不同的处理方式。这将可能导致tcp状态的变化,使用tcp状态机来表示这样状态变化。(图侵删)再结合tcp连接和断开的过程了解tcp状态机二,源码分析tcp状态机的源码就是上图状态机的实现;首先是处理rst,若输入报文是rst报文,则判断该rst合不合法,合法则复位tcp连接: /*-------------------------------------原创 2020-12-18 13:45:55 · 918 阅读 · 0 评论 -
lwip源码分析 之 TCP协议 数据输入 (三)
文章目录一,简介二,代码流程1,更新发送窗口2,快速重传与恢复3,拥塞控制算法4,更新unacked队列5,更新unsent队列6,rtt测试7,裁剪接收的数据a,接收的数据一部分已经接受过,另一部分是新数据b,数据正好在接收窗口左边界c,数据不在左边界一个有着接近900行代码的函数,庞大的函数,需要我们有庖丁解牛的耐心一,简介tcp_receive(struct tcp_pcb *pcb)用于处理接收到的一个报文,更新发送窗口,执行快速重传,拥塞控制算法,更新三个队列,由接收窗口来裁剪出有效数据原创 2020-12-17 20:53:52 · 1334 阅读 · 1 评论