TCP可靠性表现
面向连接
校验和
确认应答与序列号(TCP传输时将每个字节的数据都进行了编号,这就是序列号)
超时重传
流量控制
滑动窗口设置
TCP的粘包/拆包原因
1.UDP首部采用了16bit来指示UDP数据报文的长度,因此在应用层能很好的将不同的数据报文区分开,从而避免粘包和拆包的问题。TCP的首部没有表示数据长度的字段。
2.发两个数据包时会有有三种情况。主要原因是TCP发送缓冲区剩余空间的大小,将会发生粘包和拆包。
TCP粘包、拆包解决办法
1、发送端给每个数据包添加包首部,首部中应该至少包含数据包的长度。
2、发送端将每个数据包封装为固定长度(不够的可以通过补0填充)。
3、可以在数据包之间设置边界,如添加特殊符号,这样,接收端通过这个边界就可以将不同的数据包拆分开。
Netty解决方案
Netty默认提供了多种编解码器用于处理半包,例如:LineBasedFrameDecoder
BIO、NIO、AIO分别是什么
阻塞 非阻塞 异步(read write 缓冲)
Netty跟Java NIO有什么不同
越底层的东西越麻烦涉及到多线程,网络编程,NIO底层还有bug。
框架模块丰富,有大量的实践,稳定,社区活跃。
Netty组件
其实NIOEventLoopGroup就是一个线程池实现,通过设置不同的NIOEventLoopGroup方式就可以对应三种不同的Reactor线程模型。
channel 都有一个与之关联的eventLoop绑定一个线程然后注册到selector
当 channel 创建时,就会被自动分配到它专属的 ChannelPipeline 为 ChannelHandler 链提供了容器。
Reactor线程模型
单线程模型
多线程模型
主从线程模型
select、poll、epoll的机制及其区别
都是同步多路IO复用
它仅仅知道了,有I/O事件发生了,却并不知道是哪那几个流(可能有一个,多个,甚至全部),我们只能无差别轮询所有流,找出能读出数据,或者写入数据的流,对他们进行操作。所以select具有O(n)的无差别轮询复杂度,同时处理的流越多,无差别轮询时间就越长。
(2)poll==>时间复杂度O(n)
poll本质上和select没有区别,它将用户传入的数组拷贝到内核空间,然后查询每个fd对应的设备状态, 但是它没有最大连接数的限制,原因是它是基于链表来存储的.
(3)epoll==>时间复杂度O(1)
epoll可以理解为event poll,不同于忙轮询和无差别轮询,epoll会把哪个流发生了怎样的I/O事件通知我们。所以我们说epoll实际上是事件驱动(每个事件关联上fd)的,此时我们对这些流的操作都是有意义的。(复杂度降低到了O(1))
1、表面上看epoll的性能最好,但是在连接数少并且连接都十分活跃的情况下,select和poll的性能可能比epoll好,毕竟epoll的通知机制需要很多函数回调。
2、select低效是因为每次它都需要轮询。但低效也是相对的,视情况而定,也可通过良好的设计改善
网友评论