CS144 Lab3 实战记录:TCP 发送器实现
文章目录
- 1 实验背景与目标
- 2 TCP发送器的实现
- 2.1 整体流程
- 2.2 核心组件
- 2.3 窗口管理
- 2.4 关键函数实现
- 2.4.1 push函数
- 2.4.2 receive函数
- 2.4.3 tick函数
- 3 仓库地址
1 实验背景与目标
在 TCP 协议中,发送器(TCP Sender)是实现可靠传输的核心组件。它的主要职责是将应用层的字节流分割为 TCP 段,通过不可靠的网络传输,并确保数据被可靠接收。在 Stanford CS144 Lab3 中,我们需要基于 Lab0 实现的字节流(ByteStream)、Lab1 的字节流重组()、 Lab2 实现的接收器(TCPReceiver),完成 TCP 发送器的实现。TCP发送端的主要职责包括:
- 维护发送窗口和序列号
- 实现数据分段和传输
- 处理重传定时器
- 响应接收方的确认和流量控制
2 TCP发送器的实现
2.1 整体流程
其工作流程可以概括为:应用层数据通过push
接口进入发送器,发送器根据当前窗口状态封装 TCP 段并发送,同时启动重传定时器;接收到 ACK 时更新确认状态和窗口信息,定时器超时则触发重传。这一过程通过push
、receive
、tick
三个核心函数的协同,实现了数据发送、确认处理和超时重传的闭环控制。
2.2 核心组件
-
连接状态标志
-
syn_sent_
:表示 SYN 握手包是否已发送。作为三次握手的起点,SYN 段占用 1 字节序列号,必须在数据传输前发送 -
fin_sent_
:标记 FIN 结束包的发送状态。当字节流读取完毕时,发送 FIN 段表示数据传输完毕,同样占用 1 字节序列号
-
-
序列号管理
-
isn_
(初始序列号):每个连接随机生成的初始序列号,用于防止历史连接的重复数据干扰 -
next_seqno_
:下一个待发送的字节序列号,初始为 0,每次发送段后递增段的总长度(包括 SYN/FIN 标志占用) -
ackno_
:接收端已确认的最高字节序列号,通过 ACK 解析得到,用于标记已可靠传输的边界 -
bytes_in_flight_
:当前已发送但未确认的字节总数,实时反映窗口的占用情况
-
-
窗口与定时器状态
-
window_size_
:接收端通告的可用窗口大小,初始化为 1(允许窗口探测),0 表示接收缓冲区已满 -
initial_RTO_ms_
:初始重传超时时间,实验中通常设为 100ms,作为定时器的基准参数 -
current_RTO_ms_
:动态调整的当前超时时间,每次重传后按指数退避算法加倍(如 200ms、400ms…) -
timer_
:记录自上次定时器重置后的 elapsed 时间,用于判断是否超时 -
timer_running_
:标记定时器是否处于运行状态,避免重复启动 -
consecutive_retransmissions_
:连续重传次数,用于拥塞控制中的阈值调整(实验中暂未实现完整拥塞控制)
-
#pragma once#include "byte_stream.hh"
#include "tcp_receiver_message.hh"
#include "tcp_sender_message.hh"#include <functional>
#include <queue>class TCPSender
{
public:/* Construct TCP sender with given default Retransmission Timeout and possible ISN */TCPSender( ByteStream&& input, Wrap32 isn, uint64_t initial_RTO_ms ) : input_( std::move( input ) ), isn_( isn ), initial_RTO_ms_( initial_RTO_ms ), current_RTO_ms_( initial_RTO_ms ){}/* Generate an empty TCPSenderMessage */TCPSenderMessage make_empty_message() const;/* Receive and process a TCPReceiverMessage from the peer's receiver */void receive( const TCPReceiverMessage& msg );/* Type of the `transmit` function that the push and tick methods can use to send messages */using TransmitFunction = std::function<void( const TCPSenderMessage& )>;/* Push bytes from the outbound stream */void push( const TransmitFunction& transmit );/* Time has passed by the given # of milliseconds since the last time the tick() method was called */void tick( uint64_t ms_since_last_tick, const TransmitFunction& transmit );// Accessorsuint64_t sequence_numbers_in_flight() const; // For testing: how many sequence numbers are outstanding?uint64_t consecutive_retransmissions() const; // For testing: how many consecutive retransmissions have happened?const Writer& writer() const { return input_.writer(); }const Reader& reader() const { return input_.reader(); }Writer& writer() { return input_.writer(); }private:Reader& reader() { return input_.reader(); }ByteStream input_; // the outbound stream used to read data to sendWrap32 isn_; // initial Sequence Number/* State flag */bool syn_sent_{}; // has the SYN flag been sent?bool fin_sent_{}; // has the FIN flag been sent?/* Window management */uint16_t window_size_{ 1 }; // size of the receiver's windowuint64_t next_seqno_{}; // next sequence number to be sentuint64_t ackno_{}; // acknowledgment number of the receiveruint64_t bytes_in_flight_{}; // number of bytes sent but not acknowledged/* Retransmission timer management */uint64_t initial_RTO_ms_; // initial RTO in millisecondsuint64_t current_RTO_ms_{}; // current RTO in milliseconds uint64_t timer_{}; // timer for retransmissionbool timer_running_{}; // is the timer running?uint64_t consecutive_retransmissions_{}; // number of consecutive retransmissions// outstanding segments waiting for acknowledgmentstd::queue<TCPSenderMessage> outstanding_messages_{};
};
2.3 窗口管理
接收端通过 ACK 中的窗口字段告知发送端可用接收缓冲区大小,发送器必须严格遵循这一限制。这里需要处理两种特殊情况:
- 零窗口处理:当
window_size_
为 0 时,视为接收缓冲区已满,发送器应停止发送数据(除了窗口探测段)。实验中采用 “窗口探测” 机制,将零窗口视为有效窗口为 1,允许发送 1 字节的段来探测窗口是否更新 - 有效窗口计算:实际可用窗口需考虑已发送未确认的字节(
bytes_in_flight_
),公式为:
有效窗口 = max(1, window_size_) - bytes_in_flight_
这里的max(1, window_size_)
确保零窗口时仍允许探测,而减去已发送字节则保证不超过接收端的处理能力
2.4 关键函数实现
2.4.1 push函数
push
函数是TCP发送端的核心功能,负责将输入流中的数据封装成TCP报文并发送。其核心逻辑如下图所示:
void TCPSender::push(const TransmitFunction& transmit)
{// 计算有效窗口大小(将0窗口视为1进行窗口探测)const uint16_t effective_window = window_size_ ? window_size_ : 1;// 持续发送直到窗口用尽或FIN已发送while (bytes_in_flight_ < effective_window && !fin_sent_) {TCPSenderMessage msg = make_empty_message();// 如果连接未初始化,设置SYN标志if (!syn_sent_) {msg.SYN = true;syn_sent_ = true;}// 计算考虑窗口和已发送数据后的可用负载空间const uint64_t remaining_capacity = effective_window - bytes_in_flight_;const size_t max_payload = min(remaining_capacity - msg.sequence_length(), // 考虑SYN/FIN占用TCPConfig::MAX_PAYLOAD_SIZE);// 从输入流填充负载,不超过计算出的最大容量while (reader().bytes_buffered() && msg.payload.size() < max_payload) {const string_view data = reader().peek().substr(0, max_payload - msg.payload.size());msg.payload += data;reader().pop(data.size());}// 如果流已结束且窗口允许,设置FIN标志if (!fin_sent_ && reader().is_finished() && (remaining_capacity > msg.sequence_length())) {msg.FIN = true;fin_sent_ = true;}// 跳过空段(除了SYN/FIN外)if (msg.sequence_length() == 0)break;// 传输段并更新跟踪状态transmit(msg);next_seqno_ += msg.sequence_length();bytes_in_flight_ += msg.sequence_length();outstanding_messages_.push(move(msg));// 如果定时器未运行,启动重传定时器if (!timer_running_) {timer_running_ = true;timer_ = 0;}}
}
2.4.2 receive函数
receive
函数处理从TCP接收方返回的确认信息,更新窗口大小和确认序列号:
void TCPSender::receive(const TCPReceiverMessage& msg)
{// 处理错误状态if (input_.has_error())return;if (msg.RST) {input_.set_error();return;}// 更新接收方窗口大小window_size_ = msg.window_size;// 如果没有确认号,直接返回if (!msg.ackno)return;// 将相对确认号转换为绝对序列空间const uint64_t ack_abs = msg.ackno->unwrap(isn_, next_seqno_);// 验证确认号if (ack_abs > next_seqno_)return; // 确认了未发送的数据bool acked = false;// 处理所有完全确认的段while (!outstanding_messages_.empty()) {const auto& front_msg = outstanding_messages_.front();const uint64_t segment_end = ackno_ + front_msg.sequence_length();if (segment_end > ack_abs)break; // 部分确认// 更新跟踪信息acked = true;ackno_ = segment_end;bytes_in_flight_ -= front_msg.sequence_length();outstanding_messages_.pop();}// 如果有段被确认,重置定时器状态if (acked) {timer_ = 0;current_RTO_ms_ = initial_RTO_ms_;consecutive_retransmissions_ = 0;timer_running_ = !outstanding_messages_.empty();}
}
2.4.3 tick函数
tick
函数处理重传定时器逻辑,当定时器超时时重传最早的未确认段:
void TCPSender::tick(uint64_t ms_since_last_tick, const TransmitFunction& transmit)
{// 只有在定时器运行时更新计时器if (timer_running_) {timer_ += ms_since_last_tick;}// 检查超时条件if (timer_running_ && timer_ >= current_RTO_ms_ && !outstanding_messages_.empty()) {// 重传最早的未确认段transmit(outstanding_messages_.front());// 只有当窗口打开时应用指数退避if (window_size_ > 0) {consecutive_retransmissions_++;current_RTO_ms_ *= 2;}// 重置定时器以准备下一次可能的重传timer_ = 0;}
}
3 仓库地址
https://github.com/HeZephyr/minnow
相关文章:
CS144 Lab3 实战记录:TCP 发送器实现
文章目录 1 实验背景与目标2 TCP发送器的实现2.1 整体流程2.2 核心组件2.3 窗口管理2.4 关键函数实现2.4.1 push函数2.4.2 receive函数2.4.3 tick函数 3 仓库地址 1 实验背景与目标 在 TCP 协议中,发送器(TCP Sender)是实现可靠传输的核心组…...
Transformer:引领深度学习新时代的架构
引言 在深度学习的快速发展历程中,Transformer 架构如同璀璨的新星,照亮了自然语言处理(NLP)以及计算机视觉(CV)等众多领域的前行道路。自 2017 年在论文《Attention Is All You Need》中被提出以来&#…...
基于RabbitMQ实现订单超时自动处理
基于RabbitMQ实现订单超时自动处理 引言 在现代电商系统中,订单超时自动取消是一个常见的业务需求。传统的定时任务扫描数据库的方式存在性能瓶颈和实时性差的问题。本文将介绍如何使用RabbitMQ的消息队列和死信队列特性,构建一个高效可靠的订单超时自…...
nginx实现同一个端口监听多个服务
nginx实现同一个端口监听多个服务 前言原理配置不同域名基于路径(URL 路由)补充 总之完结撒花,如有需要收藏的看官,顺便也用发财的小手点点赞哈,如有错漏,也欢迎各位在评论区评论! 前言 受同…...
用 Firebase 和 WebRTC 快速搭建一款浏览器视频聊天应用
在现代 Web 应用中,实时音视频通信变得越来越普遍。本文将通过一个简洁实用的示例,带你一步步搭建一个基于 Firebase WebRTC 的浏览器视频聊天应用,帮助你理解 WebRTC 的核心通信机制以及如何借助 Firebase 进行信令传输。 🔧 技…...
记录一次OGG进程abended,报错OGG-01431、OGG-01003、OGG-01151、OGG-01296问题的处理
1. ogg进程abended的几种常见原因: 1. undo表空间不足导致abended。 2. 数据不一致,违反唯一约束导致abended。 3. 源端和目标端表结构不一致导致abended。 4. 源端表名过长,同步到目标端报错导致abended。 5. OGG-03517字符集转换问题导…...
机器学习分类算法详解:原理、应用场景与测试用例
机器学习分类算法详解:原理、应用场景与测试用例 一、基础分类算法 1. 决策树 原理: 通过递归划分数据集,选择信息增益(ID3)或基尼系数(CART)最大的特征作为分裂节点,构建树结构。叶节点代表分类结果。应用场景: 医疗诊断(需解释性,如判断疾病风险)。客户分群(如根…...
机器人仿真:相机信息仿真及显示
1)概要 除了激光雷达以外,机器人常用的视觉传感器还包括相机,相机图像能够获取真实世界的真实颜色和纹理信息,能够被用于进行目标检测、分割和追踪。 2)结果展示...
车载功能测试-车载域控/BCM控制器测试用例开发流程【用例导出方法+优先级划分原则】
目录 1 摘要2 位置灯手动控制简述2.1 位置灯手动控制需求简述2.2 位置灯手动控制逻辑交互图 3 用例导出方法以及优先级原则3.1 用例导出方法3.1.1 用例导出方法介绍3.1.2 用例导出方法关键差异分析 3.2 优先级规则3.2.1 优先级划分的核心原则3.2.2 具体等级定义与判定标准 3.3 …...
gem5-gpu教程05 内存建模
memory-modeling|Details on how memory is modeled in gem5-gpu ====== gem5-gpu’s Memory Simulation ====== gem5-gpu, for the most part, eschews GPGPU-Sim’s separate functional simulation and instead uses gem5’s execute-in-execute model. Therefore, memory …...
如何提升个人解决问题的能力?
提升个人解决问题的能力是一个系统性工程,涉及思维、知识、经验和心态的多方面提升。以下是一些具体且可操作的方法,帮助你逐步增强解决问题的能力: 1. 培养「结构化思维」 明确问题本质: 遇到问题时,先问自己&…...
CSS清楚默认样式
* {margin: 0;padding: 0;box-sizing: border-box;} 这段 CSS 代码是一个常见的全局样式重置代码块,它会对网页中的所有元素(通过通配符 * 选择器)应用相同的样式规则,下面分别解释每一条规则的作用。 margin: 0; 在 HTML 中&a…...
问题:raw.githubusercontent无法访问
问题:raw.githubusercontent无法访问 文章目录 一、问题二、hosts文件2.1、hosts文件简介2.2、hosts文件位置2.3、hosts文件修改 3、解决方法3.1、查询出raw.githubusercontent.com的ip地址3.2、在/etc/hosts里填写IP地址3.3、再次执行命令 4、一些常用IP地址 一、问…...
【C语言】文本操作函数fgetc、fputc、fgets、fputs、fprintf、fscanf、fread、fwrite
一、介绍 二、简要概括 三、函数的使用 1、fgetc和fputc int fgetc ( FILE * stream ); 从文件中读取信息,每次读取一个字符 从流中获取字符返回指定流的内部文件位置指示符当前指向的字符。然后将内部文件位置指示符推进到下一个字符 int main() {//打开文件FI…...
(19)VTK C++开发示例 --- 分隔文本读取器
文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容👉内容导航 👈👉VTK开发 👈 1. 概述 本例采用坐标和法线(x y z nx ny nz)的纯文本文件,并将它们读入vtkPolyData并显示…...
C++ 中 std::thread 的高级应用
C 中 std::thread 的高级应用、常见坑,以及如何封装为类,适合做线程池、异步任务、后台 worker、并发调度等场景。内容结构如下: 一、std::thread 高级用法清单 1. 线程成员函数调用(this 捕获) class Worker { publ…...
Linux之彻底掌握防火墙-----安全管理详解
—— 小 峰 编 程 目录: 一、防火墙作用 二、防火墙分类 1、逻辑上划分:大体分为 主机防火墙 和 网络防火墙 2、物理上划分: 硬件防火墙 和 软件防火墙 三、硬件防火墙 四、软件防火墙 五、iptables 1、iptables的介绍 2、netfilter/…...
Linux安装ffmpeg7.1操作说明
安装yasm Index of /projects/yasm/releases/ 下载最新版 wget https://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz 解压 tar -zxvf yasm-1.3.0.tar.gz 编译及安装 ./configure make && make install 安装ffmpeg https://download.csdn.net/down…...
Java 加密与解密:从算法到应用的全面解析
Java 加密与解密:从算法到应用的全面解析 一、加密与解密技术概述 在当今数字化时代,数据安全至关重要。Java 加密与解密技术作为保障数据安全的关键手段,被广泛应用于各个领域。 加密是将明文数据通过特定算法转换为密文,使得…...
海思SDK的sensor驱动框架
对于海思的SDK之前一直对驱动的框架不清楚,只知道mpp的目录下的一些简单的业务demo,归根结底对这个SDK的框架还是不够了解,研究了一段时间才对该框架有一点认识。SDK是通过Makefile来管理和编译的所以对于Makefile文件需要有一定的理解&#…...
MyBatis-Plus 使用 Wrapper 构建动态 SQL 有哪些优劣势?
MyBatis-Plus (MP) 提供的 Wrapper (如 QueryWrapper, LambdaQueryWrapper, UpdateWrapper, LambdaUpdateWrapper) 是其核心特性之一,它允许我们在开发时以面向对象的方式构建 SQL 的 WHERE 条件、ORDER BY、SELECT 字段列表等部分。与传统的 MyBatis 在 XML 文件中…...
【PGCCC】Postgres 故障排除:修复重复的主键行
如何从表中删除不需要的重复行。这些重复行之所以“不需要”,是因为同一个值在指定为主键的列中出现多次。自从 glibc 好心地改变了排序方式后,我们发现这个问题有所增加。当用户升级操作系统并修改底层 glibc 库时,这可能会导致无效索引。 唯…...
Java多线程的暗号密码:5分钟掌握wait/notify
wait和join的区别 wait和join在使用上都是等待。 但是join是等待其他线程结束,而wait是等待其他线程的notify通知再运行。 当拿到锁的线程,发现要执行的任务时机不成熟的时候,使用wait进行阻塞等待,然后等时机成熟了再notify通…...
【重学Android】03.高版本 Android Studio 不能使用引用库资源ID的问题
问题背景 由于直接下载的最新版本Android Studio,然后直接创建的新项目,因此默认的工程配置相比以前的老版本有了不少的变化,Gradle的新版本使用,导致一些配置项也发生了变化,加上谷歌针对gradle.properties文件的一些…...
8. kubernetes的service原理
Kubernetes 的 Service 是集群内部和外部访问 Pod 的核心抽象层,解决了 Pod 动态 IP 变化及负载均衡问题。以下是其核心概念、原理及使用方法: 一、Service 的核心概念 概念说明服务发现通过标签选择器(selector)动态关联一组 Po…...
杭电oj(1087、1203、1003)题解
DP 即动态规划(Dynamic Programming),是一种通过把原问题分解为相对简单的子问题,并保存子问题的解来避免重复计算,从而解决复杂问题的算法策略。以下从几个方面简述动态规划: 基本思想 动态规划的核心在…...
解锁安防新境界:XS9933四通道多合一同轴高清解码芯片方案
在安防监控领域,高清、高效、便捷一直是行业追求的目标。今天,我们要为大家介绍一款具有突破性的产品——XS9933四通道多合一同轴高清解码芯片方案,它将为安防监控带来全新的体验。 一、强大性能,高清呈现 XS9933是一款4通道模拟复…...
Mysql之存储过程
🏝️专栏:Mysql_猫咪-9527的博客-CSDN博客 🌅主页:猫咪-9527-CSDN博客 “欲穷千里目,更上一层楼。会当凌绝顶,一览众山小。 目录 1.存储过程概述 2.存储过程的基本语法 2.1创建存储过程 2.2调用存储过…...
2.第二章:政策法规与标准体系
文章目录 2.1 全球数据治理政策概览2.1.1 欧盟GDPR2.1.2 美国数据法规2.1.3 亚太地区数据法规 2.2 国际标准体系2.2.1 ISO/IEC 270012.2.2 NIST框架2.2.3 DAMA DMBOK2.2.4 其他国际标准 2.3 中国数据治理法规体系2.3.1 《网络安全法》2.3.2 《数据安全法》2.3.3 《个人信息保护…...
Kubernetes (k8s) 日常运维命令总结
一、资源查看 查看所有命名空间的 Pod kubectl get pod --all-namespaces查看指定命名空间的 Pod kubectl get pod --namespace <命名空间>查看所有部署(Deployments) kubectl get deployments.apps --all-namespaces查看所有守护进程集࿰…...
NLP高频面试题(五十三)——LLM中激活函数详解
引言 在现代大型语言模型架构中,激活函数是贯穿神经网络各层的关键组件。它们通过为线性变换结果引入非线性,从而赋予模型表达复杂语言模式的能力。选择合适的激活函数,不仅影响训练的稳定性与收敛速度,还在推理阶段决定了计算效率与模型性能。本文将系统梳理常见激活函数…...
跨平台软件开发探讨
一、跨平台开发核心思路 1. 代码复用最大化 通过抽象平台差异实现核心逻辑复用,理想情况下70%代码可复用,仅30%处理平台特性。 2. 分层架构设计 业务逻辑层:完全平台无关(C/Rust) 平台适配层:封装系统AP…...
网络原理————HTTP
1,HTTP简介 我们上一期谈到了网络编程尤其是TCP和UDP,使用网络套接字来实现网络编程,上一期忘记说了,我们使用TCP的时候,我们用了线程池,这样就可以处理很多客户端而不会阻塞,那么如果客户端一…...
安装Jupyter Notebook 之不断报错 差点放弃版
error: subprocess-exited-with-error Preparing metadata (pyproject.toml) did not run successfully. │ exit code: 1 ╰─> [6 lines of output] Cargo, the Rust package manager, is not installed or is not on PATH. This package requires Rust and Cargo to com…...
w~大模型~合集13
我自己的原文哦~ https://blog.51cto.com/whaosoft/13864163 #TextRCNN、TextCNN、RNN 小小搬运工周末也要学习一下~~虽然和世界没关 但还是地铁上看书吧, 大老勿怪 今天来说一下 文本分类必备经典模型 模型 SOTA!模型资源站收录情况 模型来源论文 RAE …...
【华为】防火墙双击热备-之-主备模式-单外网线路
FW1和FW2的业务接口都工作在三层,上行连接二层交换机。上行交换机连接运营商的接入点,运营商为企业分配的IP地址为100.100.100.2。现在希望FW1和FW2以主备备份方式工作。正常情况下,流量通过FW1转发;当FW1出现故障时,流…...
学习记录:DAY16
Maven 进阶与前端实战 前言 二轮考核的内容下来了,由整体项目构建转为实现特定模块的功能。对细节的要求更高了,而且有手搓线程池、手搓依赖注入等进阶要求,又有得学力。嘻嘻,太简单了,只要我手搓 Spring Boot 框架……...
基于 Spring Boot 瑞吉外卖系统开发(六)
基于 Spring Boot 瑞吉外卖系统开发(六) 菜品列表 在系统管理端首页,单击左侧菜单栏中的“菜品管理”,会在右侧打开菜品管理页面。 请求URL/dish/page,请求方法GET,请求参数page,pageSize。 该菜品列表…...
香港服务器租用需要哪些性能要求
在如今数字化的时代,租用香港服务器成为了许多企业和个人的选择。但你知道租用香港服务器需要哪些性能要求吗?香港服务器租用需满足硬件性能、网络质量、安全合规、扩展能力四大核心要求,旨在支撑业务高并发、低延迟、稳定安全的运行环境。其…...
LLama Factory从入门到放弃
目录 简介 安装 LLama Factory界面介绍 数据格式要求 微调训练 今天在这里介绍一种常用的大模型微调框架——LLama Factory。 简介 LLama Factory 是一个高效的界面化大语言模型微调工具库,支持多种参数高效微调技术,提供简洁接口和丰富示例&#…...
钧瓷产业原始创新的许昌共识:技术破壁·产业再造·生态重构(一)
大禹智库 第 9期〔总第463期〕2025-4-23 钧瓷产业许昌共识:技术破壁产业再造生态重构(一) ——基于钧瓷产业一体化与数字化原始创新的双轮驱动实践 在当今快速发展的科技领域,创新已成为推动进步的核心动力,企业生存和…...
思科路由器密码绕过+重置
思科路由器密码忘记,重新设置密码不重置配置 1、路由器在初始化过程中会询问是否进行初始化配置,输入no,将直接进入路由器,不会出现用户设置、密码设置等操作。 Would you like to enter the initial configuration dialog? [ye…...
OpenCV 图形API(52)颜色空间转换-----将 NV12 格式的图像数据转换为 RGB 格式的图像
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 将图像从 NV12 (YUV420p) 色彩空间转换为 RGB。该函数将输入图像从 NV12 色彩空间转换到 RGB。Y、U 和 V 通道值的常规范围是 0 到 255。 输出图…...
为什么圆形在GeoJSON中被表示为多边形(Polygon)而不是圆形类型
GeoJSON规范中没有"圆形"类型 GeoJSON是一种用于表示地理空间数据的标准格式,它的规范中只定义了以下几种基本几何类型: Point (点) LineString (线) Polygon (多边形) MultiPoint (多点) MultiLineString (多线) MultiPolygon (多多边形) Ge…...
【解读】Chrome 浏览器实验性功能全景
Chrome 浏览器提供了大量可配置的实验性或功能性设置,主要涉及安全、性能、多媒体、Web API、隐私等多个方面,这些设置可在 Chrome 浏览器的 flags 页面进行调整。 安全相关设置 不安全源设置:可通过#unsafely-treat-insecure-origin-as-sec…...
LInux平均负载
Linux平均负载是**指在一定时间内,系统中处于可运行状态或正在等待资源的进程数的平均值。**它是衡量系统整体工作负载的重要指标,反映了系统的繁忙程度。平均负载通常分为过去1分钟、5分钟和15分钟的平均值。 理解平均负载的关键点 与CPU核心数的关系 *…...
【人工智能】Ollama 负载均衡革命:多用户大模型服务的高效调度与优化
《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! 解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 在 多用户大模型推理 场景下,负载均衡 是确保高并发、低延迟的关键挑战。本文以 Ollama(一个流行的本地大模型运行框架)为例,深入探讨 …...
deepseek-php-client开源程序是强力维护的 PHP API 客户端,允许您与 deepseek API 交互
一、软件介绍 文末提供程序和源码下载学习 deepseek-php-client开源程序是强力维护的 PHP API 客户端,允许您与 deepseek API 交互。 二、Features 特点 无缝 API 集成:DeepSeek 人工智能功能的 PHP 优先接口。流畅构建器模式:可链式调用的…...
ThinkPHP快速使用手册
目录 介绍 安装(windows环境) 安装Composer 安装ThinkPHP 目录结构 配置文件 第一个接口(Controller层) Hello World 自定义Controller 请求参数 获取查询参数(Get请求) 获取指定请求参数 获取…...
文档构建:Sphinx全面使用指南 — 强化篇
文档构建:Sphinx全面使用指南 — 强化篇 Sphinx 是一款强大的文档生成工具,使用 reStructuredText 作为标记语言,通过扩展兼容 Markdown,支持 HTML、PDF、EPUB 等多种输出格式。它具备自动索引、代码高亮、跨语言支持等功能&#…...