Day15
1. TCP和UDP的区别?
- 连接方式:TCP 是面向连接的,传输前需要三次握手建立连接;UDP 是无连接的,发送数据前不需要建立连接,开销更小。
- 可靠性:TCP 提供可靠传输,保证数据按序、无重复、不丢失地到达;而 UDP 是尽最大努力交付,不保证可靠性,但更高效。
- 传输方式:TCP 是面向字节流的,没有边界,适合持续的数据传输;UDP 是面向报文的,每个报文是一个独立的消息,有明确边界。
- 服务对象:TCP 通常是一对一通信;UDP 支持一对一、一对多、多对多通信,适用于广播和多播。
- 拥塞与流量控制:TCP 内部有拥塞控制和流量控制机制,能自动调整速率,避免网络拥堵;UDP 没有这些机制,发送速率不受限制。
- 头部开销:TCP 的头部最小是 20 字节(不含选项字段),较复杂;UDP 的头部固定为 8 字节,结构简单,效率更高。
2. UDP怎么保证可靠性?
UDP 是一种不可靠的传输协议,但像 QUIC 这样的协议通过一系列机制,在 UDP 的基础上实现了类似 TCP 的可靠传输能力,具体包括:
- 连接迁移:QUIC 为每个连接分配独立的 Connection ID,当网络环境发生变化(比如从 WiFi 切换到 4G)时,连接仍然可以继续使用,保证通信不中断,提升连接的可靠性。
- 重传机制:QUIC 会给每个数据包编号,当接受方发现有数据包丢失时会通知发送方进行重传,确保数据最终能被完整接收。
- 前向纠错(FEC):QUIC 支持可选的前向纠错技术,可以在丢包时不依赖重传就恢复部分数据,降低重传开销,提高整体传输效率和稳定性。
- 拥塞控制:QUIC 内置了 TCP 类似的拥塞控制算法,比如 BBR 或 CUBIC,能根据网络状况动态调整发送速率,避免网络过载造成的大量丢包。
3. HTTP的原理是什么?
HTTP 是一种基于 TCP 的应用层协议,主要用于 Web 浏览器和服务器之间传输超文本数据。它采用请求-响应模型:客户端(比如浏览器)发起请求,服务端接受并返回响应。一个请求从“请求行”开始,包含请求方法、URL和协议版本;服务端响应时,会返回状态行,服务器默认不会记录客户端的历史状态。为了实现登录状态、购物车等功能,通常会配合使用 Cookie、Session 或 Token 技术进行状态管理。此外,HTTP 支持传输各种类型的数据(如文本、图片、视频等),可以通过请求头和响应头(比如 Accept、Content-Type)来协商数据格式,实现更灵活的通信。
4. TCP协议里的TIME_WAIT状态是什么?
TIME_WAIT 是 TCP 协议中,主动关闭连接的一方在完成四次挥手中发送最后一个 ACK 报文后进入的状态,通常持续时间为 2 倍最大报文段寿命(2MSL)。这个状态主要有两个作用:
- 防止丢失的最后 FIN 报文重传时未被正确处理:网络中可能存在延迟或丢失的 FIN 报文,TIME_WAIT 状态让主动关闭方在这段时间内继续监听,若对方重传 FIN,可以及时响应,确保链接可靠关闭。
- 避免旧连接中的“死信包”(重复数据包)干扰新连接:每个 TCP 连接由四元组(源 IP、源端口、目的 IP、目的端口)唯一标识,TIME_WAIT 阶段保留这个四元组,防止旧连接的延迟包误导新连接,保证数据通信的准确性。
在 TIME_WAIT 状态期间,该端口号暂时无法复用,这可能导致服务器端口资源被占用较多,但这是 TCP 保证连接关闭可靠性的重要机制。
5. redis主节点挂了怎么办?
当 Redis 主节点宕机后,可以通过Redis Sentinel 或 Redis Cluster 实现自动故障转移(Failover),将某个从节点提升为新的主节点,确保服务高可用。
- 哨兵机制(Redis Sentinel)自动故障转移:Redis 提供了 Sentinel 机制来实现主从架构的高可用。一旦主节点挂掉,哨兵会:
- 监控主节点的心跳
- 发现主节点不可用后进行投票确认
- 选举一个从节点提升为新的主节点
- 自动通知其他从节点重新复制新的主节点
- 通知客户端更新主节点地址
- Redis Cluster 自动故障转移:是 Redis 的分布式方案,数据分片存储在多个主节点中。它具备:
- 多主从架构
- 任意一个主节点宕机时,由集群中的其他节点检测到并选举一个从节点为新主
- 客户端可自动感知主节点变更
- 适用于大规模分布式部署
- 人工干预:如果没有部署 Sentinel 或 Cluster,主节点挂了需要手动:
- 将某个从节点配置为主节点
- 修改客户端连接
- 更新主从结构配置
6. 线程、进程、协程的区别是什么?
进程是操作系统资源分配的基本单位,拥有独立的内存空间,进程之间相互隔离,通信需要通过管道、消息队列等方式,稳定但切换开销大。线程是进程内更小的执行单位,多个线程共享进程的内存,通信高效,但存在线程安全问题,需要加锁控制,适合 CPU 密集型任务。协程是用户态的轻量线程,由程序调度,不依赖内核,切换开销极小,适合处理大量并发的 I/O 密集型任务,比如异步网络请求,缺点是调度和管理需要程序员自己控制。简单来说,进程最重、线程较轻、协程最轻,执行效率是协程 > 线程 > 进程。
7. MySQL索引底层原理是什么?
MySQL 中最常用的存储引擎是 InnoDB,它的索引底层使用的是 B+ 树结构。B+ 树是一种多路平衡查找树,所有真实数据都只存储在叶子节点中,而非叶子节点只存储键值和指向节点的指针,这使得树的高度可以控制得非常低(一般 2~4 层就能管理上千万行数数据),大大减少了磁盘 I/O。并且所有叶子节点通过链表相连,支持高效的范围查询和排序操作。在 InnoDB 中,主键索引是聚簇索引,数据行存储在主键 B+ 树的叶子节点中,因此通过主键查询非常快;而普通索引(辅助索引)是非聚簇的,它们的叶子节点只存储索引键和对应主键的值,所以通过辅助索引查询时需要先定位主键,再去主键索引中“回表”查找完整数据。索引的设计会直接影响查询效率、插入速度和存储开销,因此在使用时要根据数据量、查询频率和字段选择性合理规划索引策略。
8. 介绍一下 CAP 理论
CAP 是分布式系统中的一个基本原理,它指出在一个分布式系统中,最多只能同时满足以下三个属性中的两个,三者不可兼得。
- Consistency(一致性):所有节点在同一时间看到的数据是一致的(等价于单机系统的强一致性)。例如:你写入了一个值,所有节点立刻都能读到这个值。
- Avaliability(可用性):系统始终保证对客户端的请求返回响应,不管响应是成功或失败,至少能有结果。即使部分节点故障,系统也能继续提供服务。
- Partition tolerance(分区容错性):系统在出现网络分区(即节点间网络通信异常、丢包、延迟)时,仍能继续运作。这是分布式系统中必然面临的情况,无法回避。
核心:在网络发生分区(Partition)时,系统必须在一致性(C)和可用性(A)之间进行权衡。
- 若选择 C + P(保证一致性和分区容错):系统可能牺牲可用性,比如牺牲部分请求的响应。
- 代表系统:HBase、MonggoDB(强一致性模式)
- 若选择 A + P(保证可用性和分区容错):系统可能牺牲一致性,比如出现短时间的数据不同步。
- 代表系统:Cassandra、Dynamo、CouchDB