- 博客(63)
- 收藏
- 关注
原创 Linux网络--NAT、代理服务、内网穿透
网络通信是一场精密的接力赛,每一层专注解决特定问题,共同构建出可靠高效的全球互联网络。理解分层模型,是掌握网络技术的基础。
2025-12-17 18:02:53
759
原创 Linux网络--数据链路层
ARP 缓存表有超时机制(通常 1-10 分钟),超时后会重新请求正确的 MAC。等主机E收到后,看清了是发送给自己的请求,那么主机E要进行处理,把自己的MAC地址写上去,OP为2表示ARP应答,此时源以太网地址是主机E的MAC地址,目的以太网地址是路由器的MAC地址,这样将ARP发回路由器,路由器就知道了主机E的MAC地址。攻击者(比如局域网内的主机 C)给主机 A 发伪造的 ARP 响应:“我是网关(192.168.1.1),我的 MAC 是 CC:CC:CC:CC:CC:CC(攻击者的 MAC)”。
2025-12-17 17:02:29
858
原创 Linux网络--IP 分片和组装的具体过程
我们上次学习了这是IP协议的报文格式,今天我们来学习有关第二行的这三个部分(16位标识,3位标志,13位片偏移),我们上次说了这三部分是为了IP内容进行分片时用的。将重组后的完整 IP 报文,交给 IP 头部 “协议号” 指定的传输层协议(TCP/UDP),传输层仅需处理完整数据,无需知晓分片过程。最后一个分片的 “数据长度” = 该分片的 IP 总长度 - 该分片的 IP 头部长度(IHL×4 字节);在同一组分片的,找到 MF=0 的分片 → 该分片是最后一个分片,其片偏移和数据长度是判断收全的关键。
2025-12-17 16:09:37
296
1
原创 Linux网络--网络层协议 IP
举一个例子,我们要去一个地方,但是我们不知道路该怎么走,所以我们要找人问路,有的人知道怎么走就把路线告诉我们,有的人不知道该怎么走,但是他告诉我们先走一段路再去问问别人。网络宏观上被分为公网和内网(子网,局域网),它们的比例是 1 : N ,在内网中Ip地址可以重复,所以我们的私有IP无法出现在公网,因为无法收到应答,那么是怎样进行通信的呢?这是我制作的一张关于公网和子网的分配图,实际上的分配比这要复杂的多,同一个路由器WAN口记录自己的公网IP,LAN口记录自己的子网IP。
2025-12-16 23:33:27
789
原创 Linux网络--传输层协议 TCP
比方说发送的是1000 - 4000的数据,那么如果是1000 - 2000的数据丢了,那么收到的所有应答应该都是1000,此时就说明1000 - 2000的数据丢了,当有三个及以上的ACK是相同的值时,就会立即对该数据段进行重发,我们知道,一个服务器是可以同时连接多个客户端的,那么操作系统内部就可能会同时存在多个报文,所以操作系统要对这些报文进行管理,同样采用先描述再组织的方式,也就是说我们学习的这些协议,其实就是一个结构体。那么采用这样的传输方式之后,若是产生了丢包,那么该怎么办呢?
2025-12-07 17:42:33
741
原创 Linux网络--传输层协议 UDP
然而 64K 在当今的互联网环境下, 是一个非常小的数字.如果我们需要传输的数据超过 64K, 就需要在应用层手动的分包, 多次发送, 并在接收端手动拼装;端口号的核心作用是标识 “进程 - 网络服务” 的映射,默认情况下,操作系统会保证端口号的唯一性(避免端口冲突)。- 多进程服务:父进程创建 socket 并绑定端口后,fork 子进程共享该 socket,实现多进程监听同一端口。:更严格的多进程共享端口,要求所有绑定该端口的进程都设置此选项,且权限一致(避免恶意进程抢占);
2025-12-07 16:12:14
612
原创 Linux网络--HTTP cookie 与 session
并且 HTTP 是一个无连接、无状态的协议,每次请求都需要建立新的连接,且不适合保存用户的浏览信息,那么到底该如何才能实现这个功能呢?本质问题在于这些用户私密数据在浏览器(用户端)保存,非常容易被人盗取,更重要的是,除了被盗取,还有就是用户私密数据也就泄漏了。之间的差别通常很小,大多数情况下可以互换使用。都曾是或现在是国际上重要的时间标准,但由于地球自转的不规则性和原子钟的精确性,
2025-12-07 15:46:44
615
原创 Linux网络--应用层协议 HTTP
通常在http后直接写的就是服务器域名,用来指定服务器,服务器后面写的是要访问的资源的路径,而对于一些大型且成熟的协议,它们的端口号是默认的,无需再额外指定了,比如http的端口号是80,https的端口号是443。2. 请求的时候,url 中如果有特殊字符,客户端(一般是浏览器)会自动给我们进行对特殊字符进行编码 encode,浏览器和服务器自己进行 urldecode。首先我们先来学习HTTP协议,这是一个应用层协议,HTTP协议可用来传输视频,图片,音频等文件资源。协议中,默认使用持久连接。
2025-12-01 20:07:58
1215
原创 Linux网络--应用层自定义协议与序列化
和FastWriter提供了不同的序列化选项,你可以根据具体需求选择使用。和函数是Jsoncpp中主要的反序列化工具,它们提供了强大的错误处理机制。3, 在进行序列化和反序列化时,请确保处理所有可能的错误情况,并验证输入和输出的有效性。是Jsoncpp库中的一个重要类,用于表示和操作JSON数据结构。以下是一些常用的 Json::Value操作列表:5.1。
2025-11-21 16:30:49
1080
1
原创 Linux网络--Socket 编程 TCP
大家好,上次我们学习了有关UDP的socket编程,今天我们来继续学习一下关于TCP的socket编程,那么我们开始今天的学习。1.
2025-11-13 22:04:56
704
1
原创 Linux系统--线程的同步与互斥
大家好,今天我们来继续学习线程相关的部分:线程的同步与互斥。那么话不多说,我们开始今天的学习。目录线程同步与互斥1. 线程互斥1-1 进程线程间的互斥相关背景概念1-2 互斥量mutex1-3 互斥量实现原理探究1-4 互斥量的封装2. 线程同步2-1 条件变量2-2 同步概念与竞态条件2-3 条件变量函数2-4 ⽣产者消费者模型2-4-1 为何要使⽤⽣产者消费者模型2-4-2 ⽣产者消费者模型优点2-5 基于BlockingQueue的⽣产者消费者模型2-5-1 BlockingQueue2-5-2 C+
2025-10-28 23:30:47
670
原创 Linux系统--线程概念与控制
大家好,上次我们学习了Linux系统的信号部分,今天我们来继续学习Linux系统的线程部分,话不多说,我们开始今天的学习:线程概念与控制1. Linux线程概念1-1 什么是线程在⼀个程序⾥的⼀个执⾏路线就叫做线程(thread)。更准确的定义是:线程是“⼀个进程内部的控制序列”⼀切进程⾄少都有⼀个执⾏线程线程在进程内部运⾏,本质是在进程地址空间内运⾏在Linux系统中,在CPU眼中,看到的PCB都要⽐传统的进程更加轻量化。
2025-10-15 15:46:32
574
原创 Linux系统--进程信号
打个⽐⽅,某⼈要⼩睡⼀觉,设定闹钟为30分钟之后响,20分钟后被⼈吵醒了,还想多睡⼀会⼉,于是重新设定闹钟为15分钟之后响,“以前设定的闹钟时间还余下的时间”就是10分钟。当代码在用户态运行时,当出现中断,异常或系统调用的时候会由用户态进入内核态,在内核处理完异常之后,会检测当前有没有可以递达的信号,此时就会进行处理,如果信号的处理方法是默认或忽略时,由内核完成,若是处理方法为自定义,则需要从内核态先返回到用户态进行自定义处理方法的运行,在信号处理之后,要在内核态统一返回用户态继续代码的执行。
2025-09-25 16:40:09
672
原创 Linux系统--进程间通信
大家好,好久不见,今天我们来继续学习Linux的系统部分,今天我们来学习进程间通信进程间通信1. 进程间通信介绍什么是通信?进程间通信是指运行在同一台计算机或不同计算机上的多个进程之间进行数据交换和通信的技术。因为每个进程都有自己独立的地址空间,无法直接访问彼此的数据,所以得依靠特定机制来实现通信。它在操作系统和多进程编程里是重要概念,广泛应用于分布式系统、多任务操作系统以及各类应用程序之间。1-1 进程间通信⽬的为什么要有进程间通信呢?数据传输:⼀个进程需要将它的数据发送给另⼀个进程。
2025-09-11 16:26:21
683
原创 Linux系统--文件系统
记录的信息主要有:bolck 和 inode的总量,未使⽤的block和inode的数量,⼀个block和inode的⼤⼩,最近⼀次挂载的时间,最近⼀次写⼊数据的时间,最近⼀次检验磁盘的时间等其他⽂件系统的相关信息。那个C,D,E就是分区。到这我们要思考⼀个问题,⽂件数据都储存在”块”中,那么很显然,我们还必须找到⼀个地⽅储存⽂件的元信息(属性信息),⽐如⽂件的创建者、⽂件的创建⽇期、⽂件的⼤⼩等等。⼀个”块”的⼤⼩是由格式化的时候确定的,并且不可以更改,最常⻅的是4KB,即连续⼋个扇区组成⼀个 ”块”。
2025-08-08 17:32:52
704
原创 Linux系统--基础I/O
pathname:要打开或创建的⽬标⽂件flags:打开⽂件时,可以传⼊多个参数选项,⽤下⾯的⼀个或者多个常量进⾏或运算,构成flags。参数O_RDONLY: 只读打开。
2025-08-07 16:38:41
1061
原创 Linux系统--进程控制
大家好,今天我们来继续学习Linux的系统部分,上一次我们学到了进程的概念,接下来我们来进一步学习进程的控制进程控制1. 进程创建1-1 fork函数初识在linux中fork函数是⾮常重要的函数,它从已存在进程中创建⼀个新进程。新进程为⼦进程,⽽原进程为⽗进程。进程调⽤fork,当控制转移到内核中的fork代码后,内核做:1. 分配新的内存块和内核数据结构给⼦进程2. 将⽗进程部分数据结构内容拷⻉⾄⼦进程3. 添加⼦进程到系统进程列表当中4. fork返回,开始调度器调度。
2025-07-23 18:19:24
1097
原创 Linux系统--进程概念
大家好,好久不见,我们今天来继续Linux系统的学习。今天我们来认识一下操作系统中重要的一部分:进程。那么话不多说,我们开始今天的学习。
2025-07-21 15:45:14
1093
原创 Linux系统--开发工具
大家好,我们今天来继续学习Linux的内容,今天我们来学习一些在Linux中使用的工具。基础开发⼯具本节⽬标学习yum⼯具,进⾏软件安装掌握vim编辑器使⽤,学会vim的简单配置掌握gcc/g++编译器的使⽤,并了解其过程,原理掌握简单的Makefile编写,了解其运⾏思想编写⾃⼰的第⼀个Linux 程序:进度条学习 git 命令⾏的简单操作, 能够将代码上传到 Github 上掌握简单gdb使⽤于调试。
2025-07-01 19:59:40
1191
原创 Linux系统--指令基础
大家好,在之前我们学完了c++的初阶和进阶部分,今天我们来进行新一部分的学习:LinuxLinux我在学习时也分为两部分:Linux系统和Linux网络。那么话不多说,我们开始进入今天的学习。
2025-06-18 14:45:42
394
原创 c++进阶--智能指针
weak_ptr⽀持expired检查指向的资源是否过期,use_count也可获取shared_ptr的引⽤计数,weak_ptr想访问资源时,可以调⽤lock返回⼀个管理资源的shared_ptr,如果资源已经被释放,返回的shared_ptr是⼀个空对象,如果资源没有释放,则通过返回的shared_ptr访问资源是安全的。RAII在获取资源时把资源委托给⼀个对象,接着控制对资源的访问,资源在对象的⽣命周期内始终保持有效,最后在对象析构的时候释放资源,这样保障了资源的正常释放,避免资源泄漏问题。
2025-04-10 22:29:41
1066
原创 c++进阶--异常
1. 异常处理机制允许程序中独⽴开发的部分能够在运⾏时就出现的问题进⾏通信并做出相应的处理,异常使得我们能够将问题的检测与解决问题的过程分开,程序的⼀部分负责检测问题的出现,然后解决问题的任务传递给程序的另⼀部分,检测环节⽆须知道问题的处理模块的所有细节。1. 抛出异常后,程序暂停当前函数的执⾏,开始寻找与之匹配的catch⼦句,⾸先检查throw本⾝是否在try块内部,如果在则查找匹配的catch语句,如果有匹配的,则跳到catch的地⽅进⾏处理。异常时抛出⼀个对象,这个对象可以函数更全⾯的各种信息。
2025-04-09 14:01:24
635
原创 c++进阶--c++11
3. 对于像string/vector这样的深拷⻉的类或者包含深拷⻉的成员变量的类,移动构造和移动赋值才有意义,因为移动构造和移动赋值的第⼀个参数都是右值引⽤的类型,他的本质是要“窃取”引⽤的右值对象的资源,⽽不是像拷⻉构造和拷⻉赋值那样去拷⻉资源,从提⾼效率。那么编译器会⾃动⽣成⼀个默认移动构造。1. 对于⼀个参数包,我们除了能计算他的参数个数,我们能做的唯⼀的事情就是扩展它,当扩展⼀个包时,我们还要提供⽤于每个扩展元素的模式,扩展⼀个包就是将它分解为构成的元素,对每个元素应⽤模式,获得扩展后的列表。
2025-04-06 21:30:09
940
原创 c++进阶--unordered_set和unordered_map的实现
但是SGI-STL30实现了哈希表,只容器的名字是hash_map和hash_set,他是作为⾮标准的容器出现的,⾮标准是指⾮C++标准规定必须实现的,源代码在hash_map/ hash_set/ stl_hash_map/ stl_hash_set/ stl_hashtable.h中。1. iterator实现的⼤框架跟list的iterator思路是⼀致的,⽤⼀个类型封装结点的指针,再通过重载运算符实现,迭代器像指针⼀样访问的⾏为,要注意的是哈希表的迭代器是单向迭代器。
2025-03-26 20:05:47
1010
原创 c++进阶--哈希表的实现
1.5.1 除法散列法/除留余数法1. 除法散列法也叫做除留余数法,顾名思义,假设哈希表的⼤⼩为M,那么通过key除以M的余数作为映射位置的下标,也就是哈希函数为:h(key) = key % M。2. 当使⽤除法散列法时,要尽量避免M为某些值,如2的幂,10的幂等。如果是 ,那么key %本质相当于保留key的后X位,那么后x位相同的值,计算出的哈希值都是⼀样的,就冲突了。
2025-03-25 22:43:29
1183
原创 c++进阶--unordered_set和unordered_map的使用
3. unordered_set和set的第⼆个差异是迭代器的差异,set的iterator是双向迭代器,unordered_set是单向迭代器,其次set底层是红⿊树,红⿊树是⼆叉搜索树,⾛中序遍历是有序的,所以set迭代器遍历是有序+去重。4. unordered_set和set的第三个差异是性能的差异,整体⽽⾔⼤多数场景下,unordered_set的增删查改更快⼀些,因为红⿊树增删查改效率是 ,⽽哈希表增删查平均效率是 ,具体可以参看下⾯代码的演⽰的对⽐差异。
2025-03-24 20:02:48
1040
原创 c++进阶--红黑树
大家好,今天我们继续来学习c++的进阶部分,今天我们要学习的内容是红黑树。1. 红⿊树的概念红⿊树是⼀棵⼆叉搜索树,他的每个结点增加⼀个存储位来表⽰结点的颜⾊,可以是红⾊或者⿊⾊。通过对任何⼀条从根到叶⼦的路径上各个结点的颜⾊进⾏约束,红⿊树确保没有⼀条路径会⽐其他路径⻓出2倍,因⽽是接近平衡的。1.1 红⿊树的规则:1. 每个结点不是红⾊就是⿊⾊2. 根结点是⿊⾊的3. 如果⼀个结点是红⾊的,则它的两个孩⼦结点必须是⿊⾊的,也就是说任意⼀条路径不会有连续的红⾊结点。
2025-03-17 23:42:25
1010
原创 c++进阶--AVL树
3. 更新后parent的平衡因⼦等于2 或 -2,更新前更新中parent的平衡因⼦变化为1->2 或者 -1->-2,说明更新前parent⼦树⼀边⾼⼀边低,新增的插⼊结点在⾼的那边,parent所在的⼦树⾼的那边更⾼了,破坏了平衡,parent所在的⼦树不符合平衡要求,需要旋转处理,旋转的⽬标有两个:1、把parent⼦树旋转平衡。通过图7和图8可以看到,左边⾼时,如果插⼊位置不是在a⼦树,⽽是插⼊在b⼦树,b⼦树⾼度从h变成h+1,引发旋转,右单旋⽆法解决问题,右单旋后,我们的树依旧不平衡。
2025-03-13 22:57:17
685
原创 c++进阶--map和set的使用
大家好,昨天我们学习了二叉搜索树,今天我们来学习一下map和set容器的使用。1. map和set的使⽤1.1 序列式容器和关联式容器今天我们学习的map和set是一种新容器:1. 前⾯我们已经接触过STL中的部分容器如:string、vector、list、deque、array、forward_list等,这些容器统称为序列式容器,因为逻辑结构为线性序列的数据结构,两个位置存储的值之间⼀般没有紧密的关联关系,⽐如交换⼀下,他依旧是序列式容器。
2025-03-05 21:51:21
946
原创 c++进阶--二叉搜索树
大家好,今天我们来学习在c++中更深奥的数据结构,二叉搜索树。1. ⼆叉搜索树的概念⼆叉搜索树⼜称⼆叉排序树,它或者是⼀棵空树,或者是具有以下性质的⼆叉树:1. 若它的左⼦树不为空,则左⼦树上所有结点的值都⼩于等于根结点的值2. 若它的右⼦树不为空,则右⼦树上所有结点的值都⼤于等于根结点的值3. 它的左右⼦树也分别为⼆叉搜索树。
2025-03-04 20:06:03
876
原创 c++进阶--多态
大家好,今天我们来学习c++进阶的第二课:多态。c++的三大特性就是封装,继承和多态。那么今天我们就来学习一下多态。1. 多态的概念多态(polymorphism)的概念:通俗来说,就是多种形态。多态分为编译时多态(静态多态)和运⾏时多态(动态多态),这⾥我们重点讲运⾏时多态,编译时多态(静态多态)和运⾏时多态(动态多态)。
2025-03-03 21:56:58
1114
原创 c++进阶--继承
1.2.1 定义格式上面我们看到Person是基类,也称作⽗类。Student是派⽣类,也称作⼦类。(因为翻译的原因,所以既叫基类/派⽣类,也叫⽗类/⼦类)。继承有三种继承方式:1. public继承2. protected继承3. private继承。
2025-03-02 19:49:42
993
原创 c++初阶--模板进阶
1. 对于一个数组的越界检查,一个数组如果越界读,可以进行,但读出的结果是随机值;如果进行越界写,系统对于一个数组,在数组后面有两位标志位,这两位有一个默认值,当写的是这两位时,会判断是越界并进行报错,但写的若不是这两位,则不会进行报错。// 定义一个模板类型的静态数组public:private:但由于我们使用非类型模板参数定义的静态数组是在类中进行定义的,所以该静态数组有迭代器(指针),无论对于读还是写,只要越界就会进行报错。
2025-03-01 16:19:43
648
原创 c++初阶--Stack,Queue和PriorityQueue的实现
但对于官方库中,Stack和Queue的这个容器参数缺省值给了一个容器deque,那么deque是哪种容器呢?1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。
2025-02-27 19:39:04
682
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