网络模型-面试必备
2025-09-09 09:56:06 0 举报
AI智能生成
准备参加面试的求职者需要对网络模型有清晰的理解,因为这是许多IT职位考核的关键知识点。核心内容包括但不限于OSI模型的七层结构、TCP/IP模型的四层对应、每一层的功能和主要协议。面试者应详细掌握数据传输过程中的封装与解封装、不同网络层之间的通信机制、以及如何处理网络故障和性能优化等问题。此外,了解流行的网络设备如路由器、交换机的工作原理及其在网络中的作用也是必要的。针对不同类型的网络(如局域网、广域网)的特性和配置,以及网络安全相关的基础知识和防护措施也是面试中常提及的内容。求职者应当通过实例加深对这些概念的理解,并能够在面试中运用相关的技术术语以展现出其专业水平。文件类型通常要求掌握其在网络架构、协议和配置中的应用,如Wireshark捕获文件的解读能力等,以证明其实战能力。
作者其他创作
大纲/内容
发展过程
BIO
早期是BIO,每次只能一个链接,链接上之后不中断就一直阻塞
考虑多线程处理,每个线程处理一个链接,局限性:线程个数有上限,并且大量链接会导致服务器资源浪费
即使加入线程池的技术,也不能解决根本问题
NIO
NIO,支持非阻塞的IO,一个线程就可以支持多个链接,虽然提高了并发能力,但是如果大量链接连接上之后不做任何操作,每次循环都需要不停的遍历所有链接确保有数据传输过来,这个方式会导致cpu空跑,看上去cpu很高,实际上都是无用功
NIO Reactor模式
引入selector,多路复用器,他采用事件驱动的模式,使得一个线程可以监听多个channel
创建一个selector,底层调用epoll_create(),实际上就是一个epollArray,channel会存储到这个数组中,通常会设置为非阻塞模式,并且为这个channel注册事件,底层调用的就是epoll_ctl,比如连接、可读、可写事件,然后循环调用select方法,这个方法会阻塞直到有事件触发,底层调用的epoll_wait(阻塞并发回准备就绪的文件描述符),这样每次只需要处理有事件触发的channel,不用遍历所有channel
redis 5.0采用的就是单线程的 Reactor模式
woker Reactor模式
虽然实现了多路复用,但是每个线程处理的能力会随着连接的增多,业务执行时间等因素导致效率大降,所以引入了woker reactor,主线程reactor负责连接,业务处理交给worker
Multi Reactor模式
为了进一步提高性能和并发,又引入了multi reactor,也就是有多个reactor线程负责连接管理,多个worker负责业务执行,这也是Netty使用的IO模型
redis 6.0 采用的mult Reactor 模式,但不是标准的Multi Reactor模式,只有读数据的操作是worker完成的,
Netty
核心组件
NioEventLoopGroup
EventLoop
BootStrap/ServerBootStrap
客户端和服务器的启动类
允许设置channel和channelPipeline
ChannelPipeline
采用责任链模式的ChannelHandler,,负责所有的入站和出站事件(读写)
它隐含两个ChannelHandler,一个Header,一个Tail
类似双向链表的结构,入站从Header开始,Tail结束,出站反过来,从Tail开始,Header结束,中间就是我们自己定义的ChannelHandler,比如序列化、反序列化的处理
每一个channel都有自己的pipeline
Channel
对网络I/O操作的抽象,是客户端或服务端连接用的通道
Future/Channel Future
Netty中,许多操作都是异步的,比如建立连接、数据写入、端口绑定,异步操作的响应结果通过Future获取
ChannelInitializer
可以视为ChannelPipeline的构造器
ChannelHandler
Netty中处理业务的核心组件,他是一个接口,他定义了一些列的方法来处理不同的I/O事件,,通常程序员只需关注这个
序列化
编码解码
粘包拆包
网络开发的一个框架,支持多种协议
内置的通讯传输模式
Nio
Epoll
边缘触发
Oio
local
子主题
设计精髓
子主题
TCP/IP协议镞
不同层次的网络协议集合
TCP
控制传输协议
如何保证可靠性的
重传机制
超时重传
快速重传
数据包顺序控制
通过seq_num保证数据包的顺序
三次握手
为什么要三次握手
因为TCP是面向连接的可靠传输,所以需要服务器ACK它准备好了,同时客户端也需要ACK服务器它准备好了,
流程
第一次客户端发送给服务器 SYN标识,并且会有一个随机数Seq_num
第二次服务器会发送SYN+ACK,同时返回ACK_num(会将第一次握手时的随机数加上数据包的数据量发给客户端)
第三次客户端向服务器发送ACK,同时返回ACK_num(第二次握手的时候传的随机数加上数据包的数量)
四次分手
为什么是四次,TCP是全双工通讯模式,所以客户端和服务器都需要发送FIN通知,并且ACK
TCP断开连接的时候的Timewait
当主动断开连接的一方发送最后一个ACK报文之后,会等待2MSL(最大报文存活时间),通常是2-4分钟,
这是为了保证旧的连接没有收到的报文,不会影响新的连接,导致混乱
IP
英特网协议
Socket
Socket是TCP/IP协议镞的抽象,是操作系统提供给我们的一系列的接口,用于操作网络
零拷贝
当读取磁盘文件然后通过网络传输的时候,因为内核缓存和用户缓存之间拷贝会产生上下文切换,减少拷贝次数,可以减少上下文切换
零拷贝指在进行数据 IO 时,数据在用户态下经历了零次 CPU 拷贝,并非不拷贝数据。通过减少数据传输过程中 内核缓冲区和用户进程缓冲区 间不必要的CPU数据拷贝 与 用户态和内核态的上下文切换次数,降低 CPU 在这两方面的开销,释放 CPU 执行其他任务,更有效的利用系统资源,提高传输效率,同时还减少了内存的占用,也提升应用程序的性能。
实现
mmap
内存映射文件的方法,可以将文件或对象地址映射到用户空间
MappedByteBuffer
FileChannel.map方法也会创建MappedByteBuffer
sendfile
内核会直接将文件数据从 page cache 通过网络协议栈发送到目标套接字
sendfile系统调用会告诉内核从一个文件描述符(如磁盘文件对应的文件描述符)读取数据,并将其发送到另一个文件描述符(如网络套接字对应的文件描述符)
java.nio.channels.FileChannel类的transferTo()和transferFrom()方法
Linux2.1
Linux2.4
splice
利用通道传输数据,可以省去内核态到用户态的数据复制和用户态到内核态的数据复制
系统调用会在内核中建立一个从文件(由文件描述符指定)到套接字(另一个文件描述符)的直接数据通道。
DMA
计算机中直接内存访问的技术,是通过硬件实现的
应用
子主题
BIO
阻塞IO模型
等待链接,等待数据传输的时候都会阻塞
NIO
非阻塞IO模型
通常会结合多路复用selector使用
粘包拆包
原理
粘包拆包现象主要发生在TCP协议的网络通讯中,因为TCP是一种面向流的协议,再数据传输过程中,他没有明确的消息边界
Nagle算法:是TCP协议中的重要优化机制
TCP将多条消息放入缓冲区,累积到一定量以后再统一发送,这样可以更高效的利用网络带宽,有效减少数据包的发送次数
触发条件
缓冲区数据达到一定量
上一个数据包已确认(ACK)
Nagle算法引起的问题
因为多个消息被合成一个数据包发送,引起粘包问题
当数据过大的时候,一次缓冲区不能全部发送,所以拆分成多个包发送,接收方是多次收到包才能组合成一个数据
解决方案
关闭Nagle算法,再一些即使通讯或游戏的应用中会采用这个方式
添加特殊分隔符,这个方法最简单,再客户端和服务端按照特定分隔符分割数据
定长发送和读取,如果业务场景中每次消息的长度是可控的,可以考虑定长发送消息和读取消息,确定是限制太大了
传输的时候加上数据长度,读取的时候先获取数据长度的信息,再读取消息
网络分层模型
OSI(开放系统互联)模型 7层
物理层
数据链路层
网络层
传输层
会话层
表示层
应用层
或TCP/IP模型 5层
物理层
物理网卡
数据链路层
近似的理解为网卡的驱动程序
网络层
ip地址
传输层
TCP
应用层
HTTP
面试问题
Netty是如何解决JDK 中selector的bug
事件误触发
Netty通过事件重复空跑次数来决定是否需要重新构建selector
如何在单机下实现Netty的应用程序百万连接
1. 操作系统优化
每个socket都是一个文件,所以用户和操作系统能打开的文件描述符是有限的,我们需要先修改操作系统能打开的最大句柄数,单线程也有这个限制
2. Netty应用程序优化
线程池优化
心跳检测的时长控制
保持心跳机制的前提下,尽可能的减少次数,并且剔除非活跃连接
读缓存和写缓存设置要合理
读缓存和写缓存最小空间至少需要4K,支持百万连接至少需要8G,因此服务器资源至少要16G
尽可能使用内存池
每次都New一个内存buffer,会产生占用大量内存,引起频繁的GC
IO线程和业务线程做分离
3. JVM调优
尽可能的减少FullGC,如果发送了FullGC的时候尽量减少STW的时间
可以考虑ZGC或G1等垃圾收集器
back_log
已完成三次握手,但是还没有被用户线程取走的连接,会保存到back_log队列中
什么是水平触发,什么是边缘触发
水平触发
当接收缓存中有数据的时候就不停的触发
边缘触发
只通知一次,只有当网络上有新的数据来了才会继续触发
DNS解析过程
子主题
0 条评论
下一页
为你推荐
查看更多