docs: document client abort close tradeoff
This commit is contained in:
@@ -268,6 +268,9 @@ ROLE,EN,LPORT,RIP,RPORT,UART
|
|||||||
- `Server` 与 `Client` 共用同一条 `LINK` 记录模型
|
- `Server` 与 `Client` 共用同一条 `LINK` 记录模型
|
||||||
- `Server` 中 `RIP/RPORT` 可作为允许接入的对端约束或预设对端信息
|
- `Server` 中 `RIP/RPORT` 可作为允许接入的对端约束或预设对端信息
|
||||||
- `Client` 中 `RIP/RPORT` 表示远端目标地址与端口
|
- `Client` 中 `RIP/RPORT` 表示远端目标地址与端口
|
||||||
|
- `Client` 侧当前保留固定 `LPORT` 语义,用于满足部分上位机或现场网络策略对固定源端口的依赖
|
||||||
|
- 为避免固定 `LPORT` 下频繁重连被 lwIP `TIME_WAIT` 长时间占用阻塞,当前固件对 `Client` 主动断开后的释放路径采用 abortive close(RST)而非优雅 `FIN/ACK` 关闭
|
||||||
|
- 因此 `Client` 重连场景下,对端可能观察到 `RST` 或“连接被重置”,这属于当前产品约束下的有意设计取舍,不影响 `AT+LINK` 对 `LPORT` 的配置语义
|
||||||
|
|
||||||
#### 查询单条 LINK
|
#### 查询单条 LINK
|
||||||
|
|
||||||
|
|||||||
@@ -448,3 +448,22 @@ case ETHTYPE_ARP:
|
|||||||
3. 不要忽略 `DIAG_TASK_ISOLATION=1 正常、=0 异常` 这个前提
|
3. 不要忽略 `DIAG_TASK_ISOLATION=1 正常、=0 异常` 这个前提
|
||||||
4. 不要一次性修改 `C1/S1/CH390/lwIP` 多个方向,避免再次失去因果关系
|
4. 不要一次性修改 `C1/S1/CH390/lwIP` 多个方向,避免再次失去因果关系
|
||||||
5. 每次只做一个能明显改变故障边界的最小改动,并用 RTT + Keil build 结果交叉验证
|
5. 每次只做一个能明显改变故障边界的最小改动,并用 RTT + Keil build 结果交叉验证
|
||||||
|
|
||||||
|
### 11.8 固定 Client 端口重连策略(TIME_WAIT 取舍)
|
||||||
|
|
||||||
|
当前工程的 `Client` 链路保留固定 `LPORT` 配置语义,默认 `C1/C2` 均使用明确的本地源端口。
|
||||||
|
|
||||||
|
在 `lwIP + netconn` 路径下,如果仍沿用优雅 `netconn_close()`,则相同 `LPORT` 的快速重连会受到 TCP `TIME_WAIT` 影响,表现为一段时间内重复 `bind/connect` 失败。
|
||||||
|
|
||||||
|
结合本项目的约束,当前版本固化如下取舍:
|
||||||
|
|
||||||
|
1. 不取消 `Client` 固定 `LPORT` 语义
|
||||||
|
2. 不依赖扩大 PCB 池作为主修复手段
|
||||||
|
3. 不通过降低 `TCP_MSL` 改写全局 TCP 保守语义
|
||||||
|
4. 对 `Client` 主动断开后的释放路径采用 abortive close(RST),以立即释放 PCB 与本地端口
|
||||||
|
|
||||||
|
使用该策略时应明确接受以下副作用:
|
||||||
|
|
||||||
|
1. 对端可能看到 `RST` 或“连接被重置”
|
||||||
|
2. 连接尾部未完成发送的数据不会再走优雅关闭路径
|
||||||
|
3. 该策略仅用于固定 `Client` 端口快速重连场景,不应直接推广到所有 TCP 关闭路径
|
||||||
|
|||||||
@@ -365,6 +365,14 @@ EN,LPORT,RIP,RPORT,UART
|
|||||||
5. 内部 ring buffer 可取消(netconn 内部已有 pbuf 缓冲)
|
5. 内部 ring buffer 可取消(netconn 内部已有 pbuf 缓冲)
|
||||||
6. 每个 TCP 任务内直接处理路由,通过 Queue 指针传递数据
|
6. 每个 TCP 任务内直接处理路由,通过 Queue 指针传递数据
|
||||||
|
|
||||||
|
补充约束(当前实现口径):
|
||||||
|
|
||||||
|
1. `Client` 链路保留固定 `LPORT` 配置语义,以满足产品侧对固定源端口的依赖
|
||||||
|
2. 在 `lwIP + netconn` 模型下,若 `Client` 继续使用优雅 `netconn_close()`,相同本地端口的快速重连会受 `TIME_WAIT` 影响
|
||||||
|
3. 因此当前工程对 `Client` 会话结束后的释放路径采用 abortive close(`tcp_abort` / RST)以立即释放 PCB 与本地端口
|
||||||
|
4. 该策略只针对 `Client` 固定端口重连路径,不扩展到 `Server` listener 或一般被动关闭场景
|
||||||
|
5. 该策略的已知代价是:对端可能看到 `RST`,且尾部未完成发送的数据不会再走优雅 `FIN/ACK` 收尾
|
||||||
|
|
||||||
### 7.4 FreeRTOS 初始化 `freertos.c`
|
### 7.4 FreeRTOS 初始化 `freertos.c`
|
||||||
|
|
||||||
CubeMX 生成的 FreeRTOS 初始化文件,职责:
|
CubeMX 生成的 FreeRTOS 初始化文件,职责:
|
||||||
|
|||||||
Reference in New Issue
Block a user