自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(146)
  • 收藏
  • 关注

原创 虚函数表存储的位置(解析C++内存分配及其编译分段)

C语言在编译和连接后,将分成代码段(Text)、只读数据段(ROData)和读写数据段(RWData)。在运行时,除了以上三个区域外,还包括未初始化数据段(BSS)区域和堆(Heap)区域和栈(Stack)区域。虚函数表属于类,类的所有对象共享这个类的虚函数表。编译时期由编译器确定。

2023-09-11 11:17:04 1186

原创 编译链接的流程

链接过程中可能会生成动态链接文件(Dynamic Link Library,DLL)或静态链接文件(Static Link Library,LIB)。静态链接会将目标文件中需要使用的代码和数据复制到最终可执行文件中,而动态链接则将其保留为独立的文件,在程序运行时由操作系统动态加载。

2023-08-31 20:23:39 363

原创 C++ malloc/free/new/delete详解(内存管理)

new是动态分配内存的运算符,自动计算需要分配的空间,在C++中,它属于重载运算符,可以对多种数据类型形式进行分配内存空间,比如int型、char型、结构体型和类等的动态申请的内存分配,分配类的内存空间时,同时调用类的构造函数,对内存空间进行初始化,即完成类的初始化工作。delete与new通常配对使用,与new的功能相反,可以对多种数据类型形式的内存进行撤销,包括类,撤销类的内存空间时,它要调用其析构函数,完成相应的清理工作,收回相应的内存资源。这告诉我们,可以认为new就是malloc的封装。

2023-08-21 23:59:25 1365

原创 阻塞和挂起的区别和联系

正在执行的进程由于发生某时间(如I/O请求、申请缓冲区失败等)暂时无法继续执行。此时引起进程调度,OS把处理机分配给另一个就绪进程,而让受阻进程处于暂停状态,一般将这种状态称为阻塞状态。:由于系统和用户的需要引入了挂起的操作,进程被挂起意味着该进程处于静止状态。如果进程正在执行,它将暂停执行,若原本处于就绪状态,则该进程此时暂不接受调度。

2023-08-21 23:37:15 1354

原创 进程间通信(IPC)的几种方式

进程间通信可以通过传送打开文件(fork,exec与文件系统)来实现,不同的进程通过一个或多个文件来传递信息,事实上,在很多应用系统里,都使用了这种方法。但一般说来,进程间通信不包括这种似乎比较低级的通信方法。特点:无名管道是半双工的(即数据只能在一个方向上流动),具有固定的读端和写端。因为没有名字,因此无名管道只能用于具有亲缘关系的进程之间的通信(也是父子进程或者兄弟进程之间)。无名管道只存在于内存中,其实质是一个内核缓冲区。进程以先进先出的方式从缓冲区存取数据:管道一端的进程顺序地将进程数据写入缓冲区

2023-08-11 22:11:48 878

原创 Linux下高并发socket最大连接数所受的各种限制

当系统中某一时刻同时存在太多的TCP客户端连接时,由于每个TCP客户端连接都要占用一个唯一的本地端口号(此端口号在系统的本地端口号范围限制中),如果现有的TCP客户端连接已将所有的本地端口号占满,则此时就无法为新的TCP客户端连接分配一个本地端口号了,因此系统会在这种情况下在connect()调用中返回失败,并将错误提示消息设为“Can’t assignrequested address”。在高TCP并发的情形下,如果使用同步I/O,这会严重阻塞程序的运转,除非为每个TCP连接的I/O创建一个线程。

2023-08-09 10:07:53 1426

原创 工厂模式详解

工厂模式属于创建型模式,大致可以分为三类,简单工厂模式、工厂方法模式、抽象工厂模式。

2023-08-09 00:00:00 245

原创 C++ 左值和右值

