【网络知识之二】HTTP协议

HTTP协议(Hypertext Transfer Protocol,超文本传输协议),一种无状态的、应用层的、以请求/应答方式运行的协议,它使用可扩展的语义和自描述消息格式,与基于网络的超文本信息系统灵活的互动。

是浏览器和服务器之间进行“沟通”的一种规范。

1、背景
HTTP协议基于TCP协议,前者属于应用层协议,后者属于传输层协议;TCP/UDP是广泛使用的网络通信协议,而且TCP可以实现稳定可靠的连接,那为啥有多出个http协议呢?
普通的C/S架构软件,顶多上千个Client同时连接,而B/S架构的网站,十万人同时在线也是很平常的事儿。如果十万个客户端和服务器一直保持连接状态,那服务器如何满足承载呢?
http协议的产生很大程度上是基于性能考虑,在请求之后,服务器端立即关闭连接、释放资源。既保证了资源可用,也兼容了TCP的可靠性。
通常说http协议是“无状态”的,也就是“服务器不知道你客户端干了啥”,所以后来有了session会话之类的玩意。

2、HTTP1.1的请求协议
HTTP请求消息由请求行、请求头、空行和请求数据四个部分组成。

GET请求示例:

第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的HTTP版本.

GET说明请求类型为GET,[/562f25980001b1b106000338.jpg]为要访问的资源,该行的最后一部分说明使用的是HTTP1.1版本。

第二部分:请求头部,紧接着请求行(即第一行)之后的部分,用来说明服务器要使用的附加信息

从第二行起为请求头部,HOST将指出请求的目的地.User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该信息由你的浏览器来定义,并且在每个请求中自动发送等等

第三部分:空行,请求头部后面的空行是必须的

即使第四部分的请求数据为空,也必须有空行。

第四部分:请求数据也叫主体,可以添加任意的其他数据。

这个例子的请求数据为空。

POST请求示例:

第一部分:请求行,第一行明了是post请求,以及http1.1版本。
第二部分:请求头部,第二行至第六行。
第三部分:空行,第七行的空行。
第四部分:请求数据,第八行。

2.1请求行
请求行包含HTTP请求方法、请求的URL、HTTP协议版本三个内容,它们之间以空格间隔,并以回车+换行结束。

请求方法:
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

2.2请求头
头部分成三部分:常用头域、请求头域、实体头域。其中常用头域和实体头域部分内容在响应协议部分也有相同的定义。
(1)常用头域

header 解释 示例
Cache-Control 指定请求和响应遵循的缓存机制 Cache-Control: no-cache
Connection 表示是否需要持久连接。(HTTP 1.1默认进行持久连接) Connection: close
Date 请求发送的日期和时间 Date: Tue, 15 Nov 2010 08:12:31 GMT
Pragma 用来包含实现特定的指令 Pragma: no-cache
Trailer 指出头域在分块传输编码的尾部存在 Trailer: Max-Forwards
Transfer-Encoding 文件传输编码 Transfer-Encoding:chunked
Upgrade 向服务器指定某种传输协议以便服务器进行转换(如果支持) Upgrade: HTTP/2.0, SHTTP/1.3, IRC/6.9, RTA/x11
Via 通知中间网关或代理服务器地址,通信协议 Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)
Warning 关于消息实体的警告信息 Warn: 199 Miscellaneous warning

 

(2)请求头域

header 解释 示例
Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/html
Accept-Charset 浏览器可以接受的字符编码集 Accept-Charset: iso-8859-5
Accept-Encoding 指定浏览器可以支持的web服务器返回内容压缩编码类型 Accept-Encoding: compress, gzip
Accept-Language 浏览器可接受的语言 Accept-Language: en,zh
Accept-Ranges 可以请求网页实体的一个或者多个子范围字段 Accept-Ranges: bytes
Authorization HTTP授权的授权证书 Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Cookie HTTP请求发送时,会把保存在该请求域名下的所有cookie值一起发送给web服务器 Cookie: $Version=1; Skin=new;
Expect 请求的特定的服务器行为 Expect: 100-continue
From 发出请求的用户的Email From: user@email.com
Host 指定请求的服务器的域名和端口号 Host: www.zcmhi.com
If-Match 只有请求内容与实体相匹配才有效 If-Match: “737060cd8c284d8af7ad3082f209582d”
If-Modified-Since 如果请求的部分在指定时间之后被修改则请求成功,未被修改则返回304代码 If-Modified-Since: Sat, 29 Oct 2010 19:43:31 GMT
If-None-Match 如果内容未改变返回304代码,参数为服务器先前发送的Etag,与服务器回应的Etag比较判断是否改变 If-None-Match: “737060cd8c284d8af7ad3082f209582d”
If-Range 如果实体未改变,服务器发送客户端丢失的部分,否则发送整个实体。参数也为Etag If-Range: “737060cd8c284d8af7ad3082f209582d”
If-Unmodified-Since 只在实体在指定时间之后未被修改才请求成功 If-Unmodified-Since: Sat, 29 Oct 2010 19:43:31 GMT
Max-Forwards 限制信息通过代理和网关传送的时间 Max-Forwards: 10
Proxy-Authorization 连接到代理的授权证书 Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==
Range 只请求实体的一部分,指定范围 Range: bytes=500-999
TE 客户端愿意接受的传输编码,并通知服务器接受接受尾加头信息 TE: trailers,deflate;q=0.5
User-Agent User-Agent的内容包含发出请求的用户信息 User-Agent: Mozilla/5.0 (Linux; X11)
     

 

