1.TCP为什么是四次挥手,而不是三次?

https://www.zhihu.com/question/63264012

TCP 包含 三次握手 四次挥手

四次挥手

数据发起方发起的停止请求代表数据终止传输,接受方再发起关闭请求才是关闭请求

2.Java性能之优化RPC网络通信

https://blog.csdn.net/sevencuecue/article/details/101301381

RPC 包含 RMI

RMI jdk自带的RPC框架 使用短链接 默认的jdk序列化

RPC 关联 Netty

Netty 关联 主从Reactor多线程

3.深入了解NIO的优化实现原理

https://time.geekbang.org/column/article/100861

IO多路复用 包含 epoll select poll

4.Epoll的本质(内部实现原理)

https://zhuanlan.zhihu.com/p/63179839

epoll 关联 poll select

文件描述符fd(linux将所有外部设备看成文件)
select和poll 当有io准备完成,进程只知道有IO事件, 所以需要将当fd_set传入内核态遍历一遍才知道哪个IO准备就绪了.
fd_set 在poll是链表 select是数组
epoll通过epoll_ctl()将fd描述符注册在内核态的时间列表中(红黑树),数据准备就绪后修改rdlist中状态并唤醒进程,并返回rdist给进程

5.多路复用器Selector

https://www.jianshu.com/p/e8f76cef72ed

NIO

SelectorProvider 决定了使用哪种方式(select(windows),kqueue(mac),epoll(linux))作为默认的多路复用的方式

6.多线程调优(上):哪些操作导致了上下文切换

https://time.geekbang.org/column/article/102619

上下文切换 包含 自发性上下文切换 非自发性上下文切换

由程序主导如等待IO sleep yield等为自发性上下文切换
由cpu,或虚拟机主导的为非自发性上下文切换,如高并发下争抢cpu资源,虚拟机垃圾回收导致的stop-the-world

上下文切换

在低并发下,串行执行的效率大于并行的原因是因为上下文切换消耗资源
vmstat,pidstat查看上下文切换

7.深入理解 NioEventLoop启动流程

https://www.cnblogs.com/ZhuChangwu/p/11196791.html

netty 包含 NioEventLoop ioRatio

ioRatio用来控制 IO任务处理时间和非IO任务处理时间比例

epoll 关联 epoll空轮询bug

8.磨刀不误砍柴工:欲知JVM调优先了解JVM内存模型

https://time.geekbang.org/column/article/106203?utm_campaign=guanwang&utm_source=baidu-ad&utm_medium=ppzq-pc&utm_content=title&utm_term=baidu-ad-ppzq-title

JMM

1.JMM向操作系统申请内存,并根据配置分配堆栈,方法区大小
2.class文件加载,验证,准备,解析 为静态变量分配内存
3.执行构造器 方法 。包括 静态变量赋值,静态方法,静态代码块
4.启动并执行 main方法

9.TCP粘包,拆包及解决方法

https://www.cnblogs.com/panchanggui/p/9518735.html

TCP 包含 拆包 粘包

  1. 粘包是因为socket缓冲区大小太大, 导致一次发了两个包
  2. 拆包是因为socket缓冲区大小太小,一次包拆成了两次发送,或者发送的数据大小超过了协议的MTU
  3. 解决方案,为每个请求包设置边界,请求头包含请求包大小

10. ET/LT模式区别

https://blog.csdn.net/YMY_mine/article/details/81212731

epoll 包含 边缘触发 水平触发

水平触发: 调用epoll_wait()时只要pipe有数据,就会通知线程
边缘触发: 调用epoll_wait(), 一次请求只会触发一次读取,即使因为缓冲区大小导致一次没有读完,也不会触发读取. 所以为了防止没有后续数据导致无法读取完数据, 需要设置为非阻塞

12. Reactor模型

https://www.jianshu.com/p/da96ff9066a3

IO多路复用 包含 单线程Reactor 多线程Reactor 主从Reactor

主从reactor将 接受数据用一个单独线程reactor去接受数据,并将 decode compute encode 操作用一个线程池来处理 read send用reactor处理

13. ServiceLoader使用看这一篇就够了

