1.UDP和TCP有什么区别呢?分别应用的场景是?
UDP协议是不可靠传输协议,TCP是可靠的传输协议,在数据传输可靠性方面有区别,UDP会比TCP的数据传输可靠性低,TCP协议在连接性上面向连接,UDP无连接,在报文方面,TCP的报文面向字节流,UDP面向报文,在效率上,TCP的传输效率低,UDP的传输效率高,在流量控制和拥塞控制中,TCP针对流量控制有滑动窗口,对拥塞控制有慢开启,拥塞避免,快重传,快恢复,而UDP对流量控制和拥塞控制无相应对策,在传输速度方面TCP较UDP慢。
TCP的应用场景主要是在对效率要求低,对准确性要求高或者要求有连接的场景
UDP的应用场景主要是在对效率要求高,对准确性要求较低的场景使用
-----------------------------------------------------拓展----------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------------
2.Select、poll、epoll的区别
select poll epoll 是 Linux系统的三个系统调用,也是IO多路复用模型的具体实现
Select
select函数监听的文件描述符分三类 分别是writefds、readfds 和 exceptfds
调用过程:
1 用户进程需要监控某些资源fds,在调用select函数后会阻塞,操作系统会将用户线程加入这些资源的等待队列中
2 直到有文件描述符就绪(有数据可读、可写或有except)或超时(timeout指定等待时间,如果立刻返回设为NULL即可),函数返回
3 select 函数返回后,中断程序唤起用户线程,用户可以遍历fds,通过FD_ISSET判断具体哪个fd收到数据并作出相应处理
Select 缺点:
1 每次调用select都需要将进程加入到所有监视fd的等待队列,每次唤醒都需要从每个队列中移除
2 函数返回时,系统会将就绪描述符写入fd_set中,并将其拷贝到用户空间,进程被唤醒后,用户进程并不知道那些fd收到数据,还需要遍历一次
32位系统最多监听1024个fd,64位系统最多监听2048个
Poll
与select原理类似,都需要来回拷贝全部监听的文件描述符,不同的是:
1 poll函数采用链表的方式替代原来select中的fd_set结构,因此可监听文件描述符数量不受限制
2 poll函数返回后,可以通过pollfd结构中的内容进行处理就绪文件描述符,相比select效率要高
3 新增水平触发,也就是通知程序fd就绪后,这次没有被处理,那么下次poll的时候会再次通知同一个fd已经就绪
Poll缺点:
1 poll返回后需要轮询pollfd来获取就绪的描述符
2 随着监视描述符的增长,其效率也会线性下降
epoll
epoll使用一个文件描述符管理多个文件描述符,将用户进程监控的文件描述符的事件存放到内核的一个事件表中,这样在用户空间和内核空间只需拷贝一次
epoll_create
创建一个epoll的句柄,参数size并非限制了epoll所能监听的描述符最大个数,只是对内核初始分配内部数据结构的一个建议
当epoll句柄创建后,他就会占用一个fd值,在Linux中查看/proc/进程id/fd/,能够看到这个id,所以epoll使用完后必须调用close关闭,否则可能导致fd被耗尽
epoll_ctl
事件注册函数,将需要监听的事件和需要监听的fd交给epoll对象
OP用三个宏表示:添加(EPOLL_CTL_ADD)删除(EPOLL_CTL_DEL)
修改(EPOLL_CTL_MOD)
epoll_wait
等待epfd上的io事件,最多返回maxevents个事件,参数timeout是超时时间
浅拷贝or深拷贝
浅拷贝
创建一个新的对象,这个对象有着原始对象属性值的一份精准拷贝,如果属性是基本类型,拷贝的就是基本类型的值,如果属性是引用类型,拷贝的就是内存地址
深拷贝
深拷贝是将一个对象从内存中完整拷贝一份出来,从堆区内存再开辟一个新的区域存放新对象
二者的区别在于如果修改浅拷贝新建对象的值则原对象也随随之改变
而深拷贝新建对象被修改不影响原对象的值
C++空类中的成员函数
1 缺省构造函数
2 缺省拷贝构造函数
3 缺省析构函数
4 缺省赋值运算符
5 缺省取址运算符
6 缺省const取址运算符
内存泄漏
内存泄漏是因为疏忽或错误造成程序未能释放已经不能再使用的内存的情况
避免方法:手动释放内存 避免出现野指针 使用智能指针(unique_ptr shared_ptr weak_ptr)
sizeof和strlen区别
sizeof:
它是一个运算符,不是一个函数,代表给定对象的大小(以字节为单位)
strlen:
是一个函数,用于计算字符串的长度,即字符串中字符个数,不包括结尾的NULL(\0)字符,被定义在<string.h>头文件中
STL中reverse()和resize()的区别
1 reserve() 避免多次不必要的扩容
特征:
reverse 的作用是更改vector的容量,使vector 至少可以容纳 n 个元素
· 如果 n 大于 vector 当前的容量,reserve会对vector进行扩容
其他情况下都不会重新分配vector的储存空间
reserve 是容器预留空间,但在空间内不真正创建元素对象,所以在没有添加新的对象之前,不能引用容器内的元素,加入新元素时,要调用 push_back() / insert() 函数
reserve() 函数预分配出的空间没有被初始化,所以不可访问
2 resize 是改变容器的大小,且创建对象
resize() 函数和容器的size息息相关,调用resize(n)后,容器的size即为n。至于是否影响容量,则取决于调整后的容器的size是否大于容量
比原来小时 后面的会被截断
比原来大时 后面的会填充新的东西
resize 是改变容器的大小,且在创建对象,因此,调用这个函数之后就可以引用容器内的对象了,因此加入新的元素时,用operator[]操作符,或者用迭代器引用对象,此时调用push_back函数是加在这个新的空间后面的
http1.x 和 http2.x 的区别
1 http2使用的是二进制传送 http1是文本(字符串)传输
2 http2支持多路复用
3 http2 头部压缩
4 http2 支持服务器推送
从代码到可执行程序的四个过程
预处理 CPP 根据以 # 字节开头的命令修改原始的 C 程序 .c 文件变为 .i 文件 -E
编译 包含一个汇编语言程序 .i 文件变为 .s 文件 -S
汇编 将 .s 翻译成机器语言指令,将这些指令打包成一种叫做可重定位目标程序的格式并保存在
.o 文件中,这是个二进制文件,无法直接用文本编辑器观看 .s变为.o文件 -C
链接 -O 从.o 文件得到可执行文件
三次握手四次挥手
三次握手
客户端主机向服务器主机发送请求连接数据包,其中首部SYN为1,确认序列号sequence=x
此时客户端进入SYN-SEND状态,服务器接收到请求连接数据包后返回确认数据包,SYN=1
ACK=1 生成确认序列号sequence=y ack=x+1 此时服务器进入SYN-RECEIVED状态
客户端主机收到服务器发送的确认数据包后要向服务器发送确认收到数据包,此时ACK=1
sequence=x+1 ack=y+1此时客户端主机进入ESTABLISH状态,服务器接收到确认数据包后也进入
ESTABLISH状态,三次握手完成
四次挥手
客户端主机向服务器主机发送断开连接报文段,其中首部FIN=1,sequence=u,此时客户端主机
进入FIN-WAIT-1状态,服务器收到客户端的断开请求报文段后向客户端发送确认收到报文段,其
中ACK=1 sequence=v ack=u+1 此时服务器进入CLOSE-WAIT状态,客户端收到报文段后变为
FIN-WAIT-2状态,此时服务器向客户端发送断开连接报文段,其中FIN=1,ACK=1 sequence=v
ack=u+1 ,接收到报文段的客户端主机此时进入TIME_WAIT状态,此时向服务器主机发送确认收
到报文段ACK=1 sequence=u+1 ack=v+1 等待2MSL时间后客户端和服务器都变为CLOSE状态
四次挥手完成
HTTPS协议具体加密过程
client请求服务端(指定SSL版本和加密组件)
server返回CA证书+公钥
client用机构公钥认证server返回的CA证书上的签名是否正确
client生成一个密钥R,用公钥对密钥R加密发送给server server用服务器的私钥解密获取密钥R
后续通信都是采用密钥R进行加密
MySQL主从同步如何实现
在master机器上,主从同步事件会被写到特殊的log文件中(binary-log);
在slave机器上,slave读取主从同步事件,并根据读取的事件变化,在slave库上做相应的更改。