1、虚函数表(类拥有):在编译阶段创建,链接阶段分配具体内存地址,运行时类的对象被实例化的时候,虚表指针被初始化,存在于内存布局最前面,作为对象的一部分,如果对象是局部变量就在栈上,如果是动态分配就在堆上。
纯虚函数:定义接口没有具体实现,含有纯虚函数的类是抽象类不能实例化。
类有虚函数表,对象有虚指针
虚继承:通过虚基类的方式,避免基类重复继承
运行时候虚函数指针和虚函数表动态绑定
2、c++实现多态:
模板,函数指针,std::function,手动类型擦除
3、野指针:指针指向了一个随机的内存地址(指针变量没有初始化或者重新使用没有重新赋值)
悬空指针:指向了一块已经被释放的内存地址(内存块被释放,指针没有设为nullptr)
4、内存对齐:允许CPU以最快的方式访问内存,减少内存访问的效率
5、extern “C”
防止C++编译器对函数名称进行修改,从而避免连接器找不到符号,可以直接使用C语言的库
6、C++编译流程:
预处理(处理宏定义,头文件包含,条件编译指令)
,编译(检查语法,把预处理的代码转换成汇编)
,汇编(汇编代码转换成机器代码)
,链接(多个目标文件和库文件链接成可执行文件)
7、编译器如何实现重载:
名称改编:函数名和参数类型组合成一个唯一符号,用于区别
8、函数调用压栈的过程:从右到左将参数压入栈中,压入返回地址,跳转到函数代码执行,处理返回值清理栈,返回调用位置(是指一个函数中调用另一个函数的过程)
9、回调函数:委托机制,是由其他代码在适当的时间点调用的函数,
10、宏定义:
只进行文本上的替换,不进行安全检查
内链函数:
更安全灵活,适用于短小的函数,使用频繁的函数,实际内联由编译器决定
11、浅拷贝:只复制对象指针不复制内存里的内容,多个对象共享同一块内存资源,一个对象修改会影响全部
深拷贝:内存独立,不会影响其他对象
12、隐式转换:编译器自动将一种类型转换成另一种类型
使用explicit防止
13、零拷贝:数据处理过程中不进行内存拷贝,直接在不同模块传递,减少CPU和内存带宽的消耗,常用高性能网络传输和文件IO操作
14、sizeof(),计算变量占用内存的总字节数
strlen:返回字符串的长度(不包含终止符号)计算c风格字符串以\0结尾的
15、头文件避免冲定义:使用预处理指令#ifndef #define #endif
16、静态多态:函数重载和模板(编译时 速度快)
动态多态:虚函数(运行时候 速度较慢)
17、memcpy:内存块拷贝,可以拷贝任意数据类型,需要指定拷贝的字节数
strcpy:用于拷贝字符串,直到遇到\0结束符
18、重载:用于在同一作用域定义多个参数列表不同的同名函数
重写:派生类重新定义基类的虚函数
19、临时对象产生:
返回值优化:函数返回一个对象,编译器通常会生成一个临时对象。
隐式类型转换:函数参数或者返回值需要进行类型转换时,编译器会创建临时对象存放转换后的值
运算符重载:涉及到操作结果返回的情况,临时对象会产生
20、
1. 返回值优化(RVO)
定义:当函数返回一个临时对象时,编译器可以直接将该对象构造在调用者的栈帧中,省去拷贝或移动操作。
2. 具名返回值优化(NRVO)
定义:当函数返回一个具名对象时,编译器仍可以将该对象构造在调用者的栈帧中,避免拷贝。
21、static变量线程安全:
程序启动或者第一次使用初始化,多线程只进行一次初始化
储存在静态存储区,不同线程访问的是同一个位置
单例模式:只会实例化一次
二、C++11新特性
1、auto
2、for遍历容器
std::vector<int> vec={1,2,3,4,5};
for(int value:vcc){}
3、Lambda表达式可以捕获外部变量,可以作为参数传递给函数
[capture list](parameter list) -> return type { function body }
//
捕获列表([ ]):指定如何捕获外部变量(如 [x, &y])。
参数列表(( )):与普通函数的参数类似。
返回类型(-> type):可省略(编译器自动推导)。
函数体({ }):实现具体逻辑。
4、类型别名 using intager = int;
给已经存在的类型设置别名
5、原子操作:std:atomic 提供一种无锁机制(不会出现死锁)来实现线程安全操作(操作不可分割不会中断),
原子操作避免数据竞争,比互斥锁更高效,
std::atomic<int>counter(0);
原子操作方法:
fetch_add:增加并获取旧值。
fetch_sub:减少并获取旧值。
load:读取原子变量的值。
store:设置原子变量的值。
compare_exchange_strong 和 compare_exchange_weak:比较并交换,用于实现复杂的同步机制。
6、nullptr 表示空指针,NULL通常被定义为整数0
7、移动语义:将资源从一个对象移动到另一个对象,而不是复制(移动构造函数,移动赋值运算符)
右值引用:右值引用可以避免不必要的拷贝操作(只能绑定到临时对象的引用)
std::move 左值转换为右值
8、std::thread
用于创建和管理线程
9、enum class强类型枚举,解决命名冲突和隐式转换,引用的时候要加类名前缀
enum class Color { RED, GREEN, BLUE };
enum class Animal { RED_FOX, BLUE_BIRD };
Color::RED 和 Animal::RED_FOX
10、std::chrono引入的时间库,用于处理时间点、时间段和时钟
基本组件
时间点 (std::chrono::time_point):表示某个时钟上的特定时间。
时间段 (std::chrono::duration):表示时间间隔。
时钟(std::chrono::steady_clock, std::chrono::system_clock, std::chrono::high_resolution_clock):提供当前时间点。
11、
default 用于显式指定编译器生成默认的函数实现。
delete 用于显式禁止某个函数
MyClass() = default; // 使用编译器生成的默认构造函数
~MyClass() = default; // 使用编译器生成的默认析构函数
MyClass(const MyClass&) = delete; // 禁用拷贝构造函数
MyClass& operator=(const MyClass&) = delete; // 禁用赋值运算符
12、share_ptr智能指针,动态管理分配的对象的生命周期
引用计数(共享计数share_ptr,弱计数weak_ptr):原子操作,线程安全,创建share_ptr share_count+1,销毁减1
share_count weak_ptr 都等于0,控制块自身也会销毁
控制块:引用计数,其他数据元
管理的对象访问不是线程安全的,需要加互斥锁
13、shared_ptr赋值给weak_ptr时内部做了什么
weak_ptr指向shared_ptr相同的控制块
控制块的weak_count加1
三、STL容器基础
1、STL容器本身不是线程安全的,多个线程同时读取同一个STL容器是安全的,但同时写操作或一个写一个读都不是线程安全的
2、
红黑树用于有序数据存储,提供O(log n)的查找、插入和删除复杂度,但内存开销较大。哈希表提供平均O(1)的查找、插入和删除复杂度,内存开销较低,但在哈希冲突严重时,最坏情况下复杂度为O(n)。红黑树随数据量增加,增长率比较低
3、哈希表:一个数组+一个哈希函数(哈希函数把键(Key)映射到数组索引位置)
当多个key被映射到相同的索引时候,会发生冲突
处理冲突:
链地址法:每个数组维护一个链表,所有哈希到相同索引的元素储存在链表中
开放地址法:在数组中寻找下一个空闲位置存储冲突元素
探测方法:线性、二次、双重哈希:使用第二个哈希函数计算探测步长
哈希平衡算法:
负载因子:元素数量和数组大小的比值
动态扩容:负载因子超过阈值,哈希表扩容数组为原来的两倍,重新计算并插入
动态缩容:负载因子小于阈值,缩小内存
4、linux线程调度的底层是红黑树(自平衡二叉搜索树),在完全公平调度器(CFS)中高效的管理和查找就绪队列的进程,每个进程都有一个虚拟运行时间,表示进程在CPU上的运行时间。就绪队列所有进程按照虚拟运行时间存储在红黑树中。
进程进入就绪队列时,调度器根据虚拟运行时间插入到红黑树
进程被调度器选中运行并从就绪队列移除,调度器从红黑树中删除
调度器查找红黑树里虚拟运行时间最小的节点选择下一个需要运行的进程。
5、std:vector 动态数组,通过动态分配和扩展机制管理内存,元素存储在连续的内存块中,插入删除末尾高效,中间效率低,随机访问效率高
默认构造函数,大小为0,不会分配任何内存
扩容机制:容量不足时候,以1.5或者2倍增长率扩展容量,分配新的内存,复制旧的数据到新内存,释放就内存
emplace_back()
原地构造元素,避免不必要的拷贝和移动
push_back()
复制或移动元素到vector末尾
6、迭代器++it 、it++
前置效率更高,直接递增
后置需要创建临时对象 效率低
7、vector(高效随机访问)
动态数组(连续的,中间插入要移动后面的),连续内存块,随机访问高效(内存连续),末尾高,中间低
clear清空内容,但不会释放容量,需要调用shrink_to_fit释放多余容量,减少内存使用。
插入、删除、扩容操作后迭代器失效
list(高效插入删除)
双向链表,分散的内存块,随机访问低效需要遍历,插入删除任意位置高效
删除元素后迭代器指向被删除元素时失效
duque
双端队列,分段连续内存布局,高效随机访问,头尾插入删除高效
插入、删除、扩容操作后迭代器失效
8、map插入方式
删除元素后迭代器指向被删除元素时失效
insert:返回插入结果指示值和布尔值,表示是否插入成功
operator[]:插入或者修改元素
emplace:直接构造函数,避免不必要的拷贝,移动
9、vector避免push_back时扩展容器开销办法:
使用reserve方法预分配足够容量,避免多次扩展容器
10、resize()
改变vector大小,初始化新元素。
reserve()
预先分配内存不改变大小,不增加删除元素
11、priority_queue
基于堆实现,使用vector作为底层容器,使用堆算法维护堆结构make_heap,push_heap,pop_heap
适用于需要快速访问最大最小元素的场景
12、forward_list单向列表,内存占用少,只会指向下一个元素
13、std::stack后进先出,栈,使用std::deque作为底层
14、在vector中如何优化数据大量插入处理
reserve预先 分配足够内存避免数据移动
批量插入:使用insert进行批量插入,而不是逐个插入
15、std::vector::at()
提供边界检查,访问越界会抛出异常
std::vector::operator[],不提供边界检查
16、std::sort:使用快速排序、堆排序、插入排序的混合算法,适用于随机访问迭代器,vector deque
std::stable_sort:使用归并排序,保持相同元素相对顺序,适用于所有迭代器
17、迭代器:抽象化容器的访问,不一定是指针,提供统一接口访问不同类型容器
指针:实际内存地址表示,适用于数组等简单结构
第四章 计算机网络
1、TCP
面向连接(需要建立连接)
可靠传输,速度较慢
UDP
无连接,数据可能乱序到达,较快,不可靠传输
2、IP地址分类
3、MAC地址
数据链路层,48位,全球唯一,硬件固定不易更改
IP地址
网络层 32位(IPv4) 128位(IPv6)
网络内唯一,可更改配置
4、网络带宽:网络能传输数据的最大速率,通常以比特每秒为单位,带宽越大速率越快
优化:增加带宽,减少传输量,负载均衡技术(将流量分配到多个服务器,避免单点过载
)使用缓存减少重复传输,流量控制,重要数据优先传输
5、
丢包:增加带宽,高性能设备,更换可靠协议,丢包重发
延迟:最优路径传输,避免中间节点和跳数
接近用户位置,减少传输距离和时间(使用内容分发网络)
5、端口
系统端口:0-1023 知名服务和协议保留
用户端口:用户注册的服务和应用程序
动态端口:临时链接,操作系统动态分配,客户端连接
6、
TCP三次握手:
第一次:客户端发送SYN
第二次:服务器收到SYN并响应SYN-ACK
第三次:客户端收到SYN-ACK,发送ACK给服务器
四次挥手:
第一次挥手:客户端发送FIN包给服务器
第二次挥手:服务器收到FIN后发送ACK给客户端
第三次挥手:服务器发完数据后,给客户端发送FIN
第四次挥手:客户端收到FIN后发送ACK给服务器
TIME-WAit状态:
等待2msl(最大报文生存时间)保证所有报文被正确处理,避免旧的重复数据包干扰新连接
7、TCP流量控制
滑动窗口机制实现,确保发送方不会淹没接收方的处理能力
发送窗口:已发送未确认数据量+可以发送最大数据量组成
接收窗口:已接收未处理数据+可以接收最大数据量
窗口大小控制:
发送方根据接收窗口大小发送数据
接收方通知发送方当前窗口大小
零窗口处理:接收方接收窗口是0,发送方停止发送数据,知道收到非零窗口通知’
发送方可以周期发送窗口探测包,询问窗口大小
8、TCP拥塞控制机制(防止网络拥塞)
慢启动 拥塞避免 快重传和快恢复
9、KCP:基于UDP协议之上实现的,利用DUP简单和快速传输,引入TCP中一些可靠传输
实时应用(王者荣耀,实时视频)
主要功能:
可靠传输:确认机制和重传机制,确保数据包按顺序、完整到达
流量控制:滑动窗口加流量控制算法,避免网络拥塞
拥塞控制:自适应拥塞控制算法,根据网络状况调整发送窗口状态、
快速重传:检测到包快速丢失,可以快速重传丢失的数据包
与TCP区别,TCP是内置于操作系统的传输层协议,KCP基于UDP实现的用户态协议
通过减少握手过程和拥塞控制提升传输效率,需要在应用层手动管理和实现,控制更灵活
10、怎么保证UDP下帧与帧间的有序性:
发送方为每个数据包添加一个唯一的序列号,从零开始发送一个加1,接收方:如果数据包按序到达就交给应用层处理,如果乱序到达或者丢包,就先放进重排序缓冲区,等待丢失数据包再按需处理。使用ACK确认机制接收方接收到数据包就回复一个ACK,发送方一定时间内没有收到ACK确认包,发送方会重传未确认的数据包。
11、为什么连接的时候三次握手,关闭的时候四次挥手
三次握手(建立可靠的全双工连接):为了建立连接,确保双方都有能力进行数据传输,防止历史重复连接请求。
四次挥手:可靠的关闭,确保双方都能完成各自的数据传输和处理,并释放资源。
避免半关闭状态的出现
12、三次握手不能变成两次吗?
三次握手确保客户端和服务器都知道连接的存在,确认彼此的发送接收能力,避免出现旧的连接请求被误认为是新的连接。
两次握手,当客户端发送SYN包后崩溃重启,服务器不知道还依然以为连接存在。
13、长连接如何维持,心跳机制,如果想要一直连接着怎么办?
保持长连接的方法:设置定时器,定期发送心跳包,设置超时时间,检测链接状态,避免长时间保持大量连接资源耗尽
可以减少链接 建立和关闭的开销,提升通讯效率
心跳机制:
心跳包(PING)
心跳回应(PONG)如果未在规定时间收到心跳回应,认为连接断开。
14、超时重传如何实现,超时重传时间怎么确认?
超时重传时间(RTO)根据往返时间RTT的 测量和估计来确认
1)RTT测量:在发送数据包并接收到ACK后,测量往返时间(RTT)。
2)SRTT计算:使用加权平均算法计算平滑RTT估计值(SRTT)。
3)RTT方差计算:计算RTT的变化幅度(RTT_variance)。
4)RTO计算:根据SRTT和RTT_variance计算重传超时时间(RTO)。
15、TCP CLOSE_WAIT状态还能收到报文吗?
还能接收报文,知道应用层调用了close()关闭连接,会发生FIN给发送方,发送方接收到FIN后,回复ACK确认关闭,双方连接关闭
16、两台服务器之间可以建立多个TCP链接吗?如何实现?
可以,可以通过不同端口号或者同一端口的多个套接字
每个TCP连接都是由四元组(源IP地址、源端口号、目的IP地址、目的端口号)唯一标识的。
16、linux内核收包流程
1、(网卡接收数据包)网卡接收数据包,并存储在网卡的接收缓冲区
2、(DMA传输)网卡通过DMA将数据包直接传输到系统内存中,避免CPU参与数据传输
3、(中断通知)网卡通过PCIe总线生成硬件中断,通知COU有数据包到达
4、(软中断通知)CPU响应中断,执行硬件中断处理程序,硬件中断处理程序触发软中断
5、(内核网络协议栈处理)软中断处理程序将数据包从内存缓冲区取出,保存在skb(socket buffer)
6、(数据包队列)内核网络协议,将数据包放到对应的socket接收队列中
7、(唤醒用户进程)
17、本机向本机发送请求,IP 127.0.0.1 和网卡ip地址的区别
·127.0.0.1 ,数据在内核网络栈中处理,经过回环接口,不会通过物理网卡NIC发送
网卡IP(本地实际IP地址)数据在内核网络栈中处理,经过物理网卡发送接收,走完整的网络栈路径,进行正常的网络通讯
数据包会走完整的网络栈路径,包括物理层、数据链路层和网络层。数据包会真正通过物理网卡发送和接收,可能会在网络上产生负载。
18、TCP粘包如何解决:
面向流的协议,发送的数据没有边界,接收方在一次读取操作接收到多个发送方的数据包,导致数据粘在一起
1)定长消息:每个消息固定长度,接收方按固定长度读取数据。
2)分隔符:在每个消息之间添加特殊字符作为分隔符,接收方按分隔符拆分数据。
3)消息头标识长度:在每个消息前添加一个消息头,消息头包含该消息的长度,接收方根据长度读取完整消息。
19、滑动窗口过大怎么样,过小怎么样?
过大:
在高带宽 低延迟环境下,可以在不等待收到ACK的情况下发送更多的数据
高延迟高丢包率:导致大量的未确认数据堆积,一旦丢包重传数据量大
过小:
高延迟高丢包率:可以限制未确认数据量,减少数据重传,降低网络拥堵
高带宽低延迟:限制了发送方数据传输速率,降低了带宽利用率
20、什么是流控制,如何在TCP中实现
目的:防止溢出,防止发送方数据过快,导致接收方数据溢出
确保稳定:确保网络传输的稳定性
流控制:接收方维护一个接收窗口,接收方在发送ACK时候,通知发送方当前接收窗口大小,发送方根据接收窗口大小,调整数据发送速度
21、TCP的nagle算法,negle坏处:
将小的数据包合成大包发送,减少每个包的协议开销
如果有小的数据包需要发送,如果前一个数据包ACK未收到,新的小数据包会被缓冲,等待前一个包的ACK到达或者缓冲区累积到足够大的数据再发送
22、UDP有可靠性保证吗?UDP如何可靠?
UDP特性:无连接,不保证数据包的顺序和完整性
实现可靠性的方法:
ACK确认
超时重传,发送数据后开启一个定时器
序列号:接收方根据序列号确认数据
FEC(前向纠错):冗余数据,在数据包中增加冗余数据,通过冗余信息进行纠错检测和纠正,确保数据完整性
23、UDP常见应用场景:
视频流媒体传输、语音通讯,在线游戏(多人在线游戏)、简单的请求-响应,网络广播
24、为什么客户端 TIME-WAIT状态必须等待2MSL?
在TCP协议中,当一方主动关闭连接时,他会进入TIME-WAIT状态。持续时间2MSL(最大报文段生存时间)
确保被动关闭方收到ACK
(1)主动关闭方发送最后一个ACK报文,可能会丢失,被关闭方没有收到ACK,会重新发送FIN
(2)主动关闭方必须等待一段时间,接收FIN并重新发送ACK
(3)不等待2MSL可能没法发接收到,导致不正常的关闭
确保旧的报文段在网络中消失
(1)在这段时间内,网络中所有旧的、重复的报文都会超时并丢弃,确保下一次连接不会收到前一个连接旧报文段
25、什么是MTU,如何处理MTU的问题?
MTU(最大传输单元):
指网络层协议数据包在数据链路层的最大传输字节。典型值1500字节(以太网)。
数据包大于MTU,必须分片传输,增加额外开销,过小的MTU会导致数据包数量增加。
如何处理
(1)路径MTU发现:
通过发现路径上所有路由器的MTU大小,确定最小的MTU以避免分片
工作原理:发送带有DF标志的数据包,某个路由器无法转发这个数据包,他会丢弃该数据包并返回一个ICMP(需要分片但设置了DF标志),源主机根据此消息 调整MTU大小,直到找到合适的MTU
(2)手动设置MTU
(3)MSS调整
TCP协议中使用MSS来指定传输层能够发送最大数据段大小,MTU减去TCP/IP头部大小
(4)使用较小的MTU值:
确保所有路径上的MTU都大于等于该值,避免分片
26、IPv4 IPv6区别
27、什么是NAT?作用是什么?
网络地址转换(NAT):在路由器 或者防火墙,将私有网络地址转换为共有网络地址,允许多个设备共享一个共有ip
解决IPv4地址耗尽,提高网络安全性
28、IP分片,为什么要IP分片
将大于MTU数据包分割成多个小包传输,在接收方重新组装成完整数据包
原因:适用不同的MTU,避免数据包丢弃
29、ICMP,互联网控制消息协议,一种网络层协议,IP主机和路由器之间传递控制消息和错误报告,主要用于报告网络连接中的错误和进行网络诊断
30、如何防止ARP攻击
31、什么是TCP序列号机制?
序列号:每个TCP数据包都包含一个序列号,用于标志数据包的顺序
确认号:接收方期望收到下一个数据包的序列号
作用:数据包排序,丢包检查,查看是否丢包
三、网络编程
1、socket编程基本流程:
2、什么是多路复用?如何使用select、poll、epoll
多路复用:允许一个单独的线程同时监控多个文件描述符,查看是否有任何一个文件描述符准备好了进行IO操作,这种技术在同时处理大量并发连接的网络服务器中十分有用
(1)select:
创建一个文件描述符集合
将需要监控的文件添加到集合中
调用select函数,并传递文件描述符集合和超时时间
select返回准备好进行IO操作的文件描述符数量
缺点:处理大量文件描述符的时候性能较差,每次调用select都要遍历所有文件描述符
(2)poll
创建一个pollfd结构数组,并将需要监控的文件描述符添加到数组中
调用poll函数,并传递文件描述符数组和超时时间
poll函数返回准备好进行IO操作的文件描述符数量
优点:没有文件描述符数量限制
缺点:在处理大量文件描述符时候性能较差,因为每次调用poll实例都需要遍历整个数组
(3)epoll
使用epoll create创建一个epoll实例
使用epoll ctl 添加、修改、删除需要监控的文件描述符
使用epoll wait 等待事件 并获取准备好进行io操作的文件描述符
优点:适用于大量并发连接的 场景,不需要每次调用都遍历所有文件描述符
缺点:仅在linux系统上可用
3、如何实现长连接和短连接
长连接:
第一次连接后,通过心跳包维持连接状态
短连接:
每次请求和响应完成后,客户端和服务器立即关闭连接
4、什么是端口号?
用于标志特定的网络服务,每个端口号对应一个网络服务,范围:0-65535
1)HTTP (80):用于Web浏览的超文本传输协议。
2)HTTPS (443):用于安全Web浏览的超文本传输协议。
3)FTP (21):用于文件传输协议。
4)SSH (22):用于安全外壳协议。
5)DNS (53):用于域名系统。
5、如何通过socket实现可靠数据传输?
序列号确认号,超时重传,流控制(接收窗口),拥塞窗口控制
四、网络安全
1、HTTPS和HTTP
HTTPS是安全版的http,它通过SSL/TLS协议对数据进行加密,确保数据在客户端和服务器之间不会被窃听和篡改。
HTTPS工作原理:
建立连接:客户端向服务器发送HTTPS请求,服务器返回SSL/TLS证书(公钥和服务器身份信息)
身份验证:客户端验证服务器证书是否由可信CA签发
加密密钥协商:客户端生成一个会话密钥,并使用服务器的公钥加密这个会话密钥,然后发给服务器,服务器使用自己的私钥解密会话密钥,双方拥有相同的会话密钥
加密通信:双方通过相同的会话密钥对数据进行加密和解密,确保数据不会被篡改
2、什么是SSL/TLS?
SSL安全套接层
TLS传输层安全
五、应用层协议
1、HTTP/1.1
(1)持久连接:HTTP1.0每次请求需要建立一个新的TCP连接,而1.1引入了持久连接
,允许多个请求和响应共用一个TCP连接
(2)管道化:允许客户端发送第一个请求后,未等待其相应就发送第二个请求
(减少响应时间,头阻塞问题严重)
(3)分块传输编码:
使用分块传输编码,每一块都有自己的大小标识,接收端根据块大小逐一接收和组装
(4)缓存机制:
提供了丰富的缓存控制头部字段
1).请求/响应头部未经压缩,信息越多延迟越大。
2).每次发送相同的头部信息,导致了大量的冗余和浪费。
3).服务器按请求顺序响应,头阻塞问题严重。
4).无法控制请求的优先级,重要的请求不能优先处理。
5).请求只能由客户端发起,服务器只能被动响应。
HTTP2.0
(1)二进制格式传输
(2)多路复用:
在一个TCP连接上同时发送多个请求和响应,每个请求和响应对应一个流,通过流标识区分不同的请求和响应,避免了头阻塞问题
(3)头部压缩:使用HPACK算法对头部进行压缩,减小头部大小
(4)服务器推送:
服务器可以在客户端未明确请求时主动推送资源,提高页面加载速度‘
(5)流优先级
客户端可以为每个流设置优先级,告诉服务器哪些资源更重要
2、DNS解析过程:
用户在浏览器中输入域名
浏览器缓存
操作系统缓存
检查hosts文件
向本地DNS服务器发出查询请求
向根DNS服务器发送查询请求
返回顶级域名服务器地址
返回权威DNS服务器地址
向权威DNS服务器发出查询请求
返回最终ip地址
DNS解析是将域名转换成ip地址的过程
3、什么是负载均衡,常见的算法
分布式计算技术,通过工作负载和请求分配到多个服务器上,防止单一服务器过度使用
常见算法:轮询,加权轮询,最小连接数,加权最小连接数,源地址哈希,随机,最小响应时间
4、什么是CDN?他的工作原理
CDN:内容分发网络,是一种通过在全球范围内部署多个服务器节点,帮助用户更快速更稳定访问网站内容的技术,CDN主要目标市提高内容传输的速度和可靠性,减小服务器负载,提升用户体验。
CDN的优势:
加速内容传输,减轻源站负载,提高可用性,安全性增强,带宽优化
5、什么是WebSocket?他与HTTP的区别
WebSocket是一种单个TCP连接上进行全双工通讯协议。允许服务器和客户端之间进行实时双向数据传输。适用于频繁更新数据的应用
(1)建立连接
客户端发送一个带有特殊头部字段的HTTP请求到服务器,表示希望升级到WebSocket协议,这个请求被称为“握手”请求,服务器相应握手请求
(2)数据传输:
WebSocket使用帧(frame)来传输数据,帧可以包含文本数据或者二进制数据,且通讯时无须每次都携带头部信息,减少了传输开销
(3)关闭连接
连接可以由客户端或服务器任意一方主动关闭连接,发送一个关闭帧,另一方收到会回复一个关闭帧
WebSocket优势:
(1)实时通讯,支持双向通信
(2)降低开销:一旦建立连接,后续数据传输不需要重复传输头部信息
(3)保持连接状态,连接是持久的
6、FTP、SMTP、IMAP、POP3基本原理和应用场景
FTP是一种用于在客户端和服务器之间传输文件的协议
控制连接和数据连接
主动模式
被动模式
SMTP:是一种用于在电子邮件服务器之间传输电子邮件的协议
IMAP是一种用于从邮件服务器读取电子邮件的协议
POP3从邮件服务器下载电子邮件,下载后会从服务器删除
六、网络性能和优化
1、如何监控和分析网络性能
使用网络监控工具
(1)Wireshark:用于捕获和分析网络数据包
(2)Nagios:监控网络设备,服务器和服务的状态
(3)NPM实时网络性能监控和故障排除功能
网络性能指标监控
带宽使用率、延迟、抖动、丢包率、网络利用率
2、网络性能瓶颈有什莫?
带宽不足、高延迟、丢包、网络设备性能不足、网络抖动、DNS解析慢
3、如何优化网络传输性能?
实施Qos策略:为不同类型流量分配优先级,确保关键应用的带宽和响应时间
如何实现:分类和标记、流量整形、拥塞管理
使用CDN
内容缓存和分布式负载
4、如何实现一个高效的聊天应用
合适的协议:
WebSocket(实时双向通信)
MQTT(轻量级发布、订阅消息传输协议)
负载均衡(客户端连接分发到多个服务器)
消息队列:管理分发消息
数据库选择:持久化储存SQL
性能优化:
缓存,异步处理,耗时操作放在后台异步处理,使用消息队列进行任务调度
压缩和优化数据传输:优化网络传输
5、如何确保数据传输的安全性?
加密:
TLS/SSL加密传输层数据
E2EE端到端加密 :发送端消息加密,接收端进行解密
身份验证:
OAuth:经过授权的用户才能访问资源
JWT:身份验证,确保请求的合法性和安全性
安全协议:HTTPS:传输数据
IPsec:网络层对数据进行加密和认证
安全实践:
防火墙
安全审计和监控
6、消息队列的工作原理及其分布式系统中的应用
消息队列是一种用于异步通讯的中间件,通过生产者和消费者之间传递消息来实现解耦。
消息生产:生产者将消息发送到消息队列
消息储存:消息队列储存,直到消费者读取消息
消息消费:消费者通过消息队列读取消息后进行处理
消息确认:消费者处理后向消息队列发送确认,队列将对该消息标记已处理
消息删除:已处理的消息 从队列中删除,未确认的消息在第一段事件后重新投递
异步处理、解耦组件、负载均衡、峰值削减、数据同步
7、零拷贝技术:
一种减少或者消除数据在内存中拷贝次数的方法,以提高数据传输效率
第五章 操作系统
1、进程、线程、协程
进程:操作系统中资源分配的最小单位,拥有独立的地址空间,适合独立的应用程序
上下文切换:切换进程时,操作系统保存当前进程状态,并加载新进程的状态
资源共享:每个进程拥有独立的内存空间和系统资源
线程:共享进程的资源(内存空间代码段、数据段、打开的文件),拥有独立的栈、寄存器状态、程序计数器,但可以独立运行,适合执行并行任务
独占资源:
线程栈,程序计数器(指示线程下一条执行指令的位置),线程特定数据,寄存器集
线程切换时内核的行为:
线程切换是由操作系统内核自动管理的,内核执行以下操作:
保存线程状态,加载新线程状态,更新调度结构,栈切换,处理器缓存
协程:轻量级执行单元,运行在线程之上通过用户态的调度实现非阻塞的任务切换,适合处理大量的异步任务
2、进程内存空间包括哪些部分?
栈:存放函数局部变量、返回地址等
堆:用于动态内存分配,其大小和位置运行的时候可变
未初始化数据BSS:未初始化和初始化 为0的全局变量和静态变量
初始化数据:已初始化的全局、静态变量
代码段:存放程序的机器指令,通常设置为只读以防止修改
3、一个可执行文件如何变成进程?
(1)加载可执行文件,点击程序图标,操作系统的shell或其他界面将用户的请求转化为启动程序的指令,操作系统读取可执行文件的元数据
(2)创建进程控制块(PCB)
(3)分配内存
4(4)加载依赖库
(5)初始化程序运行环境
(6)开始执行
(7)调度和执行
4、什么时候使用多线程,什么时候使用多进程
多线程:共享内存和资源,轻量级并发任务,响应性要求高的应用程序
多进程:隔离安全性,利用多核处理器,资源密集型应用