Netty 网络程序优化

目录

  • 粘包与拆包
  • Nagle 与 TCP_NODELAY
  • TCP连接优化
  • Netty 优化

粘包与拆包

Netty 网络程序优化_第1张图片
粘包与拆包都是人为问题,ByteToMessageDecoder 提供的一些常见的实现类用于解决该问题:

  1. FixedLengthFrameDecoder:定长协议解码器,我们可以指定固定的字节数算一个完整的报文
  2. LineBasedFrameDecoder:行分隔符解码器,遇到\n 或者\r\n,则认为是一个完整的报文
  3. DelimiterBasedFrameDecoder:分隔符解码器,分隔符可以自己指定
  4. LengthFieldBasedFrameDecoder:长度编码解码器,将报文划分为报文头/报文体
  5. JsonObjectDecoder:json 格式解码器,当检测到匹配数量的“{” 、”}”或”[””]”时,则认为是一个完整的 json 对象或者 json 数组

Nagle 与 TCP_NODELAY

  • TCP/IP协议中针对TCP默认开启了Nagle算法
  • Nagle算法通过减少需要传输的数据包,来优化网络,数据包的发送和接受会先做缓存,分别对应于写缓存和读缓存
  • Nagle算法就是为了尽可能发送大块数据,避免网络中充斥着许多小数据块,对网络的优化包括:
    1、缓冲区满 ,当一次发送数据的量小于大块数据时,会先缓存,直到满足大块数据发送或缓冲区满
    2、达到超时,当一次发送数据的量小于大块数据且缓冲区也未满时,等待一定时长,也会将盖茨数据发送出去
  • 所谓大块数据就是指最大分段大小利用的用率高的一个数据发送包,网络传输中的一次数据传输的数据包最大容量称之为MTU: Maxitum Transmission Unit 最大传输单元,但是这里面不是全部用来传输数据的还会包含诸如IP协议头、TCP协议头,此时剩余的空间才是真正可利用空间,称之为MSS: Maxitum Segment Size 最大分段大小, 为 MTU - 20(IP) - 20(TCP)
  • MTU = 1500 Byte、MSS = 1460 Byte
  • TCP_NODELAY,启动TCP_NODELAY,就意味着禁用了Nagle算法,允许小包的发送。对于延时敏感型,同时数据传输量比较小的应用,开启TCP_NODELAY选项无疑是一个正确的选择

TCP连接优化

  • 建立连接
    Netty 网络程序优化_第2张图片
  • 断开TCP连接
    Netty 网络程序优化_第3张图片
  • 关于MSL:Linux上MSL默认1分钟,windows上默认为2分钟

Netty 优化

  1. 不要阻塞 EventLoop
  2. 系统参数优化

ulimit -a

Linux系统一切都基于文件,一切资源的描述和控制都可以通过文件描述符控制,通过该参数可以查看系统资源的文件描述符,得知并修改该资源的上限

/proc/sys/net/ipv4/tcp_fin_timeout

Linux系统上用于控制MSL时长的文件

TcpTimedWaitDelay

Windows系统上用于控制MSL时长的注册表中的项

  1. 缓冲区优化
    数据接收和发送的缓冲区SO_RCVBUF(接收缓冲区)、SO_SNDBUF(发送缓冲区)
    SO_BACKLOG:控制服务器正在建立连接的连接数,即处理TCP连接建立ESTABLISH阶段前的链接数,当正在建立连接的连接数超过设置的数量时就会返回客户端报错
    REUSEXXX:控制是否复用断开TCP连接时处于TIME-WAIT阶段的连接,这个阶段的连接没有销毁依然使用着系统资源,这样就能节省重新建立连接的消耗
  2. 心跳周期优化
    心跳机制:当连接状态比较空闲时,传输的数据很少时,可以通过定期联系服务端查看服务端的存活状态
    短线重连:短时间的网络断开,可以通过重连机制,重新建立网络连接
  3. 内存与 ByteBuffer 优化
    DirectBuffer:将Byte数据转换为信息时,可以先将Byte数据存放在JVM直接内存中,不受GC影响且书都快
    HeapBuffer:将Byte数据转换为信息时,可以先将Byte数据存放在JVM堆内存中,会受GC影响
  4. 其他优化
    ioRatio:网络IO操作和业务运算操作各自占用CPU的比值,一般为50:50
    Watermark:高低水位,当ioRatio过高或过低时,都会触发相应的不同操作
    TrafficShaping(整流):当系统一段时间内总是处于高水位,可以通过整流,将网络的请求数据放入一个缓冲区,缓解系统短时间内的数据操作压力

你可能感兴趣的:(网络编程与IO,Netty,网络,java,http)