HTTP协议结构

来源:互联网 发布:eppendorf移液器淘宝 编辑:程序博客网 时间:2024/05/17 04:15

HTTP协议无论是请求报文还是回应报文,都分为以下4个部分。

(1)报文头(initial line),比如访问百度的例子,”GEThttp://www.baidu.com/favicon.ico  HTTP/1.1”表示用GET方法请求http://www.baidu.com/favicon.ico这个文件,用的是HTTP/1.1协议。

(2)0个或者多个请求头(header line),例如Accept-Language:en

(3)空行(作为header lines的结束)

(4)可选的消息体

 

 HTTP协议是基于行的协议,每一行以\r\n作为分隔符,报文头通常表明报文的类型,比如请求的类型。且报文头只占一行,请求头附带一些特殊信息,每个请求占一行,其格式为name:value,即以分号作为分割;空行也就以一个\r\n分隔,可选的body通常包含数据,例如服务器返回的某个静态HTML文件的内容。

 

 

下面使用抓包工具wireshark,设置tcp.port==80,只关注http的端口通信。



在浏览器输入http://www.baidu.com/favicon.ico并回车。



可以看到第一行:

GET /favicon.ico HTTP/1.1\r\n

这个表明用GET方法,HTTP/1.1协议去获取favicon.ico文件。

 

1.HTTP请求方法

 

HTTP/1.1协议中定义了9种方法,来表明Request-URL指定的资源的不同操作方式,如下所述。

(1)OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法,也可以利用web服务器发送”*”的请求来测试服务器的功能性。

(2)HEAD:向服务器索要与GET方法请求一致的响应,只不过响应体将不会被返回,这种方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头的元信息,该方法常用于测试超链接的有效性,是否可以访问,以及最近是否更新等信息。

(3)GET:向特定资源发出请求。注意,GET方法不应当用于产生副作用的操作中,例如web app中的应用,其中一个原因是GET可能会被网络蜘蛛等随意访问。

(4)POST:向特定资源提交数据进行处理请求。数据被包含在请求体中,POST请求可能会导致新的资源的建立或对已有资源的修改。

(5)PUT:向指定资源位置上传最新内容。

(6)DELETE:请求服务器删除Request-URL所标识的资源。

(7)TRACE:回显服务器收到的请求,主要用于测试或诊断。

(8)CONNECTHTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。

(9)PATCH:用来将局部修改应用于某一资源,该操作添加于规范RFC5789中。

 

方法名是区分大小写的,当某个请求所针对的资源不支持对应的请求方法时,服务器应当返回状态码405,当服务器不认识或者不支持对应的请求方法时,应当返回状态码501

 

HTTP服务器至少应该实现GETHEAD方法,其他方法都是可选的。

 

2.HTTP常见的请求头

 

HTTP/1.1协议中,所有的请求头(除了Host外)都是可选的。



1Host:发送请求时,该请求头是必需的。主要用于被请求资源的Internet主机和端口号,它通常从HTTP  URL中提取出来的,HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回,例如上面的例子中,浏览器中输入http://www.baidu.com/favicon.ico后,浏览器发送的请求消息中,就会包含Host请求头域”Host:http://www.baidu.com”,此处使用的端口号80,如过指定端口号,则变成:“Host:端口号”。

2Connection:他的值通常只有2个,keep-alivecloseHTTP是一个请求响应模式的典型范例,即客户端向服务器发送一个请求信息,服务器来响应这个消息。在之前的HTTP版本中,每个请求都被创建一个新的客户端到服务器的连接,在这个连接上发送请求,然后接收请求,这种模式的好处就是简单,容易理解和编程实现,但也有一个很大的缺点,就是效率很低,因此,keep-alive被提出用来解决效率低的问题。keep-alive使得客户端到服务器的连接持续有效。当出现对服务器的后续请求时,keep-alive避免了建立或者重新建立连接。市场上大部分web服务器,包括iplanetIISapache等,都支持HTTPkeep-alive功能。

对于提供静态内容的网站来说,这个功能通常很有用,但是对于负担较重的网站来说,这里存在另外一个问题,虽然为客户保留打开的连接有一定的好处,但它同样影响了性能,因为在处理暂停期间,本来可以释放的资源仍旧被占用。当web服务器和应用服务器在同一台机器上运行时,keep-alive功能对资源利用的影响尤其突出,此功能为HTTP/1.1预设的功能,HTTP/1.0,加上keep-alivchcader也可以提供HTTP的持续作用功能。

 

(3)Accept:浏览器端可以接收的MIME类型。例如:Accepttext/html代表浏览器可以接收服务器回发的类型为text/html,也就是我们常说的html文档,如果服务器无法返回text/html类型的数据,服务器应该返回一个406错误(non acceptable),通配符(*)代表任意类型,例如Accept:*/*代表浏览器可以处理所有类型。

 

(4)Cache-Control:指定请求和响应遵循的缓存机制

 

(5)Accept-Encoding:浏览器声明自己可以接收的编码方法,通常说明是否支持压缩并指定压缩方法,Servlet能够向支持gzip的浏览器返回gzip编码的HTML页面,许多情形下这种编码可以5-10倍的下载时间。如果请求消息中没有设置这个域,服务器假定客户端对各种内容编码都可以接受。一般设置Accept-Encoding: gzip, deflate, sdch\r\n

 

(6)Accept-Language:浏览器声明自己接收的语言,语言跟字符集的区别可以理解为:中文是语言,中文有多种字符集,比如,big5gb2312gbk等,例如:Accept-Languagecn-us。如果请求消息中没有设置这个报头域,则服务器假定客户端对各种语言都可以接受。上面的例子中:Accept-Language: zh-CN,zh;q=0.8\r\n

 

(7)Accept-Charset:浏览器可以接受的字符集。如果在请求消息中没有设置这个域,默认时表示任何字符集都可以接受。

上面的例子中:

 

 

(8)User-Agent:用于告诉HTTP服务器,客户端使用的操作系统和浏览器名称和版本。

上面的列子中:

User-Agent: Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.221 Safari/537.36 SE 2.X MetaSr 1.0\r\n

 

 

3.HTTP回应报文

 

先来看看访问http://www.baidu.com/favicon.ico得到的返回包内容。




因为访问的是一张图片,因此media typeImage

第一行是报文头,第一个字段表明HTTP协议版本,可以直接以请求报文为准,第二个字段是status code,也就是返回码,相当于请求的结果。

200表示成功、404表示资源不存在等。最后一个字段为status code的可读字符串。

 

返回码由3位数字组成,第一个数字定义了响应的类型。且有5种可能的取值。

11xx:指示信息,表示请求已接收,继续处理。

22xx:  成功,表示请求已被成功接收、理解、接受。

33xx:重定向,要完成请求必须进行更进一步的操作。

44xx:客户端错误,请求有语法错误,或请求无法实现。

55xx:服务器端错误,服务器未能实现合法的请求。

 

常见返回码和其状态描述说明如下:

200 OK  客户端请求成功

400 Bad Request  客户端请求有语法错误,不能被服务器所理解

401 Unauthorized   请求未经授权

403 Forbidden   服务器收到请求,但是拒绝提供服务

404 Not found   请求资源不存在,比如输入错误URL

500 Internet Server Error   服务器发生不可以预期的错误

503 Server Unavailable    服务器当前不能处理客户端的请求,一段时间后可能恢复正常。

 

 

Date:表示日期

Server:服务器软件



原创粉丝点击