https://www.jianshu.com/p/7601ba434ff4

SPI 包含 serviceLoader

查找并创建 META-INF/services 所有的对应名称的类

14.Netty解决粘包和拆包问题的四种方案

https://www.cnblogs.com/AIPAOJIAO/p/10631551.html

一次解码器 关联 粘包 拆包

接受数据的reactor用数据累积起累积获取的数据 FrameDecoder
netty使用 固定长度解码器(FixedLengthFrameDecoder) ,分隔符解码器(DelimiterBasedFrameDecoder),固定长度额外字段存长度信息(LengthFiledBasedFrameDecoder) 来处理粘包和拆包
固定长度解码器浪费空间,因为若长度不足,需要空白对齐
分隔符解码器 需要扫描内容
固定长度额外字段存长度信息解码器 实现比较复杂

15.Netty源码(四):Netty的“二次解码器”MessageToMessageDecoder

https://blog.csdn.net/qq_35688140/article/details/105483880

netty 包含 一次解码器 二次解码器

一次解码器 转成 字节数组(byteBuf)
二次解码器将 byteBuf 转为java对象

二次解码器

其中有java序列化,json,protobuf

16.Netty从入门到秃头(五):keepalive与idle

https://blog.csdn.net/ShallDid/article/details/107597781

netty 关联 keepalive idle

idle检测数据是否有传输,减少keepalive包次数 IdleStateHandler

17.Netty精粹之轻量级内存池技术实现原理与应用

https://www.cnblogs.com/wxd0108/p/6681623.html?utm_source=itdadao&utm_medium=referral

netty 关联 内存池 堆外内存

18.Netty学习—Selector

https://www.jianshu.com/p/9b5138855891

netty 包含 selector channel

selector的作用是轮询channel的状态是否可读,并进行IO操作
selector是在 new NIOEventLoopGroup()的时候创建的

19.ServerSocket 与 Socket的区别

https://www.cnblogs.com/mareymarey111/archive/2011/12/08/2280253.html

serverSocket 关联 socket

serverSocket用于绑定固定端口,accept()客户端请求. accept()成功后转让处理权限,并返回一个socket用于与客户端进行通信
socket用来与客户端通信

serverSocketChannel 关联 socketChannel

serverSocketChannel用于绑定固定端口,accept()客户端请求. accept()成功后转让处理权限,并返回一个socketChannel用于与客户端进行通信
socketChannel用来与客户端通信

channel 包含 serverSocketChannel socketChannel

20. Netty 源码解析 ——— 基于 NIO 网络传输模式的 OP_ACCEPT、OP_CONNECT、OP_READ、OP_WRITE 事件处理流程

https://www.jianshu.com/p/12dd57758eb5

selector 包含 OP_ACCEPT OP_CONNECT OP_READ OP_WRITE

channel 注册到selector上返回selectionKey, 并用selectionKey订阅感兴趣的事件
selector 用 selector.select() / selectNow()/ select(timeoutMillis) 来发现OP_ACCEPT事件

ServerSocketChannel 关联 OP_ACCEPT

op_accept 指的是接受客户端请求 由 boss线程注册该事件

SocketChannel 关联 OP_CONNECT OP_READ OP_WRITE

OP_CONNECT 代表与客户端连接已经建立
OP_READ 有数据已经准备就绪, workerThread注册该事件,一次读事件可能包含多次读操作,最多连续读16次
OP_READ 当断开连接的时候,也会触发该事件,此时读取字节数为-1
OP_WRITE 表示当前能够写入数据的一个状态,而不是有数据要写, 当worker无法写入数据(数据已经写满)时注册该事件,等待通知再写入.所以一般情况下不用注册,否则会一直触发

21.一道Netty面试题:boss线程池和worker线程池能不能合在一起?

https://blog.csdn.net/u013374645/article/details/89006955

netty 包含 main线程 boss线程 worker线程

main线程 就是用来创建netty服务的线程
boos线程 用来绑定服务器端口,每绑定一个端口就创建一个boss线程
worker线程 为socketChannel提供读写io的服务, 与socketChannel为多对多的关系

