这是我参与「第五届青训营 」伴学笔记创作活动的第 4 天
今天课程没有安排,直接开始自主学习
数据库优化相关
- 使用and连缀的条件编译器会自动进行交换尝试优化
- 建立索引的时候不推荐建立在经常改变的字段,索引结构也需要变动,消耗性能
MySQL8.0版本开始增加了索引跳跃扫描的功能,当第一列索引的唯一值较少时,即使where条件没有第一列索引,查询的时候也可以用到联合索引。 比如我们使用的联合索引是 bcd 但是b中字段比较少 我们在使用联合索引的时候没有 使用 b 但是依然可以使用联合索引 MySQL联合索引有时候遵循最左前缀匹配原则,有时候不遵循
IP地址的获取:DHCP
-
DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)
-
DHCP的具体执行流程
-
DHCP Discover:联网时,本机由于没有IP,也不知道DHCP服务器的IP地址是多少,所以根本不知道该向谁发起请求,于是索性选择广播,向本地网段内所有人发出消息,询问"谁能给个IP用用"。
DHCP Offer:不是DHCP服务器的机子会忽略你的广播消息,而DHCP服务器收到消息后,会在自己维护的一个IP池里拿出一个空闲IP,通过*广播的形式给回你的电脑。
DHCP Request:你的电脑在拿到IP后,再次发起*广播,就说"这个IP我要了"。
DHCP ACK:*DHCP服务器此时再回复你一个ACK,意思是"ok的"。你就正式获得这个IP在*一段时间(比如24小时)*里的使用权了。后续*只要IP租约不过期,就可以一直用这个IP进行通信了
-
-
DHCP为什么是基于UDP而不是基于TCP
-
主要原因还是因为TCP是面向连接的,而UDP是无连接的。所谓"连接",他就只有一个发送端和一个接收端,就跟水管一样。
-
而DHCP由于一开始并不知道要跟谁建立连接,所以只能通过广播的形式发送消息,注意,小细节,广播。
-
同样是在本地网段内发广播消息,UDP只需要发给
255.255.255.255。它实际上并不是值某个具体的机器,而是一个特殊地址,这个地址有特殊含义,只要设了这个目的地址,就会在一定本地网段内进行广播。 -
而TCP却不同,它需要先建立连接,但实际上
255.255.255.255对应的机器并不存在,因此也不能建立连接。如果同样要做到广播的效果,就需要先得到本地网段内所有机器的IP,然后挨个建立连接,再挨个发消息。这就很低效了。因此DHCP选择UDP,而不是TCP
-
-
DHCP服务器向电脑发送二阶段实际上使用了单播作为优化手段
- 另外一个小细节不知道大家注意到没,上面在提到 DHCP Offer 阶段时,提到的是DHCP服务器会使用广播的形式回复。但抓个包下来却发现并不是广播,而是单播。
- 其实,这是DHCP协议的一个小优化。原则上大家在DHCP offer阶段,都用广播,那肯定是最稳的,目标机器收到后自然就会进入第三阶段DHCP Request。而非目标机器,收到后解包后发现目的机器的mac地址跟自己的不同,也会丢掉这个包。
- 但是问题就出在,这个非目的机器需要每次都在网卡收到包,并解完包,才发现原来这不是给它的消息,如果本地网段内这样的包满天飞,也浪费机器性能。
- 如果能用单播,那当然是最好的。但这时候目的机器其实并没有IP地址,有些系统在这种情况下能收单播包,有些则认为不能收,这个跟系统的实现有关。因此,对于能收单播包的系统,会在发DHCP Discover阶段设一个 Broadcast flag = 0 (unicast) 的标志位,告诉服务器,支持单播回复,于是服务器就会在DHCP Offer阶段以单播的形式进行回复。
-
每次联网不一定会经历完整的四个流程,电脑会自动选择最近使用过的ip发给DHCP请求,相当于告诉DHCP说:我之前用的就是这个IP你看看有没有,直接给我得了
-
DHCP出现IP重复的情况
- 文章开头提到,IP是可以自己手动配的,自己配的IP是有可能跟其他DHCP分配下来的IP是相同的。解决方案也很简单,尽量不要手动去配IP,统一走DHCP。或者在DHCP服务器里维护的IP范围里,将这条IP剔除。
- 一个本地网段内,是可以有多个DHCP服务器的,而他们维护的IP地址范围是有可能重叠的,于是就有可能将相同的IP给到不同的机子。解决方案也很简单,修改两台DHCP服务器的维护的IP地址范围,让它们不重叠就行了
-
获得IP后的处理
- 在得到DHCP ACK之后,机子不会立刻就用这个IP,而是会先发三条ARP消息。大家知道ARP消息的目的是通过IP地址去获得mac地址。所以普通的ARP消息里,是填了IP地址,不填mac地址的。但这三条ARP协议,比较特殊,它们叫无偿ARP(
Gratuitous ARP),特点是它会把IP和mac地址都填好了,而且填的还是自己的IP和mac地址。 - 其目的在于:
- 一个是为了告诉本地网段内所有机子,从现在起,xx IP地址属于xx mac地址,让大家记录在ARP缓存中。
- 另一个就是看下本地网段里有没有其他机子也用了这个IP,如果有冲突的话,那需要重新再走一次DHCP流程
- 在得到DHCP ACK之后,机子不会立刻就用这个IP,而是会先发三条ARP消息。大家知道ARP消息的目的是通过IP地址去获得mac地址。所以普通的ARP消息里,是填了IP地址,不填mac地址的。但这三条ARP协议,比较特殊,它们叫无偿ARP(