HTTP1.1协议详解

HTTP概述

HTTP协议用于约定服务端(如Web服务器Tomcat、IIS)和客户端(如浏览器、APP)通信的消息格式和响应方式。了解HTTP协议内容有助于优化Http请求,如断点下载、多线程下载、防盗链等功能的实现。HTTP协议是建立在TCP协议之上的,理论上只要有一个Socket就能够实现Http消息的请求,实现比如HttpClient、UrlConnection的请求操作。只要有一个SocketServer就能够实现Http消息的响应,实现比如Tomcat、IIS等Web服务器的功能,比如在手机上部署网站,用户可以在浏览器端访问同一网络下的手机部署的站点。

HTTP请求协议详解

HTTP1.1的请求协议报文结构如下图,大体上可以分为三块,即请求行、头部、消息主体。

HTTP1.1协议详解_第1张图片

请求行

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

HTTP请求方法有下面几种,常用的有GET、POST请求。
- OPTIONS
- GET
- HEAD
- POST
- DELETE
- TRACE
- CONNECT

请求头部

头部可以分成三个部分,为常用头域、请求头域、实体头域。其中常用头域和实体头域部分内容在响应协议部分也有相同的定义。

常用头域
常用头域名称 作用描述
Cache-Control 缓存控制
Connection HTTP 1.1默认是支持长连接的(Keep-Alive),如果不希望支持长连接则需要在此域中写入close
Date 表明消息产生的日期和时间
Pragma
Trailer
Transfer-Encoding 告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式
Upgrade 给出了发送端可能想要”升级”使用的新版本或协议
Via 显示了报文经过的中间节点(代理、网关)
Warning
请求头域
请求头域名称 作用描述
Accept 指明请求端可以接受处理的媒体类型
Accept-Charset 指明请求端可以接受的字符集
Accept-Encoding 指明请求端可以接受的编码格式
Authorization 授权
Expect 允许客户端列出某请求所要求的服务器行为
From 提供了客户端用户的E-mail地址
Host 指明请求端的网络主机和端口号
If-Match 服务端在响应头部里面返回ETag信息,客户端请求时在头部添加If-Match(值为响应的ETag),服务端接收后判断ETag是否相同,若相同则处理请求,否则不处理请求。
If-Modified-Since 客户端在请求某一资源文件时,在头部加上If-Modified-Since(值为该资源文件的最后修改时间),服务端接收后将客户端上报的修改时间与服务器存储的文件的最后修改时间做对比,如果相同,说明资源文件没有更新,返回304状态码,告诉客户端使用原来的缓存文件。否则返回资源内容。
If-None-Match 服务端在响应头部里面返回ETag信息,客户端请求时在头部添加If-None-Match(值为响应的ETag),服务端接收后判断ETag是否相同,若相同,说明资源没有更新,返回304状态码,告诉客户端使用原来的缓存文件。否则返回资源内容。
If-Range 该头域与Range头域一起使用,服务端在响应头部里面返回ETag信息,客户端请求时在头部添加If-Range(值为响应的ETag),服务端接收后判断ETag是否相同,若相同,则返回状态码206,返回内容为Range指定的字节范围。若不相同,则返回状态码200,返回内容为整个实体。
If-Unmodified-Since 客户端在请求某一资源文件时,在头部加上If-Modified-Since(值为该资源文件的最后修改时间),端接收后将客户端上报的修改时间与服务器存储的文件的最后修改时间做对比,如果相同,则返回资源内容,如果不相同则返回状态码412。
Max-Forwards 配合TRACE、OPTIONS方法使用,限制在通往服务器的路径上的代理或网关的数量。
Proxy-Authorization 代理授权
Range 表示客户端向服务端请求指定范围的字节数量:Range:bytes=0-500表示请求第1个到第501个的字节数量。Range:bytes=100-表示请求第101到文件倒数第一个字节的字节数量。Range:bytes=-500表示请求最后500个字节的数量。Range可以同时指定多组(Range:bytes=500-600,601-999)。并不是所有的服务端都支持字节范围请求的,如果支持字节范围请求,服务端会返回状态码206,若不支持则会返回200,客户端需要根据状态码来判断服务端是否支持字节范围操作。此域可用于断点下载,即在断点处请求后面的内容,也可用于多线程下载同一个文件,每个线程负责一个文件的一部分下载工作,多个线程协同完成整个文件的下载。
Referer 用于指定客户端请求的来源,是从搜索引擎过来的?还是从其它网站链接过来的?服务器根据此域,有时可以用做防盗链处理,不在指定范围内的来源,统统拒绝。
TE 指明客户端可以接受哪些传输编码。
实体头域
实体头域名称 作用描述
Allow 指明被请求的资源所支持的方法,如GET、HEAD、PUT
Content-Encoding 指明实体内容所采用的编码方式
Content-Language 指明实体内容使用的语言
Content-Length 指明请求实体的字节数量
Content-Location 可以用来为实体提供对应资源的位置
Content-MD5 指定实体内容的MD5,用于内容的完整性校验(base64的128位MD5)
Content-Range
Content-Type 指定实体的媒体类型
Expires 指明实体的过期时间
Last-Modified 指明实体最后被修改的时间

HTTP响应协议详解

HTTP1.1的响应协议报文结构如下图,大体上可以分为三块,即状态行、头部、消息主体。

HTTP1.1协议详解_第2张图片

状态行

状态行包含HTTP协议版本、状态码、原因短语三个内容,它们之间以空格间隔,并以回车+换行结束。

状态码由三位数字组成,第一位数字定义了响应类型,主要有如下五种类型的状态码

状态码类型 作用描述
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协议版本不支持

响应头域

响应头域名称 作用描述
Accept-Ranges 服务器向客户端指明服务器对范围请求的接受度
Age 从原始服务器到代理缓存形成的估算时间(以秒计,非负)
ETag 实体标签
Location 指定重定向的URI
Proxy-Autenticate 它指出认证方案和可应用到代理的该URL上的参数
Retry-After 如果实体暂时不可取,通知客户端在指定时间之后再次尝试
Server 指明服务器用于处理请求的软件信息
Vary 告诉下游代理是使用缓存响应还是从原始服务器请求
WWW-Authenticate 表明客户端请求实体应该使用的授权方案

参考资料

Http协议部分讲解

Http协议官方文档

你可能感兴趣的:(网络编程)