SylixOS TCP 数据段发送流程简述

SylixOS TCP 数据段发送流程简述

Q: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()


    • Related Articles

    • SylixOS TCP 数据段接收流程简述

      Q:SylixOS TCP 数据段接收流程简述 1、数据包最初由网卡驱动中断接收,通过调用 tcpip_input() 送入 LwIP 协议栈; 2、在 tcpip_inpkt() 中将 ip_input() 通过 mbox (本质为消息队列) 投递至线程 “t_netproto”,并在线程中执行 ip_input(); 3、在 ip_input() 中针对 IPv4 报文调用 ip4_input() 进行处理。针对 TCP 报文,tcp_input() 处理了基本的协议规则; ...
    • TCP/UDP 通信中 server 端异常关闭后无法再次连接

      Q:在 TCP/UDP 通信中,服务器和客户端正常通信时若手动异常关闭 server 端进程,再次运行开启 server 端程序会在 bind 函数位置报错,造成无法连接? 尝试在 bind 函数前添加 setsockopt 函数增加复用功能,重用本地地址,代码如下  iRet = setsockopt(sockFd, SOL_SOCKET, SO_REUSEADDR, &iRet, sizeof(int));     if(iRet < 0){         ...
    • SylixOS 协议栈学习(四)ping 工作流程

      Ping工作流程: 1、涉及协议介绍       运行ping程序时,会用到以下协议:       ICMP(因特网控制报文协议):用于IP主机、路由器直接传递控制消息(一般是差错信息,如TCP/UDP传输失败,会构建ICMP报文返回)。       IP协议:一种不可靠、无连接的传输协议(目的是为了更好的提供传输服务)。(对于TCP传输,已十分可靠,不需要在IP层再链接;UDP本身就是不可靠、无连接的协议,使用IP协议能更快传输)。     ...
    • SylixOS 功能介绍及版本差异

      SylixOS功能介绍及版本差异 SylixOS 标准版 SylixOS 标准版是 SylixOS 的基础版本,具备如下功能: 兼容 IEEE 1003(ISO/IEC 9945)操作系统接口规范; 兼容 POSIX 1003.1b(ISO/IEC 9945-1)实时编程标准; 支持国军标 GJB7714-2012 操作系统接口规范; 优秀的实时性能(任务调度与切换算法时间复杂度为 O(1)); 支持无限多任务; 抢占式调度支持 256 个优先级; 支持虚拟进程; ...
    • SylixOS 动态关核架构流程

      1. SylixOS 动态关核接口 SylixOS 支持动态关核操作,通过如下应用函数; VOID  Lw_PowerM_CpuSet(ULONG  ulNCpus, UINT  uiPowerLevel); 函数Lw_PowerM_CpuSet原型分析: 参数 ulNCpus是运行态的CPU 核个数;  参数 uiPowerLevel是CPU能耗级别。 2. 基本流程 系统函数调用流程如图 2.1: (1) Lw_PowerM_CpuSet( ...