在foo(i), 如果传入的是一个左值, 那么foo中T的类型将是int&, fparam类型是int& &&, 经过折叠为int&. 因此在std::forward模板函数中,推断出T的类型为int&,因此,std::remove_reference用int& 进行实例化。将亡值则是C++11新增的跟右值引用相关的表达式,这样表达式通常是将要被移动的对象(移为他用),比如返回右值引用T&&的函数返回值、std::move的返回值,或者转换为T&&的类型转换函数的返回值。返回string &&。

2023-08-03 23:49:38 571

原创 C++11移动构造函数详解

当类中同时包含拷贝构造函数和移动构造函数时,如果使用临时对象初始化当前类的对象,编译器会优先调用移动构造函数来完成此操作。只有当类中没有合适的移动构造函数时,编译器才会退而求其次,调用拷贝构造函数。C++在三种情况下会调用拷贝构造函数(可能有纰漏),第一种情况是函数形实结合时,第二种情况是函数返回时,函数栈区的对象会复制一份到函数的返回去,第三种情况是用一个对象初始化另一个对象时也会调用拷贝构造函数。除了这三种情况下会调用拷贝构造函数,另外如果将一个对象赋值给另一个对象,这个时候回调用重载的赋值运算符函数。

2023-08-03 23:38:09 518

原创 C++ 智能指针

默认情况下,智能指针使用 delete 释放其管理的资源,有时候,可能要修改默认使用 delete 释放资源的行为,除此之外,我们也可以自定义删除器。Connection 是一个管理连接类,在释放 Connection 之前,我们需要调用 close 函数来关闭连接。public :cout << string("关闭") + connection -> get_name() + "管理的连接中..." << endl;// 关闭连接的代码 // ..... cout << "关闭完成。

2023-08-03 23:32:47 203

原创 C++ rand的用法

功能: 随机数发生器用法: int rand(void)所在头文件: stdlib.hrand() 的内部实现是用线性同余法做的,它不是真的随机数,因其周期特别长,故在一定的范围里可看成是随机的。rand() 返回一随机数值的范围在 0 至 RAND_MAX 间。RAND_MAX 的范围最少是在 32767 之间(int)。用 unsigned int 双字节是 65535,四字节是 4294967295 的整数范围。0~RAND_MAX 每个数字被选中的机率是相同的。

2023-08-02 22:55:57 411

原创 C++中的五种构造函数

如果形参是一个对象,那么形参的值是否等于实参,取决于该对象所属的类的复制构造函数是如何实现的。例如上面的例子,Func 函数的形参 a 的值在进入函数时是随机的,未必等于实参,因为复制构造函数没有做复制的工作。换言之,作为函数返回值的对象是用复制构造函数初始化 的,而调用复制构造函数时的实参,就是 return 语句所返回的对象。换句话说,作为形参的类A的对象,是用复制构造函数初始化的,而且调用复制构造函数时的参数,就是调用函数时所给的实参。需要注意的是,默认的拷贝构造函数实现的是。这两条语句是等价的。

2023-08-02 22:52:46 1035

原创 堆和栈的区别

操作系统有一个记录空闲内存地址的链表,当系统收到malloc申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序,另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确的释放本内存空间。另外,由于找到的堆结点的大小不一定正好等于申请的大小,系统会自动的将多余的那部分重新放入空闲链表中。存放在栈中的数据只在当前函数及下一层函数中有效,一旦函数返回了,这些数据也就自动释放了。

2023-08-02 22:42:52 201

原创 异常和中断的区别

中断是由硬件设备产生的,而它们从物理上说就是电信号,之后,它们通过中断控制器发送给CPU,接着CPU判断收到的中断来自于哪个硬件设备(这定义在内核中),最后,由CPU发送给内核,有内核处理中断。异常包括很多方面,有。

2023-08-02 22:38:43 301

原创 C++ 虚函数详解(动态绑定)

虚函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。我们在使用基类的引用(指针)调用虚函数时,就会发生动态绑定。所谓动态绑定,就是在运行时,虚函数会根据绑定对象的实际类型,选择调用函数的版本。

2023-08-02 00:04:59 1023

原创 C++ 继承

