lwip是瑞士计算机科学院的一个开源的TCP/IP协议栈实现.
LwIP是Light Weight (轻型)IP协议,有无操作系统的支持都可以运行。LwIP实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用,一般它只需要几百字节的RAM和40K左右的ROM就可以运行,这使LwIP协议栈适合在低端的嵌入式系统中使用。
本文主要讨论TCP的核心协议(滑动窗口、拥塞控制、慢启动、快速重传、快速恢复、Nagle 算法、捎带 ACK等 )在lwip中的实现。
lwip中负责TCP会话管理的核心数据结构是tcp_pcb
1、 滑动窗口
1.1 发送窗口的使用:
网络数据到达时:
更新 pcb->snd_wnd
网络数据发送时:
// 发送数据大小不能超过发送窗口和拥塞窗口的最小值。
wnd =MIN ( pcb->snd_wnd , pcb->cwnd );
if ( len (待发送数据包) > wnd ) {
暂不发送;
}
1.2 接收窗口的使用:
网络数据到达时:
pcb->rcv_wnd -= len ;
应用层读取数据时:
pcb->rcv_wnd += len ;
当 rcv_wnd 被调整时:
u32_t new_right_edge = pcb->rcv_nxt + pcb->rcv_wnd;
if(new_right_edge>=pcb->rcv_ann_right_edge + MIN((TCP_WND/2), pcb->mss))
{//