http协议简单总结

本文大量参考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)之上

猜你喜欢

转载自kyfxbl.iteye.com/blog/1622140