本例中,Base 类的func()、func(int)和 Derived 类的func(char *)、func(bool)四个成员函数的名字相同,参数列表不同,它们看似构成了重载,能够通过对象 d 访问所有的函数,实则不然,Derive 类的 func 遮蔽了 Base 类的 func,导致第 26、27 行代码没有匹配的函数,所以调用失败。所谓遮蔽,就是在派生类中使用该成员(包括在定义派生类时使用,也包括通过派生类对象访问该成员)时,实际上使用的是派生类新增的成员,而不是从基类继承来的。

2023-08-01 23:56:29 237

原创 并行与并发的区别

并行(Parallel),当系统有一个以上CPU时,当一个CPU执行一个进程时,另一个CPU可以执行另一个进程,两个进程互不抢占CPU资源,可以同时进行,这种方式我们称之为并行(Parallel)。其实决定并行的因素不是CPU的数量,而是CPU的核心数量,比如一个CPU多个核也可以并行。

2023-07-31 19:29:22 214

原创 CPU用户态和内核态

这3种方式是系统在运行时由用户态转到内核态的最主要方式,其中系统调用可以认为是用户进程主动发起的,异常和外围设备中断则是被动的。操作系统有三个特权级别:R0(Ring0)、R1(Ring1)、R2(Ring2)和R3(Ring3)。,不同级别能够运行不同的指令集合。

2023-07-30 22:00:53 777

原创 计算机中存储器的层次结构

有一些比较好的CPU上面则会有第三级的缓存,也就是L3,L3的用途是补充L2用的。L1,L2,L3层的缓存完全由内置在缓存中的硬件逻辑来管理。在一个虚拟存储器系统中,DRAM主存作为存储在磁盘上的数据块缓存。对于一个具有像afs这样的分布式文件系统的机器来说,本地磁盘作为缓存它是由运行在本地机器上的afs客户端进程管理。在最高层(L0)是少量快速的CPU寄存器,CPU可以在一个时钟周期内访问他们。下一层包含了所要的数据,当前层从下一层提取数据。从下一层取出数据以及与数据相近的数据,放入当前层并读取。

2023-07-30 21:39:05 779

原创 计算机的大小端模式

没有,字节序是指byte的排序,string里面都是char,一个char就是1字节,只要出现索引的地方,一定是索引越大地址越大。计算机硬件有两种储存数据的方式:大端字节序(big endian)和小端字节序(little endian)。h表示host,指小端,n表示network指大端,l表示32位长整数,s表示16位短整数。举例来说,数值0x2211使用两个字节储存:高位字节是0x22,低位字节是0x11。计算机电路先处理低位字节,效率比较高,因为计算都是从低位开始的。所以,除了计算机的内部处理,

2023-07-30 21:35:04 456

原创 从源程序到可执行文件的四个过程

比如当一个浮点型的表达式赋值给一个整型的表达式时,其中隐含一个从浮点型到整型的转换,而语义分析就需要完成这个转换,再比如,将一个浮点型的表达式赋值给一个指针,这肯定是不行的,语义分析的时候就会发现两者类型不匹配,编译器就会报错。比如说两个整数做除法,语法上没问题,类型也匹配,听着好像没毛病,但是,如果除数是0的话,这就有问题了,而这个问题事先是不知道的,只有在运行的时候才能发现他是有问题的,这就是动态语义。语法分析器根据用户给定的语法规则,将词法分析产生的记号序列进行解析,然后将它们构成一棵语法树。

2023-07-30 21:26:03 887

原创 数字签名与数字证书

发送报文时,发送方用一个哈希函数从报文文本中生成。

2023-07-28 22:10:08 705

原创 对称加密和非对称加密体系

在RSA私钥和公钥生成的过程中,共出现过p,q,N,φ(N),e,d,其中(N,e组成公钥),其他的都不是公开的,一旦d泄露,就等于私钥泄露。然而,只有将N质因数分解,才能算出d。也就意味着私钥破译。但是,大整数的质因数分解是非常困难的,因此RSA是比较可靠的。这两个密钥在数学上是相关的,并且不能由公钥计算出对应的私钥,同样也不能由私钥计算出对应的公钥。发送方用该密钥对待发消息进行加密,然后将消息传输至接收方,接收方再用相同的密钥对收到的消息进行解密。至此完成计算,其中(N,e)是公钥,(N,d)是私钥。

