http协议

来源:互联网 发布:json在线格式转换 编辑:程序博客网 时间:2024/05/08 09:40
本文大量参考http://zsxxsz.iteye.com/blog/568250,对原作者表示感谢 

一、协议层次 

http是应用层的协议,地位类似于SMTP FTP等,是构建在传输层协议TCP之上 
 

二、数据封装 

由于http处于最上层的应用层,所以其HTTP报文需要经过多次封装,才能在网络间传递 
 

三、消息格式 

 

HTTP请求和HTTP响应,都称为http消息,包括消息头和消息体 

消息头包括消息行、实体头、头部结束标识;其中实体头又包括通用头、请求头(响应头)、实体头 

消息体就是HTTP数据体,在RFC2616中称为HTTP Entity,不是必选的。比如HTTP GET请求,就只有请求头,没有请求体 

四、消息格式举例 

 

五、HTTP的局限性 

http规范的几个约束,决定了它目前有一些缺陷,需要通过其他方式来进行规避 

首先http协议是无状态的,所以每次请求对于服务端来说都是新请求,服务端无法记忆客户端此前发来的请求。规避这个限制的方法有session cookie等,都需要额外编程来实现 

其次http协议是text-based的,也就是说http消息体里面,都是一些纯文本,没法天然表示对象的类型(json某种程度上就可以)。所以在服务端,需要额外的编程,来把纯文本信息转换成对象 

最后,http协议是纯粹的请求-响应模型,也就是说,服务端没有办法主动发起对客户端的请求。 

规避这个问题,最常见的方式是客户端用轮询的方式,定时主动发起请求,给人的感觉就像是服务端主动推送的一样。但是如果轮询太频繁,对服务端会造成较大压力 

还有一种方式,是服务端和客户端保持长连接,服务端利用这个长连接,将后续的消息发回客户端,这类实现有comet等 

另外,现在的html5,有一种websocket,好像也能解决这个问题 

还有一种方法,是在客户端添加某些插件,比如flex,以及古老的applet 

总的来说,我见过最多的还是第一种方式,comet和websocket,现在好像都还不是很成熟,没见过广泛的应用。哪位网友有实践经验,还请介绍一下 

六、与socket的关系 

socket在不同的平台有不同的实现,比如java.net包里,就提供了java平台的socket实现,利用这组API,可以进行比较容易的网络编程。 

socket用的不是http协议,只是其传输层协议也是用的TCP和UDP。总的来说,socket和http关系不大。http是应用层协议,而socket是一组编程API接口。两者都是构建于传输层协议(TCP、UDP)之上
原创粉丝点击