tcp协议栈实现,tcp定时器与滑动窗口实现

用户态协议栈 /以太网首部//目地MAC地址//源MAC地址//类型//IP数据头unsigned char version:4, //版本hdrlen:4;//首部长度//服务类型//总长度//标识unsigned short flag:3, //标志 缺省offset:13;//片偏移//生存时间(TTL)//协议//首部检验和//源IP地址//目的IP地址//UDP协议头//源端口//目的端口//封包长度//校验和//整个数据包。 阅读详情

要实现用户态协议栈,必须要搞懂TCP,TCP 11个状态、滑动窗口、拥塞控制、定时器等等。

要使用用户态协议栈,内核提供的epoll就不起作用了,我们需要自己实现用户态的epoll。epoll内部涉及到一个回调的时机,回调的作用是将红黑树中的节点添加进就绪队列,具体在epoll原理里面会具体讲解。搞清楚TCP的11个状态,我们就明白应该在什么时机进行回调了。

TCP状态转换图

在前面的[posix与网络协议栈](Build software better, together api和网络协议栈.md)中,已经介绍了tcp的状态转换。可以结合tcp状态转换图一起看。

TCP状态保存在哪里?保存在TCB中,即TCP PCB,协议控制块。里面包含了socket信息,以及sendbuffer,recvbuffer。TCB保存了从listen到time_wait的所有状态。

用户态TCP协议栈实现

前面实现了UDP协议栈,TCP协议栈实现也是类似的,但是比UDP要复杂很多。

TCP头定义

​seq num初始值是多少,到达最大值(2^32 - 1)后怎么样, 会越界吗?

seq num初始值是一个随机值,之后累加。到达最大值后又从0开始计算,不会越界。

seq num指的是包的数量,还是字节数量?

计算的时候,使用的都是字节数。

TCP的包是什么意思?TCP头为什么没有包长?

TCP前后两个包都有序号,就可以计算出包的长度。

ack num = seq num + 包长。

header length是4bit,最大值是15,单位是4个字节,所以TCP头最大时15*4 = 60字节。没有option的话,TCP头是20字节,header length值就是5。

window size,能够接收数据的最大容量。

urgent pointer, 如果URG位置1,就是告诉对端从这个位置开始的数据,要马上处理。

struct tcphdr {

	unsigned short sport;
	unsigned short dport;

	unsigned int seqnum;
	unsigned int acknum;

	unsigned char hdrlen_resv;

	unsigned char flag; 

	unsigned short window;

	unsigned short checksum;
	unsigned short urgent_pointer;

	unsigned int options[0];
				  

};
什么是协议栈? 用户态协议栈设计(udp协议栈) (协议栈(Protocol Stack)是计算机网络和通信系统中的一个重要概念,它指的是一组协议层的层次结构,这些协议层一起协同工作,以便在不同计算机或设备之间实现数据通信和交换。每个协议层都有特定的功能和责任,从物理层到应用层,每一层都在不同的抽象级别上处理数据和通信任务) 阅读详情

相关推荐

【高阶知识】用户态协议栈之Epoll实现原理

Epoll 是 Linux IO 多路复用的管理机制。作为现在 Linux 平台高性能网络 IO 必要的组件。内核的实现可以参照:fs/eventpoll.c 。为什么需要自己实现 epoll 呢?现在自己打算做一个用户态的协议栈。采用单线程的模式。https://github.com/wangbojing/NtyTcp,至于为什么要实现用户态协议栈?可以自行百度 C10M 的问题。由于协议栈做到了用户态故需要自己实现高性能网络 IO 的管理。所以 epoll 就自己实现一 下。代码:https://git

Linuxhus的博客 353

Rust手写TCP协议栈:从零构建网络核心组件

TCP协议作为网络通信的基石,其核心在于通过三次握手建立连接、滑动窗口实现可靠传输、以及四次挥手终止连接。理解TCP协议栈的工作原理,不仅能帮助开发者深入掌握网络编程的本质,还能提升对系统资源管理和并发控制的能力。在工程实践中,通过用户态实现TCP协议栈,可以绕过操作系统内核的抽象层,直接操作以太网帧、IP数据报和TCP报文段,从而实现对数据流动的精确控制。这种实践对于构建高性能网络应用、优化协议栈性能以及排查复杂网络问题具有重要价值。本文以Jon Gjengset的《手写TCP协议栈》课程为例,探讨如何用

