一 TCP如何保证可靠传输
三次握手:在建立连接时,客户端和服务器进行三次握手,以确保双方准备就绪。
序列号和确认号:每个数据包都有一个序列号,接收方通过确认号(ACK)确认数据是否成功接收。
超时重传:发送方如果在一定时间内未收到确认,会重传数据包。
流量控制:通过滑动窗口机制,控制发送方的发送速度,防止接收方因处理不过来而丢包。
拥塞控制:通过算法(如慢启动、拥塞避免等),防止网络拥塞。
二 OSI网络模型
1.物理层(Physical Layer)
OSI模型的最低层或第一层,规定了激活、维持、关闭通信端点之间的机械特性、电气特性、功能特性以及过程特性,为上层协议提供了一个传输数据的物理媒体。在这一层,协议数据单元为比特(bit)。在物理层的互联设备包括:集线器(Hub)、中继器(Repeater)等。
2.数据链路层(Datalink Layer)
OSI模型的第二层,它控制网络层与物理层之间的通信,其主要功能是在不可靠的物理介质上提供可靠的传输。该层的作用包括:物理地址寻址、数据的成帧、流量控制、数据的检错、重发等。在这一层,协议数据单元为帧(frame)。在数据链路层的互联设备包括:网桥(Bridge)、交换机(Switch)等。
3.网络层(Network Layer)
OSI模型的第三层,其主要功能是将网络地址翻译成对应的物理地 ,并决定如何将数据从发送方路由到接收方。该层的作用包括:对子网间的数据包进行路由选择,实现拥塞控制、网际互连等功能。在这一层,协议数据单元为数据包(packet)。在网络层的互联设备包括:路由器(Router)等。
4.传输层(Transport Layer)
OSI模型中最重要的一层,是第一个端到端,即主机到主机的层次。其主要功能是负责将上层数据分段并提供端到端的、可靠的或不可靠的传输。此外,传输层还要处理端到端的差错控制和流量控制问题。在这一层,协议数据单元为数据段(segment)。传输层协议的代表包括:TCP、UDP、SPX等。
5.会话层(Session Layer)
OSI模型的第五层,管理主机之间的会话进程,即负责建立、管理、终止进程之间的会话。其主要功能是建立通信链接,保持会话过程通信链接的畅通,利用在数据中插入校验点来同步两个结点之间的对话,决定通信是否被中断以及通信中断时决定从何处重新发送。
6.表示层(Presentation Layer)
OSI模型的第六层,应用程序和网络之间的翻译官,负责对上层数据或信息进行变换以保证一个主机应用层信息可以被另一个主机的应用程序理解。表示层的数据转换包括数据的解密和加密、压缩、格式转换等。
7.应用层(Application Layer)
OSI模型的第七层,负责为操作系统或网络应用程序提供访问网络服务的接口。术语“应用层”并不是指运行在网络上的某个特别应用程序,应用层提供的服务包括文件传输、文件管理以及电子邮件的信息处理。在应用层的互联设备包括:网关(Gateway)等。典型设备:应用程序,如FTP,SMTP ,HTTP。
三 HTTP和HTTPS的区别
HTTP | HTTPS | |
---|---|---|
端口 | 80 | 443 |
安全性 | 无加密,安全性较差 | 有加密机制,安全性较高 |
资源消耗 | 较少 | 由于加密处理,资源消耗更多 |
是否需要证书 | 不需要 | 需要 |
协议 | 运行在TCP协议之上 | 运行在SSL协议之上,SSL运行在TCP协议之上 |
四 数据库事务特性、隔离级别、默认级别
1.事务特性 (ACID):
原子性 (Atomicity):事务中的操作要么全部完成,要么全部回滚。
一致性 (Consistency):事务完成后,数据必须保持一致。
隔离性 (Isolation):事务之间相互独立,不受干扰。
持久性 (Durability):事务完成后,数据持久保存。
2.隔离级别:
读未提交 (Read Uncommitted):事务可以读取未提交的数据,容易产生脏读。
读已提交 (Read Committed):只能读取已提交的数据,防止脏读。
可重复读 (Repeatable Read):同一事务中多次读取结果一致,防止不可重复读。
可串行化 (Serializable):最高隔离级别,事务按顺序执行,避免幻读。
MySQL 的 InnoDB 引擎默认使用 可重复读(Repeatable Read)。
五 数据库默认索引结构是什么
大多数关系型数据库(如 MySQL)默认使用 B+树 作为索引结构,具有较高的查找效率和良好的磁盘访问性能。
六 Redis使用场景
缓存:常用于存储热数据,减轻数据库压力。
分布式锁:Redis 的原子操作可以实现分布式锁。
消息队列:利用 Redis 的 List 或 Pub/Sub 实现轻量级的消息队列。
会话存储:用于存储用户的会话数据。
排行榜:Redis 的 Zset 可以用于实现排行榜系统。
七 Redis内存满了会怎么样
Redis是不断的删除一些过期数据,但是很多没有设置过期时间的数据也会越来越多,那么Redis内存不够用的时候是怎么处理的呢?答案就是淘汰策略。当Redis的内存超过最大允许的内存之后,Redis会触发内存淘汰策略,删除一些不常用的数据,以保证Redis服务器的正常运行。
Redisv4.0前提供 6种数据淘汰策略:
volatile-lru:利用LRU算法移除设置过过期时间的key (LRU:最近使用 Least Recently Used )
allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。
Redisv4.0后增加以下两种:
volatile-lfu:从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰(LFU(Least Frequently Used)算法,也就是最频繁被访问的数据将来最有可能被访问到)
allkeys-lfu:当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的key。
八 JDK7和8做了哪些改进
JDK 7中:
try-with-resources 语法:简化了资源的关闭操作。
Switch 支持字符串:在 switch 语句中支持使用字符串类型。
Fork/Join 框架:引入了并行任务执行的框架,适合多核处理。
JDK 8中:
Lambda 表达式:简化了匿名内部类的书写方式,支持函数式编程。
Stream API:用于处理集合的声明式处理,支持并行处理。
接口中的默认方法:接口可以有实现方法,简化了接口的修改。
新日期时间 API:引入了
java.time
包,替代了老的Date
类。
九 MQ使用场景
解耦:不同系统间通过消息队列异步通信,降低系统间的耦合度。
异步处理:通过消息队列异步处理任务,提升响应速度。
削峰填谷:在流量高峰期,缓冲请求,减轻后端系统压力。
日志处理:在日志系统中,消息队列可以用来异步处理和分析日志数据。
分布式事务:在分布式系统中,用消息队列保证不同服务之间的事务一致性。
十 Hashmap
HashMap 是 Java 中的基于哈希表实现的键值对存储容器,允许通过键快速查找值。特点包括:键值对存储,每个键只能映射一个值,键不能重复,值可以重复;非线程安全,HashMap 不是线程安全的,需要在多线程环境下使用 ConcurrentHashMap;
内部实现,基于数组 + 链表 + 红黑树的结构。在哈希冲突较少时,使用链表存储;当链表长度超过一定值时,转为红黑树。
HashMap 适用于快速查找、插入、删除操作,但不保证顺序。
HashMap的底层数据结构在JDK1.7 和JDK1.8 中有所差别:
在JDK1.7 中,由“数组+链表”组成,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的。
在JDK1.8 中,由“数组+链表+红黑树”组成。当链表过长,则会严重影响 HashMap 的性能,红黑树搜索时间复杂度是 O(logn),而链表是糟糕的 O(n)。因此,JDK1.8 对数据结构做了进一步的优化,引入了红黑树,当链表超过 8 且数据总量超过 64 会转红黑树。将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树,以减少搜索时间。