netty实现websocket(一)----HTTP与WebSocket

1 HTTP协议及其弊端

1.1 HTTP介绍
HTTP协议属于应用层协议,目前有HTTP1.0与HTTP1.1。HTTP协议的主要特点如下:
1)支持客户/服务器模式。
2)简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3)灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4)无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5)无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

具体介绍参考博文:http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html

HTTP1.0与HTTP1.1之间的区别:

HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器完成请求处理后立即断开TCP连接,服务器不跟踪每个客户也不记录过去的请求;
HTTP 1.1支持持久连接,在一个TCP连接(参考博文:http://www.cnblogs.com/renyuan/archive/2013/01/19/2867720.html)上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独的网页文件的请求和应答仍然需要使用各自的连接。HTTP 1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间。
这里写图片描述
具体介绍可以参考博文:http://blog.csdn.net/elifefly/article/details/3964766

1.2 HTTP协议的弊端

1)HTTP协议是半双工的协议,半双工协议指数据可以在客户端和服务器端两个方向上传输,但是不能同时传输,这意味着同一时刻只有一个方向上的数据传输;
2)HTTP消息冗长而繁琐,HTTP消息包含消息头、消息体、换行符等,通常情况下采用文本方式传输,相比其他二进制的通信协议,冗长而繁琐;
3)针对于服务器推送的黑客攻击,如长时间的轮询:浏览器不断向服务器发出请求,然而HTTP request的Header是非常冗长的,里面包含的可用数据比例可能非常低,这会占用很多的带宽资源和服务器资源。

2 Websocket

2.1 websocket介绍
websocket是HTML5开始提供的一中浏览器与服务器进行全双工通信的网络协议。在websocket API中,浏览器与服务器只需要做一个握手的动作,然后,浏览器和服务器就形成了一条快速通道,两者就可以直接互相传送数据。websocket基于TCP双向全双工进行消息传递,在同一时刻,既可以发送消息,也可以接受消息。其主要特点如下:

1)单一的TCP连接,采用全双工模式通信;
2)无头部信息、cookie和身份验证
3)无安全开销
4)服务器可以主动传递消息给客户端,不在需要客户端轮询

2.2 websocket连接的建立
WebSocket在建立握手连接时,数据是通过http协议传输的;但是在建立连接之后,真正的数据传输阶段是不需要http协议参与的。(ps:Websocket与HTTP、TCP的关系可以参考博文:http://blog.csdn.net/linwei_1029/article/details/47836249)

首先我们来看个典型的Websocket握手:
这里写图片描述
这段HTTP请求和普通的HTTP有一点差别,那就多了这两个玩意,这表明这是一个升级版本的HTTP—websocket
这里写图片描述

Sec-WebSocket-Key 是一个Base64 encode的值,这个是浏览器随机生成的。服务器端会根据这些数据来构造一个SHA-1的信息摘要,将其值放入“Sec-WebSocket-Accept”中返回给客户端。如下为服务器返回的东西,表示已经接受到成功建立Websocket啦!
这里写图片描述
2.3 websocket连接的关闭
为关闭websocket连接,客户端和服务器端需要通过一个安全的方法关闭底层TCP连接以及TLS会话。如果合适,丢弃任何可能已经接收的字节,必要时(比如受到攻击)可以通过任何可用的手段关闭连接。

底层的TCP连接,在正常情况下,应该首先由服务器关闭。在异常情况下,客户端可以发起TCP Close。当服务器被指使关闭websocket连接时,它应该立即发起一个TCP Close;客户端应该等待服务器的TCP Close。

参考博文:http://jinnianshilongnian.iteye.com/blog/1909962

其他参考博文:
【1】http://zengrong.net/post/2199.htm
【2】http://www.zhihu.com/question/20215561

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章