自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(60)
  • 收藏
  • 关注

原创 Licode简介及与SRS对比

选择 Licode需要多人实时互动(如视频会议、在线课堂)。要求服务器端媒体处理(混流、录制)。接受较高的部署和维护成本。选择 SRS需要多协议支持(兼容 RTMP 设备)。专注低延迟直播分发(如电商直播、赛事直播)。希望快速部署和低资源占用。

2025-02-07 19:37:40 678

原创 TCP队头阻塞问题以及QUIC解决方案

假设发送方发送了数据包1、2、3,若包1丢失,即使包2和包3已到达,接收端必须等待包1重传成功后,才能将包2和3交给应用层。通过以上机制,QUIC在保证可靠性的同时,彻底解决了TCP的队头阻塞问题,成为下一代互联网传输协议的核心技术。QUIC(Quick UDP Internet Connections)是。

2025-02-07 10:53:08 495

原创 QUIC 与 UDP 关系

QUIC协议通过在UDP数据包中增加自定义的头部字段,提供了连接管理、流控制和加密等高级功能。QUIC的设计充分利用了UDP的特性,同时克服了UDP的一些限制,使其成为现代网络应用的理想选择。QUIC的头部字段和UDP的头部字段共同构成了QUIC的传输机制。

2025-02-07 10:52:32 661

原创 Rust 的内存管理机制

在编译期静态保障内存安全,无需垃圾回收(GC)且避免手动管理内存的错误。通过这套机制,Rust 在保证高性能的同时,彻底消除了内存泄漏、悬垂指针、数据竞争等传统系统编程中的常见问题。,防止悬垂引用(Dangling References)。Rust 的内存管理机制是其最核心的创新之一,它通过。借用值,无需转移所有权,分为。生命周期标注用于确保。

2025-02-06 15:16:39 930

原创 C和Rust的一些区别

Rust 和 C 都是系统级编程语言,但它们在设计理念、安全性、内存管理、并发处理等方面存在显著差异。Rust 的目标不是完全取代 C,而是在安全性、生产力和性能之间找到平衡,成为系统编程的现代化替代方案。

2025-02-06 12:55:42 1381

原创 Rust 核心语法总结

Rust 学习曲线较陡,但掌握后能写出高效且安全的代码。

2025-02-06 10:38:27 1121

原创 NGINX-RTMP 框架详解及与SRS对比

NGINX-RTMP是基于 Nginx 的第三方模块(由社区开发维护),专注于 RTMP 协议的流媒体处理,适用于直播推流、点播分发等场景。它通过扩展 Nginx 的能力,支持 RTMP 流接收、转码、录制及多协议输出(如 HLS)。

2025-02-05 16:35:25 917

原创 SRS分析及低延迟实现机制

SRS 通过高效的架构设计(事件驱动、模块化协议栈)、对 WebRTC 的深度优化(UDP/NACK/FEC)以及智能缓冲控制,实现了低延迟、高并发的流媒体服务。其性能优势在互动直播、在线教育等场景中尤为突出,且支持灵活的扩展和定制,是开源流媒体服务器中的标杆解决方案。

2025-02-05 15:54:21 1008

原创 RTMP 和 WebRTC

对比维度RTMPWebRTC传输层协议TCP(可靠传输,可能高延迟)UDP(低延迟,允许丢包)连接模式客户端-服务器(单向推拉流)P2P 或 SFU/MCU(双向实时通信)协议复杂性简单(单一协议)复杂(集成 ICE/DTLS/SRTP/SDP 等)头部开销较高(Chunk 分块 + AMF 编码)较低(SRTP 精简头部)典型场景直播推流(OBS 推流到 CDN)视频会议、屏幕共享、P2P 通话扩展性依赖服务器扩展(如 SRS 集群)原生支持分布式(如 Licode SFU 架构)

2025-02-05 15:03:02 886

原创 Webrtc (一):协议

目录前言signaling server前言WebRTC (Web Real-Time Communications) 是一项实时通讯技术,它允许网络应用或者站点,在不借助中间媒介的情况下,建立浏览器之间点对点(Peer-to-Peer)的连接,实现视频流和(或)音频流或者其他任意数据的传输。WebRTC包含的这些标准使用户在无需安装任何插件或者第三方的软件的情况下,创建点对点(Peer-to-Peer)的数据分享和电话会议成为可能。webrtc属实好玩,来好好学一下。signaling serve

2021-04-01 20:40:42 587

原创 子网和超网

