
嵌入式TCP/IP
文章平均质量分 86
研究是为了理解
要想学会一件事,就不能什么都学。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
lwIP 细节之六:connected、sent、poll 回调函数是何时调用的
使用 lwIP 协议栈进行 TCP 裸机编程,其本质就是编写协议栈指定的各种回调函数。将你的应用逻辑封装成函数,注册到协议栈,在适当的时候,由协议栈自动调用,所以称为回调。本节讲述 connected、sent、poll 回调函数。原创 2023-12-12 16:43:50 · 2762 阅读 · 0 评论 -
lwIP 细节之五:accept 回调函数是何时调用的
使用 lwIP 协议栈进行 TCP 裸机编程,其本质就是编写协议栈指定的各种回调函数。将你的应用逻辑封装成函数,注册到协议栈,在适当的时候,由协议栈自动调用,所以称为回调。本节讲述 accept 函数。原创 2023-12-12 16:38:22 · 1014 阅读 · 0 评论 -
lwIP 细节之四:recv 回调函数是何时调用的
使用 lwIP 协议栈进行 TCP 裸机编程,其本质就是编写协议栈指定的各种回调函数。将你的应用逻辑封装成函数,注册到协议栈,在适当的时候,由协议栈自动调用,所以称为回调。本节讲述 recv 回调函数。原创 2023-12-12 16:34:04 · 2264 阅读 · 0 评论 -
lwIP 细节之三:errf 回调函数是何时调用的
使用 lwIP 协议栈进行 TCP 裸机编程,其本质就是编写协议栈指定的各种回调函数。将你的应用逻辑封装成函数,注册到协议栈,在适当的时候,由协议栈自动调用,所以称为回调。本节讲述 errf 回调函数。原创 2023-12-12 16:29:24 · 2519 阅读 · 0 评论 -
lwIP更新记10:IP 冲突检测
lwip-2.2.0-rc1 版本于 2023 年 6 月 29 日发布,带来了我期盼已久的 `IPv4 冲突检测` 功能。原创 2023-08-21 10:52:15 · 2149 阅读 · 0 评论 -
lwIP更新记09:内存分配多线程保护
从 lwIP-1.1.1 到 lwIP-2.0.0,内存分配的多线程保护经过了多次更改。原创 2023-06-20 17:18:07 · 847 阅读 · 0 评论 -
lwIP更新记08:TCP 回调函数中调用 tcp_abort 终于安全了
从 lwIP-1.4.0 开始,从 tcp 回调函数中调用 `tcp_abort` 函数终于安全了。在此之前,如果从 tcp 回调函数中调用 `tcp_abort`,则会访问未分配的内存。原创 2023-05-26 08:11:35 · 2997 阅读 · 2 评论 -
lwIP更新记07:TCP 控制块申请失败可以检测到了
从 lwIP-2.0.0 开始,TCP 控制块申请失败可以检测到了。这个更新应用在 TCP 服务器模式中,处于`监听`状态的 TCP_PCB ,如果收到客户端发送的 SYN 同步标志,表示一个客户端在请求建立连接了。lwIP 会为这个新连接申请一个 TCP_PCB ,这一过程在 `tcp_listen_input` 函数中完成的。然而 TCP_PCB 的个数是有限的,如果申请失败,对于失败的处理, lwIP-2.0.0 及以上版本与 lwIP-1.4.1不同。lwIP-1.4.1 失败的毫无声息,而原创 2023-05-24 11:11:52 · 1446 阅读 · 0 评论 -
lwIP更新记06:申请 TCP 控制块(tcp_alloc)
从 lwIP-2.0.0 开始,申请 `tcp_pcb` 控制块的逻辑发生了变化。每个 tcp 连接都必须有一个 PCB 控制块 ,使用函数 `tcp_new()` 申请 PCB 控制块。原创 2023-05-23 14:40:55 · 2349 阅读 · 0 评论 -
lwIP更新记05:核心应用文件移动
从 lwIP-2.0.0 开始,lwIP 开发者将一些核心应用从 `contrib` 仓库移动到 `lwIP` 仓库的 `src/apps` 文件夹。对比版本 `lwIP-1.4.1` 和 `lwIP-2.1.2` 的 `src` 文件夹内容,可以发现 `lwIP 2.1.2` 版本多了一个 `apps` 文件夹。原创 2023-05-22 12:09:04 · 1039 阅读 · 0 评论 -
lwIP更新记04:TCP 初始序列号生成算法可以自定义了
从 lwIP-2.0.0 开始,可以自定义 TCP 报文段的初始序列号。TCP 报文段首部有一个序列号字段,它是一个32位的计数器,从 0 到 4294967295,它的值为当前报文段中第一个数据的字节序号。TCP 在建立连接的时候需要初始序列号(Initial Sequence Number:ISN),lwIP 为每个新的 TCP 连接生成一个 TCP 初始序列号。tcp.c 中的函数 `tcp_next_iss` 用于这个目的。原创 2023-05-22 10:57:18 · 728 阅读 · 0 评论 -
lwIP更新记03:IPv6
从 lwIP-2.0.0 开始,lwIP 终于有可用的 IPv6 协议栈了!从这个版本开始,lwIP 支持 `双栈`(IPv4 和 IPv6 同时使用) 或 `IPv4/IPv6 二选一` 。lwIP-1.4.1 版本也有 IPv6,但那是实验性质的(见..\lwip-1.4.1\src\core\ipv6目录下的`README`文件),并不能在实际项目中使用的。原创 2023-05-21 16:50:48 · 2655 阅读 · 0 评论 -
lwIP更新记02:网络接口标志(一个标志只做一件事)
从lwIP 2.0.0 开始,修改网络接口 netif 的`up`标志为管理标志,`up`标志**不再具有**以前的 `IP4 地址有效` 含义。现在,如果一个网络接口 netif 没有设置`up`标志,则用户**不能**在这个网络接口上收发数据!即便是使用 DHCP,在启动 DHCP 客户端之前,也要将 netif 设置为`up`状态。这与lwIP 1.4.1版本不同。原创 2023-05-21 11:47:21 · 2321 阅读 · 0 评论 -
lwIP更新记01:全局互斥锁替代消息机制
从 lwIP-2.0.0 开始,在 `opt.h` 中多了一个宏开关 `LWIP_TCPIP_CORE_LOCKING`,默认使能。这个宏用于启用 `内核锁定` 功能,使用 `全局互斥锁` 实现。在之前,lwIP 使用 `消息机制` 解决 lwIP 内核线程安全问题。消息机制易于实现,因为实现简单,更容易做到高稳定性。但使用消息机制效率低下,所以 lwIP 从 V2.0.0 开始,正式支持(并默认使用)全局互斥锁,同时仍保留消息机制。全局互斥锁方案实现复杂,但效率非常高。本文探索全局互斥锁方案是怎么诞生并原创 2023-05-20 16:38:18 · 2837 阅读 · 1 评论 -
lwIP 多线程注意事项
lwIP 内核不是线程安全的。如果在多线程环境中使用 lwIP,必须使用高层次的Sequential或socketAPI。使用rawAPI 时,需要自己保护好应用程序和协议栈核心代码。在无操作系统环境中使用rawAPI:使用轮询接收数据,因为不会在中断中使用 lwIP 函数,不需要任何保护使用中断接收数据,需要定义宏来保护pbuf和内存分配相关代码。套接字通常不能被多个应用线程使用,因为UDP或TCP控制块不能在多个线程之间共享。(目前在 udp 、netconn 上可以执行sendto。原创 2023-05-14 20:18:17 · 2144 阅读 · 0 评论 -
lwIP 细节之七:ARP 相关知识
IP 广播设备出现 ARP 风暴。局域网中有几十台 IP 广播系统,此外还有若干人员定位系统、安全监控系统。现场反馈,只要 IP 广播系统的主机断网(拔网线或者禁用网卡),局域网中的设备有很大概率全部会断网,疑似交换机瘫痪。交换机厂家去了现场捕获到了数据,发现 IP 广播大量发送 ARP 请求数据包,造成了交换机瘫痪。在查找 IP 广播为什么会大量发送 ARP 请求数据包的过程中,发现了一个异常点:IP 广播在连着上位机时,应该每隔 19 分钟向上位机发送一次 ARP 请求,但是抓包数据表明,这个时原创 2022-11-28 14:11:07 · 1697 阅读 · 0 评论 -
LwIP IP 层常用函数和宏
这个函数与 Socket 编程中的 inet_aton类似。成功时返回1,失败返回0。可以看出已经转换为网络字节序(H:主机字节序,N:网络字节序)2.将字符串形式的 IP 地址转化为 32 位网络字节序整数。1.将 4 字节数据组成 IP 地址。原创 2022-10-17 22:10:41 · 3408 阅读 · 0 评论 -
lwIP 操作系统模拟层
contrib2.1.0给出了一个lwIP的操作系统模拟层,使用的操作系统为 FreeRTOS。这个宏用于启用协议栈锁定功能,是通过互斥量实现的,要求互斥量具备优先级继承机制。注1除非特别说明,以下内容针对lwIP2.0.0及以上版本。注2操作系统使用FreeRTOS。...........................原创 2022-07-26 14:57:58 · 2024 阅读 · 0 评论 -
lwIP 细节之二:协议栈什么情况下发送 RST 标志
一次网络故障,抓包发现设备不停的发送 标志,为了探索 lwIP 协议栈什么情况下发送 标志,就有了这篇笔记。 标志是通过函数 发送的。这个函数声明为: 函数发送 TCP 数据包(带有 标志的空帧),用于中止连接或者向对方表明你指定的数据接收者查无此人(接收到的数据帧没有匹配的本地连接)。 函数可以单独使用,可以由以下函数调用:1.本地连接接收端已经关闭,但仍收到数据,调用 函数,发送 标志,通知远程主机并非所有数据都被处理。简化后的代码如下所示:这个代码也能看出,如果报文中包含有效数据,指原创 2022-06-14 16:56:41 · 3070 阅读 · 0 评论 -
lwIP 细节之一:TCP 最大链接数
lwIP 协议栈为每个 TCP 连接分配不同的 控制块。然而 lwIP 能分配的 TCP_PCB 控制块最大数目是编程人员指定的。宏 指定了 lwIP 能分配的tcp_pcb 最大数量,即同时有效的 TCP 连接个数。宏 在 文件中定义,默认 TCP 连接个数为 5。如果需要更改这个宏,需要在 文件中重新定义该宏:对于某个应用程序,如果当前的 TCP 链接数已经达到宏 指定的数目,此时再有一个客户端申请连接,lwIP 如何处理?在 TCP 服务器模式下,负责处理连接接入的是监听(lis原创 2022-06-13 15:05:42 · 5882 阅读 · 0 评论 -
lwIP 2.1.x 主要更新详情
修改网络接口 netif 的标志为管理标志。标志不再具有以前的“IP4 地址有效”含义,现在,如果一个网络接口 netif 没有设置标志,则用户不能在这个网络接口上收发数据!即便是使用 DHCP,在启动 DHCP 客户端之前,也要将 netif 设置为状态。这与lwIP 1.4.1版本不同。可以从两个版本的函数注释上看出来:通过调用函数,将指定的netif设置为状态。代码如下:可以看到将网络接口设置为状态是通过为字段增加标志实现的。做什么?具体怎么控制?协议栈通过一个软件标志,就可以把应用层发送和接收拿捏原创 2022-06-11 16:40:12 · 2016 阅读 · 4 评论 -
LwIP BUG之TCP连接丢失
注:本文转自老衲五木的博客! LwIP所有版本包括最新的2.0版本具有以下缺陷,当用户使用raw编程并在err或poll回调函数中操作了内核全局tcp_active_pcbs链表(最典型的,比如进行了重连操作),将有可能导致链表异常,严重情况下,链表中的很多tcp_pcb会丢失,从而导致部分连接没有任何反应,出现假死的现象。 具体信息为(以1.4.1为例),在tcp.c文件的tcp_slo转载 2017-01-05 09:19:06 · 12359 阅读 · 0 评论 -
基于TFTP协议的远程升级设计
1.简介 在基础网络建设已趋于完善的今天,使用以太网进行数据传输有着众多优势,不仅传输速度快、传输距离远、传输通道更安全,而且以太网具有一系列标准协议,可以与众多的配套设备互联,可以免费使用众多的软件。 由于网络基础建设的完善,现在越来越多远程测控设备接入了互联网,管理这些分散的远程设备也越来越被人们所重视,其中之一就是设备的程序更新。因此,这里讨论一...原创 2015-06-07 21:03:40 · 10905 阅读 · 22 评论 -
串口服务器设计指南
图0:串口服务器 - 系统信息0. 前言串口服务器是一种将串口数据转换为网口数据的设备,它在工业方面使用较多。这类设备需要非常高的稳定性,但是稳定性跟设计人员的硬件水平、软件水平以及测试等关系密切,这个范围太大,这里只是谈串口服务器软件如何设计。1.核心数据结构设计1.1 串口数据结构串口参数:波特率、流控制、接口方式等 操作模式:TCP服务器、UDP......原创 2016-10-13 14:33:42 · 7682 阅读 · 6 评论 -
关于TCP保活功能及其应用
本文转自老衲五木 的新浪微博 保活功能是TCP很重要的一个特性,它在连接异常检测,异常处理上起着至关重要的作用。一个网络应用程序是否稳定可靠,连接的异常处理尤为重要。很多人反应,LwIP做客户端时,是不是很不稳定,经常会莫名掉线。老衲想说的是,应为网络,硬件,环境等等太多原因,掉线是正常的,你应该把它看作一种常态,你对连接异常的处理有哪些,处理的怎么样,这些决定了你的代码...转载 2015-06-19 19:54:36 · 6508 阅读 · 3 评论