Linux后台开发
文章平均质量分 85
Linux服务器开发
C/C++Linux后台服务器开发高级架构师内容包括C/C++,Linux,Nginx,ZeroMQ,MySQL,Redis,MongoDB,ZK,流媒体,音视频开发,Linux内核,TCP/IP,协程,DPDK多个高级知识点。
展开
-
作为程序员,对于底层原理真的有那么重要吗?
前段时间在工作业务中碰到一个技术问题, 在发现问题,思考问题,解决问题的过程中,突然对底层原理有了一些思考,这里分享一下给大家。在业务中使用到了 Redis 数据库来存储数据,但是在存储大数据量的 string 的时候,监控却发现内存增长异常。string 类型,作为 Redis 中唯一的“键-单值”类型,操作简单,易于理解,按道理只是存一下字符型的数据,怎么会这么消耗内存,这是怎么回事呢?怀着刨根问底的精神,我自己在我的 Mac 机器上动手实战了一番,写了一段 Python 代码,准备数据长度 7 位数,原创 2022-06-10 14:26:23 · 2333 阅读 · 1 评论 -
【高阶知识】用户态协议栈之Epoll实现原理
Epoll 是 Linux IO 多路复用的管理机制。作为现在 Linux 平台高性能网络 IO 必要的组件。内核的实现可以参照:fs/eventpoll.c 。为什么需要自己实现 epoll 呢?现在自己打算做一个用户态的协议栈。采用单线程的模式。https://github.com/wangbojing/NtyTcp,至于为什么要实现用户态协议栈?可以自行百度 C10M 的问题。由于协议栈做到了用户态故需要自己实现高性能网络 IO 的管理。所以 epoll 就自己实现一 下。代码:https://git原创 2022-06-08 14:29:13 · 263 阅读 · 0 评论 -
11年程序员给本科、研究生应届生以及准备从事后台开发同学的建议,学习进阶之路
校招形势目前校招招聘中,后台开发或服务器开发的岗位需求一度火热,甚至超过了算法岗。不少同学从诸神黄昏的算法岗战场上退下,转向更偏向工程能力的后台开发岗,从而造成后台开发岗位竞争的大爆发。后台开发工程师主流使用的编程语言有C++、Java、PHP以及目前慢慢流行的Golang等。本文就将以C++的角度,讲讲如何学习和准备后台开发的岗位。一、语言基础无论是C++开发还是Java开发,对于一个码农而言,最重要的就是对于编程语言的熟悉。同样,无论从事哪种类型的岗位,首当其冲的就是要掌握好语言..原创 2022-05-30 17:02:59 · 566 阅读 · 0 评论 -
图解|高性能服务器设计之缓存系统一致性
缓存系统交互缓存系统设计是后端开发人员的必备技能,也是实现高并发的重要武器。对于读多写少的场景,我们通常使用内存型数据库作为缓存,关系型数据库作为主存储,从而形成两层相互依赖的存储体系。共识:我们将使用Redis和MySQL作为缓存和主存的实体,展开今天的话题。缓存系统需要处理读取场景和更新场景: 读取时只要之前MySQL和Redis中的数据是一致的,后续只要没有更新操作就不会有什么问题,借助于内存读取速度来提高并发能力,这也是我们设计缓存系统的初衷。 单纯读取的情况并不原创 2022-05-27 15:00:55 · 203 阅读 · 0 评论 -
关于2022年12代C/C++Linux服务器开发高级架构师课程体系分析
C/C++Linux服务器高级架构师的课程到2022目前已经迭代到12代了,像之前小编也总结过,但是课程每期都有做一定的更新,也是为了更好的完善课程跟上目前互联网大厂的岗位技术需求,之前课程里面也包含了一些小的分支,其中就有音视频开发、Linux内核开发、DPDK、golang等等一些程序员所需要的硬核技术。今天总结分析是2022年最新的课程体系。原创 2022-05-25 15:50:03 · 526 阅读 · 0 评论 -
避免惊群以及负载均衡的原理与具体实现
一、惊群效应1、发生惊群效应的原因1)使用accept主进程(master进程)fork出⼀批⼦进程(worker进程),⼦进程继承了⽗进程的监听端⼝(sockfd),就会出现accept惊群效应。子进程的fd属于同一个文件,若两个⼦进程同时调⽤accept进⾏阻塞监听,两个进程都会被挂起来,内核会在这个socket的等待队列wait queue链表中将两个PID记录下来以便唤醒。Linux2.6版本之后引⼊了⼀个标记为WQ_FLAG_EXCLUSIVE解决了这种惊群效应。这个在内核就已经处理了原创 2022-05-24 15:49:31 · 240 阅读 · 0 评论 -
后端开发【一大波有用知识】Redis中的IO多线程(线程池)
一、Redis中的IO多线程原理服务端收到一条信息,给它deconde成一条命令然后根据命令获得一个结果(reply)然后将结果encode后,发送回去redis的单线程是指,命令执行(logic)都是在单线程中运行的接受数据read和发送数据write都是可以在io多线程(线程池)中去运行在Redis中,生产者也可以作为消费者,反之亦然,没有明确界限。二、设置io多线程(调试设置)在redis.conf中设置io-threads-do-read原创 2022-05-21 15:41:00 · 991 阅读 · 0 评论 -
MySQL缓存策略分析
一、背景介绍众所周知,常用的关系型数据库MySQL底层是以B+树来组织存储在磁盘中的数据,而由于磁盘IO的读写性能较差,加之实际业务场景中读操作的次数要数倍于写操作。因此,适当的将读写操作分离,设计一种合适的缓存策略对提升MySQL性能异常重要。本文讲述的重点放在MySQL读写分离和缓存方案上,同时介绍MySQL的主从复制原理,对缓存方案中存在的数据同步问题进行分析并给出一致性方案,最后对三类常见的缓存问题进行分析。二、MySQL主从复制原理MySQL的主从复制主要解决的问题是数据备份、高可原创 2022-05-20 14:26:45 · 246 阅读 · 0 评论 -
时间堆原理详解及C++11的实现
一、背景网络编程中除了处理IO事件之外,定时事件也同样不可或缺,如定期检测一个客户连接的活动状态、游戏中的技能冷却倒计时以及其他需要使用超时机制的功能。我们的服务器程序中往往需要处理众多的定时事件,因此有效的组织定时事件,使之能在预期时间内被触发且不影响服务器主要逻辑,对我们的服务器性能影响特别大。一般的做法是将每个定时事件封装成定时器,并使用某种容器类数据结构将所有的定时器保存好,实现对定时事件的统一管理。常用方法有排序链表、红黑树、时间堆和时间轮,本篇文章将对时间堆方案进行详细介绍。二、小根原创 2022-05-19 15:17:47 · 468 阅读 · 0 评论 -
Reactor百万连接的并发
epoll水平触发/边沿触发LT,recvbuff中有数据就一直触发;ET,recvbuff中收到数据,只触发一次。如果recvbuff中数据没有读完,不会再次触发,当recvbuff中收到新的数据时,再次触发。也就是收到一个包,只触发一次。比如客户端发送32byte的包,服务器只recv了10byte的数据,那么epoll不会再次触发,等到下一次客户端再发送32byte的数据,epoll会再一次触发。对于ET,对于recv,最好是一个循环的读,直到读完,返回-1。所以LT适合用于大包,数据没读原创 2022-05-18 15:25:34 · 253 阅读 · 1 评论 -
Redis io多线程
redis io多线程redis单线程是指logic在单线程中执行。redis io多线程指read、decode、encode、write在io线程池中处理。开启多线程的时候,同一个连接的命令还是按顺序处理的吗?对于多线程,每一个线程都有一个任务队列,redis做了负载均衡,把任务平均分配到每一个线程对应的队列,这里并没有考虑任务是否是同一个连接来的;对于reactor,使用的是request-reply的模式,read后,会将epoll的状态设置为writable,wri原创 2022-05-17 14:10:14 · 393 阅读 · 0 评论 -
Epoll底层原理深究
一、epoll底层数据结构在epoll的使用中,我们经常需要对文件描述符集合进行添加、删除等操作,同时对触发的事件类型进行处理,回调IO事件中的工作函数。这其中离不开两个数据结构的帮助------epitem与eventpoll。1.1 eventpoll结构体eventpoll是每一个 epoll所对应的,比如epoll_create()就是创建一个 eventpoll。内核源码文件中eventpoll的定义如下:// file:fs/eventpoll.cstruct event原创 2022-05-13 14:48:29 · 1154 阅读 · 0 评论 -
DPDK背景和优势,赶紧学起来运用吧
一.背景1.传统的收发报文方式都必须采用硬中断来做通讯,每次硬中断大约消耗100微秒,这还不算因为终止上下文所带来的Cache Miss。2.数据必须从内核态用户态之间切换拷贝带来大量CPU消耗,全局锁竞争。3.收发包都有系统调用的开销。4.内核工作在多核上,为可全局一致,即使采用Lock Free,也避免不了锁总线、内存屏障带来的性能损耗。5.从网卡到业务进程,经过的路径太长,有些其实未必要的,例如netfilter框架,这些都带来一定的消耗,而且容易Cache Miss1、传统服原创 2022-05-12 19:33:47 · 463 阅读 · 0 评论 -
后端开发【一大波有用知识】MySQL索引原理(索引、约束、索引实现、索引失效、索引原则)以及SQL优化
一、索引索引分类:主键索引、唯一索引、普通索引、组合索引、以及全文索引(elasticsearch)主键索引非空唯一索引,一个表只有一个主键索引;在 innodb 中,主键索引的 B+ 树包含表数据信息PRIMARY KEY(key)唯一索引不可以出现相同的值,可以有NULL值UNIQUE(key)主键索引和唯一索引的差别:唯一索引可以有一个NULL值,只要整体不重复就行了。而主键索引,是非空唯一索引。普通索引允许出现相同的索引内容INDEX原创 2022-05-12 15:06:57 · 283 阅读 · 0 评论 -
muduo网络库的封装
一、基础socket编程网络编程的底层离不开socket,其处理流程表示如下:int sockfd = socket(AF_INET, SOCK_STREAM, 0);struct sockaddr_in serv_addr;bzero(&serv_addr, sizeof(serv_addr));serv_addr.sin_family = AF_INET;serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1");serv_addr原创 2022-05-11 15:34:07 · 173 阅读 · 0 评论 -
后端开发【一大波有用知识】Redis的线程模型和异步机制
文章目录 Redis 6.0引入多线程 异步机制 Redis pipeline技术 Redis 事务 ACID特性分析 redis 发布订阅 我们通常说,Redis 是单线程,主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。为什么使用单线程:多线程并发开销大,访问共享资源时原创 2022-05-10 19:34:37 · 332 阅读 · 0 评论 -
后台开发【一大波有用知识】Nginx数据结构剖析
Nginx数据结构就是nginx源码里面该怎么去看里面有哪些东西?核心的第一点就是把基础组建这一块,就是把我们在nginx源码里面的一些数据结构,得需要捋一遍。数据结构这里面包含哪些东西,,就现在凭你自己现在自己,你认为做一款开源的项目,这里面有哪些组件是我们有必要要了解的,第一个大家可以想象,首先对于字符串的处理字符的处理,这个肯定是有的。第二个对于内存的处理我们也是需要有的,我们对于文件的操作也是需要有的,就是对于这索引hash它是需要有的,还有类似于红黑树也是需要有,还有呢比如原创 2022-05-09 17:21:02 · 138 阅读 · 0 评论 -
DPDK系统学习—DPDK的虚拟交换机框架 OvS
目录:多队列网卡 多队列网卡硬件实现 内核对多队列网卡的支持 多队列网卡的结构 DPDK 与多队列网卡 虚拟化 CPU 虚拟化 内存虚拟化 I/O 虚拟化 Virtio 为什么是 virtio? 多队列网卡多队列网卡硬件实现有四个硬件队列(Queue0, Queue1, Queue2, Queue3),当收到报文时,通过 hash 包头的(sip, sport, dip, dport)四元组,将一条流总是收到相同原创 2022-05-07 16:09:36 · 687 阅读 · 0 评论 -
UDP的可靠性传输详解
文章目录UDP和TCP的区别TCPUDP为什么要使用UDP传输可靠性数据如何使用UDP传输可靠性数据KCP的使用方式kcp配置模式kcp的协议头UDP和TCP的区别Tcp和udp都是属于TCP/IP协议(传输层协议)。TCPTCP(Transmission Control Protocol,传输控制协议)是面向连接的协议,也就是说,在收发数据前,必须和对方建立可靠的连接。 一个TCP连接必须要经过三次握手,断开连接时需要四次挥手。TCP的可靠性主要体现在什原创 2022-05-06 16:27:13 · 2167 阅读 · 0 评论 -
Linux服务器开发【有用知识】—MySQL事务原理分析
前言今天的目标是学习MySQL事务原理分析,但是却似乎总是非常不顺利,概念和实操实在多到令人发指,故干脆轻松学完一节课,等到时机到了再重新刷一遍吧!一、事务是什么?将数据库从一致性状态转化成另一种一致性状态。单条语句是隐含得事务,多条语句需要手动开启事务。二、ACID特性是什么?原子性依靠undolog(共享表空间)实现,记录进行操作,然后进行反向操作。一致性最难理解,换句话说在事务执行前后,数据库完整性约束不能被破坏。三、隔离级别mvcc提供了一种快照读的方式提升读的并原创 2022-04-29 15:02:53 · 1022 阅读 · 1 评论 -
Mysql事务原理详解
事物目的事务将数据库从一种一致性状态转换为另一种一致性状态;组成事务可由一条非常简单的SQL语句组成,也可以由一组复杂的SQL语句组成;Innodb支持事务,Myisam是不支持事务的。这个是Myisam和Innodb一个主要的区别。对于一条SQL语句,Innodb默认是加上事务的。Myisam为什么不支持事务?因为Myisam不支持行锁,只支持表锁。Myisam为什么不支持表锁呢?因为Myisam B+树叶子结点存储索引+数据在磁盘中的位置,同时有多个B+树,但是并原创 2022-04-28 15:31:24 · 1424 阅读 · 0 评论 -
Linux C/C++ 并发下的技术方案(互斥锁、自旋锁、原子操作)
前言线程:是操作系统能够进行运算调度的最小单位。它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程,但轻量进程更多指内核线程,而把用户线程称为线程。一、为什么要使用锁?下面是一个主线程count计数的方案,分别通过它的10个子线程进行count的自增。mkdir LOCK //创建LOCK文件夹cd LOCK //转到LOCK目录下原创 2022-04-27 14:42:43 · 502 阅读 · 0 评论 -
如何更有效的使用 Redis 缓存
前言对于 Redis 来讲,作为缓存使用,是我们在业务中经常使用的,这里总结下,Redis 作为缓存在业务中的使用。旁路缓存Cache Aside(旁路缓存)策略以数据库中的数据为准,缓存中的数据是按需加载的。它可以分为读策略和写策略。只读缓存只读缓存 从缓存中读取数据;如果缓存命中,则直接返回数据;如果缓存不命中,则从数据库中查询数据;查询到数据后,将数据写入到缓存中,并且返回给用户。如果需要对数据进行修改的时候,直接修改数据库中的数据,然后删除缓存中的旧数据。只读缓存的优点:原创 2022-04-26 14:39:21 · 230 阅读 · 0 评论 -
Redis之最细命令介绍
Redis Redis是Remote Dirctionary Service的简称,即远程字典服务; Redis是内存数据库(数据都存储在内存中,mysql中主要数据存储在磁盘)、KV数据库(key-value)、数据结构数据库(value提供了丰富的数据结构); Redis应用非常广泛,如Twitter、暴雪娱乐、Github、Stack Overflow、腾讯、阿里、京东等等,很多中小型公司也在使用; Redis有16个数据库(字典),并且是单线程的,所以使用时只使用一个数据库。原创 2022-04-25 17:29:31 · 1101 阅读 · 0 评论 -
tcp协议栈实现,tcp定时器与滑动窗口实现
要实现用户态协议栈,必须要搞懂TCP,TCP 11个状态、滑动窗口、拥塞控制、定时器等等。要使用用户态协议栈,内核提供的epoll就不起作用了,我们需要自己实现用户态的epoll。epoll内部涉及到一个回调的时机,回调的作用是将红黑树中的节点添加进就绪队列,具体在epoll原理里面会具体讲解。搞清楚TCP的11个状态,我们就明白应该在什么时机进行回调了。TCP状态转换图在前面的[posix与网络协议栈](Build software better, together api和网络协议栈.md)原创 2022-04-23 13:52:20 · 482 阅读 · 0 评论 -
手写内存池以及原理代码分析【C语言】
内存池是对堆进行管理当进程执行时,操作系统会分出0~4G的虚拟内存空间给进程,程序员可以自行管理(分配、释放)的部分就是mmap映射区、heap堆区,而内存池管理的部分就是用户进程的堆区。为什么要用内存池?内存池就是用来避免堆区出现碎片化 避免频繁地分配和释放内存(防止堆区出现碎片化) 当客户端连接上服务端的时候,服务端会准备一部分的堆区用来做消息保留。当一个连接成功之后,服务器会在堆区为其分配一段属于这个连接的内存,当连接关闭之后,所分配的内存也随之释放。但是当连接量较大且过于频繁时原创 2022-04-21 16:30:54 · 333 阅读 · 0 评论 -
一文彻底掌握用户态协议栈,一看就懂的
用户态协议栈那我们先跟大家解释这个协议栈这个东西啊协议栈这个东西呢或多或少啊各个朋友应该都听过,我们站在一个设计者的角度,站在一个设计者的角度,站在tcpip的个人的角度,我们怎么去设计这个协议的? 设计队的角度来设计这个网络协议战。就是各位朋友们你想一下这个网络协议战,有很多朋友就会想到一个点,那为什么我们还需要去设计一个网络协议栈,我们不是去学这个东西就可以吗?其实我也跟大家解释一下,其实你在那把网络协议上理解的很透彻的话,你一定要站在一个设计者的角度,就是你抛开所有的东西,抛原创 2022-04-20 16:11:58 · 3090 阅读 · 0 评论 -
分布式缓存—缓存与数据库强一致场景下的方案
1. 概述缓存与数据库的强一致性,也称线性一致性,核心要求是:数据库中的值发生变更,缓存数据要实现同步复制,并且一旦操作完成,随后任意客户端的查询都必须返回这一新值。以下图为例,一旦写入b完成,必须保证读到;而写入过程中,认为值的跳变可能发生在某一瞬间,因此读到a或b都是可能的。数据库与缓存作为一个整体,在向外提供服务的过程中,无论数据是否变更过,都时刻保持数据一致,因为它内部的数据仿佛只有一份,即使并发访问不同节点。2. 场景秒杀是一个比较典型的强一致场景,一般秒杀系统的库存同时保持在原创 2022-04-19 19:42:44 · 872 阅读 · 0 评论 -
后端开发【一大波有用知识】数据库之mysql索引原理详解
1、索引索引分类:主键索引、唯一索引、普通索引、组合索引、以及全文索引(elasticsearch);1.1、主键索引非空唯一索引,一个表只有一个主键索引;在innodb中,主键索引的B+树包含表格信息PRIMARY KEY(key) // 括号中的key为列名1.2、唯一索引不可以出现相同的值,可以有NULL值(NULL值也不能重复)UNIQUE(key) // 括号中的key为列名1.3、普通索引允许出现相同的索引内容INDEX(key)-- ORKEY原创 2022-04-16 16:17:12 · 2337 阅读 · 0 评论 -
TCP三次握手、四次挥手以及TIME_WAIT详解
前提概述TCP网络编程中常用的api函数有:socket、bind、listen、accept、recv、send、close、connect其中socket函数返回一个文件描述符fd,这个fd并不单纯,而是对应着内核创建的TCB(transport control block),可以理解为一个下标索引,而不同TCB则是根据不同的五元组(源ip、源port、目的ip、目的port、协议类型)来进行区分。bind函数则是将socket函数创建的fd和本机ip联系起来。listen的功能是通原创 2022-04-15 15:53:10 · 452 阅读 · 0 评论 -
后端开发【一大波有用知识】网络通信模型和网络IO管理
简单的C/S通信模型(accept阻塞的话,就只能一个客户端接进来)socket()函数//函数原型。返回:若是成功则为非负数,如出错则为 -1int socket(int domin, int type, int protocol); //调用 参数1:使用多少位地址AF_INET 为32,参数2:数据报的类型。 参数3:TCP/UDP 协议int clientfd = socket(AF_INET, SOCK_STREAM, 0);connect() 函数,用来向服务器建立原创 2022-04-14 15:09:41 · 175 阅读 · 0 评论 -
腾讯阿里工程师所热衷的DPDK到底是个什么东西?该如何学习?
dpdk是什么?可能很多人只是听过,有的可能听都没有听过。但是目前确实很多的互联网大小厂都在使用这样一门技术,从招聘网站上看,对应的岗位也很多,薪资不菲:比如OVS,VPP等技术,很多云厂家都在用,提供云主机,组件,数据库等等,它对比于原生,能够大幅提升IPV4的转发性能,可以让用户在迁移包处理应用时,获得更好的成本和性能优势。所以,随着技术的发展,dpdk会越来越受到重视,将广泛应用到各类分布式系统中。还不熟悉的朋友,这里可以先领取一份dpdk新手学习资料包(入坑不亏):...原创 2022-04-13 20:59:10 · 488 阅读 · 0 评论 -
DPDK技术系统学习一(接收,发送,arp,icmp功能测试)
如何技术不去手动做练习实践,就总有一种无从下手的感觉文末附上小编总结的DPDK学习路线图以及我的学习资料。0:准备环境并启动,使用dpdk接管其中一个网卡。ubuntu虚拟机环境配置多队列网卡,安装dpdk。在环境已经配置ok的前提下,每次重启环境后需要重新配置环境变量,并且绑定网卡。export RTE_SDK=/home/hlp/dpdk/dpdk-stable-19.08.2export RTE_TARGET=x86_64-native-linux-gccifconfig原创 2022-04-13 15:13:24 · 1864 阅读 · 1 评论 -
hash,bloomfilter,分布式一致性hash
场景 使用word 文档时,判断某个单词是否拼写正确 垃圾邮件过滤算法 Redis缓存穿透 bitcoin core中交易校验 需求从海量数据中查询某个字符串是否存在?平衡二叉搜索树增删改查时间复杂度是O(log2n)平衡的目的是保证操作的时间复杂度稳定,保证下次搜索能够稳定排除一半的数据。O(log2n)的直观理解:100万个节点,最多比较20次;10亿个节点,最多比较30次。总结:通过比较保证有序,使用二分查找,通过每次排除一般的元素达到快原创 2022-04-12 15:08:30 · 426 阅读 · 0 评论 -
Reactor实现http服务器,附完整代码
如何在reactor的基础上实现业务?就是怎么利用reactor做服务器,并实现服务器的业务。本文基于reactor,实现简单的http协议封装。只是为了说明reactor如何做业务,真正的http服务器业务逻辑是很复杂的。服务器网络这一层,如nginx、redis,核心是epoll,实现使用的是reactor。http协议封装与reactor的关系reactor包含内容 reactor_run,event loop,通过epoll进行io检测; accept_cb,处理网络原创 2022-04-11 17:37:30 · 3525 阅读 · 0 评论 -
手写实现分布式锁
前言分布式锁需要考虑很多事情,第一网络是否正常,第二个提供分布式锁这台机器的高可用性。一、网络模块封装明线io检测部分的接口: 添加读事件是因为当有客户端连接事件来临时,我们好去处理这个事件。 写事件这是因为当我们服务端作为客户端去连接第三方服务时候,需要注册写事件。 删除事件就比如关闭连接时,我们需要将事件从检测模块中删除。 修改事件就比如当客户端发来事件我们需要检测读事件,但是接收失败了我们要把读事件修改为注册写事件进行反馈。 检测事原创 2022-04-09 14:41:19 · 1135 阅读 · 0 评论 -
后端开发【一大波有用知识】定时器方案红黑树,时间轮,最小堆
目录: 一、如何组织定时任务? 定时器收网络IO处理造成误差特别大,该怎么处理? 用何种数据机构存储定时器? 红黑树如何解决相同时间的key值的? 最小堆 时间轮 一个帮助理解单层级时间轮的例子 如何解决空推进的问题? 为什么多线程使用时间轮 设计哪些接口,如何设计? 满足哪些条件才能作为定时器的数据结构? 二、定时的方法有哪些? 究竟什么是定时? 三、总结 一、如何组原创 2022-04-08 16:11:45 · 366 阅读 · 0 评论 -
后端开发【一大波有用知识】tcp/ip定时器与滑动窗口详解
为什么udp有包长,而tcp没有包长。首先,send()发送一次发送1k,发送一次缓冲区满了就会返回-1。2k发送出去后缓冲区被清空,send()才会被再次调用。最大传输片会打印四个包发送。而最大传输单元是在数据链路层对网卡的一些限制,如果mss大于mtu时候就会被分割,而mss小于mtu时候就会直接发送。所以udp需要包长,而tcp不需要因为mss+tcp包头就可以完成不需要包长。具体点说,就是帧需要,加上512,可以将包长进行计算出,这里不做重复的事减轻了很多后续工作。 发送1m的文件原创 2022-04-07 15:19:49 · 2229 阅读 · 0 评论 -
后端开发【一大波有用知识】—Redis,Memcached,Nginx网络组件
reator网络编程epoll被称为事件管理器,利用管理器去管理多个连接。int clientfd=accept(listenfd,addr,sz);clientfd ==-1 && erro==EWOLDBLOCK //表示全连接中连接为空int connect(int sockfd, const struct sockaddr *addr,socklen_t addrlen);error == EINPROGRESS //正在建立连接error == EISCONN原创 2022-04-06 16:05:45 · 3606 阅读 · 0 评论 -
网络IO管理-简单一问一答、多线程方式
思考:1. 那网络中进程之间如何通信,浏览器的进程怎么与web服务器通信的?2. 什么时候用一请求一线程的方式?3. 什么时候用select/poll?4. 什么时候用epoll?准备工作下面展示socket几个常用的函数listenfd, bind, listen, accept具体作用。// 聘请迎宾的小姐姐if ((listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) { printf("create socket原创 2022-04-02 14:59:47 · 257 阅读 · 0 评论