- 博客(52)
- 收藏
- 关注
原创 网络基础(三)——网络层
网络层解决的问题是将数据从一台主机送到到另一台主机,即在复杂的网络环境中确定一个合适的路径。ip = 目标网络 + 目标主机(在构建网络的时候,为我们将来高速定位一台主机,提供了基础保障)
2024-05-12 12:37:17
1047
原创 网络基础(二)——传输层
描述的是,发送方不用等待ACK一次所能发送的数据最大量。这里滑动窗口的大小是与TCP的窗口大小(对方的接收能力)是相关的。1、窗口大小指的是无需等待确认应答而可以继续发送数据的最大值。上图的窗口大小就是4000个字节四个段)。2、发送前四个段的时候不需要等待任何ACK,直接发送;3、收到第一个ACK后滑动窗口向后移动继续发送第五个段的数据;依次类推;4、操作系统内核为了维护这个滑动窗口需要开辟发送缓冲区来记录当前还有哪些数据没有应答;只有确认应答过的数据,
2024-04-15 13:07:20
1145
原创 网络基础(二)——HTTPS协议原理
加密就是把明文(要传输的信息)进行一系列变换,生成密文。解密就是把密文再进行一系列变换,还原成明文。在这个加密和解密的过程中,往往需要一个或者多个中间的数据,辅助进行这个过程,这样的数据称为秘钥。数字指纹(数字摘要),其基本原理是利用单向散列函数(Hash函数)对信息进行运算,生成一串固定长度的数字摘要。数字指纹并不是一种加密机制,但可以用来判断数据有没有被篡改。
2024-04-04 11:24:11
848
原创 网络基础(二)——HTTP协议
首先我们来看一个域名:http://www.baidu.com/,很明显这是百度的域名,但是结合我们之前的知识其实这个域名做过包装,实际上可以解析成ip地址的形式。所以这里我们用ip地址220.181.38.150:80(http绑定端口号80,https绑定端口号443)也可以访问百度。了解了这些后我们来看看域名的整体结构:服务器地址后面的一串文件索引就是url(统一资源定位符),所有网络上的资源,都可以用唯一的一个“字符串标识”,并且可以获取到。我们要知道。
2024-03-31 12:27:13
788
原创 Linux——进程信号(二)
因此,未决标志和阻塞标志可以用相同的数据类型sigset_t来存储,sigset_t称为信号集,这个类型可以表示每个信号的“有效”或“无效”状态,在阻塞信号集中“有效”和“无效”的含义是该信号是否被阻塞,而在未决信号集中“有效”和“无效”的含义是是该信号是否处于未决状态。当某个信号的处理函数被调用时,内核自动将当前信号加入进程的信号屏蔽字,当信号处理函数返回时自动恢复原来的信号屏蔽字,这样就保证了在处理某个信号时,如果这种信号再次产生,那么它会被阻塞到当前处理结束为止。signo 是指定信号的编号。
2024-03-20 13:41:35
619
原创 网络编程套接字——实现简单的TCP网络程序
下面介绍程序中用到的socket API,这些函数都在sys/socket.h中。socket()打开一个网络通讯端口,如果成功的话,就像open()一样返回一个文件描述符;应用程序可以像读写文件一样用read/write在网络上收发数据;如果socket()调用出错则返回-1;对于IPv4, family参数指定为AF_INET;对于TCP协议,type参数指定为SOCK_STREAM, 表示面向流的传输协议;protocol参数的介绍从略,指定为0即可。
2024-03-20 13:28:17
843
原创 网络编程套接字——实现简单的UDP网络程序
首先我们先来解决一个问题,在进行网络通信的时候,是不是我们的两台机器在进行通信呢?答案肯定是不是的,在网络协议中的下三层,主要解决的是,数据安全可靠的运送到远端机器,但是使我们的用户使用应用层软件,完成数据发送和接收的,软件对应的自然就是进程,所以,那么问题又来了,我们两台主机在进行通信时,传输层的上层应用层不止有一个应用软件,该如何区分呢?那么我们来总结一下端口号的特性;端口号是一个2字节16位的整数端口号用来标识一个进程,告诉操作系统,当前这个数据要交给哪个进程处理。
2024-03-14 12:13:50
1015
原创 Linux——进程间通信(共享内存)
共享内存区是最快的IPC形式。一旦这样的内存映射到共享它的进程的地址空间(即内存通过某种映射关系连接到了进程使得进程能够访问这段内存),这些进程间数据传递不再涉及到内核,换句话说是进程不再通过执行进入内核的系统调用来传递彼此的数据。(具体的方法就是将物理内存映射到进程的地址空间中,本质就是修改页表,在虚拟地址空间中开辟空间,用的是系统调用接口)shm的生命周期是随内核的,进程不主动删除或者用命令删除,共享内存就一直存在,直到关机重启。我们之前的文章介绍的管道通信本质是基于文件的,OS没有做过多的设计工作。
2024-01-25 19:31:56
1641
1
原创 C++——特殊类设计
1. 设置成私有:如果只声明没有设置成private,用户自己如果在类外定义了,就可以不。信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再。2. 只声明不定义:不定义是因为该函数根本不会调用,定义了其实也没有什么意义,不写。如果单例对象构造十分耗时或者占用很多资源,比如加载插件啊, 初始化网络连接啊,读取。文件啊等等,而有可能该对象程序运行时不会用到,那么也要在程序一开始就进行初始化,2. 提供一个静态的成员函数,在该静态成员函数中完成堆对象的创建。
2023-11-10 12:02:57
93
原创 C++——智能指针
6. 但是_next属于node的成员,node1释放了,_next才会析构,而node1由_prev管理,_prev。auto_ptr的实现原理:管理权转移的思想,下面简化模拟实现了一份bit::auto_ptr来了解它的原理。2. node1的_next指向node2,node2的_prev指向node1,引用计数变成2。shared_ptr的原理:是通过引用计数的方式来实现多个shared_ptr对象之间共享资源。1. 工程前期良好的设计规范,养成良好的编码规范,申请的内存空间记着匹配的去释放。
2023-11-04 12:39:38
58
原创 C++——位图和布隆过滤器
同理,布隆过滤器也不能直接删除,因为可能会影响到其他的元素。这道题的解法有很多,最简单的就是遍历一遍,时间复杂度为O(n),也可以排序后再使用二分查找,但是无论用哪种方法,怎么样存这40亿个数首先就是个问题,它所占用的空间太大了,所以这里就可以使用位图,用比特位置1的方式来代表一个数据存在,那么原本一个整形的4字节就可以用来表示32个位数的值是否存在。所谓位图,就是用每一位来存放某种状态,适用于海量数据,数据无重复的场景。亿个不重复的无符号整数,没排过序。,它是用多个哈希函数,将一个数据映射到位图结构中。
2023-10-07 15:19:32
44
原创 C++——unordered系列关联式容器与哈希
当向一个结构中插入元素时,根据一个函数计算出元素的插入位置并存放,同样搜索时也根据这个函数计算出存储位置在此结构中取出元素,若元素相同则查找成功,这样的一个形式被称为哈希(散列)方法,哈希方法中使用的函数是哈希(散列)函数,构造出来的结构被称为哈希(散列)表。这种情况就是一个简单的哈希函数示例,但是这种情况会出现一个问题,就是如果计算出的哈希地址为相同的怎么办?拿这个例子,如果插入的值为43,计算出来后的哈希地址为3,此时出现了哈希冲突,那么就从这个冲突位置开始找到空的4位置进行插入。
2023-10-07 14:13:22
46
原创 C++——AVL树
AVL树又名平衡二叉树,实际上也是一颗二叉搜索树,只不过需要满足特定的条件:就是要保证左右子树的高度之差(简称为平衡因子)的绝对值不超过1。如果30节点有右孩子,那么就需要将它的右孩子放在60节点的左孩子处(因为30节点的右孩子一定比30大但比60小)如图就是一颗建议的AVL树,我们规定平衡因子的值为右子树高度减去左子树高度。也要考虑到60是根节点还是子树的情况,需要更新根节点或者记录60节点的双亲。需要注意的事项与实现也与上一种情况相同。1、按照二叉搜索树的方式插入。2、调节节点的平衡因子。
2023-10-02 11:05:04
44
原创 C++——map和set
s.count(x) //返回x的个数(对于set无意义,但对于multiset有意义)m.count(x) //返回x的个数(对于map无意义,但对于multimap有意义)s.erase(1,3) //删除在区间[1,3)中的元素。s.erase(1,3) //删除在区间[1,3)中的元素。s.erase(it) //删除迭代器it位置的元素。s.erase(it) //删除迭代器it位置的元素。s.earse(1) //删除键值为1的元素。s.earse(1) //删除值为1的元素。
2023-09-30 12:23:08
46
原创 排序(二)选择排序与堆排序(C语言实现)
这个时候max在i = 1的位置没有变化,而min需要和这个位置的值进行交换,那么此时max所对应的值就到了min所在的位置,所以为了防止排序出错,此时需要更新max到min的位置。堆排序的原理是在大堆或小堆的基础上将根节点与最后一个节点交换,然后进行向下调整,因为大堆或小堆的根节点是整个堆中最大或最小的值,所以一直取堆顶元素最终会达到有序。选择排序的思想其实就是选出数组中最小与最大的值分别放到数组的开头与结尾,然后选出次小的和次大的排在数组第二位和倒数第二位···直到排完。
2023-04-02 14:13:18
63
原创 链式二叉树的基本操作(C语言)
要求整棵二叉树节点的个数,就要先求左子树节点的个数,再求右子树节点的个数,最后加上一个根节点,而对于左右子树也是这样的递归思想。要求树的高度,其实就是求左右子树高度大的那一个再加上一个根节点的高度,将左右子树的高度提前保存可以减少递归的次数。求二叉树的第k层节点数量,也就是求根节点的左子树的第k-1层数量加上右子树的第k-1层数量。二叉树的前、中、后序遍历中这个前中后都是根据根节点被访问的顺序而定的,所以。中序遍历是先访问左子树,再访问根节点,最后访问右子树;1、前、中、后序遍历。1、前、中、后序遍历。
2023-04-01 08:43:32
85
原创 环形链表——快慢指针方法原理详解
如上图所示环形链表的数学模型,O为链表起点,A为进入环的入口,B则为快慢指针相遇的地方,关于快慢指针为什么会相遇,因为快指针比走的步数是慢指针的两倍,只要存在环 ,经过有限次循环是必然会相遇的。当s1走过了(m - 2n - 1)*c的距离后离A点还剩z距离,而s2是走了(m - 2n - 1)圈后回到了B点,也离A剩z距离 ,所以它们相遇的位置便一定是环的入口。现设O到A的距离为x,A到B的距离为y,B到A的距离为z,整个环的周长为c,那么慢指针走过的距离就是。,快指针走过的距离就是。
2023-03-20 22:57:42
335
2
原创 C++入门学习(六)
类模板实例化与函数模板实例化不同,类模板实例化需要在类模板名字后跟,然后将实例化的类型放在中即可,类模板名字不是真正的类,而实例化的结果才是真正的类。函数模板是一个蓝图,它本身并不是函数,是编译器用使用方式产生特定具体类型函数的模具。函数模板代表了一个函数家族,该函数模板与类型无关,在使用时被参数化,根据实参类型产生函数的特定类型版本。用不同类型的参数使用函数模板时,称为函数模板的实例化。模板参数实例化分为:隐式实例化和显式实例化。// Vector类名,Vector才是类型。...
2022-08-09 08:35:46
47
原创 C++入门学习(五)
/ new/delete 和 malloc/free最大区别是 new/delete对于【自定义类型】除了开空间。注意:在申请自定义类型的空间时,new会调用构造函数,delete会调用析构函数,而malloc与。注意:申请和释放单个元素的空间,使用new和delete操作符,申请和释放连续的空间,使用。什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现。...
2022-08-08 08:21:03
248
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人