weixin_28745067的博客 217

Linux TCP协议栈核心机制与性能调优实战

TCP协议作为互联网传输层的核心协议,其实现机制直接影响网络性能与可靠性。Linux内核中的TCP协议栈通过滑动窗口、拥塞控制、重传定时器等机制保障可靠传输,其中CUBIC和BBR等算法动态调整发送速率以适应不同网络环境。在工程实践中,合理设置缓冲区大小、调整内核参数(如tcp_rmem/tcp_wmem)以及优化中断处理(如GRO/GSO)能显著提升吞吐量。针对高并发场景下的TIME_WAIT状态处理、MTU配置等常见问题,需要结合ss、ethtool等工具进行诊断调优。随着eBPF技术的发展,现在可以通

weixin_33423874的博客 344

深入解析Microchip TCP/IP协议栈:ARP、IP、ICMP、TCP四大核心模块实战

TCP/IP协议栈是现代网络通信的基石,它通过分层模型将复杂的网络通信抽象为清晰的数据流处理过程。其核心原理在于各协议层协同工作,确保数据从源端可靠、高效地传输到目的端。理解协议栈的技术价值在于,开发者能够精准控制数据包的收发流程,从而构建稳定、高效的嵌入式网络应用。在嵌入式开发、物联网设备、工业控制等场景中,协议栈的稳定性和性能直接决定了产品的可靠性。本文聚焦于Microchip TCP/IP协议栈,深入剖析其ARP、IP、ICMP、TCP四大核心模块的内部工作机制与函数接口,并结合**网络缓冲区管理**

weixin_32576389的博客 343

TCP 可靠传输之流量控制

接收方收到数据包2,发送ACK(ack=600,确认所有数据),实现仅重传丢失数据,减少网络带宽浪费。TCP 流量控制是端到端的控制机制(仅发生在发送方与接收方之间),核心目的是:让发送方的发送速率,匹配接收方的接收能力,避免接收方因缓冲区满,无法接收新数据,导致数据丢失,从而保障 TCP 传输的可靠性。TCP 拥塞控制是全网范围的控制机制,核心目的是:让发送方的发送速率,匹配网络的传输能力,避免因发送方发送速率过快,导致网络链路拥堵、数据包丢失(如路由器缓存满),从而保障 TCP 传输的可靠性。

JAVA爱好者的专栏 256

用户态协议栈之滑动窗口与定时器

1 tcp帧头 source prot:源端口 16位 Destination port:目的端口 16位 sequence Number:序列号 32位 ack number:应答序号 32位 header length:头长度 4bits resv:4位 CWR:1位 ECE:1位 URG:1位 ACK:1位 PSH:1位 RST:1位 SYN:1位 FIN:1位 Windows size:窗口大小 16bits tcp checksum:校验和 Ugrent pointer: options:选项

Aaron.无剑 366

滑动窗口协议的仿真实现

对于计算机网络中滑动窗口协议的仿真实现。

数据链路层滑动窗口协议的设计与实现源码

自己编的程序,利用所学数据链路层原理,自己设计一个滑动窗口协议并在仿真环境下编程实现有噪音信道环境下两站点之间无差错双工通信。信道模型为8000bps 全双工卫星信道,信道传播时延270 毫秒,信道误码率为10-5,信道提供字节流传输服务,网络层分组长度在240~256字节范围。通过该实验,进一步巩固和深刻理解数据链路层的误码检测的CRC 校验技术,以及滑动窗口的工作机理。滑动窗口机制的两个主要目标:(1) 实现有噪音信道环境下的无差错传输;(2)充分利用传输信道的带宽。在程序能够稳定运行并成功实现第一个目标之后,运行程序并检查在信道没有误码和存在误码两种情况下的信道利用率。

a股level2数据接口的最优委托信息

Level-1提供的数据并不可以知道委托了xxx手是有多少人下的,以及每个人下了多少的明细。通过Level-2的这个详细买卖盘数据,盘口上的单子到底是散户小打小闹,还是主力真刀实枪在干,都一览无余。交易类型:1-市价,2-限价,3-本方优先,10-撤单, 11-暂不清楚( 基金/ 债券有此值)除了提供逐笔成交记录这个信息外,还提供了最优委托信息,也就是盘口中前50笔订单的委托数量明细。那么Level-2盘口委托数据的速度更新是非常快的,大家可以通过。交易方向:0-未知,1-买入,2-卖出。