2023-07-28 22:04:37 230

原创 数据链路层是如何传递数据的

数据链路层的主要作用就是加强物理层传输原始比特流的功能。其负责将物理层提供的可能出错的物理连接,改造成逻辑上无差错的数据链路。封装成帧、透明传输、差错控制。

2023-07-28 22:00:18 494

原创 NAT协议(网络地址转换协议)详解

这种通过使用少量的IP地址代表较多的私有IP地址的方式,将有助于减少IP地址空间的枯竭。

2023-07-28 21:57:14 2032

原创 ping命令

当A设备ping B设备时候,会同时发出arp和icmp协议。arp协议用于根据目的ip获取默认网关的mac地址,icmp协议用于实现ping的功能。MAC地址在两个设备间通信时变化,传送时DestMac和SourceMac会一直不停变化,但是ip地址始终不变。

2023-07-28 21:49:43 164

原创 ICMP协议(网际报文控制协议)详解

ICMP协议是一个网络层协议。。

2023-07-28 21:46:14 3294

原创 ARP协议(地址解析协议)详解

在局域网中,网络中实际传输的是“帧”,帧里面是有目标主机的MAC地址的。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。而ARP协议可以接收来自IP协议的逻辑地址,将其映射为相应的物理地址,然后把物理地址递交给数据链路层。这个ARP表储存在网络中的每一台机器上。局域网中的每一台主机都会接受并处理这个ARP请求报文,然后进行验证,查看接收方的IP地址是不是自己的地址,只有验证成功的主机才会返回一个ARP响应报文,这个响应报文包含接收方的IP地址和物理地址。

2023-07-28 00:02:24 390

原创 IP协议详解

IP数据报进行分片之后,当它到达目的站时,由目的端的IP层来进行组装。IP分片和完整IP报文差不多拥有相同的IP头。ID域对于每个分片都是一致的,具有同一个ID的IP分片将会重新组装。13位片偏移则记录了某IP片相对整个包的位置。中间的3位标志则标志着该分片后面是否还有新的分片,这三个标志就组成了IP分片的所有信息,接受方就可以利用这些信息对IP数据进行重新组织。IP分片是网络上传输IP报文的一种技术手段。这部分最多包含40个字节,因此IP头部最长是60字节(其中还包含前面讨论的20字节的固定部分)。

2023-07-28 00:01:59 1019

原创 网络层协议总览

网络层的主要协议包括IP、ARP、RARP、ICMP、IGMP以及各种路由选择协议等。

2023-07-28 00:01:35 356

原创 UDP丢包问题详解

解决方法:增加系统发送或接收缓冲区大小。

2023-07-27 23:36:19 973

原创 udp包为什么最好不要大于1472字节

