- 博客(110)
- 收藏
- 关注
原创 网络层协议:IP
IP协议是互联网核心协议之一,负责数据包寻址和路由,分为IPv4和IPv6两个版本。IP报文头部包含版本号、服务类型(TOS)、总长度、生存时间(TTL)、协议类型、校验和及源/目的IP地址等关键字段。其中TTL防止数据包无限循环,TOS实现服务质量控制。IP地址采用网络号+主机号的划分方式,通过子网划分优化管理效率。由于IP地址资源有限,采用DHCP动态分配技术,并区分公网/私网地址。合理的网段划分不仅提高路由效率,还能实现地址资源的优化分配。
2025-12-28 00:48:07
340
原创 传输层协议:TCP
本文摘要:TCP是一种可靠的传输层协议,通过报头中的端口号、首部长度、ACK标记、序号和确认序号等机制实现数据传输。确认应答机制确保数据可靠传输,超时重传处理数据丢失问题。连接管理包括三次握手建立连接和四次挥手断开连接,其中三次握手验证全双工通信能力并建立双方共识,四次挥手则确保连接正常终止。这些机制共同保证了TCP的高效可靠通信。
2025-12-26 19:49:01
573
原创 传输层协议:UDP
UDP是一种无连接的传输层协议,具有低延迟和高效率的特点。其核心特性包括无连接通信、不可靠传输、8字节小报头和广播/多播支持。UDP通过端口号标识应用,知名端口号0-1023需要root权限绑定。UDP报头仅8字节,采用位段数据结构直接传输,不进行序列化。UDP没有发送缓冲区只有接收缓冲区,使用sk_buff结构管理数据包。常见基于UDP的应用层协议包括DNS、DHCP、TFTP等,适用于实时性要求高的场景。
2025-12-25 18:51:55
838
原创 应用层协议HTTP
HTTP协议概述与应用实践 本文系统介绍了HTTP协议的核心概念和应用实践。主要内容包括: HTTP协议基础:作为应用层协议,HTTP定义了客户端与服务器通信规范,采用无连接、无状态的请求-响应模式 URL结构解析:详细拆解了统一资源定位符的组成要素,包括协议、域名、端口、路径等,并解释了URL编码机制 报文格式:通过代码示例展示了HTTP请求和响应的标准格式,包括请求行/状态行、报头和正文三部分 常用方法:重点对比了GET和POST方法的区别,简要介绍了其他HTTP方法 状态码分类:按1XX-5XX分类说
2025-12-24 23:39:20
759
1
原创 应用层自定义协议
本文介绍了网络计算器功能的实现,重点讲解了自定义协议和序列化技术。首先解释了面向字节流传输的原理和全双工通信的实现机制,指出TCP协议通过独立的发送/接收缓冲区实现数据同步。然后详细说明了自定义协议的设计方法,提出通过添加报头(len\r\n)来标识报文边界,确保读取完整数据。文章还介绍了使用Jsoncpp库进行结构化数据的序列化/反序列化,并展示了Request和Response类的具体实现。最后提到对Socket进行封装,采用模板方法类实现不同协议下的套接字管理,为网络计算器功能提供基础通信框架。
2025-12-23 19:08:23
790
原创 Socket编程TCP
本文介绍了TCP Echo服务器的实现与优化过程。V1版本实现基础TCP通信功能,包括创建监听套接字、绑定和监听连接。V2版本通过多进程改进,使服务器能同时处理多个客户端请求。V3版本改用多线程方案,降低了创建开销,并采用内部类封装解决参数传递问题。文章详细说明了各版本的核心实现逻辑,包括服务端初始化、连接建立和数据读写等关键步骤,并展示了客户端与服务器的交互过程。最终实现了能高效处理并发请求的Echo服务器。
2025-12-22 22:29:17
986
原创 Socket编程UDP
本文实现了一个简单的Echo服务器V1版本,主要包括服务端和客户端两部分。服务端通过继承nocopy类禁止拷贝,使用socket()创建套接字,绑定IP和端口后接收并回显客户端消息。客户端通过命令行参数获取服务器地址,创建套接字后与服务器通信。文章详细讲解了套接字创建、地址绑定、网络字节序转换等关键步骤,并强调了客户端端口由操作系统随机分配的原则。通过日志记录错误信息,实现了基本的网络通信功能。
2025-12-21 18:33:38
944
原创 网络基础概念
摘要 计算机网络发展经历了从独立计算机到局域网(LAN)和广域网(WAN)互联的演进过程。协议作为数据传输的约定标准,由国际组织(如IEEE、IETF)、行业联盟(如蓝牙技术联盟)及科技企业(如华为、谷歌)共同制定。OSI七层模型理论完善但复杂,实际广泛采用TCP/IP五层(或四层)模型,包括物理层、数据链路层、网络层、传输层和应用层。协议本质是结构化的数据类型,确保不同操作系统间的通信兼容性。TCP/IP协议的分层设计源于问题的可分层性,其核心(传输层和网络层)由操作系统内核实现,统一了跨平台通信标准。
2025-12-20 15:36:39
975
原创 Linux:多线程
本文主要介绍了Linux系统中的二级页表机制和线程概念。在二级页表部分,解释了物理内存如何被划分为页框进行管理,以及虚拟地址通过页目录和页表映射到物理地址的过程。线程部分阐述了Linux将线程视为轻量级进程的实现方式,介绍了线程创建、等待等基本操作,并分析了线程相比进程的优缺点。文章还讨论了线程调度成本更低的原因,以及线程与进程在资源分配、调度等方面的区别。最后说明了Linux通过原生线程库pthread为用户提供线程功能。
2025-12-19 00:25:30
904
原创 Linux:进程信号
信号入门摘要 信号是进程间异步通信的一种软中断方式。通过快递的类比,可以理解信号的几个关键特性:1) 异步产生;2) 可识别;3) 可暂存并延迟处理;4) 提供多种处理方式(默认、自定义或忽略)。Linux系统中使用kill -l可查看31个普通信号,每个信号都有特定含义和默认处理动作,如终止进程(SIGTERM)、核心转储(SIGSEGV)或忽略(SIGCHLD)。其中SIGKILL和SIGSTOP是特殊信号,不能被捕获或忽略。信号机制使进程能灵活响应外部事件。
2025-12-15 00:30:20
734
原创 Linux:进程间通信
进程通信是进程协同工作的基础,由于进程具有独立性,通信需要让不同进程看到同一份操作系统资源。常见的通信方式包括管道、共享内存、消息队列等。管道分为匿名管道和命名管道,匿名管道只能用于有血缘关系的进程间通信,具有单向性、同步机制等特点;命名管道通过文件路径实现不相关进程间的通信。管道文件不会刷新到磁盘,通信时采用半双工模式。文章详细介绍了管道的实现原理、使用方法和特点,包括创建、读写操作以及管道大小的限制等。
2025-12-13 16:33:06
843
原创 Linux:简易进程池编写
本文设计了一个基于进程池的任务分配系统,通过管道实现父进程与子进程间的通信。系统预先创建指定数量的子进程和对应管道,父进程通过轮询方式均衡分配任务(如打印、下载等)给子进程,实现负载均衡。关键实现包括:1) 封装Channel类管理管道和子进程;2) 初始化时关闭冗余管道端避免资源泄漏;3) 采用轮询算法分配任务;4) 任务完成后正确关闭管道和回收子进程。该系统有效减少了频繁创建进程的开销,通过阻塞机制确保空闲子进程不影响整体性能。
2025-12-12 00:04:10
969
2
原创 Linux:基础IO
本文回顾了C语言文件操作的基本方法,介绍了系统调用接口的文件操作实现。主要内容包括:1)C语言文件操作的打开方式(r/w/a)及读写示例;2)系统调用open/write/close的使用方法;3)文件描述符的概念及输出重定向原理;4)dup2系统调用的重定向实现;5)标准输出(stdout)和标准错误(stderr)的区别及重定向应用。文章通过代码示例演示了文件操作和重定向的具体实现,帮助理解操作系统层面的文件管理机制。
2025-12-09 15:27:50
1053
原创 Linux:自主shell编写
本文实现了一个简易的Linux命令行解析器,主要包括以下功能:1) 获取并打印命令行提示符,包含用户名、主机名和当前目录;2) 读取用户输入命令并去除回车符;3) 分割命令字符串为指令和参数;4) 检测并处理内建命令(如cd和echo);5) 通过fork-exec机制执行外部命令。代码使用环境变量获取系统信息,通过宏函数简化路径处理,并利用子进程执行命令以避免影响主程序。该解析器能够处理基本命令,为理解命令行工作原理提供了实践基础。
2025-12-07 02:55:48
334
原创 Linux进程、环境变量、地址空间
本文介绍了冯·诺依曼体系结构的基本原理,解释了CPU与内存交互的重要性,以及操作系统如何通过"先描述再组织"的方式管理硬件资源。重点阐述了进程的概念,包括进程控制块(PCB)、进程创建(fork)以及进程的独立性。通过实例展示了Linux进程状态(R/S/T等)的观察方法,并分析了进程状态变化的原因。文章从计算机体系结构到操作系统内核,再到进程管理的多层次讲解,为理解计算机系统运行机制提供了清晰框架。
2025-12-07 01:07:21
591
原创 二分:山脉数组的峰顶索引、寻找峰值、寻找旋转排序数组中的最小值、点名
本文介绍了二分查找的两种模板(左边界和右边界),并应用于四个算法问题。左边界模板通过向下取整避免死循环,右边界模板则需向上取整。针对山脉数组峰顶索引问题,利用右边界模板在O(logn)时间内定位峰值。寻找峰值问题同样采用右边界模板,利用数组边界特性简化查找。旋转排序数组最小值问题则通过分析旋转后的数组特性,使用二分查找快速定位最小值。三个问题均通过二分查找实现高效求解,验证了模板的通用性和实用性。
2025-11-30 13:30:03
789
原创 二分:二分查找、在排序数组中查找元素的第一个和最后一个位置、搜索插入位置、x 的平方根
本文介绍了二分查找算法及其应用。首先讲解了经典二分查找的实现原理,通过每次排除一半搜索区间实现O(logn)时间复杂度。然后探讨了在排序数组中查找元素范围的变体问题,通过分别寻找左右端点解决。最后讲解了搜索插入位置的二分查找应用,寻找第一个≥target的元素位置。所有算法都保持O(logn)的时间复杂度,并通过数学证明二分查找的平均操作次数最优。代码实现展示了如何正确处理边界条件和中点取值方式,确保算法正确性。
2025-11-29 11:14:30
897
原创 滑动窗口:水果成篮、找到字符串中所有字母异位词、串联所有单词的子串、最小覆盖子串
摘要 本文介绍了四个字符串滑动窗口算法问题及其解决方案: 水果成篮:寻找最多包含两种水果类型的最大连续子数组...,使用滑动窗口和哈希表维护窗口内的水果种类数,时间复杂度O(n)。 字母异位词:在字符串s中查找所有p的异位词子串,采用固定大小的滑动窗口,通过哈希表比较或有效字符计数优化匹配过程,最优解时间复杂度O(n)。 串联单词子串:在s中查找所有words排列组合构成的子串,利用单词长度固定的特性,通过多起点滑动窗口和哈希表匹配单词出现次数,时间复杂度O(n*m),其中n为s长度,m为words长度。
2025-11-25 22:56:19
831
原创 滑动窗口:长度最小的子数组、无重复字符的最长子串、最大连续1的个数 III、将 x 减到 0 的最小操作数
本文介绍了三道滑动窗口算法的典型题目及其解法: 长度最小的子数组:寻找总和≥target的最短连续子数组。通过维护窗口和sum,动态调整左右指针,时间复杂度O(n)。 无重复字符的最长子串:查找不含重复字符的最长子串。使用哈希表记录字符出现次数,滑动窗口维护无重复区间,时间复杂度O(n)。 最大连续1的个数 III:允许翻转k个0的情况下,求最长连续1的子数组长度。通过维护窗口内0的个数不超过k来求解。 这些题目展示了滑动窗口算法在解决连续子区间问题中的高效性,均能在O(n)时间内完成。算法核心在于维护双指
2025-11-25 22:17:02
786
原创 C++特殊类设计
本文介绍了C++中实现特殊类功能的几种方法:1)禁止拷贝:C++98通过私有化拷贝构造和赋值运算符,C++11使用delete关键字;2)限制对象创建位置:只能在堆上创建需将构造函数私有化并禁用拷贝,只能在栈上创建则需禁用new/delete操作符;3)禁止继承:C++98私有化构造函数,C++11使用final关键字;4)单例模式实现:饿汉模式提前实例化但可能影响启动速度,懒汉模式首次使用时创建,C++11前需通过双检查加锁保证线程安全。这些技术可根据不同需求灵活选择实现方式。
2025-11-18 17:12:41
825
原创 c++智能指针
现在问题是main函数结束后会自动释放p1和p2,他们指向的空间引用计数都变成1但是里面空间的指针又互相指着,导致他们的引用计数不能归零。其实回忆一下,之所以会内存泄漏,主要是抛异常跳过了回收内存的语句。拷贝竟然会把原先的指针置空,如果对于不熟悉auto_ptr机理的人使用更是毁灭性的。在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。简单分析一下原因,p1的next指向p2导致其对应的空间引用计数+1,同理p1指向的空间引用计数+1.
2025-11-17 18:26:04
983
原创 C++异常
实际使用中很多公司都会自定义自己的异常体系进行规范的异常管理,因为一个项目中如果大家随意抛异常,那么外层的调用者基本就没办法玩了,所以实际中都会定义一套继承的规范体系。这样大家抛出的都是继承的派生类对象,捕获一个基类就可以了正如前面“catch中基类对象匹配派生类对象”部分提到的Exception类和派生类。
2025-11-13 23:34:02
654
原创 C++11拓展语法
Love实际上本质是参数的隐式类型转换,不相信的话我们来以简单的自定义类型试验一下。public::_x(x),_y(y)cout << "构造" << endl;:_x(x), _y(x)cout << "构造" << endl;int _y;y.Show();z.Show();构造1 2构造11 2构造1 1。
2025-11-12 23:03:21
750
原创 unordered_set和unordered_map简单模拟实现
本文主要介绍了哈希表的基本概念及其实现方法。哈希表通过哈希函数将关键码映射到存储位置,实现快速查询。哈希冲突是常见问题,可通过闭散列和开散列两种方法解决。闭散列采用开放地址法处理冲突,而开散列通过链表链接相同哈希值的元素。文章详细讲解了哈希函数设计原则(如直接定址法、除留余数法等)和冲突解决策略,并提供了线性探测和链地址法的C++代码实现示例。哈希表的关键参数负载因子用于平衡空间利用率和查询效率。
2025-11-09 00:39:16
663
原创 二叉搜索树
二叉搜索树是一种特殊的二叉数,他的左子数节点的值都比根节点的值小,右子树的节点的值都比根节点的值大,并且对于每个节点都是如此。如果我们对二叉搜索树进行中序遍历,就会得到一个有序的序列,因此二叉搜索树又称为二叉排序树。
2025-05-21 14:18:36
775
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