
Linux
文章平均质量分 82
℃绝心恋
这个作者很懒,什么都没留下…
展开
-
Linux:数据链路层——以太网协议、NAT协议、ARP协议和DNS协议
Linux:数据链路层——以太网协议以太网协议以太网帧格式MTU以及MTU对TCP、UDP、IP协议的影响MTU对TCP协议的影响六级标题以太网协议数据链路层:数据链路层是OSI参考模型中的第二层,介乎于物理层和网络层之间。数据链路层在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源自物理层来的数据可靠地传输到相邻节点的目标机网络层。他的作用就是负责相邻设备的转发。以太网:以太网不是一种具体的网络,而是一种技术标准;既包含了数据链路层的内容,也包含了一些物理层的内容。以太网是当前应用最广原创 2021-04-15 22:52:41 · 2037 阅读 · 16 评论 -
Linux:网络层——IP协议
IP协议先来看看我从百度百科上摘下来的定义,了解一下IP简单的了解一下IP协议:IP是Internet Protocol(网际互连协议)的缩写,是TCP/IP体系中的网络层协议。设计IP的目的是提高网络的可扩展性:一是解决互联网问题,实现大规模、异构网络的互联互通;二是分割顶层网络应用和底层网络技术之间的耦合关系,以利于两者的独立发展。根据端到端的设计原则,IP只为主机提供一种无连接、不可靠的、尽力而为的数据包传输服务。还有IP协议中的一些基本概念:主机:配有IP地址,但是不进行路由控制的设备原创 2021-04-12 13:23:07 · 492 阅读 · 5 评论 -
Linux:tcp协议——用这组图来了解确认应答机制、超时重传机制、滑动窗口机制、拥塞控制机制、延时应答机制和捎带应答机制
确认应答机制超时重传机制滑动窗口机制拥塞控制机制慢启动拥塞避免快重传快恢复延时应答机制和捎带应答机制原创 2021-04-07 21:17:31 · 1466 阅读 · 5 评论 -
Linux:TCP协议——四次挥手【图片+文字】
Linux:TCP协议——四次挥手【图片+文字】四次挥手四次挥手时客户端与服务端的状态转变理解为什么TIME_WAIT的时间是2MSL如果服务端或者客户端突然崩溃,会怎样四次挥手tcp协议的三次握手是通信双方建立连接的过程,而四次挥手其实就是通信双方断开连接时要经历的过程。而在通信双反断开连接时,无论是客户端先关闭(调用close函数,向服务端发送FIN),还是服务端先关闭(调用close函数,向客户端发送FIN)都要经历四次握手这个阶段。客户端:服务端:对于四次挥手,个人觉得和我们平时下班还原创 2021-04-05 17:52:12 · 1903 阅读 · 10 评论 -
Linux:TCP协议——三次握手【图片+文字】
Linux:TCP协议——三次握手【图片+文字】三次握手面向连接二级目录三级目录三次握手TCP协议:全称为 “传输控制协议(Transmission Control Protocol”). 人如其名, 要对数据的传输进行一个详细的控制。TCP协议段格式:源/目的端口号: 表示数据是从哪个进程来, 到哪个进程去;32位序号/32位确认号: 后面详细讲;4位TCP报头长度: 表示该TCP头部有多少个32位bit(有多少个4字节); 所以TCP头部最大长度是15 * 4 = 606位标志位:原创 2021-04-03 23:10:05 · 1748 阅读 · 12 评论 -
Linux:传输层——UDP协议
Linux:传输层——UDP协议传输层主要的工作端口UDP协议面向数据报UDP协议报头字段含义数据长度u_int16 tuh_ulen校验和u_int16_t uh_sum校验和的计算方式UDP缓冲区UDP的应用传输层主要的工作在开始介绍UDP协议之前,我们需要了解传输层是负责端(可以理解成端口)与端之间的传输的,不论是传输层协议中的UDP协议还是TCP协议,都是负责端口与端口之间的数据传输。“传输层只负责端口,不负责IP(IP是网络层在负责)”。端口端口号(Port)标识了一个主机上进行通信的不同原创 2021-03-31 23:26:26 · 1472 阅读 · 12 评论 -
Linux:使用cpp-httplib创建一个简单的服务器
这里写目录标题cpp-httplib下载步骤cpp-httplibcpp-httplib是一个header-only的跨平台HTTP/HTTPS服务器和客户端C++开源库,可以使用它来完成服务端和客户端,我们使用的时候只需要包含“httplib.h”这个头文件就可以了,非常方便。在Linux中使用cpp-httplib库时,只需要把它下载下来,然后在写代码时包含该头文件就可以了。下载步骤我们在可以进入gitee直接搜索cpp-httplib,点击第一个也可以直接点击我给大家找到的连接直接进入原创 2021-03-30 16:55:57 · 2424 阅读 · 4 评论 -
Linux:应用层——自定制协议和http协议
Linux:应用层——自定制协议和http协议自定制协议tcp的粘包问题hhttp协议urlurlencode和urldecodeHTTP数据包格式请求响应自定制协议自定制协议:自定制协议工作在应用层,被程序员定义出来的协议,又叫应用层协议,在应用层对要传输的进行数据格式的约定,消息的发送方和接收方都应要遵守约定。tcp的粘包问题简单的说这个问题的就是对于消息接收方来说不能准确的区分当前数据是那一次发送过来的数据。就比如加入现在服务端提供一个加法的功能,要求客户端提供两个数字和一个“+”这样的数据,原创 2021-03-29 20:14:27 · 804 阅读 · 2 评论 -
Linux:从网卡中抓取数据包
Linux:从网卡中抓取数据包用到的工具Linux下抓包步骤1.切换到root用户2.使用tcpdump命令开始抓包3.启动程序,并发送数据(以一个但执行流TCP程序为例)4.结束抓包5.把刚才抓包的文件传到Windows系统Windows下抓包用到的工具windows:Wiresharklinux:tcpdump命令tcpdump -i any port [端口] -s 0 -w 名称Linux下抓包步骤1.切换到root用户2.使用tcpdump命令开始抓包3.启动程序,并发送数据(原创 2021-03-27 17:03:31 · 2040 阅读 · 1 评论 -
Linux:网络编程——TCP编程步骤以及多个版本的TCP代码
Linux:网络编程——TCP编程步骤以及多个版本的TCP代码TCP编程连接服务器监听接收新连接发送数据接收数据多个版本的TCP单执行流多进程多线程TCP编程TCP的编程步骤和UDP的有一定的差异,但是也有一些步骤是相同的,比如都需要创建套接字和绑定地址信息。下面我们就一起来看看TCP的编程步骤:客户端:创建套接字、绑定地址信息(不推荐)、连接服务器、发送数据、接收数据、关闭套接字服务端:创建套接字、绑定地址信息、监听、接收新连接、接收数据、发送数据、关闭套接字和UDP相比,TCP编程多了一些步骤原创 2021-03-25 22:52:12 · 653 阅读 · 0 评论 -
Linux:网络编程——UDP代码及其封装
Linux:网络编程——UDP代码及其封装UDP代码二级目录三级目录UDP代码客户端: #include <arpa/inet.h> #include <iostream> #include <string> using namespace std; int main() { int sockfd = socket(AF_INET,原创 2021-03-23 16:59:44 · 978 阅读 · 1 评论 -
Linux:网络编程——UDP编程的前期准备
Linux:网络编程——UDP编程的前期准备字节序TCP与UDP的区别UDP编程的流程1.创建套接字创建套接字的意义2.绑定地址信息(1)绑定ip和端口(2)函数3.UDP发送数据4.UDP接收数据5.关闭套接字字节序字节序是一个处理器架构特性,用于指示像整数这样的大数据类型内部的字节如何排序。分为大端字节序和小端字节序,对应大端机器和小端机器。大端字节序:即把数据的高字节放到低地址中小段字节序:高字节放到高地址中我们可以使用一串简单的代码来确定我们的机器是小端机器还是大端机器: #includ原创 2021-03-21 23:57:47 · 465 阅读 · 1 评论 -
Linux:初识网络
Linux:初识网络网络的的发展网络协议初识OSI七层模型TCP/IP五层(或四层)模型数据包封装和分用网络传输基本流程网络的的发展网络的发展经历了一个由简单到复杂的的过程,在之前的独立模式,计算机之间是相互独立,到后来网络互联把多台计算机连接在一起,完成数据共享,而后来的局域网LAN通过交换机和路由器把计算机连接在一起,使得计算机的数量增加了;广域网则将远隔千里的计算机都连接在一起。网络协议初识那么什么是协议的,其实协议有点类似于我们和某人约定用什么语言(比如汉语或者英语)来交流一样,如果我们约定原创 2021-03-20 19:16:25 · 249 阅读 · 1 评论 -
Linux:多线程——生产者与消费者模型
Linux:多线程——生产者与消费者模型二级目录三级目录代码:#include <stdio.h> #include <stdlib.h> #include <unistd.h&g原创 2021-03-15 22:30:29 · 448 阅读 · 0 评论 -
Linux:多线程——死锁以及使用gdb调试多线程程序时常用的命令
Linux:多线程——死锁以及使用gdb调试多线程程序时常用的命令死锁死锁产生的四个必要条件预防死锁使用gdb调试多线程程序时常用的命令死锁死锁:指在一组进程中的各个进程均占有不是放的资源,但因相互申请被其他进程所占用不会释放的资源而处于的一种永久等待状态。情况一:当多个执行流使用同一个互斥锁的时候,有一个执行流获取到互斥锁之后,没有释放互斥锁,导致其他执行流都卡死在加锁的接口中的现象被称之为死锁。情况二:多个执行流,多个互斥锁的情况下,没一个执行流都占有一把互斥锁,但是都想申请对方的互斥锁,这种情原创 2021-03-14 23:54:57 · 384 阅读 · 0 评论 -
Linux:线程安全
Linux:线程安全从抢票说起二级目录三级目录从抢票说起我们先写一个程序来模拟一下抢票:创建4个线程(代表4个人),票数为100(全局变量int g_tickets = 100;),每个执行流执行之后g_tickets减一,代表抢到了票,后面打印出抢到了第几张票。#include <stdio.h> #include <pthr原创 2021-03-14 19:11:13 · 254 阅读 · 0 评论 -
Linux:线程控制
Linux:线程控制线程的创建二级目录三级目录线程的创建前面我们已经基本了解了线程的基本概念,接下来我们面临的问题就是是怎让创建一个线程了,在Linux中可以用pthread_create函数来创建线程.函数原型:#include <pthread.h> int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);原创 2021-03-09 22:22:04 · 452 阅读 · 1 评论 -
Linux:多线程简介
Linux:多线程线程概念线程的优缺点线程异常与用途进程与线程线程概念首先我们来回顾一下进程的概念:进程是指指正在运行的程序。确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程序,并且具有一定独立功能而线程的概念为:线程是进程中的一个执行单元,负责当前进程中程序的执行,一个进程中至少有一个线程。一个进程中是可以有多个线程的,这个应用程序也可以称之为多线程程序。下面的图片为我们展示了单线程与多线程.线程机制是现代编程技术中常用的一种抽象概念,该机制提供了在同一个程序内共享内原创 2021-03-08 21:49:58 · 227 阅读 · 0 评论 -
Linux:进程间通信——共享内存
Linux:进程间通信——共享内存原理共享内存的创建将共享内存附加到进程将共享内存和进程分离操作共享内存原理共享内存的原理是:在物理内存中开辟一段空间,这段物理内存的空间可以被不同的进程附加到自己的共享区中,附加的进程再通过操作共享区来实现数据的交换。共享内存的创建知道共享内存的原理以后,接下来我们要关心的问题是怎样创建一个共享内存,Linux中可以用shmget函数来创建共享内存。函数原型:#include <sys/shm.h>int shmget(key_t key,siz原创 2021-03-05 16:39:41 · 696 阅读 · 0 评论 -
Linux:进程间通信——命名管道
进程间通信——命名管道命名管道命名管道的创建命令创建函数创建特性命名管道和匿名管道一样,命名管道也是在内核中开辟的一段缓存区,不过和匿名管道不同的是,这段缓存区是有标识符的,这也就意味着不同的进程,不需要有亲缘关系,只需要通过标识符就能找到该缓冲区了。命名管道的创建命令创建命名管道可以从命令行上创建,命令行创建是使用下面这个命令:mkfifo filename"p"代表文件类型为管道文件注意:该文件是不支持直接写的,该文件的作用是通过它我们可以找到内核中的创建的缓冲区函数创建相关函数原创 2021-03-04 23:22:23 · 394 阅读 · 1 评论 -
Linux:进程间通信——匿名管道
Linux:进程间通信——匿名管道进程间通信匿名管道匿名管道的创建管道的读写规则进程间通信因为每一个进程都拥有自己的独立的进程虚拟地址空间,导致了进程的独立性。进程间的通信技术是为了让各个进程之间可以很好的交换数据或者进程控制而产生的。常用的进程间通信的方式有管道、共享内存、消息队列和信号量。匿名管道管道有分为匿名管道和命名管道两种,接下来主要介绍管道通信中的匿名管道。匿名管道就是指在内核中创建出来的一块没有标识符的一段缓冲区。匿名管道的创建在Linux系统中,可以用pipe函数来创建匿名管道原创 2021-03-03 23:06:39 · 499 阅读 · 5 评论 -
Linux:动态库和静态库
Linux:动态库和静态库概念概念动态库:程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码静态库:程序在编译的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库...原创 2021-03-02 20:34:36 · 484 阅读 · 0 评论 -
Linux:软硬链接
Linux:软硬链接软硬链接软连接硬链接:总结:软硬链接我们通过举例子来理解软硬连接。软连接首先我们先touch一个文件aaa向其中追加内容使用ln -s [源文件] [生成的软链接文件] 命令生成软连接bbb此时再看bbb里面的内容,和aaa里的内容是一样的然后我们在把源文件删除,用ll命令查看,发现bbb找不到源文件在向bbb中写入数据发现源文件又生成了,所以,删除的时候最好时软链接文件和源文件一起删除硬链接:同样以aaa为例子我们生成硬链接,此时aaa文件中的数据为原创 2021-02-27 18:36:58 · 266 阅读 · 0 评论 -
Linux:简单理解文件系统内附Linux内核设计与实现PDF下载地址
简单理解文件系统文件系统ext2文件系统文件的存储文件的获取文件系统文件存储的方式有线性存储和离散存储两种,线性存储可能会导致磁盘的利用率降低,产生磁盘碎片,离散存储方式会提高程序对磁盘的利用率,以下是Linux内核简设计与实现中关于文系统的一段话的一部分:文件通过目录组织起来。文件目录好比一个文件目录好比一个文件夹,用来容纳相关文件。因为目录也可以包含其他目录,及子目录,所以目录可以层层嵌套,形成文件路径。路径中的每一部分都被称作目录条目。“/home/wolfman/butter”是文件路径的一原创 2021-02-27 18:35:59 · 2015 阅读 · 4 评论 -
Linux:文件句柄泄漏问题
Linux:文件句柄泄漏问题产生原因进程中打开的文件数量产生原因文件句柄泄漏,也叫文件描述符泄漏,当我们打开一个文件,操作系统就会给程序分配一个文件描述符,如果在使用完成之后,没有及时的关闭文件,就会造成文件句柄泄漏的问题。进程中打开的文件数量在Linux中,一个进程中打开的最大文件数量可以用ulimit -a查看图中的open files 后面的1024为打开文件的最大数量,但是打开文件的最大数量是可以被更改的,在Linux中我们可以用ulimit -n[num]修改打开文件的最大数量。注意原创 2021-02-27 00:53:39 · 1665 阅读 · 0 评论 -
Linux:基础IO——复习C语言文件IO相关操作
Linux:基础IO——复习C语言文件IO相关操作1.C语言操作文件接口2.系统调用函数的操作文件接口三级目录1.C语言操作文件接口(1) fopen函数函数原型:FILE *fopen(const char *path,const char *mode);参数解释:path:待打开的文件(文件路径 + 文件名称)mode:以何种方式打开返回值:打开文件成功返回文件流指针,打开失败返回NULL打开方式:打开方式解释r以只读方式打开,当文件不存在的时候,就会打开失败原创 2021-02-26 17:14:04 · 326 阅读 · 2 评论 -
Linux:程序替换
Linux:程序替换程序替换替换原理替换方法函数规律程序替换程序替换简单的说就是重新加载另一个程序到内存中;然后将现有的一个pcb的内存得指针指得内存空间指向这个新得程序,则这个现有得pcb就跑去调度这个新的程序了替换原理用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往要调用一种exec函数以执行另一个程序。当进程调用一种exec函数时,该进程的用户空间代码和数据完全被新程序替换,从新程序的启动例程开始执行。调用exec并不创建新进程,所以调用exec前原创 2021-02-17 16:10:49 · 298 阅读 · 0 评论 -
Linux:进程等待
Linux:进程等待进程等待进程等待的两种方法1.wait方法`2.waitpid方法获取子进程status进程等待进程等待指的就是父进程等待子进程退出;为了获取退出子进程返回值;释放退出子进程所有资源;由此可以看出进程等待是非常重要的,前面我们说过,当子进程退出,如果父进程不管不顾,就可能使子进程成为僵尸进程,进而造成内存泄漏,而我们也知道僵尸进程非常难以处理,就算是kill-9也无法将它“消灭”,就像成为僵尸的人一样,对于我们来说他已经死了,不能再被杀死第二次了。而我们想知道父进程派给子进程的任务完原创 2021-02-17 00:33:48 · 283 阅读 · 0 评论 -
Linux:进程创建详解
Linux:进程创建详解进程创建1.fork函数写时拷贝调用失败的原因2.vfork函数进程终止正常退出的三种方法_exit和exit的区别进程创建现在我们已经知道进程的概念以及怎样创建一个进程,接下来我们来详细探索一下进程创建的细节。1.fork函数在Linux中fork函数可以从已存在的进程中创建一个新进程,新进程为子进程,原进程为父进程#include <unistd.h> //头文件pid_t = fork(void);//返回值有三种情况//pid_t = 0 表示子原创 2021-02-15 23:01:46 · 3698 阅读 · 0 评论 -
Linux:程序地址空间及常见页面置换算法
程序地址空间及常见页面置换算法研究背景以及定义虚拟内存操作系统中管理内存的三种方法:1.分段式2.分页式3.段页式缺页中段解决方法——页面置换算法1.最佳(Optimal)置换算法2.先进先出(FIFO)页面置换算法3.LRU(Least Recently Used)置换算法4.最少使用(Least Frequently Used,LFU)置换算法5.简单的Clock置换算法---最近未使用(NRU)算法研究背景以及定义环境:32为平台在了解程序地址空间之前我们需要知道:地址:内存地址------对原创 2021-02-14 20:12:33 · 803 阅读 · 0 评论 -
Linux进程状态以及僵尸进程于孤儿进程的产生
Linux进程状态简述Linux下的进程状态通过系统调用fork()创建子进程僵尸进程在了解了进程的基本概念以及进程的创建等概念以后,接下来我们需要了解进程的状态。那么什么是进程状态呢?简单的说进程状态就是把一个进程在不同的时间划分为不同的状态。它描述了一个进程在什么时间做什么样的事情。一般情况下进程有三种状态,就绪,运行,阻塞。状态名称描述就绪进程已经具备运行条件,但是CPU还没有分配过来,拿到时间片就可以运行执行进程占用CPU,并在CPU上运行阻塞进程因等待某原创 2021-02-04 16:29:44 · 138 阅读 · 0 评论 -
Linux环境变量及其设置
Linux环境变量及其设置环境变量常见环境变量有关环境变量的一般指令操作在代码中获取环境变量的三种方法环境变量概念:环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数。简单来说就是一个变量,用于存储系统的环境参数。作用:通过修改环境变量的值,灵活的配置系统运行环境参数(使系统环境配置更加灵活)常见环境变量PATH指定命令的搜索路径HOME指定用户的主要工作目录(即用户登录到Linux系统中时,默认的目录)SHEL原创 2021-02-04 16:29:01 · 290 阅读 · 0 评论 -
使用gdb调试程序
使用gdb调试程序背景二级目录三级目录背景开始之前,我们需要先了解以下内容:1.程序的发布方式有两种,debug模式和release模式2.Linux gcc/g++出来的二进制程序,默认是release模式3.要使用gdb调试,必须在源代码生成二进制程序的时候加上-g选项二级目录三级目录...原创 2021-02-03 23:14:56 · 371 阅读 · 0 评论 -
进程简述
进程简述什么是进程?二级目录三级目录什么是进程?总的来说进程的概念有多个定义,例如:1.进程是指正在执行的程序2.进程是正在计算机上执行的程序示例3.能分配给处理器并由处理器执行的实体4.具有一下特征的活动单元:一组指令序列的执行、一个当前状态和相关的系数的系统资源集二级目录三级目录...原创 2021-02-03 23:14:12 · 277 阅读 · 0 评论 -
vim的基本操作
vim的基本操作Vim常用的三种模式Vim的基本操作Vim正常模式常用模式命令:转至插入模式:移动光标:删除文字:复制:替换:撤销上一次操作:更改:Vim底行模式命令集合列出行号:跳转到文件中某一行:查找字符:保存文件「w」:Vim常用的三种模式1. 命令模式:控制屏幕光标的移动、字符、字和行的删除,移动复制某区段及进入插入模式下,或者底行模式2. 插入模式:只有在插入模式下,才可以做文字输入,按【ESC】键可回到命令行模式。3. 底行模式:文件保存或者退出,也可以进行文件替换,查找字符串,列出行号原创 2021-02-03 23:13:23 · 822 阅读 · 0 评论