Netty框架知识点
2024-01-15 23:49:44 21 举报
AI智能生成
Netty是一个高性能、异步事件驱动的网络应用框架,主要用于构建服务器和客户端。它提供了一套丰富的工具和组件,如编解码器、缓冲区管理、心跳检测等,帮助开发者快速构建可靠的网络应用。Netty的核心是基于NIO的EventLoop模型,通过多线程处理I/O操作,实现高并发和低延迟。同时,Netty支持多种协议(如TCP、UDP、HTTP、WebSocket等),具有良好的扩展性和兼容性。此外,Netty还提供了一些高级特性,如零拷贝、链路层安全加密、流量整形等,以满足不同场景的需求。总之,Netty是一个强大且易于使用的网络编程框架,适用于各种类型的网络应用开发。
作者其他创作
大纲/内容
TCP/IP协议
TCP/IP协议介绍
TCP/IP协议族,Transmission ControlProtocol/Internet Protocol 的简写,中文名:传输控制协议/因特网互联协议。是国际互联网的基础,由传输层的TCP协议和网络层的IP协议组成,能够实现信息在网络中传输。
TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇,只是在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇,只是在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
OSI模型
OSI(Open Systems Interconnection)模型是一种概念模型,它表征并标准化电信或计算系统的通信功能,而不考虑其基础内部结构和技术。OSI可分为七层模型,相较与TCP/IP多了表示层和会话层
TCP/IP网络模型
TCP/IP是一个五层体系结构,从上到下分别是:
应用层
传输层
IP层
数据链路层
物理层
TCP/IP数据传输流程
1.应用层处理数据,将需要发送的数据报文传给传输层
2. 传输层在报文数据上附加TCP头部,交给下一层IP层
3. IP层拿到数据后附加上IP头部,交给下一次数据链路层
4. 数据链路层拿到上一层的包同时加上mac头部,交给下一层物理层
5. 物理层拿到数据后,将其通过网络传给接收端
6. 接收端拿到数据后,进行逆向解析。最终拿到数据
地址+端口号
MAC地址
MAC地址(Media Access Control Address),直译为媒体存取控制位址,也称为局域网地址(LAN Address)、MAC位址、以太网地址(Ethernet Address)或物理地址(Physical Address)。MAC 地址共 48 位(6 个字节)。前 24 位由 IEEE(电气和电子工程师协会)决定如何分配,后 24 位由实际生产该网络设备的厂商自行制定。每个网卡都需要并会有一个唯一的MAC地址,用来确认网络设备位置。
IP地址
IP 地址(Internet Protocol Address)的全称叫作互联网协议地址,由32位二进制组成,通常每8位为一组。如:192.168.1.1。用来识别 TCP/IP 网络中互连的主机和路由器
端口号
在传输层也有类似地址的概念,那就是端口号。端口号用来识别同一台计算机中进行通信的不同应用程序。因此,它也被称为程序地址。
TCP三次握手
第一次握手:客服端发起连接,进入syn_send状态。发生报文 :seq=m(m为一个随机值) 标志位SYN = 1
第二次握手: 服务端接收到连接请求后发送确认报文,既然syn_recv状态。确认报文: SYN = 1 ACK=1 seq = n (随机值) ack = m + 1 表示确认了一条报文
第三次握手: 客服端接收到服务端的报文后,回复确认报文。同时进入establish。报文; ACK = 1 ack = n + 1
TCP四次挥手(客服端和服务端都能发起)
第一次挥手:客服端发起断开请求,此时客服端为establish状态。发送报文: FIN = 1 seq = m
第二次挥手: 服务端接收到断开请求后,回复确认报文,此时服务端还是establish状态。报文: ack = m + 1 seq = n ACK = 1(客服端接收到此条报文后进入FIN_WAIT1 状态)
第三次挥手: 一段时间后,服务端准备断开连接进入CLOSE_WAIT。发送报文:FIN = 1 ack = m + 1 seq = n ACK = 1
第四次挥手: 客服端接收到FIN报文后,进入FIN_WAIT2状态,发送确认报文: ACK = 1 ack = n + 1 seq = m + 1 。
服务端接收到确认报文后断开连接进入CLOSED。客服端等待一段时间(2MSL周期个时间)客服端才关闭连接进入CLOSED状态
客服端为生么等待2MSL周期个时间(任何IP数据报文能在网络中存活的最长时间)
保证服务端接收到确认报文,并且关闭连接。避免由于服务端未接收到报文进行报文重传,误关连接的情况出现
UDP协议
UDP介绍(User Datagram Protocol)
UDP 中文名是用户数据报协议,非连接协议。将数据报发送出去后就不管对方是否收到数据报,对方也不用进行数据确认和回复。所有UDP存在丢包的风险。在开发中需要程序进行验证报是否收到。
UDP广播
UDP 没有连接,可以实现数据的广播。也就是将数据报发送的网络中的所有设备中。
UDP应用
UDP没有TCP中的一系列复杂的机制来确保包不丢失。性能比TCP出色,其在很多场景也有广泛的应用。例如:NTP网络时间协议和DNS服务;视频音频等即时通讯场景
JAVA 网络编程基础知识
Socket认识
Socket是应用层与TCP/IP协议族通信中间抽象层。它有一组接口,由操作系统提供。它隐藏了TCP/IP通信的复杂处理流程,只需要通过一组简单的接口调用就能实现程序间的网络通信。例如:主机A要与主机B进行网络通信,那么它们之间需要先建立Socket连接。
客服端连接上一个服务器后,就会产生一个Socket,同样服务端每接收一个客服端连接也会创建一个Socket 实例与客服端进行通信。多个客服端就对应有多个Socket实例。
短连接&长连接
短连接是是指:Socket连接建立后-->传输数据-->断开连接。即连接建立传输完数据立刻断开连接。
长连接是指:Socket建立连接-->传输数据-->保持连接--可以继续传输数据-->断开连接。即长连接建立后不管有没有数据传输都保持连接存在。
BIO模型
BIO是阻塞式IO通信模式,它的阻塞体现在两个方面:第一是连接的建立需要阻塞等待,也就是服务端如果在没有客服端连接的情况下一直会阻塞线程,直到有客服端连接。第二是连接建立后读流中的数据读取也是阻塞式的。如果流中没有数据读也会阻塞线程,直到可以读数据为止。
一般使用BIO进行网络通信开发时,会单独使用一个线程来处理客服端的连接。每建立一个连接就创建一个线程进行数据的读写操作。通常这里会使用线程池来管理线程。使线程可以进行复用。
BIO模式缺点:在大并发情况下,如果出现读取数据慢的情况(如:网络环境差、传输的数据量大),会导致线程池中的线程资源或整个系统的线程资源耗尽的情况。这时其他通信连接也只能等待。根据这一特点,BIO一般用在处理并发不大,读写快速的网络应用中。
NIO模型
NIO是分阻塞式I/O,有JDK1.4引入,用来弥补BIO中的不足。java I/O都是面向流的操作,都是阻塞操作。NIO与其最大的区别就是它是面向缓冲区的。它可以在缓冲区读取不到数据时返回。从而可以去处理其他I/O操作,从而一个线程可以处理多个输入和输出。
NIO中的Reactor模式: 所有的网络编程都关注三件事,建立连接、读数据、写数据。在JAVA的NIO模式中使用线程去注册者三种事件,当其中一种感兴趣的事件发生后,再处理对应的事。其他时间都可以去处理其他任务。
NIO的三大核心组件
Channel 管道
建立连接的应用程序和操作系统传递内容的渠道。程序可以通过通道读取或者写入数据。可以同时进行读写操作。
Selector 选择器
应用程序向Selector对象注册它需要关注的channel,以及这个channel会对那种事件敢兴趣。当感兴趣事件发生后,应用程序就可以种Selector中获取到对应的channel,应用程序可以进行对应事件的处理。如:读写网络数据。
buffer缓冲区
JAVA中的NIO是面向缓冲的,这个buffer就是和NIO通道进行交互的缓冲。输入是从通道中读取到缓冲buffer或者从缓冲buffer中写入通道中。
Netty介绍
定义
Netty是一个异步事件驱动的网络应用开发框架。用于快速开发可维护的高性能协议服务器和客服端
优点
开发简单,使用门槛低,Netty提供了大量协议实现和API封装。简化了客服端和服务器的开发过程
强大的定制能力,通过ChannelHandler对框架进行灵活的扩展,应对各种复杂业务场景。
综合性能高,与其他主流NIO框架对比,Netty的综合性能最优
成熟稳定,Netty经历了大规模的商业软件考验,质量有保证
开源且社区活跃,版本更新快,bug能及时修复
Netty程序
Maven依赖
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.42.Final</version>
</dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.42.Final</version>
</dependency>
server
ServerBootstrap
ChannelInboundHandler
client
Bootstrap
ChannelInboundHandler
Netty核心组件
BootStrap
Netty的启动入口,分为Bootstrap客服端类和ServerBootstrap客服端类
EventLoop
Netty的核心抽象,称为事件循环,用于处理网络连接发生的事件。
EventLoopGroup
为每一个新创建的channel分配一个EventLoop
Channel
Netty提供的Channel接口用于所有的I/O操作
ChannelPipeline
每一个Channel被创建都会被分配一个独有的ChannelPipeline,它是ChannelHandler的链式容器,业务处理就是在这个链上进行流转的。
ChannelHandler
Netty的核心扩展组件,业务我们程序开发用到最多最核心的接口组件。它分为入站和出站的handler。可以理解为对Netty中事件的请求传入逻辑处理和响应返回逻辑处理。
ChannelInboundHandler 入站接口,处理入站事件
ChannelOutboundHandler 出站接口,处理出站事件
ChannelHandlerContext
用来维护ChannelHandler链表,提供ChannelHandler上下文信息
ChannelFuture
Netty是一个异步框架,其里面的操作基本上都是异步进行的,所以Netty直接封装了一个类似jdk中Future的ChannelFuture,在执行异步操作的时候使用。
ChannelInitializer
它本身是一个ChannelInboundHandler,用来向Pipeline中添加Handler,添加完成后会除自己。
ChannelOption
Netty服务的属性设置,如:ChannelOption.SO_BACKLOG,对应的是 tcp/ip 协议 listen 函数中的 backlog 参数,等
待接受的完全建立的套接字的队列长度
待接受的完全建立的套接字的队列长度
ByteBuf
Netty提供的对缓冲区的操作数组。Netty中对数据的接收和发送都通过ByteBuf进行操作
粘包/半包
粘包: TCP协议在发送数据包时,会对比较小的包进行合并操作,一次发送出去。导致接收端接收到的包是由多个小包组成,这就是粘包问题。
半包:由于应用层一次性发送的包大于了套接字能发送的最大数据包而被拆分发送,导致接收端接收到的包并不完整。这就是半包问题。
半包:由于应用层一次性发送的包大于了套接字能发送的最大数据包而被拆分发送,导致接收端接收到的包并不完整。这就是半包问题。
由于TCP无法决定应用层包的大小,所以这个问题需要在应用层进行处理。常用的有三种方案
发送定长数据,通过应用层传输的数据大小永远固定,在接收端接可以根据长度进行解析
使用特殊字符分割,在数据包的结尾加入特殊字符进行区分,接收端通过特殊字符进行分割
包中加长度字段解决(常用),计算出需要发送数据包的长度,并在数据包的头部附加上长度信息。在接收端就可以通过这个长度字段进行数据解析了。
编解码器
网络中的通信必须定义怎样解析在两个节点间传输原始字节,以及如何将其转换成应用程序可处理的数据格式。这种转换就由编解码器来完成
0 条评论
下一页
为你推荐
查看更多