![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
笔记
DaysAway
为秃头而奋斗
展开
-
关于哈希的一致性
一致性哈希算法的基本概念其实,一致性哈希算法也是使用取模的方法,只是,刚才描述的取模法是对服务器的数量进行取模,而一致性哈希算法是对2^32取模,什么意思呢?我们慢慢聊。首先,我们把二的三十二次方想象成一个圆,就像钟表一样,钟表的圆可以理解成由60个点组成的圆,而此处我们把这个圆想象成由2^32个点组成的圆,示意图如下:圆环的正上方的点代表0,0点右侧的第一个点代表1,以此类推,2、3、4、5、6……直到2^32-1,也就是说0点左侧的第一个点代表(2 ^ 32)-1,我们把这个由2的32次方个点组原创 2022-03-10 09:17:47 · 222 阅读 · 0 评论 -
hash functions
这里我们看一看标准库自己实现的hash function吧:标准库的hash函数只针对内置类型,对于自定义类型无法进行hash;其hash值输出为下图:不同版本的编译器对应的hash函数有所不同。这里附上vs2019的hash源码...原创 2022-01-27 08:00:00 · 206 阅读 · 0 评论 -
容器篇之hash_table
首先说一下hashtable的基本结构:由vector来维护,vector中的每一个元素都是指针类型指向一个自由链表,有种二级空间配置器的感觉哦。当自由链表元素过多时会导致查询的时候速度过慢,当链表元素大于vector长度时,将该链表断开,对vector进行扩充,随后重新对链表元素进行分配,这里的分配方法是除留余数法,元素除以vector长度所留余数即为存储位置的下标。...原创 2022-01-26 07:00:00 · 250 阅读 · 0 评论 -
lambdas表达式(二)
上节说到简单的lambdas表达式的语法和应用,这里接着上节继续讲讲lambdas表达式吧。lambdas也可以和set一起使用,作为set第二参数,其中decltype是获取tmp的返回类型,这里会调用set的构造函数进行初始化set<>里的第二参数实际上就是我们写的lambdas表达式,而lambdas要做的是对传进来的参数进行比大小,也就是说我们使用我们自己定义的比大小规则替代了set本身的compare准则。但是这里有一个小bug,那就是myset(tmp)这里的tmp会报错,原原创 2022-01-25 20:30:00 · 184 阅读 · 0 评论 -
C++2.0新特性之lambdas(一)
什么是lambdas?在2.0中加入lambdas表达式,它允许我们定义出 ‘被用来当成一个参数或者是局部对象的内联函数’。lambdas改变了对标准库的使用。lambdas最简单的使用方法:[] {std::cout<<“hello lambdas”<<std::endl;}我们可以通过后面加 ‘()’ 的方式直接调用它:[] {std::cout<<“hello lambdas”<<std::endl;}(); //prints “he原创 2022-01-25 13:00:00 · 598 阅读 · 0 评论 -
C++ 2.0新特性(续)
上节说到2.0新加的几个头文件和标准库,这节说一下2.0新添加的关键字:delete和default;1,delete本意删除的意思,在2.0中是这样使用:String()=delete;意思是删除默认的构造函数,也就是说在创建实例对象时,编译器不会再调用默认的构造函数,如果没有写其他的构造函数的话就会报错,如图测试:一定注意,析构函数在delete的时候一定要谨慎,不然会很麻烦的。2 default则是默认的意思,用法与delete相同,以上图类为例,My_class() =default,意思原创 2022-01-25 08:00:00 · 210 阅读 · 0 评论 -
浅谈C++ 2.0新特性
C++1.0也就是我们俗称的C98,而C++2.0则是C11/14的统称,而从1.0到2.0C++又增加了那些新特性呢?在这里就浅谈一下C11/14的新特性吧!1,首先是header file部分,1.0版本时的头文件是一定要.h的,eg:#include<stdio.h>,而2.0版本可以去掉.h了,eg:#include2.0新添加的头文件:#include<unordered_set>#include < array>#include <type_t原创 2022-01-24 18:00:00 · 654 阅读 · 0 评论 -
关于new和delete
new和delete也是老生长谈的问题了。这里再次说一下个人对其的理解。1,首先是new:new是关键字而非和malloc一样如果空间分配错误会返回nullptr,new失败会抛出异常——throw();在调用new时如果对new没有进行重载就会调用全局new,也就是::operator new(),如果是自定义类型还会调用构造函数进行实例化对象的操作,new的内部最终是调用malloc进行空间分配。注:::operator new可以进行重载,其内容可以根据自身需要进行选择合适的内存分配方法(但是重原创 2022-01-24 09:00:00 · 231 阅读 · 0 评论 -
连的IP 地址存在,但端口号不存在的主机的握手过程是怎么样的?
前面已经提到的过IP地址压根就不存在的情况。想知道的同学可以回到我上一节的内容查看。假如IP地址存在但端口号是瞎编的呢?它的握手过程会是怎么样的呢?现象也比较简单,IP地址是存在的,也就是在互联网中这个机器是存在的。那么我们可以正常发消息到目的IP,因为对应的MAC地址和IP都是正确的,所以,数据从数据链路层到网络层都很OK。直到传输层,TCP协议在识别到这个端口号对应的进程根本不存在时,就会把数据丢弃,响应一个RST消息给发送端。此图来源于网络,不可用于商业RST字段在前几节有所涉及,这里原创 2022-01-12 15:00:00 · 945 阅读 · 0 评论 -
连接一个不存在的IP的主机时,握手是怎么样的?
我们先来看看正常的握手过程:服务器端启动之后调用LISTEN方法后回进入LISTEN状态,等待连接,客户端调用connect(IP地址)方法发起连接,向IP地址发起第一次握手,发送SYN到目的服务器。服务器在收到第一次握手之后,就会响应发出SYN,ACK,这是第二次握手。客户端在收到服务器发送的SYN时,也会响应发送一个ACK,至此三次握手结束,客户端和服务器都进入ESTABLISHED状态。以上为TCP的三次握手的抓包过程。那么,当我们连接一个IP地址不存在的主机时的握手是什么样呢?首先我原创 2022-01-12 09:00:00 · 544 阅读 · 0 评论 -
HTTP补充内容
众所周知,服务器与客户端想要进行数据传输就需要双方建立通信连接,常见的就是TCP连接,也就是三次握手,但是,当我们打开浏览器页面时,查看资源可以发现,会有很多资源状态码(200),那是不是每一个资源都要进行一次TCP连接呢?如上图所示,每一次返回成功状态码都表示一次资源请求的成功,按理说,每一个资源的请求都得有一次请求连接,但是,是否是每一个资源的请求都会有三次握手呢?答案当然是不会的!这么多资源,得进行多少次三次握手啊,想想就很耗时,所以自然是不会的,那么这么多资源到底是怎么样传输的呢?接下来给大家解原创 2022-01-11 08:00:00 · 171 阅读 · 0 评论 -
TCP报文
首先我们来看一看TCP报文格式:端口号:用来标识同一台计算机的不同的应用程序。1,源端口:源端口和IP地址的作用是标识报文的返回地址。2,目的端口:端口指明接收方计算机上的应用程序接口。TCP报头中的源端口号和目的端口号同IP数据报中的源IP和目的IP唯一确定一条TCP连接。URG:当URG=1时表示报文中有紧急数据需要发送,通常配合紧急指针使用ACK:与确认号关联,当ACK=1时,才可以读取确认号,为0时则无法读取确认号,就认为建立连接失败,所以ACK是用来确认连接的,一旦三次握手成功,则所原创 2022-01-09 07:00:00 · 1337 阅读 · 0 评论 -
HTTP请求之POST和GET
相信对于HTTP大家也是耳闻熟详了,对于它的TCP连接也是老八股了,相信什么三次握手和四次挥手也是老生常谈的东西了,这些不是今天文章的主要内容,所以在这里就不细说了,接下来就进入主题吧!每次当大家在输入栏中输入URL地址后就会呈现出界面,有没有想过他是通过什么方法来得到?在HTTP中请求方法有两种:POST和GET直接在地址栏里输入的请求是GET请求,而POST是将资源请求放在表单进行操作的,GET请求的资源可以放在URL的参数中,POST将资源的请求放在body里,这样的做的好处是相比较GET来说安原创 2022-01-08 06:00:00 · 1458 阅读 · 0 评论 -
浅谈Linux虚拟内存管理和虚拟地址空间
虚拟内存技术使得不同进程在运行过程中,它所看到的是自己独占了当前系统的4G内存空间。所有进程共享同一物理内存,每个进程只把自己目前需要的虚拟内存空间映射并存储到物理内存上。事实上,在每个进程被创建时候,内核只为进程"创建”了虚拟内存的布局,具体就是初始化进程控制表中内存相关的链表,实际上并不立即就把虚拟内存对应位置的程序数据和代码(.txt段,.data段)拷贝到物理内存中,只是建立好虚拟内存和磁盘文件之间的映射关系,等到程序运行的时候,才会通过缺页异常来拷贝数据。还有进程在运行过程中需要动态分配内存,比如原创 2022-01-07 13:30:00 · 801 阅读 · 0 评论 -
Linux下的五种IO模型
1,阻塞型IO:最简单的一种IO模型,简单来讲就是死等,即线程或进程一直等待某个条件,不满足则一直等待。2,非阻塞型IO:应用进程与内核交互,目的未达到之前会直接返回,然后不断轮询,不停的去问内核数据是否准备好,如果发现准备好了,就把数据拷贝到用户空间。应用进程通过recvfrom调用不停的去和内核交互,直到内核准备好数据。如果没有准备好,内核会返回error,应用进程在得到error后,过一段时间再发送recvfrom请求。在两次发送请求的时间段,进程可以先去做其他的事情。3,信号驱动IO:我们会发现原创 2022-01-07 08:00:00 · 797 阅读 · 0 评论 -
深入理解TCP
TCP第三次握手携带数据第一次和第二次是不可以携带数据的,但是第三次是可以携带数据的。加入第一次握手可以携带数据的话,那对于服务器来说太危险了,如果有人恶意攻击服务器的话,每次都在第一次握手中的SYN报文中放入大量的数据,并且不断的重发SYN报文,服务器就会花费很多时间和内存空间去接收这些报文。第三次握手,此时客户端已经处于ESTABLISHED状态。对于客户端来说,已经建立了连接,并且已经知道服务器的接收和发送能力是正常的,所以也就可以携带数据了。服务器不调用accept即使服务端不调用acce原创 2022-01-04 14:00:00 · 826 阅读 · 0 评论 -
初识session和cookie
session和cookie的区别:1,cookie数据存放在客户端的浏览器上,session数据放在服务器上。2,cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应该使用session3,session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能考虑到减轻服务器性能方面,应当使用cookie4,单个cookie保存的数据不能超过4k,很多浏览器都限制一个站点最多保存20个cookie。cookie和session的联系sess原创 2022-01-04 08:00:00 · 850 阅读 · 0 评论 -
滑动窗口的死锁问题
滑动窗口所谓的流量控制就是让发送方的发送速率不要过快,让接收方有足够时间接收数据。利用TCO报文段中的窗口大小字段来控制发送发的发送窗口不大于接收方发回的窗口大小就可以实施流量控制。考虑一种特殊的情况,就是接收方若没有足够的缓存使用,就会发送零窗口大小的报文,此时发送方将发送窗口设置为0,停止发送数据。之后接收方有足够的缓存,发送了非零的窗口大小的报文,但是这个报文在中途丢失,那么发送方的发送窗口就一直是零导致死锁。如何解决这个问题?解决这个问题,TCO为每一个连接设置一个持续计数器(persisit原创 2022-01-03 07:30:00 · 1029 阅读 · 0 评论 -
浅谈HTTPS协议的加密过程
https包括对称加密和非对称加密两个阶段,在客户端和服务端建立连接的时候使用非对称加密,连接建立以后使用的是对称加密。注:SSL是传输层协议加密过程:1,客户端使用https的URL访问Web服务器,要求与 Web服务器建立SSL连接。2,Web服务器收到客户端请求后,会将网站的公钥传送一份给客户端,私钥自己保存。3,客户端的浏览器根据双方同意的安全等级,生成对称加密使用的密钥,称为会话密钥(也可以看做是客户端的公钥),然后利用网站的公钥将会话密钥进行加密,并传送给网站。4,Web服务器利用原创 2022-01-02 08:00:00 · 1354 阅读 · 0 评论 -
HTTP与HTTPS协议
HTTP和HTTPS也是老生常谈了,想必大家也对这一对兄弟是熟悉有加了,在这里我简单的介绍下两者的区别。1,HTTP协议是以明文方式在网络中传输数据的,而HTTPS协议传输的数据则是经过SSL/TLS加密后的,HTTPS更具有安全性,但是因为HTTPS的安全也是需要代价的,那就是他在传输数据之前需要先进行加密处理,所以在速度上面会比HTTP要慢一些,但是相对于数据的安全性,我想这个代价是可以承受的,毕竟,谁都不想自己的账户信息被窃吧。2,HTTPS在三次握手之后会有SSL的handshake,协商加密使原创 2022-01-02 00:29:21 · 691 阅读 · 0 评论 -
POST和GET请求
GET和POST的区别:1,GET在浏览器回退时是无害的,而POST会再次提交请求。2,GET产生的URL地址可以被Bookmark,而POST不可以。3,GET请求可以被浏览器主动cache,而POST不会,除非手动设置。4,GET请求只能进行URL编码,而POST支持多种编码方式。5,GET请求在URL中传送的参数是有长度限制的,而POST没有。6,对参数的数据类型,GET只接受ASCLL字符,而POST没有限制。7,GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏原创 2022-01-01 06:30:00 · 200 阅读 · 0 评论 -
HTTP报文的特点
HTTP协议的主要特点可概括如下:1,支持C/S模式2,简单快速:客户端向服务器请求服务时,只需要传送请求方法和路径。请求方法常用的有GET,HEAD,POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议的简单,使得HTTP服务器的程序规模小,因而通信速度很快。3,灵活性:HTTP允许传输任意类型的数据对象。正在传输的类型有Content-Type加以标记。4,无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节原创 2022-01-01 00:25:00 · 634 阅读 · 0 评论 -
浅谈IP协议的作用和特点
网络层最核心的协议就是IP协议。IP协议根据数据包的目的IP地址来决定如何传输。如果数据包不能直接发送到目标主机,那么IP协议就会为它寻找下一个合适的路由器,并将数据包交付给该路由器来转发。多次重复这一过程,数据包最终到达目标主机,或由于发送失败而被丢弃。所以,IP协议使用跳转的方式确定通信路径。IP协议的特点:无连接,不可靠,无状态1,无连接是指:IP通信的双方都不长久地维持对方的任何信息。这样的话,上层协议每次发送数据的时候,都必须明确地指定对方的IP地址。2,不可靠是指:IP协议不保证数据报能够原创 2021-12-30 18:30:00 · 6568 阅读 · 0 评论 -
ISO模型
1,DNS协议,HTTP协议,HTTPS属于应用层应用层是体系结构中的最高层。应用层确定进程之间通信的性质以满足用户的需要。这里的进程就是指正在运行的程序。应用层不仅要提供应用进程所需要的信息交换和远地操作,而且要作为互相作用的应用进程的用户代理,来完成一些为进行语义上有意义的信息交换所必须的功能。应用层直接为用户的应用进程提供服务。2,TCP/UDP传输层传输层的任务就是负责主机中两个进程之间的通信。因特网的传输层可使用两种不同协议:即面向连接的传输控制协议TCP,和无连接的用户数据报协议UDP。面原创 2021-12-30 15:30:00 · 351 阅读 · 0 评论 -
浏览器输入一个URL的详细过程
在浏览器输入URL浏览器要将URL解析为IP地址,解析域名就要用到DNS协议,首先主机会查询DNS的缓存,如果没有就给本地的DNS发送查询请求。DNS查询分为两种方式,一种是递归查询,一种是迭代查询。如果是迭代查询,本地的DNS服务器,向根域名服务器发送查询请求,根域名服务器告知该域名的一级域名服务器,然后本地服务器给该一级域名服务器发送查询请求,然后依次类推直到查询到该域名的IP地址。DNS服务器是基于UDP协议的。得到IP地址后,浏览器就要与服务器建立一个http连接。因此要用到http协议。htt原创 2021-12-30 10:31:25 · 1584 阅读 · 0 评论 -
UDP如何实现可靠传输
因为UDP是无连接的不稳定的协议,所以在传输层上无法保证可靠传输,要想实现可靠数据传输,只能从应用层实现,需要实现TCP的seq/ack机制,重传机制和窗口拥塞控制机制。在接收方收到UDP之后回复个确认包,发送发有个机制,收不到确认包就要重新发送,每个包有递增的序号,接收方发现中间丢包了就要发重传请求,当网络太差导致频繁丢包,为了防止丢包越严重越重传的恶性循环,需要有和TCP一样的窗口拥塞控制机制,发送窗口的大小要根据网络的传输情况来决定,调整算法应该有一定的自适应性。总结:1,添加seq/ack机制,原创 2021-12-30 00:30:39 · 1285 阅读 · 0 评论 -
TCP的粘包问题
粘包问题的最本质的原因在于接收对等方无法分辨消息与消息之间的边界在哪。我们可以通过使用某种方案给出边界,例如:1,发送定长包,如果每个消息的大小都是一样的,那么在接收对等方只要累计接收数据,直到数据等于一个定长的数值就将它作为一个消息。2,包头加上包体长度。包头是定长的4个字节,说明了包体的长度,接收对等方先接收包体长度,依据包体长度来接收包体。3,可以使用更复杂的应用层协议。...原创 2021-12-30 00:17:17 · 242 阅读 · 0 评论 -
UDP的优缺点
UDP的优点:一般把UDP和TCP进行想比较,因为UDP没有TCP的确认机制,重传机制,拥塞控制,所以相对于TCP,UDP的速度快于TCP并且安全,但这同时也是UDP的一个缺点,这个我们后面说,UDP是一个无状态的传输协议,所以它在传递数据时非常快。没有TCP的各种机制,UDP相较TCP被攻击者利用的漏洞也要少一些。但是UDP也有无法避免的攻击,比如:UDP flood攻击。UDP缺点:上面我们说到,UDP没有TCP的各种机制,这会使得UDP不可靠,不稳定,在数据传输的时候,如果网络质量不好的话,就会容易原创 2021-12-28 18:53:21 · 5417 阅读 · 0 评论 -
TCP的优缺点
TCP的缺点:慢,效率低,占用系统资源高,容易被攻击,TCP在传输数据之前需要建立连接,这会消耗时间,而且在传输数据的时候,它的一些机制,比如重传机制,确认机制,拥塞控制机制都会消耗大量的时间,并且需要在每台设备上都要维护到所有的连接,每一个连接都会占用CPU资源,内存等硬件资源。TCP的确认机制也导致其在建立连接的过程中受到攻击,最常见的攻击就是DDOS,DOS攻击等。但是它的个别缺点同时又是TCP的优点(真是爱恨交织)TCP的优点:因为他的确认机制和重传机制的存在,所以TCP是可靠的,稳定的,并且在原创 2021-12-28 18:38:01 · 5323 阅读 · 0 评论 -
unique_ptr智能指针特性
C++中早期使用的智能指针是auto_ptr,在早些时候它的应用比较方便,但随着发展与要求的变化导致auto_ptr不能够很好的满足需求,于是目前auto_ptr已经被弃用了何为智能指针?我们在平常进行new空间之后,总是会忘掉delete释放空间,或是因为指针还在使用空间时就被释放而导致的指针对内存的非法访问,而智能指针要做的就是自动释放对象所占有的空间,调用析构函数来对new出来的空间进行delete释放。auto_ptr特性:1)不允许隐式构造; 隐士构造:eg:int*p1=new .原创 2021-10-16 17:19:40 · 84 阅读 · 0 评论 -
make编译makefile文件时可能会出现的问题
1 make编译makefile文件时可能会出现的常见问题之一就是文件格式问题 了:make后会报错:make:*** 缺失分隔符 停止;这是因为书写格式不正确导致的错误,通常是因为将Tab键替换为了空格键 导致的格式错误,只需要将错误行找出并将空格键改为Tab键,并且代码高亮则说明格式修改正确。2 常见问题之二:出现这种是因为犯了一个和本人一样的粗心问题,这题提示没有server.o文件是因为编译期间没有找到sever.c文件导致无法生成.o文件,所以,一定是因为没有注意.c文件原创 2021-09-03 10:08:43 · 7443 阅读 · 0 评论 -
一键部署tars-web时会出现的问题
./linux-install.sh 127.0.0.1 MYSQL_PASSWD ens33 false false root 3306(1)其中127.0.0.1为主机IP,也就是本机MYSQL的IP地址;(2)MYSQL_PASSWD则为你当时设置的MySQL的密码;(3)ens33为你所用机器的网卡名称,可以使用ifconfig来查看;(4)第一个false:是REBUILD(false[default]/true);REBUILD: 是否重建数据库,通常为false, 如果中间装出错,原创 2021-08-22 10:23:36 · 276 阅读 · 0 评论 -
Linux总体大纲总结
bin: 放命令mnt:临时挂载点~ 家目录exit 退出lib 库文件u:属主g:同组o:其他人a:所有人-z : 判空操作命令安装: apt install cmaker w x -读权限 修改权限 执行权限 没有权限4原创 2021-08-19 23:30:02 · 209 阅读 · 0 评论 -
centos7环境源码部署tarscpp时,可能会出现cmake无法编译的问题以及解决方法
在centos7环境下源码部署tarscpp时,可能会出现cmake无法编译的情况,可能的原因如下:1: cmake版本过低,或是其他依赖版本过低,可以通过命令yum install glibc-devel gcc gcc-c++ bison flex cmake来查看依赖包的版本。当版本过低时需要通过源码下载高版本的依赖包。2:出现此错误:CMake Error at servant/CMakeLists.txt:64 (add_subdirectory): add_subdire原创 2021-07-26 11:39:11 · 453 阅读 · 0 评论 -
docker启动mysql时端口冲突问题
今天通过docker启动MySQL时出现错误,话不多说,直接上图#mermaid-svg-jCvkWzA1VxHzcP6F .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-jCvkWzA1VxHzcP6F .label text{fill:#333}#mermaid-svg-jCvkWzA1VxHzcP6F .原创 2021-07-26 11:27:15 · 1219 阅读 · 0 评论 -
new与malloc的区别
malloc: 1)malloc是函数,成功返回的是无类型指针,需要强转;2)malloc需要sizeof()计算空间小;3)malloc只开辟空间;4)malloc申请空间失败会返回NULL指针;5)malloc释放资源由free()释放;new: 1)new是关键字,成功返回类型为内置类型或自己设计的类型;2)new不需要sizeof(),自己计算空间大小;3)new 不但开辟空间,并且开辟后进行初始化;4)new申请空间失败会抛出异常;5)new释放资源由delete() 释原创 2021-04-27 22:31:57 · 83 阅读 · 0 评论 -
2021-01-01
CPP概要:1、将亡值概念(指在构建对象时系统自己定义的临时变量):存在于栈区,在函数执行完之后就会被自动销毁。2、减少对象的调用:原创 2021-01-01 21:59:45 · 72 阅读 · 0 评论 -
2020-10-24
c语言概述C语言是强类型语言,且c语言函数不可嵌套但可以嵌套调用C语言重要类型所占字节char 1字节short 2字节int 4字节long int 4字节long long 8字节float 4字节double 8字节long double 8字节,12字节,16字节bool 1字节C语言变量:可读(可获取,可取值)可写(赋值)C语言常量:只可读不可写定义:对编译器和机器声明:对编译器全局变量:在函数外部定义局部变量:在函数内部定义原创 2020-11-07 14:41:58 · 93 阅读 · 0 评论