(3)实体头域

header 解释 示例
Allow 对某网络资源的有效的请求行为,不允许则返回405 Allow: GET, HEAD
Content-Length 请求的内容长度 Content-Length: 348
Content-Type 请求的与实体对应的MIME信息 Content-Type: application/x-www-form-urlencoded
Content-Encoding web服务器支持的返回内容压缩编码类型 Content-Encoding: gzip
Content-Language 响应体的语言 Content-Language: en,zh
Content-Location 请求资源可替代的备用的另一地址 Content-Location: /index.htm
Content-MD5 返回资源的MD5校验值 Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==
Content-Range 在整个返回体中本部分的字节位置 Content-Range: bytes 21010-47021/47022
Expires 响应过期的日期和时间 Expires: Thu, 01 Dec 2010 16:00:00 GMT
Last-Modified 请求资源的最后修改时间 Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT

 

3、HTTP1.1的响应协议
HTTP响应消息分三块,即状态行、响应头、消息主体。

示例:

第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。

第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)

第二部分:消息报头,用来说明客户端要使用的一些附加信息

第二行和第三行和第四行为消息报头,
Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是ISO-8859-1

第三部分:空行,消息报头后面的空行是必须的
第四部分:响应正文,服务器返回给客户端的文本信息。

空行后面的html部分为响应正文。

3.1 状态码

状态代码有三位数字组成,第一个数字定义了响应的类别,共分五种类别:

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

2xx:成功--表示请求已被成功接收、理解、接受

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

4xx:客户端错误--请求有语法错误或请求无法实现

5xx:服务器端错误--服务器未能实现合法的请求

常见状态码:

详细状态码描述:

状态码 原因短语  
100 Continue 继续
101 Switching Protocols 切换协议
200 OK 成功
201 Created 已创建
202 Accepted 接受
203 Non-Authoritative information 非权威信息
204 No Content 无内容
205 Reset Content 重置内容
206 Partial Content 部分内容
300 Multiple Choices 多个选择
301 Moved Permanently 永久移动
302 Found 发现
303 See Other 见其它
304 Not Modified 没有改变
305 Use Proxy 使用代理
307 Temporary Redirect 临时重发
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 Confilict 冲突
410 Gone 不存在
411 Length Required 长度必需
412 Precondition Failed 先决条件失败
413 Request Entity Too Large 请求实体太大
414 Request-URI Too Long 请求URI太长
415 Unsupported Media Type 不支持的媒体类型
416 Requested Range Not Satisfiable 请求范围不被满足
417 Expectation Failed 期望失败
500 Internal Server Error 内部服务器错误
501 Not Implemented 服务端没有实现
502 Bad Gateway 坏网关
503 Service Unavailable 服务不能获得
504 Gateway Timeout 网关超时
505 HTTP Version Not Supported HTTP协议版本不支持

 

3.2 响应头

header 解释 示例
Accept-Ranges 表明服务器是否支持指定范围请求及哪种类型的分段请求 Accept-Ranges: bytes
Age 从原始服务器到代理缓存形成的估算时间(以秒计,非负) Age: 12
ETag 请求变量的实体标签的当前值 ETag: “737060cd8c284d8af7ad3082f209582d”
Location 用来重定向接收方到非请求URL的位置来完成请求或标识新的资源 Location: http://www.zcmhi.com/archives/94.html
Date 原始服务器消息发出的时间 Date: Tue, 15 Nov 2010 08:12:31 GMT
refresh 应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持)

Refresh: 5; url=
http://www.zcmhi.com/archives/94.html

Retry-After 如果实体暂时不可取,通知客户端在指定时间之后再次尝试 Retry-After: 120
Server web服务器软件名称 Server: Apache/1.3.27 (Unix) (Red-Hat/Linux)
Vary 告诉下游代理是使用缓存响应还是从原始服务器请求 Vary: *
WWW-Authenticate 表明客户端请求实体应该使用的授权方案 WWW-Authenticate: Basic
Set-Cookie 设置Http Cookie Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1

 

参考:

HTTP协议
HTTP协议详解

浏览器内部工作原理

HTTP/1.1协议

 
posted @ 2019-11-11 17:36  cac2020  阅读(481)  评论(0编辑  收藏  举报