netty 和 网络编程 - 823126028/book_reader GitHub Wiki

网络编程

网络参数调整

  • net.ipv4.tcp_tw_reuse = 1: 表示开启重用,允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭。
  • net.ipv4.tcp_tw_recycle = 0 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。
  • net.ipv4.tcp_syncookies= 1 主要是防止tcp sync攻击,在不开启的情况下,默认tcp三次握手第一次会发起sync请求是会分配空间的,加入synccookies时,只有在三次握手验证结束第三次的时候才会分配空间(根据cookie校验)。

EPOLL:

  • 用红黑树作为事件存储器,注册到网络中断上(红黑树主要是为了查询快)
  • List callback 接受所有中断后的事件。
  • epoll wait 底层等待事件

netty 重要组成结构

Boostrap:

serverBoostrap

  • option 设置自身port的端口一些网络参数。 backLog, TCP_NODELAY, ADDR_REUSE, BUF_SIZE 。
  • childOption 设置childOption
  • childHandler ChannelInitializer() 属于channal hanler,初始。register 事件进行触发register。 register 生成根据注册的channel handler重新添加生成channelHandler 并且根据 channelContext中获取pipleLine 移除自己。
  • 两个eventLoopGroup ,每个eventLoop 里注册了一批channel,通过selector.selectKeys 获取 就绪的事件进行处理。bossGroup处理的是accept事件

ClientBoostrap

  • 一个 eventLoop

EventLoop

  • 每个eventLoop带一个selector,selector的作用是根据 interestKey,搜索出符合标准的channel。

channelPipeLine

  • channelPipeline 执行事件下发的流程。

channelHandler(ChannelInboundHandler , ChannelOutboundHandler ):

DefaultEventExecutorGroup,可以解放io线程

dispatchEvent:

当收到read 信息的时候开始dispatch Event

netty IO 相关。

  • 异步阻塞的缺点:多个连接最会使线程池被阻塞。

  • read,write byte的数目为0,证明对面的网速很慢,应该注册事件,下次再读或者写,在netty 4 中 增加了high_water 和 low_water设置,如果大于high_water isWritable false,当低于低水平线的时候,使得isWritable 为true.可以判断网速不好的连接使他们丢弃。

  • web socket 新的html5协议,开始用html5进行握手协议,(客户端首先发送一个http协议带上websocket 请求标志和加密协议,并请求websokcet升级,服务端接受websocket升级 返回upgrade协议和加密字段)。

  • netty 客户端模式连接断开没必要关闭整个Executor 这个线程池。同样重启一个客户端没必要再启一个线程池。

  • netty 4 unRegister 包括了所有的连接断开:包括自己断开连接和主动断开连接。

netty 的自带工具

  • o.netty.util.HashedWheelTimer 时间轮算法。