Netty与TCP、HTTP、WebSocket协议简明摘要
2016-12-05 08:06
585 查看
1.同步阻塞I/O(BIO) NIO 伪异步I/O 异步I/O(AIO)
NIO(非阻塞I/O):1个IO线程处理多个客户端连接,非阻塞,同步
同步阻塞IO:一个IO线程处理一个客户端连接,阻塞,同步
伪异步IO:M个线程处理N个客户端连接(其中M≥N),阻塞,同步
异步IO:不需要启动额外的IO线程,被动回调,非阻塞,异步
2.TCP粘包问题
TCP基于流的方式进行数据传输,由于底层的TCP无法理解上层的业务数据,因此需要上层的应用协议栈设计解决这个问题,如:
消息定长
在包尾增加回车换行符进行分割,如FTP协议
将消息分为消息头和消息体,消息头重包含表示消息总长度(或消息体长度)的字段
更复杂的应用层协议
用法:
解决粘包:LineBasedFrameDecoder和StringDecoder
自动完成以分隔符做技结束标志的消息的解码:DelimiterBasedFrameDecoder
自动完成对定长消息的解码:FixedLengthFrameDecoder
3.编解码(序列化)技术
Protobuf:ProtobufDecoder仅负责解码,不支持读半包,因此需要使用
Netty提供的ProtobufVarint32FrameDecoder
继承Netty提供的通用半包解码器LengthFieldBasedFrameDecoder
继承ByteToMessageDecoder类,自己处理半包消息
Marshalling:Netty的Marshalling编解码器支持TCP粘包和拆包处理,可以开发出与JBoss内部模块进行远程通信的程序,且支持一部非阻塞,降低了基于Netty开发的应用程序与JBoss内部模块对接的难度
4.HTTP协议开发
Netty+HTTP+XML协议栈开发:;利用到了Java的XML数据绑定框架:JiBx
SpringMVC+restful api+json协议栈开发:http://my.oschina.net/u/2273085/blog/481085
5.WebSocket协议开发
HTTP协议的弊端:
HTTP协议为半双工协议,客户端和服务端数据不能同时传输
HTTP消息冗长繁琐
HTTP对服务器的推送为长时间轮询 的方式,会占用很多的带宽和服务器资源
WebSocket协议优点:
单一TCP连接,采用全双工模式通信
对代理、防火墙和路由器透明
没有头部信息、Cookie和身份验证
没有安全开销
通过ping/pong帧保持链路激活
服务器可以I主动传递消息给客户端,不再需要客户端轮询
6.Netty私有协议栈开发
Java中常见的私有协议栈有:通过RMI进行RPC;通过Java的Socket+Java序列化的方式进行跨节点调用;利用开源的RPC框架进行RPC,如Facebook的Thrift,Apache的Avro等;利用标准的公有协议进行跨节点的服务调用,如HTTP+XML,RESTful+JSON或RESTful+WebService等
可靠性设计:心跳机制;重连机制;重复登录保护;消息缓存重发等
安全性设计:内部长连接采用基于IP地址的安全认证机制,服务端对握手请求消息的IP地址进行合法性校验;如果在白名单之内,则通过校验,否则拒绝连接。如果Netty协议栈在公网中使用,则采用严格的安全认证机制,如基于密钥和AES加密的用户名+密码认证机制,也可以采用SSL/TSL安全传输。
参考:
http://www.cnblogs.com/shanyou/p/4085802.html
《Netty权威指南》
NIO(非阻塞I/O):1个IO线程处理多个客户端连接,非阻塞,同步
同步阻塞IO:一个IO线程处理一个客户端连接,阻塞,同步
伪异步IO:M个线程处理N个客户端连接(其中M≥N),阻塞,同步
异步IO:不需要启动额外的IO线程,被动回调,非阻塞,异步
2.TCP粘包问题
TCP基于流的方式进行数据传输,由于底层的TCP无法理解上层的业务数据,因此需要上层的应用协议栈设计解决这个问题,如:
消息定长
在包尾增加回车换行符进行分割,如FTP协议
将消息分为消息头和消息体,消息头重包含表示消息总长度(或消息体长度)的字段
更复杂的应用层协议
用法:
解决粘包:LineBasedFrameDecoder和StringDecoder
自动完成以分隔符做技结束标志的消息的解码:DelimiterBasedFrameDecoder
自动完成对定长消息的解码:FixedLengthFrameDecoder
3.编解码(序列化)技术
Protobuf:ProtobufDecoder仅负责解码,不支持读半包,因此需要使用
Netty提供的ProtobufVarint32FrameDecoder
继承Netty提供的通用半包解码器LengthFieldBasedFrameDecoder
继承ByteToMessageDecoder类,自己处理半包消息
Marshalling:Netty的Marshalling编解码器支持TCP粘包和拆包处理,可以开发出与JBoss内部模块进行远程通信的程序,且支持一部非阻塞,降低了基于Netty开发的应用程序与JBoss内部模块对接的难度
4.HTTP协议开发
Netty+HTTP+XML协议栈开发:;利用到了Java的XML数据绑定框架:JiBx
SpringMVC+restful api+json协议栈开发:http://my.oschina.net/u/2273085/blog/481085
5.WebSocket协议开发
HTTP协议的弊端:
HTTP协议为半双工协议,客户端和服务端数据不能同时传输
HTTP消息冗长繁琐
HTTP对服务器的推送为长时间轮询 的方式,会占用很多的带宽和服务器资源
WebSocket协议优点:
单一TCP连接,采用全双工模式通信
对代理、防火墙和路由器透明
没有头部信息、Cookie和身份验证
没有安全开销
通过ping/pong帧保持链路激活
服务器可以I主动传递消息给客户端,不再需要客户端轮询
6.Netty私有协议栈开发
Java中常见的私有协议栈有:通过RMI进行RPC;通过Java的Socket+Java序列化的方式进行跨节点调用;利用开源的RPC框架进行RPC,如Facebook的Thrift,Apache的Avro等;利用标准的公有协议进行跨节点的服务调用,如HTTP+XML,RESTful+JSON或RESTful+WebService等
可靠性设计:心跳机制;重连机制;重复登录保护;消息缓存重发等
安全性设计:内部长连接采用基于IP地址的安全认证机制,服务端对握手请求消息的IP地址进行合法性校验;如果在白名单之内,则通过校验,否则拒绝连接。如果Netty协议栈在公网中使用,则采用严格的安全认证机制,如基于密钥和AES加密的用户名+密码认证机制,也可以采用SSL/TSL安全传输。
参考:
http://www.cnblogs.com/shanyou/p/4085802.html
《Netty权威指南》
相关文章推荐
- 2015-2016网页设计趋势分析 Web Design of Trends
- ruby实现的一个异步文件下载HttpServer实例
- C#异步绑定数据实现方法
- C#线程间不能调用剪切板的解决方法
- 科学知识:同步、异步、阻塞和非阻塞区别
- 探讨Ajax中同步与异步之间的区别
- C#线程同步的三类情景分析
- C#获取进程或线程相关信息的方法
- 简单对比C#程序中的单线程与多线程设计
- C#停止线程的方法
- C#子线程更新UI控件的方法实例总结
- C#线程队列用法实例分析
- C#中异步回调函数用法实例
- 基于Node.js + WebSocket打造即时聊天程序嗨聊
- TCP版backshell的VBS脚本代码
- jQuery Ajax 异步加载显示等待效果代码分享
- C++使用CriticalSection实现线程同步实例
- 基于C++实现的线程休眠代码
- C#实现异步GET的方法
- 基于C#的socket编程的TCP异步的实现代码