第一范文网 - 专业文章范例文档资料分享平台

lwip中各种函数,标志位的总结

来源:用户分享 时间:2025/5/29 1:39:00 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

if ((flags & TCP_FIN) && accepted_inseq) { // 如果ACK包同时?有FIN位且

tcp_ack_now(pcb); //已经接收完了最后的数据,则响应FIN

pcb->state = CLOSE_WAIT;//进入CLOSE_WAIT状态 } }

else { //不合法的ACK序号则返回一个复位包 tcp_rst(ackno, &(iphdr->dest), &(iphdr->src), tcphdr->dest, tcphdr->src); } } break;

seqno

+

tcplen,

tcp的输入输出函数

tcp_enqueue,将数据包或者连接的控制握手包放到tcp 控制块的发送队列上。

tcp_enqueue( struct tcp_pcb *pcb, void *arg, u16_t len,u8_t flags, u8_t apiflags,u8_t *optdata, u8_t optlen )

其中有几个重要的输入参数:pcb是相应连接的TCP控制块;

arg是要发送的数据的指针;len 是要发送的数据的长度,以字节为单位;flags是TCP数据段头部中的标识字段,主要用 于连接建立或断开的握手;apiflags表示要对该数据段做的操作,包括是否拷贝数据、是否设置PUSH标志;optdata表示TCP头部中的选项字段的值,optlen表示选项字段的长度。

tcp_enqueue 首先确认要发送的数据长度len 是否小于当前连接能用的数据发送缓冲区大小将要发送的数据段的序号 字段设置为pcb->snd_lbb,然后判断pcb->snd_queuelen值是否超过了所允许挂接的数据包

的上限值TCP_SND_QUEUELEN,如果超过了该上限值,则函数也不会对这个要发送的数

据段进行处理。接下来tcp_enqueue 函数会将数据组装成为tcp_seg 类型的数据段,根据数据长度的大小不同,可能需要几个tcp_seg类型结构才能描述完所有的数据,每个数据段中的TCP头部部分字段值要在这里都要被设置,包括数据序号、标志字段。最后,所有创建好的tcp_seg类型结构都是连接在queue队列上的,queue是函数的一个临时变量函数tcp_enqueue需要将queue队列上的数据段挂接到TCP控制块的unsent队列上这有好几种情况,即unsent 队列是否为空的情况,若为空,则直接挂接,若不为空,则需要 将queue挂接在unsent队列的最后一个tcp_seg 之后,如果

挂接点处相邻两个tcp_seg 所包的数据大小小于最长发送段大小pcb->mss,且相邻的两个段都不是FIN包或SYN包,则 需要将两个段合并为一个段。最后,函数需要调整TCP控制块中的相关字段的值,这点也是我最关心的地方, if ((flags & TCP_SYN) || (flags & TCP_FIN)) { //发送SYN或FIN包被认为数据长度为1 ++len; }

if (flags & TCP_FIN) { // 若为FIN包,则设置flags字段为相应值 pcb->flags |= TF_FIN; }

pcb->snd_lbb += len; // 下一个要被缓冲数据的序号,注意与snd_nxt不同

pcb->snd_buf -= len; // 减小空闲的发送缓冲数,注意这个缓冲区并不是真正存在的

pcb->snd_queuelen = queuelen; // ?发送队列中的pbuf个数

cp_output 函数有个唯一的参数,即某个链接的TCP控制块指针pcb,函数把该控制块的unsent队列上数据段发送出去

或直接发送一个ACK数据段。如果调用该函数时,控制块的flags 字段设置了TF_ACK_NOW标志,则函数必须马上发出去一个带有ACK标志。因此,如果此时unsent队列中无数据发送或者发送窗口此时不允许发送数据,则函数需要发出去一个不?任何数据的ACK数据报。当没有TF_ACK_NOW置位,或者TF_ACK_NOW置位但该ACK能和数据段一起发送出去时,则此时函数会取下unsent 队列上的数据段发送出去(这里先暂时不考虑nagle算法)。发送一个具体的数据段是通过调用函数tcp_output_segment实现的,这个函数主要是填充待发送数据段的TCP头部中的确认序号为pcb->rcv_nxt,通告窗口大小为pcb->rcv_ann_wnd,校验和字段,最后tcp_output_segment将数据包递交给IP层发送

tcp_receive这个函数简单的来说就是操作TCP控制块中的unsent、unacked、ooseq字段,这三个字段用于连接TCP的各种数据段。unsent用于连接还?被发送出去的数据段、unacked用于连接已经发送出去但是还?被确认的数据段、 ooseq 用于连接接收到的无序的数据段。这个三个字段都是tcp_seg 类型的指针,结构体tcp_seg用于描述一个TCP数据段源代码如下: struct tcp_seg {

struct tcp_seg *next; // 用来建立链表的指针 struct pbuf *p; // 数据段pbuf指针

搜索更多关于: lwip中各种函数,标志位的总结 的文档
lwip中各种函数,标志位的总结.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c2izmv47esu8mpoj7oh1r_7.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top