【C/C++】手写 DPDK 协议栈(六):TCP 三次握手、状态机与数据回显

目录

  • [手写 DPDK 协议栈(六):TCP 三次握手、状态机与数据回显](#手写 DPDK 协议栈(六):TCP 三次握手、状态机与数据回显)
    • [1. 状态机是 TCP 的核心](#1. 状态机是 TCP 的核心)
    • [2. 三次握手的数字关系](#2. 三次握手的数字关系)
    • [3. 建连与数据投递](#3. 建连与数据投递)
    • [4. 实验抓包](#4. 实验抓包)
    • 小结

手写 DPDK 协议栈(六):TCP 三次握手、状态机与数据回显

标签:DPDK TCP 状态机 用户态网络栈

tcp/stack.ctcp/socket.c 在 UDP 的 socket/ring 框架上加入 TCP 状态、序列号、确认号与标志位。它的目标是教学型最小 TCP 服务端,而不是完整 RFC 实现。

1. 状态机是 TCP 的核心

text 复制代码
LISTEN --SYN--> SYN_RECEIVED --ACK--> ESTABLISHED
ESTABLISHED --FIN--> CLOSE_WAIT --close--> LAST_ACK --ACK--> CLOSED

课程 socket_block_t 保存 tcp_statusseq_numack_numwindow_size;接收路径按四元组/五元组找到连接,再按状态调用处理函数。

c 复制代码
switch (local->tcp_status) {
case TCP_STATUS_LISTEN:
    tcp_listen_handle(local, ip_hdr); break;
case TCP_STATUS_SYN_RECEIVED:
    tcp_syn_received_handle(local, ip_hdr); break;
case TCP_STATUS_ESTABLISHED:
    tcp_established_handle(local, ip_hdr); break;
case TCP_STATUS_LAST_ACK:
    tcp_last_ack_handle(local, ip_hdr); break;
default:
    break;
}

2. 三次握手的数字关系

text 复制代码
Client                  Server
SYN, seq=x             ->  LISTEN
             <- SYN+ACK, seq=y, ack=x+1
ACK, seq=x+1, ack=y+1  ->  ESTABLISHED

SYN 和 FIN 各消耗一个序列号;纯 ACK 不消耗序列号。TCP 头长来自 data_off 高 4 位再乘 4,应用数据长度为 IP 总长减去 IP 头与 TCP 头长度。

3. 建连与数据投递

收到 LISTEN socket 的 SYN 时,课程代码封装 SYN+ACK 到监听 socket 的 out ring,同时按对端地址创建一个新 socket_block_t,状态置为 SYN_RECEIVED。第三次 ACK 到达后改为 ESTABLISHED

c 复制代码
if (tcphdr->tcp_flags & RTE_TCP_PSH_FLAG) {
    uint16_t hdr_len = (tcphdr->data_off >> 4) * 4;
    uint16_t payload_len = ntohs(ip_hdr->total_length)
        - sizeof(struct rte_ipv4_hdr) - hdr_len;
    local->ack_num = ntohl(tcphdr->sent_seq) + payload_len;
    /* 一个 ACK 入 out ring;携带 payload 的副本入 in ring */
}

数据到达时先排队 ACK,再将 payload 投递给应用,能让"确认网络数据"和"业务处理"解耦。

4. 实验抓包

这个版本适合作为 TCP 状态机起点,但尚未覆盖重传定时器、滑动窗口、乱序重组、拥塞控制、TIME_WAIT 管理、RST、MSS/窗口缩放协商和完整校验。任何外网服务都不能直接使用该简化实现。

小结

手写 TCP 最有价值的部分不在"拼出一个 SYN+ACK",而在于把每个输入报文映射为明确状态转移、序列号更新和应用可见事件。下一篇把单循环拆成三层,解决协议栈逐步复杂后的耦合问题。

相关推荐
我爱cope13 分钟前
【计算机网络 | 传输层3:TCP 协议概述:面向连接、可靠传输到底意味着什么?】
网络·网络协议·学习·tcp/ip·计算机网络·传输层
知无不研39 分钟前
c语言中循环的介绍与简单应用
c语言·开发语言·算法·循环·for·while
郝学胜-神的一滴44 分钟前
Qt 高级编程 045:坐标体系深度实战
开发语言·c++·windows·python·qt·程序人生
码匠许师傅1 小时前
【设计模式精讲】22.中介者模式(Mediator)
c++·设计模式·软件工程·uml·中介者模式
HRTOS2 小时前
HRTOS 4.0 驱动库:06_Storage 存储设备驱动——24C02 EEPROM与I²C驱动开发
c语言·驱动开发·嵌入式硬件·51单片机
爱吃巧克力的程序媛4 小时前
main.cpp注册 C++ 类到 QML 元对象系统
c++·qt
YYYing.4 小时前
【C++进阶系列 (二)】关于线程堆栈的那些事——函数调用过程
开发语言·c++·函数·线程堆栈
开开心心就好4 小时前
免费刷题软件推荐,支持导入题库自动判题
网络·网络协议·tcp/ip·jupyter·智能手机·电脑·idea
键盘会跳舞5 小时前
【C++多线程】死锁诊断工具实战:从 Windows 到 Linux 的全链路排查
linux·c++·windows·死锁
HugoStudio_SWAN5 小时前
洛谷 P10719 \[GESP202406 五级] 黑白格——暴力美学与图像处理的最小外接矩形
c++·图像处理·人工智能·学习·程序人生·算法·目标跟踪