Qq_2037696191的博客 1168

LSTM cell结构的理解和计算

LSTM是传统RNN网络的扩展,其核心结构是其cell单元,网上LSTM的相关资料繁多,质量参差不齐,下面主要结合LSTM神经网络的详细推导和 Christopher Olah的blog两篇文章中的内容进行说明。主要介绍网络如何计算,为何这么算先不展开:)。前者一副图加上29个公式,简洁明了;后者娓娓道来,适合初学者。首先是LSTM cell最常见的结构图: 这是变形的版本(找不到更清晰的版本了),

songhk0209的博客 2万+

QT插件学习系列(一) 初识QtPlugin

QT插件学习系列(一) 初识QtPlugin 1、 概述 为什么我们要学习插件化,其和 windows 导出 dll 有什么区别呢? 导出的动态库如果缺失,程序不能运行。但插件可以。 同一套代码,即可分别在 windows 下和 linux 下生成插件。 QT 本身提供两种插件支持,一种称为高级 API,一种称为低级 API。 高级API的作用是扩展 QT 程序本身,需要子类化 QT 提供的插件基类,例如现有的 QTSqlDriver,因此你可也以编写自己的 QTStyle 扩展 QT。 低级

L_Andy的专栏 3113

java 二维码生成及其标签打印

本文主要内容 二维码生成 二维码标签预览及打印 二维码生成 笔者此次的二维码是通过调用第三方接口生成的,具体流程如下: 根据规范要求调用第三方接口,返回二维码下载地址及二维码图片的属性值(图片大小等) 根据返回的值获取二维码下载地址,根据地址下载二维码图片,保存至本地磁盘及记录数据信息 扫描二维码跳转相应地址,显示资产的基本信息 最终生成的二维码如下图所示: 预览并批量打印二维码标签 先...

孙小牟的博客 4942

[RK3399][Android7.1] 调试笔记 --- 编译GSL5680 touch提示错误

Platform: RK3399 OS: Android 7.1 Kernel: v4.4.83 现象: 之前在rk3288平台上使用过GSL5680的Touch,现在移植过来一直报如下错误: make[1]: `include/generated/vdso-offsets.h' is up to date. CHK include/generated/compi...

Kris Fei's blog 1056

1.2 固态变压器:传统工频变压器的局限与SST的技术起源

本小节明确传统工频变压器在电力系统中的基础定位与核心工作特性,系统分析其在新型电力系统场景下的固有技术瓶颈,梳理固态变压器(Solid State Transformer, SST,又称电力电子变压器Power Electronic Transformer, PET)从概念提出到工程化成熟的完整演进路径,为后续SST技术优势、设计需求与规范符合性要求的讲解建立底层逻辑,同时对应GB/T 40429-2021《电力电子变压器通用技术要求》的需求制定背景。

技术工作者 659

Krylov子空间与Arnoldi过程

一、应用背景 Krylov子空间方法是模型降阶(MOR)的一种,Krylov 子空间方法就是在Krylov子空间中寻找近似解。 二、Krylov子空间 n是原始矩阵的维度,m为降阶后矩阵的维度,通常m<<n。 三、Arnoldi 过程: 计算Km 的一组正交 对应上述MGS过程的python代码: import numpy as np def arnoldi_itera...

保持写作习惯,完成知识沉淀 6002

RDKit | 基于Pytorch和RDKit建立QSAR模型

QSAR 定量构效方法(quantitative structure-activity relationship, QSAR)是应用最为广泛的药物设计方法。所谓定量构效方法就是通过一些数理统计方法建立其一系列化合物的生理活性或某种性质与其物理化学性质之间的定量关系,通过这些定量关系。可以预测化合物的生理活性或某些性质,指导我们设计出具有更高活性的化合物。 早在...

DrugOne 5078

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

上一篇: 手写内存池以及原理代码分析【C语言】
下一篇: Redis之最细命令介绍
Linux服务器开发
博客等级 码龄7年 610粉丝 589原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值