目录前言问题解决思路划分子网构造超网前言我们原本的IP地址是二级IP地址,且分成五类。但是确实不太合理,会出现一些问题,今天来探讨下这些问题以及解决的一些策略。问题原本分为五类的IP地址如下:如上,IP地址 ::= {<网络号>,<主机号>}那这样的分配有什么问题呢?1、地址的空间利用率有时候很低B类和C类地址能容纳的主机数相差很多。但是有的公司为了以后的发展,不选择足以使用的C类地址,而是使用B类地址,造成很多地址空闲浪费。2、给每一个物理网络都分配一个网络号会

2021-03-28 13:02:01 957

原创 经典链表翻转(递归)

目录前言链表翻转非递归递归链表每k个节点翻转非递归前言链表翻转是很典型的场景案例了。在面试中被问过,挺有趣的,记录下。链表翻转给定一个链表,将其翻转,如下理解起来是很简单的。下面给定链表节点的结构 struct ListNode { int val; struct ListNode *next; };非递归对于翻转这个动作,例 A->B->NULL ,可以当A的父节点也是NULL。则:(1)当前节点为A,前一个为NULL,A->next 指向NULL(2

2021-03-27 16:43:51 584

原创 TCP 的拥塞控制

目录前言拥塞TCP的拥塞控制方法慢开始拥塞避免算法快重传快恢复小片尾(主动队列管理AQM)前言之前提到了TCP的流量控制,我们知道了发送方与接收方两点之间如何控制通信的流量。流量控制有助于防止 A发送的数据超过了B的缓冲区。但是网络环境中,发送方和接收方中间可能要经过很多的路由器等复杂的环境,并不是简简单单的两点通信。网络中的带宽的数据又很复杂, 所以呀引进了网络堵塞的概念,然后TCP又要防止在网络中堵塞,所以引进了拥塞控制的概念。拥塞计算机网络中有许多帮助连接的资源(链路容量(带宽)、交换节点中的

2021-03-27 15:06:16 544 2

原创 TCP流量控制

目录前言流量控制一个问题一些问题前言流量控制也是TCP一个很重要的功能。在前面TCP可靠传输的实现 中已经提到了一个移动窗口的概念。通信双方都各自维护自己的发送窗口和接收窗口,发送方根据接收方的TCP首部的窗口字段调整自己的发送窗口大小。流量控制那今天要提到的流量控制就是让发送方的速率不要太快,使接收方来得及接收。若来不及接收可能会导致信息丢失(缓冲区溢出?)。其实前面TCP可靠传输那篇文章提到的窗口的移动就是流量控制的关键,接下来来看一个例子使这个概念更清晰。情景A向B发送数据,建立连接时

2021-03-26 16:58:40 349

原创 STL容器(三):deque

目录前言deque结构中控器(map)迭代器(iterator)例子deque 操作前言deque是一个很好用的双端队列,在头部或尾部插入删除复杂度都为O(1) 。关于deque操作方面就不怎么提了,和 vector 差不多 。这篇文章主要记录下deque的底层结构,这才是它有趣的地方。deque结构包括三个部分:迭代器(iterator)、中控器(map)、缓冲区(实际储存地址)。它们的关系如下图所示。中控器(map)这个结构也叫map,但是和STL里的map不一样,对于它来说,它是一个二维

2021-03-25 21:46:40 228

原创 缺失数字(异或)

目录题目解析题目题目描述从0,1,2,…,n这n+1个数中选择n个数,组成有序数组,请找出缺失的那个数,要求O(n)尽可能小。解析异或大法。只需要知道一些异或的性质异或后为0 仅当 两个数分别为0和1自己异或自己结果为 0class Solution {public: /** * 找缺失数字 * @param a int整型一维数组 给定的数字串 * @param aLen int a数组长度 * @return int整型

2021-03-25 15:41:54 328

原创 TCP 可靠传输的实现

目录前言功能描述窗口前言之前了解了TCP首部不同字段的意义,今天来看它们的第一个功能,可靠传输。下面再看一波首部样子留点印象。功能描述可靠传输无差错、不丢失、不重复、按序到达接下来看看为了实现这个TCP搞了哪些东西。窗口...

2021-03-25 12:27:48 833

原创 两个链表相加生成新链表

题目描述 假设链表中每一个节点的值都在 0 - 9 之间,那么链表整体就可以代表一个整数。给定两个这种链表,请生成代表两个整数相加值的结果链表。 例如:链表 1 为 9->3->7,链表 2 为 6->3,最后生成新的结果链表为1->0->0->0。思路利用栈先将所有的数字存储好,然后弹出来相加即可。/** * struct ListNode { * int val; * struct ListNode *next; * }; */class.

2021-03-24 22:11:27 464

原创 STL容器(二): vector

目录前言vector简介功能特性操作前言vector永远的神,每当别人问用什么容器最多,我就说vector(其它的太难了 )。vector简介vector表现得像个动态数组,可实际上底层还是利用静态数组实现的。如图,vector 一开始会申请一个足够大的数组,然后我们已经插入的元素个数为 size,最大容量为 capacity 。要使用 vector ,需要加入 #include < vector > 头文件,类定义如下:namespace std{ template <

2021-03-24 20:49:36 153

原创 STL容器(一): array

目录前言array简介功能初始化非修改操作swap迭代器前言一直觉得STL是C++最有利的武器之一,今天开个坑来学习一下。先从最好欺负 容易学的Array开始,fighting!array简介array内部其实是封装了一个简单的静态数组。并且在创建时就要确定数组的大小,在对象生命期结束前数组的长度都维持在这个大小。如果需要使用这个容器,要在头文件中包含 #include < array > ,它也是在std命名空间里的。using namespace std{ template

2021-03-24 19:02:33 324

原创 最长公共子串(动态规划)

目录题目思路代码题目题目描述 给定两个字符串str1和str2,输出两个字符串的最长公共子串 题目保证str1和str2的最长公共子串存在且唯一。 示例1输入"1AB2345CD",“12345EF” 返回值 “2345”思路动态规划的典型例子,要想好状态怎么变化。在这里用二维数组保存状态,假设 字符串为 123 ,12 。则有一开始状态:*12312然后12310+1=100201+1=20

2021-03-23 20:38:09 423

原创 UDP和TCP报文格式

目录前言UDP(用户数据报协议)特性首部结构TCP特性首部格式前言运输层有TCP和UDP两个协议。都是为了支持不同主机间的进程的通信,端到端之间的通信是应用进程间的通信。运输层提供的就是端到端间的逻辑通信,因为在两个主机是没有一条真正的线路连接的。在获得应用层的数据后,传输层要向下封装IP报头再到数据链路层封装成帧,然后再发送出去。通过上面两个应用之间通信的概念图片也能发现路由器是不负责传输层的。UDP(用户数据报协议)用户数据报协议UDP只是在IP协议上增加了一点功能,也就是复用和分用以及差

2021-03-23 20:17:24 841

原创 网际控制报文协议 ICMP

目录介绍种类差错报文查询报文介绍ICMP(Internet Control Message Protocol)是一个在网络层的协议,ping 命令就是使用的 ICMP 协议。注意,ICMP不是高层协议,ICMP报文是封装在 IP数据报中,作为其中的数据部分。种类ICMP报文有两种种类:ICMP差错报文,ICMP询问报文。报文前四个字节是固定的,分别是类型、代码、 检验和。接着四个字节和报文的种类有关。最后是数据字段,其长度取决于ICMP的类型。代码字段是为了进一步区分某种类型中的不同情况。检

2021-03-18 12:26:42 225

原创 三种线性排序:计数排序、基数排序、桶排序

目录前言决策树线性时间排序计数排序前言之前学到的归并、快排、堆排序等其实都可以归为比较排序,因为一定要通过数字之间的比较才知道数字的次序。对于堆排序和归并排序,时间复杂度上界都是 O(nlog(n)),对于快速排序,平均到了O(nlog(n))。决策树比较排序都可以抽象为像上图一样的完全二叉树。可以表示在给定输入规模的情况下,一个排序算法对所有元素的比较操作。当到达叶节点时,就确定了一个正确的排序。根据上面的例子可以看出,当比较次数最多的时候就是到达叶子节点的时候。在最坏情况下,任何比较排序都要

2021-03-17 16:35:12 308

原创 堆排序和优先队列

目录堆操作维护堆的性质(MAX-HEAPIFY)建堆堆排序算法(HEAP-SORT)优先队列堆今天看看堆,这里的堆不是操作系统堆栈的堆,而是一个二叉树的结构。它不仅可以用来实现堆排序,还可以构造一种有效的优先队列。(二叉)堆是一个数组,也可以被看作是一个近似的完全二叉树。树上的每一个结点对应数组中一个元素。除了最底层外,该树是完全充满的,而且是从左向右填充。这样我们很容易就能根据下标找到一个节点的父节点下标或子节点下标。Parent(i): return i/2;LeftChild(i):

2021-03-16 20:48:54 365

原创 HTTP 常见状态码

这是个挺常见的问题,一般碰到什么码没见过直接搜就行。总共有五类:1xx:第一类提示信息:表示目前是协议处理的中间状态,还需要后续的操作;例如:POST发送的第一个包就是等服务器返回1xx响应表示POST可以继续发送数据。2xx:成功,报文已经收到且处理掉了[200 OK]: 最想看到的就是这个,表示一切正常。[204 NO Content]: 响应时没有body数据。[206 Partial Content]:说明此时 HTTP是分块下载或断点续传,表示响应返回的body数据并不是资源

2021-03-15 15:29:40 161

原创 IP 层转发分组的流程

目录路由表信息路由表信息在一个路由表中,对每条路由最主要的是以下两个信息:(目的网络地址,下一跳地址)例子我们就根据目的网络地址确定下一跳的路由器,所以可以得出以下结果:(1)IP数据报最终一定可以找到目的主机网络上的路由器(可能通过多次间接交付)(2)只有到达最后一个路由器时,才试图向目的主机直接交付。虽然互联网中所有的分组收拾基于目的主机的网络,但是也允许特例,即对特定的目的主机指定一个路由。这种路由叫特定主机路由。路由器还可采用默认路由以减小路由表所占用的空间和搜索路由表所用的时间

2021-03-15 09:14:50 4249

原创 IP数据报

目录首部固定部分各字段根据 IP 数据报的格式我们就能了解 IP协议具有哪些功能。在TCP/IP标准中,各种数据格式常常以 32 位(4字节)为单位来描述。我们可以看到,对一个IP头部,有20字节是固定的,然后后面是可选字段,它的大小是可变的。首部固定部分各字段版本号:IPv4 或IPv6首部长度:因为固定部分是20字节,而这个字段单位是 32bit(4字节),因此最小值是 5 (0101),当首部长度不是 4字节 的整数倍时,必须利用最后的填充字段加以填充。区分服务:旧标准中叫服务类型,实

2021-03-14 22:38:55 994

原创 概率分析和随机算法

目录雇用问题描述概率分析随机算法指示器随机变量雇用问题与指示器雇用问题描述一个老板想换掉自己的办公助理,并且决定每次面试一个人,如果当前这个面试者比现在的办公助理好,就雇用他,并且解聘现在的办公助理。描述成伪代码可以有如下形式:Hire-Assistant(n):best = 0 //假装有最菜的面试者,其实也可以理解为当前助理最菜for i=1 to n //遍历全部面试者 interview candidate i //取当前面试者 if candidate i is better th

2021-03-12 16:19:15 636

原创 c++ static关键字一些事

目录staticstatic引入静态数据的存储static的声明和初始化staticstatic引入考虑一个变量需要面向类的全部对象时,我们可以怎么来解决?1、使用全局变量。但是全局变量会被非这个类的函数修改。2、使用static声明类的静态变量。所以,在 C++ 中,需要一个数据对象为整个类而非某个对象服务,同时又力求不破坏类的封装性,即要求此成员隐藏在类的内部,对外不可见时,可将其定义为静态数据。静态数据的存储全局(静态)储存区:分为DATA和BSS段。BSS:Block Starte

2021-03-12 14:05:53 94

原创 C++的const的几种用法(带例子)

目录修饰变量和指针修饰参数const修饰成员函数const在函数中三个位置例题修饰变量和指针const修饰普通类型的变量,告诉编译器某值是保持不变的。const 修饰指针变量,根据const出现的位置和出现的次数分为三种指向常量的指针(常量指针):指针指向一个常量对象,目的是防止使用该指针来修改指向的值。指针常量:将指针本身声明为常量,这样可以防止改变指针指向的位置。指向常量的常指针:一个常量指针指向一个常量对象。#include <iostream>us

2021-03-12 13:23:53 1017

原创 Mysql的ACID以及四种隔离级别

目录ACID并发事务ACIDACID就是我们常说的事务的特点。原子性(Atomic)一个事务必须被视为一个不可分割的最小单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。一致性(Consistency)一致性指事务将数据库从一种状态转变为下一种一致的状态。事务开始前和结束后,数据库的完整性约束没有被破坏。一致状态的含义即数据库中数据应满足完整性约束。举个栗子,用户A和B的总资产加起来一共200元,他们之间相互

2021-03-12 09:28:32 312

原创 关于网络性能的一些指标

目录1、速率2、带宽3、吞吐量4、时延 (重要)5、时延带宽积6、往返时间RTT (重要)7、利用率接下来准备好好学习一下网络方面的知识,之前的自学都浮于表面。我们都知道网络用于端对端的一个信息传递,那么今天先了解一下信息传递时描述网络性能是怎么样的一些指标。1、速率我们平时传输的数据都是比特流(bit),一个比特也就是 0 或 1。因此我们平时上网看到的传输速率就是 bit/s 。下面是一些换算,数据传输比较快时,我们也能看到:kb/s = 1000 bit/smb/s = 1000 kb/

2021-03-10 21:44:21 2563

原创 Socket基础及连接过程

目录Socket APIsocketbindlistenACCEPT在网络编程中经常使用的就是socket来进行两台机器间的通信。在自己的项目里还用上了EPOLL来监听socket的缓冲区信息变化。但是socket连接和通信与网络连接的关系是怎么样的呢?接下来就来看看。Socket API首先看socket的API:socketsocket(int domain, int type, int protocol)man socket :socket() creates an endpo

2021-03-09 11:50:13 3712

原创 使用Union判断大小端

今天看了一手Union,之前都快忘光了,想起大小端才有点印象。Union,也就是联合体。在C++中可以从来处理 n选1 的变量占用同样内存,从而达到节省资源的目的。例如看下面一个例子:union demo{ int a; char b;}c;cout<< sizeof(c)<<endl;// 4 bytes也就是说,变量 a和b 都是占用着同样的内存空间。那怎么利用它来测试大端小端呢?看下面的代码。c.a = 1;return 1 == c.b;//返回1则为

2021-03-08 22:01:11 1549

原创 如何选择MYSQL储存引擎

目录InnoDB存储引擎MyISAM储存引擎要知道如何选择数据库引擎,就得先了解数据库引擎,Mysql里主要有三种数据库引擎,分别是MEMORY 、 MYISAM 、 InnoDB。 一个储存引擎的作用是提供不同的存储机制、 索引技巧 、 锁定水平等。一般把这些核心功能分为四类:支持的字段和数据类型、锁定类型、索引和处理。如何选择储存引擎?一步步看。1、使用场景是否需要事务支持;2、是否需要支持高并发,InnoDB的并发度远高于MyISAM;3、是否需要支持外键;4、是否需要支持在线热备;5

2021-03-08 16:16:55 109

原创 进程和线程的调度

目录系统分类1、批处理系统2、交互式系统3、实时系统线程调度Linux 中进程、线程调度一台计算机中时刻运行着非常多的进程和线程,但是CPU只有几个,为了显示出每个程序是“并行”的,就需要调度算法让它们合理的掌控CPU的时间。因为进程线程的切换也是很耗时的,所以对于不同的系统,需要不同的调度算法,才能使调度的好处最大化。系统分类操作系统其实有很多类,下面只讲三类。1、批处理系统批处理是指用户将一批作业提交给操作系统后就不再干预,由操作系统控制它们自动运行。这种采用批量处理作业技术的操作系统称为

2021-03-07 14:21:04 716

原创 MySQL的索引

目录本质B-TreeInnoDB的B+TreeMyISAM的B+树哈希索引本质是对要查找的列建立一个能快速查找的数据结构,例如平时顺序查找就需要顺序结构,二分查找就需要二叉查找树或者红黑树等,所以我们数据库除了数据,有索引时还维护着索引的数据结构。目前常见的这种数据结构有B-Tree、B+Tree 还有hash。B-TreeB-Tree是为磁盘等设备设计的一种平衡查找树。系统从磁盘读取数据到内存时是以磁盘块(block)为基本单位的,位于同一磁盘块中的数据会被一次性读取出来,而不是按需读取。I

2021-03-06 18:59:36 89

原创 关于两个主机的信息传递

目录1、交换机MAC寻址2、ARP的IP/MAC3、两台主机通讯过程1、交换机MAC寻址转发表: 局域网主机端口MAC地址与交换机端口。交换机: 根据转发表将数据帧转发到指定主机端口上。A第一次发送数据到 D:设置本地网卡MAC地址 和 目标网卡MAC地址,发送给交换机交换机收到数据后,将源MAC地址记录下来交换机检查自己的表里是否有 目的MAC地址,(1)有则直接从记录的端口发送过去 (2)没有则叫帧从所有非接收端口发送过去(这里是端口1)对于不是目的MAC的机器会忽略该帧,只有主机D

2021-03-06 12:44:18 2105

原创 C++的内存空间分布

目录变量类型1、栈2、堆堆的效率比栈要慢。3、静态储存区4、常量区5、代码区多线程时线程独自拥有哪些资源?一个进程拥有的空间。从高地址到低地址:变量类型局部常量,全局常量,全局变量,局部变量,局部静态变量,全局静态变量,局部临时变量,全局临时变量。1、栈临时变量,函数参数,局部常量。2、堆动态分配的变量。(new 或 malloc 分配的。)堆的效率比栈要慢。3、静态储存区全局静态变量,局部静态变量,全局变量。4、常量区全局常量。5、代码区存放代码。//main.cppi

2021-03-05 16:12:26 416

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除