- 博客(76)
- 收藏
- 关注
原创 保姆级内网穿透教程
其中的 serverPort 和 remotePort 需要区分清楚,serverPort 是服务器建立连接时绑定的端口,但服务器只是用于建立连接,未来访问本地这台内网机器具体某一个服务时,用的是 remotePort。,其中的 user_name 填充的是,内网机器(也就是虚拟机上 linux 的用户名),IP 是云服务器的公网 IP,端口号是 frpc 配置文件中对 ssh 服务绑定的 remotePort。这样,就完成了 frp 的部署和测试,我们就可以在不同地方,还能访问其它局域网内的机器。
2025-01-15 16:38:49
912
3
原创 TCP__滑动窗口__拥塞控制
滑动窗口是TCP协议中的一种优化机制,允许发送方在未收到ACK之前发送多个数据段,从而提高传输效率。窗口的大小由接收方的缓冲区决定,通过滑动窗口,发送方可以在确认数据成功接收后,继续发送新的数据段。滑动窗口的大小会随着网络状态和接收方处理能力动态调整,既可以增大以提高吞吐率,也可能因拥塞或接收方缓冲区已满而缩小甚至归零。这种机制本质上是流量控制的一种手段,用于在网络不稳定或拥塞时保持数据传输的平衡和效率。
2025-01-10 17:17:55
1037
3
原创 TCP__超时重传__握手挥手
TCP协议的面向字节流体现在其将数据视为无边界的连续字节流,依赖序号来确保数据按顺序传输和重组,而不直接面向数据包。超时重传机制通过动态调整超时时间,根据网络状况重传丢失的数据包,并使用序号去重,保证数据的完整性和可靠性。连接管理机制则通过三次握手和四次挥手来确保连接的建立与释放,提供了可靠的端到端通信通道。
2025-01-06 15:52:07
1004
3
原创 UDP_TCP
在网络通信中,TCP和UDP是两种重要的传输层协议。TCP注重可靠性,通过确认应答、序号和流量控制确保数据传输完整,适合需要稳定连接的场景;UDP则强调快速性和简洁性,采用无连接模式,不保证数据到达顺序和完整性,适用于对实时性要求高的应用。两者在协议栈中通过结构化数据管理通信,协议的本质是对规则的约定。TCP的发送缓冲区和捎带应答机制提高了效率,而UDP则依赖应用层处理数据分包和拼接,灵活性较强。
2025-01-03 16:37:11
1083
5
原创 HTTPS__CA证书与签名
HTTPS 工作过程中涉及到的密钥有三组:第一组(非对称加密):用于校验证书是否被篡改。服务器持有私钥(私钥在形成CSR文件与申请证书时获得),客户端持有公钥(操作系统包含了可信任的 CA 认证机构有哪些,同时持有对应的公钥)。服务器在客户端请求时,返回携带签名的证书。客户端通过这个公钥进行证书验证,保证证书的合法性,进一步保证证书中携带的服务端公钥权威性。
2024-12-31 19:59:00
1013
5
原创 cookie__HTTPS
Cookie 是客户端保存会话的机制,但存储敏感信息有被盗风险,结合服务端管理的 Session 可提高安全性。HTTPS 通过加密(对称、非对称)和数据完整性校验(摘要)确保传输安全。综合利用多种加密方式(如 TLS)解决单一方案的问题,保障用户数据和通信安全。
2024-12-27 21:21:02
1205
6
原创 HTTP协议
域名用于替代 IP 地址和端口号,简化访问过程。HTTP 协议默认使用端口 80(HTTP)和 443(HTTPS)。请求和响应报文的格式包括请求行、报头、正文。通过解析请求行,服务器根据 URL 找到对应的资源并返回。在服务器实现方面,实现一个简易 HTTP 服务器,通过多线程处理客户端请求,并根据 URL 动态返回 HTML 内容。 HTTP 方法、状态码、常见头字段以及如何处理不同类型的请求资源,如图片和 HTML 文件。
2024-12-24 15:23:19
706
1
原创 【守护进程 】【序列化与反序列化】
在 Linux 中,前后台任务由会话和进程组管理,前台进程能接收键盘信号,而后台进程则不能。通过命令如 jobs、fg、bg 可以管理后台任务。后台进程通常在会话关闭后仍然存在,但会被操作系统领养,失去终端信息。要使进程不受会话退出影响,通常通过守护进程实现,守护进程通过 setsid() 创建新会话,使进程脱离当前会话,确保其独立运行。TCP 通信是全双工的,能够同时进行数据的发送与接收。由于 TCP是面向字节流的,接收方无法知道数据的边界,因此需要协议定制,通过序列化与反序列化来保证数据的正确解析。
2024-12-21 15:39:04
847
4
原创 网络基础(二)
跨网段通信需要经过路由器,IP 地址用于标识主机,而 MAC 地址用于局域网内标识设备。数据从应用层到网络层被封装,每一层添加报头以提供路由信息和目标主机信息。IP 地址不随网络协议变化,主要用于确定路由路径,而 MAC 地址仅在局域网内有效。传输层使用端口号标识特定进程,端口号与进程间的通信方式即为 Socket。TCP 提供可靠的连接式通信,保证数据传输完整性,UDP 则不保证可靠性,适用于对速度要求较高的场景。网络字节序在网络上传输时使用大端格式,确保跨平台通信的兼容性,主机字节序可通过转换函数处理。
2024-12-18 15:23:46
1132
3
原创 网络版计算器
基于 TCP 网络的计算器系统,客户端和服务器通过自定义协议或 JSON 格式进行数据序列化和反序列化。服务器使用 TcpServer 类处理客户端请求,计算器根据请求执行相应的算术操作并返回结果。自定义协议通过报文头标记数据长度,而 JSON 版本则通过 jsoncpp 序列化和反序列化数据。服务器采用多进程方式处理多个客户端连接,并支持守护进程模式,使其在后台运行。
2024-12-15 15:27:07
693
1
原创 tcp_socket
tcp_socket 通信案例,从最初单进程模型导致阻塞,后通过多进程和多线程模型来处理并发连接,减少了阻塞和进程开销。最终,使用线程池管理线程,避免频繁创建销毁线程,提高了效率。服务端通过字典文件实现了简单的翻译服务,客户端则加入了重连机制,确保在断开连接时可以自动重连。
2024-12-08 14:56:42
451
2
原创 网络基础(一)
网络协议的本质是约定,通信双方遵循统一的规则以确保数据的准确传递。协议分层使得网络系统更易维护与扩展,每层负责不同任务,如数据传输、地址管理、确保数据可靠性等。OSI七层模型和TCP/IP五层协议栈是常见的协议层次结构,操作系统依赖这些协议栈来进行网络通信。局域网通信中,每台主机有唯一的MAC地址,通过数据链路层识别接收方,避免数据碰撞。交换机能划分碰撞域,减少冲突,确保局域网资源的互斥访问。
2024-12-02 15:14:05
885
8
原创 线程(五)【环形队列CP | 线程池 | 线程完结】
信号量是一种计数器,用于控制对共享资源的访问,适用于多个线程并发访问时的资源分配。环形队列通过信号量管理生产者和消费者对数据的访问,保证了生产者在空间满时等待,消费者在无数据时等待。线程池使用懒汉单例模式创建,确保多线程任务的高效执行。STL容器默认不线程安全,智能指针中的shared_ptr通过CAS保证线程安全。自旋锁和悲观锁、乐观锁各有优缺点,适用于不同的场景。读者写者问题中,读者和写者的互斥关系通过读写锁实现,通常采用读者优先策略,防止写者饥饿。
2024-11-29 15:13:31
865
5
原创 线程(四)【死锁 | 条件变量 | CP模型】
死锁是线程因资源互相占用导致的永久等待状态,需满足互斥、请求与保持、不剥夺、循环等待四条件,破坏任一条件即可避免死锁。条件变量通过线程等待队列和通知机制,解决线程间竞争问题,实现同步。生产消费模型模拟生产者、消费者通过缓冲区交互,利用阻塞队列实现数据安全和高效传递,互斥保证资源原子性,同步调节生产与消费节奏,提高并发效率。条件变量需在加锁后使用,避免误唤醒时引发资源状态混乱。
2024-11-26 16:00:41
986
2
原创 线程(三)【线程互斥(下)】
互斥锁用于解决多线程并发访问共享资源时的数据不一致问题,通过加锁保护临界区代码,保证线程对临界资源的访问是串行的。加锁用时间换取安全,但会降低并发性能,应尽量缩小临界区范围。线程切换期间持有锁不会释放,保证资源访问安全。互斥锁底层利用CPU指令集实现原子性操作,确保申请和释放锁的完整性。线程安全确保并发时结果一致,可重入函数在多执行流中结果一致且无副作用,可重入函数一定线程安全,但线程安全函数未必可重入。锁机制可实现线程安全但可能破坏重入性,多线程编程需平衡性能与安全。
2024-11-23 20:05:27
1018
6
原创 线程(三)【线程互斥(上)】
当多个线程同时访问共享资源时,可能会出现数据不一致的问题。例如,在多线程抢票的场景中,多个线程可能同时读取和修改共享变量 tickets,导致数据覆盖和错误的计数。这是因为线程切换时,每个线程会将数据加载到自己的寄存器中进行处理,而其他线程在切换后可能对同一数据进行修改,从而引发竞态条件。解决这个问题通常需要使用互斥锁(mutex)来确保每次只有一个线程能访问共享资源,避免并发修改导致的数据不一致。
2024-11-19 16:50:38
785
3
原创 线程(二)【线程控制】
线程是进程的执行分支,共享进程资源,没有独立的PID,只能通过LWP进行调度。线程创建通过`pthread_create`,传入线程执行函数及其参数,主线程可以通过`pthread_join`等待子线程结束,获取其返回值。线程终止有多种方式,包括正常结束、`pthread_exit`或`pthread_cancel`。Linux中没有明确的线程概念,操作系统通过`clone`创建轻量级进程,线程库通过维护线程的属性来管理线程。线程ID、栈空间等由线程库维护,而操作系统通过调度LWP来调度线程。
2024-11-15 15:34:12
1294
5
原创 线程(一)【理论篇】
线程是进程内部的执行分支,具有更细的执行粒度。与进程不同,线程共享进程的地址空间和资源。进程在创建时分配独立的资源,如 task_struct 和页表,而线程则只创建执行流,共享进程的资源。Linux 系统中,线程通过共享进程的 task_struct 结构来实现,线程并没有独立的调度控制块。这样,线程和进程的调度机制统一,线程比进程消耗更少的资源。
2024-11-11 14:59:23
763
1
原创 可重入函数 && volatile && SIGCHLD
在多线程或信号处理中,若一个函数在执行过程中被中断并在中断处理程序中再次调用,该函数称为不可重入函数。volatile 关键字可防止编译器优化变量,保证变量在内存中的可见性,避免多线程或信号处理中变量值不同步的问题。在进程管理中,父进程通过接收子进程发送的 SIGCHLD 信号来回收子进程,但若父进程未显式捕捉该信号,默认动作是忽略,可能导致僵尸进程。通过设置信号处理程序,父进程可及时回收子进程,防止内存泄漏。
2024-11-07 18:12:41
979
6
原创 进程地址空间(四)
虚拟到物理地址的转换通过多级页表实现。32位虚拟地址被分为10位(页目录)、10位(二级页表)和12位(偏移量)。页目录索引到二级页表,再从二级页表获取物理页框的起始地址,最后加上偏移量获取具体物理地址。页表动态分配,节省内存,且不必完整存在。缺页中断用于处理未加载的数据。数据类型在编程语言中定义变量的大小,CPU通过指令识别读取的字节数。CR3寄存器保存页目录地址,CR2寄存器记录引发缺页中断的虚拟地址。
2024-11-04 20:18:32
894
5
原创 信号(四)【信号处理与捕捉】
信号处理涉及进程在内核态和用户态之间的切换。当进程接收到信号时,信号会被记录在进程控制块的pending位图中,直到进程在从内核态返回用户态时进行处理。处理信号的前提是进程需要进入内核态以访问系统数据结构。信号捕捉的过程是,若进程注册了自定义信号处理函数,则在信号到达时会调用该函数,而信号的pending状态会在调用之前被清除。在信号处理期间,进程会自动屏蔽相同信号的递达,确保同一信号在处理期间不会被重复处理。这种机制保证了信号处理的有效性和系统的稳定性。
2024-10-31 21:05:00
1138
1
原创 信号(三)【信号保存】
普通信号使用位图结构(如task_struct中的signal字段)来记录信号的接收状态,进程接收到信号时相应比特位被置为1。信号的处理动作可以是默认的终止进程,也可以是用户自定义的操作,操作系统允许用户处理信号以避免意外损失。信号在未决状态下保存,使用pending位图记录未处理的信号。进程可以屏蔽信号,这意味着信号不会递达但依然保存在pending表中。通过sigset_t和sigprocmask等系统调用,用户可以管理信号的阻塞状态和查看pending状态,从而实现对信号的有效控制。
2024-10-26 17:18:44
675
8
原创 信号(二)【信号的产生】
介绍信号产生的五种方式:通过键盘组合键触发信号,如 Ctrl + C、Ctrl + \ 和 Ctrl + Z,分别发送不同的信号来终止或暂停进程。其次,kill 命令和系统调用用于向特定进程发送信号。然后,代码异常(如除零错误)也会导致信号的产生,进程可以通过信号处理程序捕捉这些信号。最后,软件条件(如管道通信错误和闹钟)同样可以引发信号。这些机制确保了操作系统能够有效管理进程的生命周期和错误处理。
2024-10-22 21:29:33
2100
12
原创 了解消息队列 && 信号量
消息队列是进程间通信的一种方式,通过数据块传递信息。主要系统接口包括msgget(创建或获取标识符)、msgctl(控制操作)和msgrcv、msgsnd(接收和发送消息)。共享内存、消息队列和信号量通过类似的结构体(如ipc_perm)统一管理,使用数组结构进行资源的增删查改。信号量作为计数器,用于管理对共享资源的访问,防止数据不一致,二元信号量则用于互斥访问。信号量的主要接口有semget(申请)、semctl(控制)和semop(执行操作)。
2024-10-18 16:36:42
2278
8
原创 信号(一)【概念篇】
在计算机中,信号用于进程间的异步通信,进程需具备识别和处理信号的能力,例如Ctrl + C会发送SIGINT信号终止前台进程。信号处理可以是默认动作、忽略或自定义。当进程接收信号时,不一定立即处理,可能选择合适时机,形成一个时间窗口。操作系统通过中断机制有效管理外设数据,如键盘输入,提升效率。因此,信号在进程控制中是异步的,确保及时通知进程发生的事件。
2024-10-14 17:02:33
2098
8
原创 【进程间通信(三)】【system V共享内存】
如果有进程 B 想要与进程 A 进行通信,只需要将同一块共享内存通过页表映射到进程 B 的共享区中即可。后续通过页表映射,访问同一块内存,这就完成了让不同进程看到同一份资源的工作!
2024-10-10 16:52:36
2100
6
原创 【进程间通信(二)】【命名管道】
命名管道用于没有血缘关系的进程之间通信,创建时使用 mkfifo 命令。与匿名管道不同,命名管道通过路径和文件名确保进程能访问同一资源,从而实现通信。管道在内存中操作,不需要刷盘,因此支持实时数据传输。
2024-10-06 14:54:17
1915
9
原创 进程间通信(一)【管道通信(下)】
管道的四种情况:读写端正常,管道如果为空,读端阻塞;读写端正常,管道如果被写满,写端阻塞;读端正常读,写端关闭,读端读到文件结尾,读端不阻塞;写端正常,读端关闭。具有血缘关系的进程才能进行进程间通信。管道只能单向通信。父子进程是会进程协同的,同步与互斥的,以此来达到保护管道文件的数据安全。管道是面向字节流的。管道是基于文件的,而文件的生命周期是随进程的!
2024-09-28 15:41:31
2167
9
原创 进程间通信 (一)【管道通信(上)】
两个及以上的进程实现数据层面的交互,称为进程间的通信。进程间是互相独立的,又为了保证不打破进程之间的独立性,但又必须让不同的进程看到同一份 “资源”,这样才能够让进程间进行通信。 管道的本质是一个内存级别的文件。如果两个进程不具备血缘关系,不能用管道文件的方式进行通信呢
2024-09-25 15:49:39
1436
12
原创 【动态库的加载】【进程地址空间(三)】
探讨动态库的加载机制及其在进程地址空间中的作用。当可执行程序运行时,操作系统为其创建内核数据结构并加载代码和数据。动态库作为文件,也需要加载到内存,并通过页表映射到进程地址空间的共享区。多个进程可共享动态库,但全局变量如 errno 可能会导致互相影响,因写入会引发写时拷贝。程序在编译时已分配逻辑地址,加载后使用物理地址。动态库采用相对地址,避免绝对编址,以便灵活加载至任意位置。静态库则是直接拷贝,无需加载。
2024-09-22 15:30:26
1627
9
原创 【Linux】动静态库
在 linux 系统中,形如 libXXX.a 的文件称为静态库,对应是的静态链接;形如 libYYY.so 为动态库,对应的是动态链接,也是 gcc/g++ 的默认编译行为。但是对于动静态库 和 动静态链接,远远不只这些。
2024-09-19 15:50:30
1899
15
原创 【文件系统】软硬链接
目录文件的数据块存放的就是该目录下所有文件名 与文件对应的 inode 编号之间的映射关系,是一组 kv 结构的数据。软链接是一个独立的文件,对 file.txt 建立软链接,sotf-link 的 inode 编号与 file.txt 并不相同!因为软链接具有独立的 inode!硬链接的本质就是在特定目录的数据块中新增 文件名 和 硬链接指向的目标文件的 inode 编号的映射关系!
2024-09-15 15:05:14
1934
15
原创 【文件系统】Linux ext2
Data blocks: 存放文件内容的区域。inode Table: 单个文件的所有属性,主流的大小为 128 byte,一般都是一个文件分配一个 inode,每个 inode 具有唯一性。Block Bitmap: 比特位的位置和块号进行映射,比特位的内容即表示该块有没有被使用。node Bitmap: 比特位的位置和 inode 编号进行映射,比特位为1,代表映射对应的 inode 有效。Group Descriptor Table(GDT): 描述整个分组 Block Group 的基本使用情况。
2024-09-12 15:33:05
1855
11
原创 用户缓冲区
介绍上层用户缓冲区,以及语言层的 printf 等输出接口背后的本质。用户缓冲区刷新策略:无缓冲、行缓冲、全缓冲、以及进程退出时自动缓冲。缓冲区的作用:解决用户效率问题,配合格式化信息
2024-09-09 15:32:31
1363
11
原创 详谈重定向
文件描述符的分配规则;重定向的本质是在对文件描述符索引处的指针做修改,使其指向新的文件对象的地址;dup2 系统调用对进程打开的文件做重定向,dup2 拷贝的并不是文件描述符,文件描述符只是一个进程内核中特定数组的一个下标!拷贝的是这个下标内存储的指针数据!在内核层看待 linux 一切皆文件
2024-09-06 14:52:32
2199
16
原创 文件 fd
介绍系统调用 open、write 等接口访问文件、进程中的文件描述符表 fd 的本质就是一个数值下标,包括上层语言提供的 FILE* 类似的文件操作的类型,都是 fd 的封装,以及访问文件的本质就是在进程的文件描述符表填充一个指向 struct file 文件对象的指针
2024-09-03 16:58:28
2396
14
原创 进程程序替换
系统调用 excel 进行程序替换之后,execl 后续的代码并没有被执行。 exec* 类函数调用称为进程替换。替换发生时,操作系统简单粗暴的直接将原本程序的代码和数据替换成 目标程序的代码和数据(单进程情况),这就是进程替换! 子进程进程替换的时候不会影响父进程;代码也可以被写时拷贝!
2024-08-31 15:10:57
2752
17
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人