SylixOS TCP 数据段发送流程简述

1、在 LwIP 协议栈中使用 TCP 控制块结构 struct tcp_pcb 管理 TCP 连接,使用 TCP 段结构 struct tcp_seg 描述 TCP 段。在 TCP 控制块中有两个队列 unsent 与 unacked 表示所有未发送的 TCP 数据段和发送了还未收到确认的 TCP 数据段。如下图所示。

2、TCP 连接发送数据由应用层发起,数据段构建后首先被缓存在 TCP 控制块的 unsent 链表中,随后调用网卡驱动发送接口发送数据,流程如下:

1)调用 write 发送 TCP 数据。write 接口最终会调用 LwIP TCP 发送函数 tcp_write() 调用链如下:

write() ---> __socketWrite() ---> lwip_write() ---> lwip_send() ---> netconn_write_partly() ---> netconn_write_vectors_partly() ---> lwip_netconn_do_write() ---> lwip_netconn_do_writemore() ---> tcp_write()

2)在 tcp_write() 中会构建新的 TCP 段,且大部分 TCP 协议内容在这里完成,新构建的 TCP 段会被放入 pcb->unsend 队列中;

3)调用 tcp_output() 用于发送 TCP 段。在 tcp_output() 中首先通过 tcp_route() 获取发送网卡结构 netif,将 unsend、unacked 队列中的 TCP 段通过 tcp_output_segment() 提交到 IP 层。在 tcp_input()、tcp_close()、tcp_connect() 等函数中也会调用 tcp_output() 用于实现 TCP 链接各个过程中的报文发送;

4)IP 层最终调用到网卡驱动发送接口,函数调用流程如下:

tcp_output_segment() ---> ip_output_if() ---> ip4_output_if() ---> ip4_output_if_opt_src() (大部分 IP 层协议内容在这里完成) ---> ethernet_output() ---> netdev_netif_linkoutput() ---> NETDEV_TRANSMIT()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

stone8761

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值