但这并不是指链路层的长度被限制在1500字节,其实这个MTU指的是链路层的数据区.并不包括链路层的首部和尾部的18个字节。因为IP数据报的首部为20字节,所以IP数据报的数据区长度最大为1480字节。而这个1480字节就是用来放TCP传来的TCP报文段或UDP传来的UDP数据报的。又因为UDP数据报的首部8字节,所以UDP数据报的数据区最大长度为1472字节.这个1472字节就是我们可以使用的字节数。(Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的。

2023-07-27 23:33:57 682

原创 DoS攻击

拒绝服务攻击DoS(Denial of Service):使系统过于忙碌而不能执行有用的业务并且占尽关键系统资源。它是基于这样的思想:用数据包淹没本地系统,以打扰或严重阻止捆绑本地的服务响应外来合法的请求,甚至使本地系统崩溃。

2023-07-27 23:29:05 367

原创 TCP KeepAlive与HTTP Keep-Alive

从图中可以发现一个完整的HTTP事务,有连接的建立,请求的发送,响应接收,断开连接这四个过程,早期通过HTTP协议传输的数据以文本为主,一个请求可能就把所有要返回的数据取到,但是,现在要展现一张完整的页面需要很多个请求才能完成,如图片,JS,CSS等,如果每一个HTTP请求都需要新建并断开一个TCP,这个开销是完全没有必要的。KeepAlive并不是默认开启的,在Linux系统上没有一个全局的选项去开启TCP的KeepAlive。需要开启KeepAlive的应用必须在TCP的socket中单独开启。

2023-07-27 23:25:17 1598

原创 TCP连接过程中如果拔掉网线会发生什么?

等客户端插回网线后,如果客户端向服务端发送了数据,由于服务端已经没有与客户端相同四元祖的 TCP 连接了,因此服务端内核就会回复 RST 报文,客户端收到后就会释放该 TCP 连接。:当连接超过一段时间没有数据传输之后,TCP自动发送一个数据为空的报文给对方,如果对方回应了这个报文,说明对方还在线,连接可以继续保持,如果对方没有报文返回,并且重试了多次之后则认为连接丢失,没有必要保持连接。在客户端拔掉网线后,服务端向客户端发送的数据报文会得不到任何的响应,在等待一定时长后,,重传未得到响应的数据报文。

2023-07-27 23:19:55 916

原创 TCP粘包问题

举个例子:有三个数据包,大小分别为2k、4k、6k,如果采用UDP发送的话,不管接受方的接收缓存有多大,我们必须要进行至少三次以上的发送才能把数据包发送完,但是使用TCP协议发送的话,我们只需要接受方的接收缓存有12k的大小,就可以一次把这3个数据包全部发送完毕。TCP为了保证可靠传输并减少额外的开销(每次发包都要验证),采用了基于流的传输,基于流的传输不认为消息是一条一条的,是无保护消息边界的(保护消息边界:指传输协议把数据当做一条独立的消息在网上传输,接收端一次只能接受一条独立的消息)。

2023-07-27 23:18:01 195

原创 TCP/IP的分包粘包

因为TCP为了减少额外开销,采取的是流式传输,所以接收端在一次接收的时候有可能一次接收多个包。而TCP粘包就是发送方的若干个数据包到达接收方的时候粘成了一个包。多个包首尾相接,无法区分。当然还有可能是分包情况,同一个包,两次才能接收到。

2023-07-27 23:13:24 866

原创 TCP如何保证服务的可靠性

滑动窗口技术通过动态改变窗口大小来调节两台主机间数据传输,相互连接的主机间存在两个滑动窗口:一个用于接收数据,另一个用于发送数据。根据接收端的接收情况,动态去调整窗口大小,然后来控制发送端的数据流量。发送窗口:在任意时刻,发送方都维持一组连续的允许发送的帧的序号,称为发送窗口。接收窗口:接收窗口用来对发送方进行流量控制,而发送窗口的大小 W 代表在还没有收到对方确认信息的情况下发送方最多还可以发送多少个数据帧。

2023-07-27 23:12:46 1279

原创 RTO(Retransmission Time Out):重传超时时间

RTO(Retransmission Time Out):重传超时时间,即从数据发送时刻算起,超过这个时间便执行重传。

2023-07-27 22:42:45 213

原创 TCP三次握手/四次挥手

考虑场景,B是服务器,A是一个合法的客户端,C假冒A(比如模拟IP等)和B进行通信。C假冒A,B接受后把ACK会直接发给A。由于A没有发送过seq=ISN _C的请求,当A收到ISN_C的ack后直接发送reset 给B,最终关闭了链接。如下图所示:假如初始序列号不是随机的,而是可以推测的,那么C就可以拿到ISN_B,然后模拟一个ACK过去,B最终会建立链接,C开始传递数据,这就会产生非常严重的安全问题(比如SYN泛洪),所以ISN随机是必须的。

2023-07-27 22:36:53 286

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除