1.netty的基础概念:是一个异步,基于事件驱动的网络应用程序框架,其对 Java NIO进行了封装,大大简化了 TCP 或者 UDP 服务器的网络编程。
2.Netty中粘包/拆包处理:Netty中粘包/拆包处理
只需在服务端和客户端分别添加 LineBasedFrameDecoder 和 StringDecoder解码器(将接收到的对象转换成字符串) 来解决粘包/拆包问题,因为是双向会话,所以两端都要添加
3.Netty 在 Dubbo 中如何应用? Dubbo 底层使用的是 Netty 作为网络通信,dubbo 使用 Netty 还是挺简单的,消费者使用 NettyClient,提供者使用 NettyServer,Provider 启动的时候,会开启端口监听,使用我们平时启动 Netty 一样的方式。而 Client 在 Spring getBean 的时候,会创建 Client,当调用远程方法的时候,将数据通过 dubbo 协议编码发送到 NettyServer,然后 NettServer 收到数据后解码,并调用本地方法,并返回数据,完成一次完美的 RPC 调用。
4.netty的nio和传统nio区别:和netty优点: Java分布式框架netty之NIO框架区别分析_qiujiavip的博客-CSDN博客
5.dos攻击,ddos攻击,drdos攻击,怎么解决 : DOS、DOS攻击、DDOS攻击、DRDOS攻击_热气球-CSDN博客_drdos攻击
6. 一步一图,带你走进 Netty 的世界!(自此链接中问题)
1、Netty是什么 2、Netty线程模型 3、EventLoopGroup / EventLoop 4、ChannelPipeline 5、Buffer】
(在此链接中)https://www.cnblogs.com/xiaoyangjia/p/11526197.html
1.TCP和UDP的区别?TCP和UDP的最完整的区别 - 割肉机 - 博客园
2.TCP协议如何保证可靠传输? 3.TCP的粘包/拆包原因及其解决方法是什么? 4.BIO. NIO. AIO分别是什么? 5.说说网络IO模型?
6.Netty跟Java NIO有什么不同,为什么不直接使用JDK NIO类库? 7. Netty高性能体现在哪些方面? 8.Netty的零拷贝提体现在哪里,与操作系统上的有什么区别?】
7.BIO、NIO 和 AIO 的区别?
-
BIO:一个连接一个线程,客户端有连接请求时服务器端就需要启动一个线程进行处理,线程开销大。伪异步IO:将请求连接放入线程池,一对多,但线程还是很宝贵的资源。
-
NIO:一个请求一个线程,但客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。
-
AIO:一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。
BIO是面向流的,NIO是面向缓冲区的;BIO的各种流是阻塞的。而NIO是非阻塞的;BIO的Stream是单向的,而NIO的channel是双向的。
NIO的特点:事件驱动模型、单线程处理多任务、非阻塞I/O,I/O读写不再阻塞,而是返回0、基于block的传输比基于流的传输更高效、更高级的IO函数zero-copy、IO多路复用大大提高了Java网络应用的可伸缩性和实用性。基于Reactor线程模型
8.Netty 的特点?
-
高并发:Netty 是一款基于 NIO(Nonblocking IO,非阻塞IO)开发的网络通信框架,对比于 BIO(Blocking I/O,阻塞IO),他的并发性能得到了很大提高。
-
传输快:Netty 的传输依赖于零拷贝特性,尽量减少不必要的内存拷贝,实现了更高效率的传输。
-
封装好:Netty 封装了 NIO 操作的很多细节,提供了易于使用调用接口。
9.Netty 的线程模型?
Netty 通过 Reactor 模型基于多路复用器接收并处理用户请求,内部实现了两个线程池, boss 线程池和 work 线程池,其中 boss 线程池的线程负责处理请求的 accept 事件,当接收 到 accept 事件的请求时,把对应的 socket 封装到一个 NioSocketChannel 中,并交给 work 线程池,其中 work 线程池负责请求的 read 和 write 事件,由对应的 Handler 处理。
单线程模型:所有 I/O 操作都由一个线程完成,即多路复用、事件分发和处理都是在一个 Reactor 线程上完成的。既要接收客户端的连接请求,向服务端发起连接,又要发送/读取请 求或应答/响应消息。一个 NIO 线程同时处理成百上千的链路,性能上无法支撑,速度 慢,若线程进入死循环,整个程序不可用,对于高负载、大并发的应用场景不合适。
多线程模型:有一个 NIO 线程(Acceptor) 只负责监听服务端,接收客户端的 TCP 连接 请求;NIO 线程池负责网络 IO 的操作,即消息的读取、解码、编码和发送;1 个 NIO 线 程可以同时处理 N 条链路,但是 1 个链路只对应 1 个 NIO 线程,这是为了防止发生并发 操作问题。但在并发百万客户端连接或需要安全认证时,一个 Acceptor 线程可能会存在性 能不足问题。
主从多线程模型:Acceptor 线程用于绑定监听端口,接收客户端连接,将 SocketChannel 从主线程池的 Reactor 线程的多路复用器上移除,重新注册到 Sub 线程池的线程上,用于处理 I/O 的读写等操作,从而保证 mainReactor 只负责接入认证、握手等操作;
10.Netty 的零拷贝实现?“零拷贝”是指计算机操作的过程中,CPU不需要为数据在内存之间的拷贝消耗资源。
所谓的 Zero-copy
, 就是在操作数据时, 不需要将数据 buffer 从一个内存区域拷贝到另一个内存区域. 因为少了一次内存的拷贝, 因此 CPU 的效率就得到的提升.
在 OS 层面上的 Zero-copy
通常指避免在 用户态(User-space)
与 内核态(Kernel-space)
之间来回拷贝数据. 例如 Linux 提供的 mmap
系统调用, 它可以将一段用户空间内存映射到内核空间, 当映射成功后, 用户对这段内存区域的修改可以直接反映到内核空间; 同样地, 内核空间对这段区域的修改也直接反映用户空间. 正因为有这样的映射关系, 我们就不需要在 用户态(User-space)
与 内核态(Kernel-space)
之间拷贝数据, 提高了数据传输的效率.
而需要注意的是, Netty 中的 Zero-copy
与上面我们所提到到 OS 层面上的 Zero-copy
不太一样, Netty的 Zero-coyp
完全是在用户态(Java 层面)的, 它的 Zero-copy
的更多的是偏向于 优化数据操作
这样的概念.
Netty 的 Zero-copy
体现在如下几个个方面:
- Netty 提供了
CompositeByteBuf
类, 它可以将多个 ByteBuf 合并为一个逻辑上的 ByteBuf, 避免了各个 ByteBuf 之间的拷贝. - 通过 wrap 操作, 我们可以将 byte[] 数组、ByteBuf、ByteBuffer等包装成一个 Netty ByteBuf 对象, 进而避免了拷贝操作.
- ByteBuf 支持 slice 操作, 因此可以将 ByteBuf 分解为多个共享同一个存储区域的 ByteBuf, 避免了内存的拷贝.
- 通过
FileRegion
包装的FileChannel.tranferTo
实现文件传输, 可以直接将文件缓冲区的数据发送到目标Channel
, 避免了传统通过循环 write 方式导致的内存拷贝问题.
11.Netty 的高性能表现在哪些方面?
-
IO 线程模型:同步非阻塞,用最少的资源做更多的事。
-
内存零拷贝:尽量减少不必要的内存拷贝,实现了更高效率的传输。
-
内存池设计:申请的内存可以重用,主要指直接内存。内部实现是用一颗二叉查找树管理内存分配情况。
-
串形化处理读写:避免使用锁带来的性能开销。
-
高性能序列化协议:支持 protobuf 等高性能序列化协议。
--------通讯-----------
0. Http 1.0、1.1、2.0差异: http1.0 、http1.1和http2.0的区别 - 司马老朋 - 博客园
- HTTP1.0与HTTP 1.1的主要区别
- 长连接
- 节约带宽
- HOST域
- HTTP1.1与HTTP 2.0的主要区别
- 多路复用
- 二进制分帧
- 首部压缩
- 服务器推送
1. XSS、CRSF攻击与预防: XSS、CSRF攻击与防范 - 瓶子咕咕咕 - 博客园
一.三次握手四次挥手TCP三次握手和四次挥手过程 - Andya_net - 博客园
2.301、302区别:状态码301和302的区别 - Wayne-Zhu - 博客园
302重定向只是暂时的重定向,搜索引擎会抓取新的内容而保留旧的地址,因为服务器返回302,所以,搜索搜索引擎认为新的网址是暂时的。
而301重定向是永久的重定向,搜索引擎在抓取新的内容的同时也将旧的网址替换为了重定向之后的网址。
3.三次握手: 客户端发送信息-------------- 到服务端,
服务端响应信息确认--------- 到客户端,
客户端在此确认-------------- 到服务端
为什么三次:因为前两次,服务端只是在一个等待交互状态,确保客服端没有断开,在此响应第三次,为了确认链接需求。防止多余的骚扰
第一次握手:主机 A 发送位码为 syn=1,随机产生 seq number=1234567 的数据包到服务器,主机 B 由SYN=1知道,A要求建立联机;
第二次握手:主机 B 收到请求后要确认联机信息,向 A 发送 ack number=(主机 A 的 seq+1),syn=1,ack=1,随机产生seq=7654321 的包
第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码 ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认
4.四次挥手: 客户端------服务端
服务端----- 客户端 响应请求
服务端------客户端 fin标识结束请求可以关闭
客户端------服务端 响应关闭,但是等待2msl时间
为什么四次:因为防止数据没有传输完,最后一次结束提示,还需要等2mls,最大报文这么大。
1) 关闭客户端到服务器的连接:首先客户端 A 发送一个 FIN,用来关闭客户到服务器的数据传送, 然后等待服务器的确认。其中终止标志位FIN=1,序列号seq=u
2) 服务器收到这个FIN,它发回一个ACK,确认号ack为收到的序号加1。
3) 关闭服务器到客户端的连接:也是发送一个FIN给客户端。
4) 客户段收到FIN后,并发回一个 ACK报文确认,并将确认序号seq设置为收到序号加1。
首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
4。http https
HTTP是一个无状态的协议。无状态是指客户机(Web浏览器)和服务器之间不需要建立持久的连接, 这意味着当一个客户端向服务器端发出请求,然后服务器返回响应(response),连接就被关闭了,在服 务器端不保留连接的有关信息.HTTP 遵循请求(Request)/应答(Response)模型。客户机(浏览器)向 服务器发送请求,服务器处理请求并返回适当的应答。所有 HTTP连接都被构造成一套请求和应答。
http:80
https: 443 加了ssl验证安全
建立连接获取证书
1) SSL客户端通过TCP和服务器建立连接之后(443端口),并且在一般的tcp连接协商(握 手)过程中请求证书。即客户端发出一个消息给服务器,这个消息里面包含了自己可实现的算 法列表和其它一些需要的消息,SSL的服务器端会回应一个数据包,这里面确定了这次通信所 需要的算法,然后服务器向客户端返回证书。(证书里面包含了服务器信息:域名。申请证书 的公司,公共秘钥)。
证书验证 2) Client在收到服务器返回的证书后,判断签发这个证书的公共签发机构,并使用这个机构的公 共秘钥确认签名是否有效,客户端还会确保证书中列出的域名就是它正在连接的域名。
数据加密和传输
3) 如果确认证书有效,那么生成对称秘钥并使用服务器的公共秘钥进行加密。然后发送给服务 器,服务器使用它的私钥对它进行解密,这样两台计算机可以开始进行对称加密进行通信。
加密:对称加密:不安全,客服端和服务端公用一套加解密算法,容易被篡改
非对称加密:如果被中间人知道,会别替换攻击
通过https:客服端需要发送信息得到ca认证,ca收费。然后通过数字签名和数字证书。
5。tcp udp区别 : 面试题:UDP&TCP的区别_sifanchao的博客-CSDN博客_tcp和udp的区别
TCP和UDP的最完整的区别 - 割肉机 - 博客园
tcp:可靠性,序列化会监控数据包,但是效率慢,消耗大:例如:http https ftp
udp:只关注效率,消耗少,不追踪包的是否到达。例如:dns ip电话 dhcp 微信通话
6。http的几种请求方式 java实现HTTP请求的三种方式
1.java原生HttpURLConnection 分doget和dopost
2.Apache httpClient3.1 htppClient4.5
3.spring 的restTemplate
7.http错误分类
1.4xx 客户端错误 400 请求语法错误;
403资源不可用
404 无法找到指定位置资源
2.5XX 服务器错误 504
8。http请求包裹
请求行:包含请求方法,uri,http版本信息
请求头:host主机地址,接受的编码方式
空行:必须要的。表示请求头结束;
请求内容:参数信息
响应报文包含:
状态行:包含http版本,状态码
响应首部字段
响应内容实体
八.网络七层架构:
7层模型主要包括:
9.网络传输流程
1 :地址解析
如用客户端浏览器请求这个页面:http://localhost.com:8080/index.htm 从中分解出协议名、主机名、 端口、对象路径等部分,对于我们的这个地址,解析得到的结果如下:
协议名:http
主机名:localhost.com
端口:8080
对象路径:/index.htm
13/04/2018 Page 165 of 283
在这一步,需要域名系统DNS 解析域名localhost.com,得主机的 IP地址。
2 : 封装 HTTP
请求数据包
把以上部分结合本机自己的信息,封装成一个HTTP请求数据包
3 : 封装成 TCP
包并建立连接
封装成TCP包,建立TCP连接(TCP的三次握手)
4 : 客户机发送请求命
4)客户机发送请求命令:建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资 源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可内容。
5 : 服务器响应
服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或 错误的代码,后边是MIME 信息包括服务器信息、实体信息和可能的内容。
6 : 服务器关闭 TCP