22.Netty 核心组件 Pipeline 源码分析(一)之剖析 pipeline 三巨头

https://www.jianshu.com/p/18e53b6b224f

netty 包含 pipeline

pipeline用来串联channel的各个动作,如 一次解码,二次解码 类似于 tomcat中的过滤器

pipeline 关联 ChannelInBoundHandler

业务处理就是注册一个handler(实现ChannelInBoundHandler)到pipeline上 ,重写channelRead()
默认处理线程就是 NioEventLoop线程,也可以通过 pipeline.addLast(,)来设置线程

23.Netty内存管理器ByteBufAllocator及内存分配

https://www.cnblogs.com/wuzhenzhao/p/11287903.html

netty 包含 ByteBufAllocato

24.Netty | 设置高低水位线避免 OOM

https://www.jianshu.com/p/092ded8d1f8c

netty 包含 水位线

写入数据的时候若无法写入会放在channel的写缓冲区中, 当超过一定数量,触发高水位线

25.Netty如何发送消息(writeAndFlush)

https://www.jianshu.com/p/d1005f5375ea

netty

netty写数据时 write写入ChannelOutboundBuffer flush将ChannelOutboundBuffer的数据发送出去

26.Netty之ByteBuf介绍

https://www.jianshu.com/p/380a006a51e4

netty 包含 ByteBuf

netty中最基础的数据结构, 用来接收处理完半包拆包问题的tcp帧转成字节数组,最后转成java对象. (反过来转化是发送数据)

27.ChannelFuture的用法

https://www.jianshu.com/p/4835eb4e91ab

netty 包含 channelFuture

channelFuture用来保存channel异步操作的结果 .sync() 会使当前线程进入 wait状态

28.调优参数:权衡Netty核心参数

https://time.geekbang.org/course/detail/100036701-168359

netty 包含 netty调优系统参数 netty调优核心参数

netty调优系统参数

linux文件句柄最大数量 ulimit -n
TCP_NODELAY 是否禁用Nagle算法(小碎片合并发送)
SO_BACKLOG 最大等待连接数
SO_SNDBUF SO_RCVBUF—TCP发送接受缓冲区大小 SO_KEEPALIVE—默认关闭 不用开启,系统默认开启 SO_REUSEADDR—(不懂)多网卡绑定相同端口 SO_LINGER IP_TOS

netty调优核心参数

WRITE_BUFFER_WATER_MARK 高低水位线 [32k, 64k]
CONNECT_TIMEOUT_MILLIS 客户端(连接)服务器最大时间 (30s)
MAX_MESSAGE_PER_READ WRITE_SPIN_COUNT 连续读 连续写次数 (16)
ALLOCATOR RCVBUF_ALLOCATOR bytebuf分配器大小

29.Netty中ChannelHandler共享数据的方式

https://blog.csdn.net/u013721793/article/details/51204029

netty 包含 ChannelHandler

channelHandler共享数据和隔离级别

30.netty 堆外内存泄露排查盛宴

https://www.jianshu.com/p/4e96beb37935

netty 包含 内存泄漏

31.Netty之内存泄露

https://www.cnblogs.com/it-davidchen/p/11193961.html

内存泄漏

内存泄漏有 DISABLED SIMPLE(默认) ADVANCED PARANOID(偏执)四种

32.优化使用:“整改”线程模型让”响应”健步如飞

https://time.geekbang.org/course/detail/100036701-171284

netty

netty单独设置子线程线程池时,应当另外创建,而不是使用 NioEventGroupLoop

33.Netty | 流量整形

https://www.jianshu.com/p/27067b16f32e

netty 包含 流量整形

有全局和channel级别的读写限流四种

33.《netty系列教程》 IP黑名单过滤

https://www.jianshu.com/p/b5b89666e121

netty 包含 netty黑名单过滤

34. 安全增强:少不了的自定义授权

https://time.geekbang.org/course/detail/100036701-174511

netty 包含 netty授权

35.安全增强:拿来即用的SSL-轻松融入案例

https://time.geekbang.org/course/detail/100036701-174514

netty 包含 nettySSL加密

sslHandler