HTTP是一个基于请求和响应模式的无状态,应用层的协议,常基于TCP的连接方式,广泛应用于B/S(浏览器/服务器)模式。
http工作流程
1、 首先客户端和服务器建立tcp连接。
2、 客户端发送请求报文,请求相关URL
3、 服务器接收到请求之后,返回应答,即响应报文
4、 客户端将内容显示在浏览器上,然后断开连接
http报文特点
1、 支持客户/服务器模式 C/S
2、 简单快速:客户像服务器请求服务时,只需要传送请求方法和路径(常用的有GET HEAD POST方式)
3、 灵活:HTTP允许传输任意类型的数据对象,其类型由content-Type加以标志
4、 链接:限制每次连接只处理一个请求,处理完就断开链接。由于HTTP基于TCP协议,因此当客户端连续请求时,这种处理方式导致时间开销较大(需多次建立TCP连接),这种情形下采用长连接会比较有效。
5、 无状态:是指协议对于事务处理没有记忆能力,如果客户端请求同样的资源,需重传需要的数据。
补充:
a) 关于长连接和短连接:
客户端的长连接不可能无限期持续着,这样会造成服务器的并发量太大,因此需要有一个超时时间timeout(keep-alive表示持续连接),如
另外还可能指定max =xxx,指示这个长连接最多接收XXX此请求就断开。如果没有指定超时时间,服务端也可以执行四次挥手断开链接。总之,服务端为了控制并发量,需要有相应的解决措施。
b) 关于服务端如何判断传输结束:
判断传输的数据量是否达到Content-Length大小;没有Content-Length字段的采用chunked编码来判断,在传输的最后会有一个空的chunked块。
另外,为了控制客户端并发量,有的服务器只支持一个客户端只能有一个连接。常见的情形就是不支持多线程下载。
c) 流水线技术
指在一个TCP连接内,多个HTTP请求可以并行(像流水线一样),即在下一个HTTP请求的应答完成之前就发起;现在还有很多技术瓶颈待解决,因此应用的还不广泛。如果使用流水线技术,那么客户端多连接并不能提高效率(都是带宽充分利用),除非需要抢占资源。
这里顺便提一下抓包软件wireshark,该软件可以抓取通过网卡的数据包。对于http协议而言,当http报文太大,到传输层就要进行TCP分片传输,然后到目的端再进行组装。在早些时候的wireshark软件中,分析出来的就是tcp包,而不是http报文(过滤选项过滤不出http),在1.12版本中已经可以过滤出来了,对分析而言方便了不少。
HTTP报文格式
HTTP报文分为请求报文和响应报文两种,其报文格式分别如下:
请求报文包含请求行、首部行、空行及主体,格式如下:
图 1 请求报文格式
响应报文包含状态行、首部行、空行及主体
图 2 响应报文格式
状态码是一个三位整数,其中第一位定义的响应的类型:
1xx:信息响应类,表示接收到请求并且继续处理
2xx:处理成功响应类,表示动作被成功接收、理解和接受
3xx:重定向响应类,为了完成指定的动作,必须接受进一步处理
4xx:客户端错误,客户请求包含语法错误或者是不能正确执行
5xx:服务端错误,服务器不能正确执行一个正确的请求
讲了那么多,现在实际分析一下:
用wireshark抓取请求www.baidu.com的http报文,其请求报文和响应报文如下:
图 3 请求报文
图 4 响应报文
从请求报文中可以看出请求报文没有主体部分(图中没标出,可以自己实践一下)响应码可以看出资源重定向了。当成功获取请求,响应码为200 ok
参考链接:
HTTP协议详解http://www.cnblogs.com/li0803/archive/2008/11/03/1324746.html
HTTP的长连接和短连接http://www.cnblogs.com/cswuyg/p/3653263.html