1、负载均衡中的一致性哈希如何使用的
2、服务器的半同步半异步怎么使用的
主线程异步监听listenfd,当有客户端连接的时候,将连接连接套接字发给工作线程,工作线程也是异步处理,使用libevent将所有套接字监听起来。所以是一个高效的半同步半异步
3、服务器和客户端通讯的步骤
4、数据包在网络中传输的具体过程
应用层将要发送的数据发送到传输层,传输层加上传输层的头部信息之后给到网络层,网络层添加网络层的头部之后,主要是目的ip和源ip,ttl跳数等,将数据包给到网络接口层,这时arp协议开始工作,根据目的ip地址在arp表中查找对应的mac地址,如果在同一个局域网并且arp表中可以查到对应的目的mac,直接发送,如果查不到则arp会给该局域网广播一条arp请求来获取目的mac,然后发送消息并将该目的mac和ip存入到自己的arp表中。如果不在一个局域网中,那么arp就会将连接该局域网的路由器的mac地址封装到mac帧中,由物理层发送出去,然后当路由器接收到该数据包之后,他会进行一个去头部的过程一直到网络层,识别到目的ip,在自己的路由表中查找到合适的next hop的ip地址,将该ip传给网络接口层,arp协议根据ip找到mac地址,封装到mac帧中发送出去,在网络中的路由一直重复这个过程,直到一个路由器发现该数据包的目的ip是自己的局域网中的一台主机时,就不再进行路由,而时直接发送给该主机,这就完成了一次数据包在网络中的传输过程。
5、数据包的传输经过了哪些层
应用层->传输层->网络层->网络接口层
6、粘包的优点和缺点
粘包的概念:发送端的多个tcp数据包被连在一起头尾相接,当成一个数据包发送。或接收端从接收缓冲区中读的时候,将多个数据包一次读出。产生原因:socket缓冲区与滑动窗口的限制,MSS/MTU限制,Nagle算法将多个包结合起来一次发送。
优点:减少网络中细碎的数据包个数,避免对网络造成压力,导致网络拥塞。
缺点:接收端处理的时候比较困难,要进行解包
7、接收端如何处理粘包
8、数据包在网络中路由时如何确定路由的路径,目的ip和源ip会改变吗
arp协议根据ip地址查找对应的mac地址,进行物理层的寻路转发,如果arp表中没有对应的mac地址,则会广播一条mac请求,谁回应他谁就是对应的mac地址,也是一个学习过程,网络层根据ip地址在路由表中查找合适的下一跳,确定之后将下一跳的mac地址封装到链路层头部,进行转发。因此,ip地址是不会改变的,改变的是mac地址,每次都会被更新成下一跳的mac地址。
9、滑动窗口协议,窗口是越大越好吗,为什么
滑动窗口协议是tcp流量控制的一种手段,tcp的内核缓冲区中会维护一个窗口,发送缓冲区维护发送窗口,发送窗口的大小由接收窗口和拥塞窗口的最小值决定;接收缓冲区维护接收窗口,接收窗口的大小一般由接收应用程序读取接收缓冲区的速度决定。当双方通信的时候,接收端在对所接收到的数据包进行确认的时候,会将接收窗口的大小放在tcp头部带给发送端,发送端根据接收窗口的大小结合拥塞窗口的大小,确定自己发送窗口的大小。发送窗口的前沿可以右移,也可以左移(不推荐),后沿只能右移。而且后沿只有在接收到第一个数据包的确认的时候才会右移。接收窗口在接收到数据包后,会先暂存在接收缓冲区,直到应用程序读取该数据包之后才会将其从接收窗口移出。
发送窗口是由拥塞窗口和接收窗口共同决定的,在网络状况允许的情况下,如果接收窗口越大,那么发送窗口也会越大,这样的好处是会提高传输效率,但是有可能会对网络造成压力。
10、tcp为什么是三次握手
如果是两次的话,这时的情况是:客户端发送给服务器一个SYN,服务器在接收到该SYN后,发送一个ACK给客户端,这时服务器进入ESTABLISHED状态,客户端收到ACK后也进入ESTABLISHED状态。在这种情况下,如果客户端第一次发送的连接请求在网络中拥塞了,超过重传时间,客户端又发送了第二个请求,这次很快从到达服务器,建立连接,完成交互,断开连接。当断开之后,第一次的请求才到达服务器,服务器又会重新建立一个和该客户端的连接,然而此时客户端已经关闭了,这将会极大的浪费服务器的资源。
11、IP头部的字段
4位版本号,4位头部长度,8位服务类型,16位总长度,16位标识,3位标志,13位片偏移,8位生存时间,8位协议,16位头部校验和,32位源ip,32位目标ip
12、myisam和innodb的区别
1、myisam只支持表锁,而innodb支持行锁
2、innodb支持事务,myisam不支持事务
3、myisam支持全文索引,innodb不支持全文索引
4、innodb支持外键,而myisam不支持外键
5、myisam只支持非聚簇索引,而innodb支持聚簇索引
13、innodb如何实现对事务的支持
事务的话是有它的四个特性:ACID,即原子性,一致性,隔离性,持久性。
原子性:一个事务必须被视为一个不可分割的最小工作单元,整个事务的所有操作要么全部提交成功,要么全部失败回滚,不可能只执行其中的一部分
一致性:数据库总是从一个一致性的状态转换到另一个一致性的状态。
隔离性:通常来说,一个事务所做的修改在最终提交前,对其他事务是不可见的。
持久性:一旦事务提交,那么其所做的修改就会永久保存到数据库中,即使系统崩溃修改的数据也不会丢失
那innodb对ACD的支持是通过redo log和undo log实现的,隔离性是靠锁实现的。
redo log:记录字段被事务修改后的值,由于考虑到效率问题,事务被提交之后并不会立即对数据文件进行写入,而是先暂存在内存中,但redo log却会在事务未被提交时就刷到redo日志文件中,这时如果数据库断电,当恢复后就可以从redo日志文件中读取事务对数据库的修改然后写入磁盘。
undo log:记录字段执行事务前的值,如果事务已经修改了某个记录,但是还未提交的时候突然断电,当恢复后就可以从undo log中回滚到事务未执行之前的状态,确保了原子性。
14、索引的类型
b+树索引:使用b+树作为存储键值的数据结构,叶子节点存放数据或者数据的地址
hash索引:采用一种hash算法,将键值转换成新的hash值存储
在等值查询时,hash索引的优势比较明显,只用经过一次hash函数的计算而不用经过 从跟节点到叶子节点的查询过程。但是范围查找时由于b+树的叶子节点之间是连续的, 所以很高效,只用进行一次I/O,而且hash索引也不能用来对键值进行排序。
15、聚簇索引和非聚簇索引,myisam和innodb索引的区别
聚簇索引的叶子节点是数据节点而不是索引节点,而非聚簇索引的叶子节点存放的是聚 簇索引的地址,先根据非聚簇索引找到聚簇索引,再根据聚簇索引找到数据。
myisam中没有聚簇索引,innodb中有聚簇索引。
myisam中的索引的叶子节点存放的是数据文件的文件指针,而innodb的非聚簇索引 的叶子节点存放的是聚簇索引键值,找到键值后再根据聚簇索引去找到数据。
16、聚簇索引为什么快,如果查询的字段不是建立索引的字段还会高效吗
聚簇索引只用查找一次就能够获取到数据,而非聚簇索引要查找一遍之后,再进行一次 聚簇索引的查找
17、聚簇索引范围查找为什么快
b+树的叶子节点会有一个指向下一个叶子节点的指针,找到范围中的第一个数据后, 就可以直接指向下一个节点,而不用再回表重新查找。
18、操作系统的分页机制及其优点
二级页面映射:
linux内核中位每个进程维护了一个页面目录,当cpu将线性地址交给mmu去查找物 理地址时,mmu以该线性地址的高十位为下标去页面目录中查找目录项,对应目录项 的高20位指向了一个页面表,低12位的最低位p标志位为1时说明 该页面表在 内存中,为0时说明在磁盘上;找到页面表后,mmu再根据线性地址的次 10位在 该页面表中找到对应的页面表项,页面表项的高20位指向对应的页面,当该页面表项 的最低位为1时表示该页面在内存中,否则在磁盘上,找到对应的页面后,再用该页面 的地址加上线性地址的低十二位就是对应数据在物理内存中的位置
分页机制:操作系统在将磁盘上的数据加载到内存中时是按页为单位加载的,每个进程 会有一个页表,对应物理内存中的一个页面。
优点:程序不必连续存放,局部性原理:每次加载一个页到内存中,访问页中的一个数 据时,下次访问的可能是和该数据在同一页的数据,不用多次加载。
19、堆排序的思想
利用堆进行排序,小顶堆根节点和叶子节点相比肯定是最小的。使用小顶堆排序的思路 为:将待排数据先构造成一个小顶堆,此时整个堆的根节点是整个序列的最小值,将其 和最后一个元素互换,将待排序列长度减一,再调整小顶堆,这时堆顶元素是次小元素, 再和最后一个元素交换,重复这个过程直到剩下一个数据的,就成为有序的一个序列。
20、如何从一个字符串中找到所有不重复的字符,最优的时间复杂度