- 博客(22)
- 收藏
- 关注
原创 彻底搞懂TCP
TCP是一种面向连接、可靠的字节流传输协议,通过三次握手建立连接,确保数据传输可靠性。其特性包括序列号确认、超时重传、流量控制和拥塞控制机制。TCP粘包问题由字节流特性引起,可通过关闭Nagle算法或应用层处理解决。连接管理涉及三次握手建立连接和四次挥手关闭连接,TIME_WAIT状态确保可靠终止。TCP Keep-Alive机制检测空闲连接,维护网络活跃性。这些机制共同保障了TCP协议的高效可靠传输。
2025-07-15 13:42:21
601
原创 网络模型
摘要 OSI七层模型将网络通信划分为物理层、数据链路层、网络层、传输层、会话层、表示层和应用层,每层负责特定功能,如物理传输、数据封装、路由选择等。而TCP/IP模型更简洁,分为应用层(整合OSI的应用、表示、会话层)、传输层(TCP/UDP)、网络层(IP)和网络接口层(整合数据链路层和物理层)。两种模型结构相似但分层不同,TCP/IP因简洁性和广泛适用性成为互联网通信的主要标准。实际应用中,数据在各层封装后传输,确保高效通信。
2025-07-15 10:44:04
527
原创 【HTTP版本演变】
浏览器访问URL的全流程解析:从输入网址到页面渲染的完整过程,包括DNS解析、TCP连接、HTTP请求、服务器响应等关键步骤。文章详细对比了HTTP协议各版本的演进:HTTP/1.0不支持持久连接,1.1引入长连接和管道化但仍有队头阻塞问题;HTTP/2采用二进制帧和头部压缩实现多路复用,但基于TCP仍存在传输层阻塞;HTTP/3基于QUIC协议改用UDP,彻底解决队头阻塞,支持零RTT连接和连接迁移。全文系统梳理了网络协议的发展历程与技术优化要点。
2025-07-14 15:30:54
545
原创 [TcpConnection]
摘要: TcpConnection是muduo网络库的核心类,封装已建立的TCP连接及其事件处理。主要功能包括:管理连接生命周期(建立/关闭)、处理读写/错误事件、保存对端地址信息。通过双缓冲区(inputBuffer_/outputBuffer_)实现高效数据收发:当内核发送缓冲区不足时,数据暂存至outputBuffer_并触发高水位回调;可写时通过handleWrite发送剩余数据。连接关闭采用半关闭(shutdownWrite)确保数据完整性,待对方关闭后析构资源。关键设计: 事件驱动:读写事件由C
2025-06-25 17:00:30
1115
原创 【日志系统-文件】
file_->flush()` 操作(即缓冲区往磁盘写内容)时,其他线程会被阻塞`std::unique_lock<std::mutex> lock(*mutex_);` 这一行,直到持有锁的线程释放锁,当对文件进行读写操作时,数据会先在缓冲区中进行处理,而不是直接与文件进行交互。此项目回滚只实现了基于文件大小和基于时间(按天)的日志回滚功能,当文件超出所设定的上限时,产生一个新文件;在这种模式下,当一个线程获取互斥锁并执行`append_unlocked`方法时,在执行。2. 构建新的回滚文件。
2025-06-24 10:11:18
853
原创 【日志系统】
摘要:该代码实现了一个基于RAII技术的日志系统,定义了TRACE到SYSFATAL八个日志级别,通过枚举类LOG_LEVEL和字符串数组实现级别转换。Logger类提供日志流对象构建、级别控制和输出管理功能,支持自定义输出策略,在析构时自动完成日志输出。系统通过宏定义简化调用方式,如LOG_INFO<<msg,并采用__FILE__等预定义宏自动记录上下文信息。FATAL级别日志会触发程序终止,确保严重错误立即处理。整体设计实现了日志记录的自动化和灵活性。
2025-06-22 09:00:00
620
原创 【日志系统-时间戳】
本文介绍了时间处理相关的API函数和数据结构,主要包括:1) timezone和timeval结构体定义,用于存储时区和时间信息;2) gettimeofday函数获取当前时间戳;3) gmtime_r线程安全的时间转换函数;4) Timestamp类实现,包含Now()静态方法和now()实例方法获取时间,以及toString()、toFormattedString()等方法进行时间格式化输出。这些API和类提供了从系统获取时间、时区处理、时间格式转换等功能,支持微秒级精度和线程安全操作。
2025-06-21 21:09:45
540
原创 【线程同步】
线程同步机制与多线程编程 摘要:本文介绍了线程同步的概念及其在多线程编程中的应用。线程同步通过互斥锁、信号量、条件变量和读写锁等机制协调线程对共享资源的访问,防止出现竞态条件和数据不一致等问题。文章详细分析了各种同步方式的特点:互斥锁确保临界区代码串行执行;读写锁优化读多写少场景;自旋锁通过循环检查减少阻塞开销;条件变量配合互斥锁实现线程间状态通知;信号量控制资源访问数量。同时指出了死锁的四个必要条件及预防方法,并通过生产者-消费者模型示例展示了条件变量和信号量的实际应用。最后,文章对比了不同同步机制的性能
2025-06-19 22:02:34
1135
原创 【EventLoop】
wakeupFd_`是非常重要的一个成员,与之对应的`wakeupChannel_`,起到了一个唤醒`loop`所在的线程的作用,因为当前线程主要阻塞在`poll`函数上,唤醒的方法时手动激活这个`wakeupChannel_`, 写入几个字节让`Channel`变为可读, 当然这个`Channel`也注册到`Pooll`中。`mainLoop`事先注册一个回调`cb`(需要`subLoop`来执行)`wakeupFd`唤醒`subLoop`后,执行`cb`
2025-06-06 09:15:00
455
原创 【事务-隔离级别-底层实现】
事务是数据库操作的原子单元,具有ACID特性(原子性、一致性、隔离性、持久性)。不同隔离级别(READ UNCOMMITTED至SERIALIZABLE)通过锁机制和MVCC解决并发问题(脏读、不可重复读、幻读)。InnoDB使用行级锁(共享锁、排它锁)和间隙锁防止幻读,MVCC通过undolog版本链和ReadView实现读写分离。已提交读每次生成新快照,可重复读保持事务内一致性视图。MVCC机制(多版本并发控制)使读写操作互不干扰,通过保存数据多个版本和事务隔离规则实现高并发,是数据库并发控制的核心技术
2025-06-05 17:13:47
791
原创 【Poller/EPollPoller】
摘要:muduo网络库中的Poller采用抽象虚类设计,由EpollPoller和PollPoller具体实现。EpollPoller封装了epoll系统调用,通过ChannelMap管理监听对象,用epoll_event结构体数组存储活跃事件。核心机制包括:1)poll方法调用epoll_wait监听事件;2)fillActiveChannels将事件转换为Channel对象;3)通过ptr指针实现事件与Channel的高效绑定。设计亮点包括:vector容器自动扩容、Channel状态管理、类型安全转换
2025-06-05 10:30:00
537
原创 【Channel】
Channel类是网络编程中管理文件描述符及其事件处理的核心组件。它通过事件管理机制注册可读、可写等事件,并设置相应回调函数。为解决多线程环境下对象生命周期问题,Channel提供tie()方法,通过weak_ptr延长关键对象(如TcpConnection)的生命周期,确保在处理事件时对象不会被意外销毁。典型应用场景包括:当TCP连接关闭时,通过tie机制保证Channel对象在handleEvent()执行完毕前不被析构,从而避免程序崩溃。核心成员包括事件循环指针、文件描述符、事件状态标记以及各类回调函
2025-06-04 08:44:33
677
原创 Reactor反应堆模型
摘要:Reactor设计模式采用事件驱动机制,将IO操作转换为事件处理,通过非阻塞IO和IO多路复用实现。单Reactor单进程方案中,Reactor对象监听事件并分发:连接事件由Acceptor处理并创建Handler,其他事件由对应Handler处理,遵循read→业务处理→send流程。该模式可扩展为多线程/进程架构(单/多Reactor)以提高性能。
2025-06-03 12:17:59
506
原创 【HTTP】
HTTP协议解析:工作原理与安全对比 HTTP是互联网传输超文本的应用层协议,使用TCP端口80。其结构分为请求(客户端→服务器)和响应(服务器→客户端)两部分,均包含特定格式的行数据块。HTTP具有无状态特性,不保存客户端历史请求信息。URL作为资源标识符包含协议、地址、端口和路径。GET和POST是主要请求方法,区别在于数据位置(URL/请求体)、数据量和安全性。HTTPS通过SSL/TLS加密提升安全性,使用443端口并需CA证书,而HTTP为明文传输。响应包含状态行、响应头、空行和响应数据,状态码标
2025-06-02 11:27:29
725
原创 【KMP】
前缀表是KMP算法中的核心概念,用于在模式匹配失败时确定回溯位置。它记录模式串中各位置的最长相同前后缀长度,实现高效匹配。前缀表可表示为next数组,常见两种实现方式:直接存储前缀表或统一减一右移。构建过程通过初始化指针、处理前后缀异同情况完成。匹配时利用next数组快速定位,避免主串回溯。代码实现包括构建next数组和在主串中查找模式串两部分,通过比较字符并借助next数组调整位置,最终确定匹配起始点或返回未匹配结果。前缀表使KMP算法达到O(n+m)的时间复杂度。
2025-06-02 11:05:34
921
原创 【Linux进程VS线程】
进程与线程的主要区别在于资源分配和调度机制:进程是资源分配的基本单位,拥有独立内存空间;线程是调度的基本单位,共享进程资源。进程创建通过fork()系统调用,线程通过clone()或pthread_create()。进程间通信需要特殊机制(如共享内存、管道),线程直接共享内存。进程切换涉及地址空间转换和资源保存,开销较大;线程切换仅需保存寄存器状态,效率更高。二者在并发编程中各具优势,需根据具体场景选择使用。
2025-05-29 21:59:16
1016
原创 【为什么析构函数要虚函数】
在多态场景下,基类析构函数必须声明为虚函数,否则通过基类指针删除派生类对象时只会调用基类析构函数,导致派生类资源泄漏。将基类析构函数设为虚函数后,派生类析构函数会自动重写它,通过虚表指针确保调用正确的析构函数链。例如,当基类A的析构函数为虚时,delete基类指针会依次调用B和A的析构函数;若非虚函数,则只会调用A的析构函数。抽象基类必须声明虚析构函数以保证派生类对象能被正确销毁。
2025-05-29 13:15:27
327
原创 【C++运行时的多态-查虚表】
每个类都有自己独立的虚函数表,即使派生类没有重写基类的虚函数,它的虚函数表中也会包含从基类继承过来的虚函数地址。下面为你详细解释其实现机制。在程序运行时才确定函数调用的具体目标,在对象创建时,生成虚表指针(记录虚函数表地址),根据对象指针或引用指向的实际对象,从虚函数表中选择函数调用。运行时的多态是指在程序执行以前,无法根据函数名和参数来确定该调用哪个函数,必须在程序的执行过程中,根据具体情况来动态确定的,通过类的继承关系public(派生类对象可以自然地转换为基类指针或引用)和虚函数来实现的(
2025-05-28 22:49:53
325
原创 【MySQL索引】
MySQL索引底层主要采用B+树结构,相比B树具有更低的树高和更高效的磁盘I/O。InnoDB引擎下,主键索引直接存储数据,二级索引存储主键值并可能触发回表查询。哈希索引虽查询快速(O(1))但仅支持等值查询且消耗内存,InnoDB会自适应地为热点页构建哈希索引。对于多条件查询需建立联合索引避免文件排序。B+树适合范围查询且数据分布均匀,是关系型数据库索引的理想选择。
2025-05-28 14:05:14
704
原创 unique_ptr
在指向对象时,我们需要区分指向的是一个对象还是一组对象,对应的删除为delete和delete[];唯一性智能指针,意味着同一时间一个资源只被一个unique_ptr对象拥有。
2025-05-27 15:58:54
192
原创 RAII思想
我们在func函数中声明一个局部对象的时候,会自动调用构造函数来初始化,当func函数执行完之后,自动调用析构函数来销毁对象,整个过程无需我们手动介入;既然如此,我们可以联想到在使用资源时,new-delete;这里的资源主要是指操作系统中有限的东西,如内存、文件描述符、套接字等,局部对象是指存储在栈区的对象,它的生命周期由操作系统来管理无需人工介入。RAII即“资源获取即初始化 ”,使用局部对象来管理资源的技术称为资源获取即初始化;RAII充分利用了C++语言局部对象自动销毁的特性来控制资源的生命周期。
2025-05-27 15:34:14
110
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人