HTTP协议基础
该篇用来记录HTTP协议的相关基础知识,以免遗忘,主要是加深对HTTP协议的请求方式及响应状态码的印象,若有遗忘以便查看。
简介
协议是指网络中两台计算机之间通信所需共同遵守的规定或规则。
HTTP协议,即超文本传输协议(Hypertext transfer protocol),是一种规定了客户端和服务端之间的数据传输格式的协议。
HTTP协议采用了请求/响应模型。
工作原理
-
HTTP基于客户/服务器模式,且面向连接。
典型的HTTP事务处理流程如下:
(1)客户端与服务器建立连接;
(2)客户端通过TCP套接字向服务器提出请求报文;
(3)服务器接收请求,并根据请求返回相应的HTTP响应作为应答;
(4)客户与服务器关闭连接;
(5)客户端浏览器解析HTML内容。
-
客户端与服务器之间的一次性连接。
HTTP连接是一种一次性连接,限制每次连接只处理一个请求,当服务器返回本次请求的应答后便立即关闭连接,下次请求再重新建立连接。这种一次性连接主要考虑到WWW服务器面向的是Internet中大量用户,且只能提供有限个连接,因此服务器不会让一个连接长时间处于等待状态,及时地释放连接可以大大提高服务器的执行效率。
-
HTTP是一种无状态协议。
即服务器不保留与客户端交互时的任何状态,减轻了服务器的记忆负担,能保持较快的响应速度。也就是说每次HTTP请求都是独立的,任意两个请求间没有必然联系。但在实际应用中,会通过引入Cookie和Session机制来关联请求。
-
HTTP是一种面向对象的协议。
允许传送任何类型的数据对象,它通过数据类型和长度来标识所传送的数据内容和大小,并允许对数据进行压缩传送。
-
HTTP基于TCP协议
HTTP协议的目的是规定客户端和服务端数据传输的格式和数据交互行为,负责数据传输的细节底层时基于TCP实现的。 客户端是在一个特定的TCP端口(默认端口号为80)上打开一个套接字。若服务器在该端口上监听连接,则该连接便建立起来,然后客户通过该连接发送一个包含请求方法的请求块。现在使用的版本当中是默认持久连接的,也就是多次HTTP请求使用一个TCP连接。
HTTP请求报文
请求报文由请求行、请求头、空行、请求体4个部分组成,报文中的数据都是使用ASCII编码,各个字段的长度不确定,请求报文结构如图所示:
请求报文样例:
POST /search HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, application/x-shockwave-flash, */* Referer: http://www.google.cn/ Accept-Language: zh-cn Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld) Host: www.google.cn Connection: Keep-Alive Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g; NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y- FxlRugatx63JLv7CWMD6UB_O_r hl=zh-CN&source=hp&q=domety
HTTP协议定义的8种请求方式
每种请求方式规定了客户端与服务端之间不同的信息交换方式,常用的请求方式为GET和POST。服务器将根据请求完成相应操作,并以应答块形式返回给客户,最后关闭连接。HTTP1.0中定义了3种请求方式:GET、POST和HEAD;HTTP1.1中新增了5种请求方式:PUT、DELETE、OPTIONS、TRACE和CONNECT方式。8种请求方式具体如下:
序号
|
方法
|
描述
|
1
|
GET
|
请求指定的页面信息,并返回实体主体
|
2
|
HEAD
|
类似GET请求,返回的响应中只获取报头信息,没有具体内容
|
3
|
POST
|
向指定资源提交数据进行处理请求(如提交表单或上传文件),数据包含在请求体中,,POST请求可能会导致新的资源的建立或已有资源的修改。
|
4
|
PUT
|
类似POST,从客户端向服务器传送的数据取代指定的文档的内容,并存储在服务器指定位置,要求客户端预先知道该位置;如POST是在服务器一个集合或文件夹上操作,而PUT时具体某一个资源上操作。
|
5
|
DELETE
|
请求服务器删除某资源。和PUT都具有破坏性,可能被防火墙拦截。
|
6
|
OPTIONS
|
获取服务器支持的HTTP请求方法,允许客户端查看服务器的性能,比如ajax跨域时的预检等。
|
7
|
TRACE
|
回显服务器收到的请求,主要用于测试或诊断。一般禁用,防止被恶意攻击或盗取信息
|
8
|
CONNECT
|
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器,即将服务器作为跳板访问其他网页,然后将数据返回回来,连接成功后,就可以正常GET、POST了。
|
注意,方法名称是区分大小写的,当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Mothod Not Allowed);当服务器不认识或者不支持对应的请求方法时,应返回状态码501(Not Implemented)。
HTTP响应报文
响应报文由响应状态行、响应头、空行、响应体4部分组成,与请求报文的区别在于在第一行中用状态信息替换了请求信息,用状态码来说明所请求的资源情况,响应报文结构如下所示:
响应报文样例:
HTTP/1.1 200 OK Date: Mon, 23 May 2005 22:38:34 GMT Content-Type: text/html; charset=UTF-8 Content-Encoding: UTF-8 Content-Length: 138 Last-Modified: Wed, 08 Jan 2003 23:11:55 GMT Server: Apache/1.3.3.7 (Unix) (Red-Hat/Linux) ETag: "3f80f-1b6-3e1cb03b" Accept-Ranges: bytes Connection: close <html> <head> <title>An Example Page</title> </head> <body> Hello World, this is a very simple HTML document. </body> </html>
状态码:
1xx:信息
状态码 |
描述
|
100 Continue
|
服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求
|
101 Switching Protocols
|
服务器转换协议:服务器将遵从客户的请求转换到另一种协议
|
2xx:成功
状态码
|
描述 |
200 OK
|
请求成功(其后是对GET和POST请求的应答文档)。
|
201 Created
|
请求被创建完成。同时新的资源被创建。
|
202 Accepted
|
供处理的请求已被接受,但是处理未完成。
|
203 Non-authoritative Information
|
文档已经正确地返回,但一些应答头可能不争气,因为使用的是文档的拷贝。
|
204 No Content
|
Response中包含一些Header和一个状态行,但不包括实体的主题内容(没有response body)
|
205 Reset Content
|
一个主要用于浏览器的代码,浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容
|
206 Partial Content
|
部分请求完成。客户发送了一个带有Range头的GET请求,服务器完成了它。
|
3xx:重定向
状态码
|
描述
|
300 Multiple Choices
|
多重选择。链接列表,用户可选择某链接到达目的地,最多允许5个地址。
|
301 Moved Permanently
|
所请求的页面已经转移至新的url,Response中应该包含一个Location URL,说明资源现在所处的位置。
|
302 Found
|
所请求的页面已经临时转移至新的url,客户端会使用Location中给出的rul,重新发送新的请求
|
303 See Other
|
所请求的页面可在别的url下被找到。
|
304 Not Modified
|
自从上次请求后,请求的网页未修改过。客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只需要比指定日期更新的文档)。服务器告诉客户,已缓冲文档还能继续使用。
|
305 Use Proxy
|
客户请求的文档应该通过Location头所指明的代理服务器提取。若服务器返回此响应,表示请求者应使用代理
|
306 Unused
|
前一HTTP版本的特征码,目前已不再使用,但特征码依然被保留。
|
307 Temporary Redirect
|
被请求的页面已经临时移至新的url,类似302。
|
4xx:客户端错误
状态码
|
描述
|
400 Bad Request
|
服务器未能理解请求
|
401 Unauthorized
|
需要客户端对自己的认证
|
402 Payment Required
|
此代码尚无法使用
|
403 Forbidden
|
请求被服务器拒绝
|
404 Not Found
|
服务器无法找到被请求的页面
|
405 Method Not Allowed
|
请求中指定的方法不被允许
|
406 Not Acceptable
|
服务器生成的响应无法被客户端所接受
|
407 Proxy Authentication Required
|
用户必须首先使用代理服务器进行验证,这样请求才会被处理
|
408 Request Timeout
|
请求超出了服务器的等待时间,服务器返回该状态码并关闭连接
|
409 Conflict
|
由于冲突,请求无法被完成
|
410 Gone
|
服务器曾有该资源,现在被请求的页面不可用
|
5xx:服务器错误
状态码
|
描述 |
500 Internal Server Error
|
请求未完成,服务器遇到不可预知的情况
|
501 Not Implemented
|
请求未完成,服务器不支持所请求的功能(如客户端使用了服务器不支持的请求方式)
|
502 Bad Gateway
|
请求未完成,服务器从上游服务器收到一个无效的响应
|
503 Service Unavailable
|
请求未完成,服务器临时过载或宕机 |
504 Gateway Timeout
|
网关超时,与408类似
|
505 HTTP Version Not Supported
|
服务器不支持请求中指明的HTTP协议版本
|
HTTP协议发展
参考链接:
-
HTTP 0.9 (1991年)
0.9协议是一个交换信息的无序协议,仅仅限于文字,只能使用GET请求方法,可用该版本协议构建一个完全的静态页面。
-
HTTP 1.0 (1996年)
1.0版本协议奠定了HTTP协议的基础,该版本不仅可传输HTML文本页面,同时可以传输二进制文件(如图片、视频等),请求方法新增了POST和HEAD。请求消息和响应消息规定了一些完数据字段,如字符集、编码和状态响应码等。
-
HTTP 1.1 (1997年)
1.1版本相较1.0更加完善。1.0版本的请求时一次TCP连接,请求完成后关闭连接;而1.1版本默认不关闭TCP连接,也不用声明 Connection: keep-alive 字段,若需要关闭可指定Connection: close 字段。同时加入了管道机制,使在一个TCP连接内可发送多个HTTP请求,不用等待上一个请求结束后再发送。新增了PUT、PATCH、OPTIONS、DELETE等命令。增加了Host字段。
-
HTTP 2 (2015年)
完善上一版本功能,相较与1.1版本,2.0版本可进行多工处理。增加了头信息压缩和服务器的主动推送。
-
HTTPS
因为HTTP协议的数据传输时明文,不安全的,所以HTTPS即在HTTP协议上使用了SSL/TLS协议进行加密处理。
至此该篇随笔结束,若在后续学习过程中认识到新内容,需加以补充。