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 时间轮算法。