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)CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
(9)PATCH:用来将局部修改应用于某一资源,该操作添加于规范RFC5789中。
方法名是区分大小写的,当某个请求所针对的资源不支持对应的请求方法时,服务器应当返回状态码405,当服务器不认识或者不支持对应的请求方法时,应当返回状态码501。
HTTP服务器至少应该实现GET和HEAD方法,其他方法都是可选的。
2.HTTP常见的请求头
在HTTP/1.1协议中,所有的请求头(除了Host外)都是可选的。
(1)Host:发送请求时,该请求头是必需的。主要用于被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的,HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回,例如上面的例子中,浏览器中输入http://www.baidu.com/favicon.ico后,浏览器发送的请求消息中,就会包含Host请求头域”Host:http://www.baidu.com”,此处使用的端口号80,如过指定端口号,则变成:“Host:端口号”。
(2)Connection:他的值通常只有2个,keep-alive和close,HTTP是一个请求响应模式的典型范例,即客户端向服务器发送一个请求信息,服务器来响应这个消息。在之前的HTTP版本中,每个请求都被创建一个新的客户端到服务器的连接,在这个连接上发送请求,然后接收请求,这种模式的好处就是简单,容易理解和编程实现,但也有一个很大的缺点,就是效率很低,因此,keep-alive被提出用来解决效率低的问题。keep-alive使得客户端到服务器的连接持续有效。当出现对服务器的后续请求时,keep-alive避免了建立或者重新建立连接。市场上大部分web服务器,包括iplanet,IIS和apache等,都支持HTTP的keep-alive功能。
对于提供静态内容的网站来说,这个功能通常很有用,但是对于负担较重的网站来说,这里存在另外一个问题,虽然为客户保留打开的连接有一定的好处,但它同样影响了性能,因为在处理暂停期间,本来可以释放的资源仍旧被占用。当web服务器和应用服务器在同一台机器上运行时,keep-alive功能对资源利用的影响尤其突出,此功能为HTTP/1.1预设的功能,HTTP/1.0,加上keep-alivchcader也可以提供HTTP的持续作用功能。
(3)Accept:浏览器端可以接收的MIME类型。例如:Accept:text/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:浏览器声明自己接收的语言,语言跟字符集的区别可以理解为:中文是语言,中文有多种字符集,比如,big5、gb2312、gbk等,例如:Accept-Language:cn-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 type是Image。
第一行是报文头,第一个字段表明HTTP协议版本,可以直接以请求报文为准,第二个字段是status code,也就是返回码,相当于请求的结果。
200表示成功、404表示资源不存在等。最后一个字段为status code的可读字符串。
返回码由3位数字组成,第一个数字定义了响应的类型。且有5种可能的取值。
(1)1xx:指示信息,表示请求已接收,继续处理。
(2)2xx: 成功,表示请求已被成功接收、理解、接受。
(3)3xx:重定向,要完成请求必须进行更进一步的操作。
(4)4xx:客户端错误,请求有语法错误,或请求无法实现。
(5)5xx:服务器端错误,服务器未能实现合法的请求。
常见返回码和其状态描述说明如下:
200 OK 客户端请求成功
400 Bad Request 客户端请求有语法错误,不能被服务器所理解
401 Unauthorized 请求未经授权
403 Forbidden 服务器收到请求,但是拒绝提供服务
404 Not found 请求资源不存在,比如输入错误URL
500 Internet Server Error 服务器发生不可以预期的错误
503 Server Unavailable 服务器当前不能处理客户端的请求,一段时间后可能恢复正常。
Date:表示日期
Server:服务器软件
- Http协议-协议结构
- HTTP协议 > HTTP协议结构
- HTTP协议的结构
- HTTP协议的结构
- Http协议结构
- 【转】HTTP协议结构
- HTTP协议的结构
- HTTP协议结构
- HTTP协议结构
- HTTP协议报文结构
- HTTP协议的报文结构
- HTTP协议的报文结构
- HTTP协议之HTTP的结构
- HTTP协议2-HTTP消息结构
- 浅谈HTTP协议(一)--结构
- HTTP协议 请求响应的 结构认识
- 《图解HTTP》初步认识和HTTP协议结构详解
- (笔记十二)Tomcat启动、结构、配置、HTTP协议简介
- Java深入浅出——一维数组和二维数组在内存中的状态图
- awk 时间选取
- new和delete的用法
- 李超树 学习笔记
- Django项目之小博客
- HTTP协议结构
- JAVA JComboBox的监听事件(ActionListener、ItemListener)
- 业余时间决定了你的人生
- 欢迎使用CSDN-markdown编辑器
- Java进阶之虚拟机《五》:多态性实现机制--静态分派与动态分派
- bzoj1055 [HAOI2008]玩具取名(区间)
- LCD主流显示接口介绍
- Keras导入数据集报'NpzFile' object has no attribute 'zip'错误解决方案
- IDEA中使用MyBaits的配置问题