先简单介绍一下五层网络协议
物理层: 实现物理层面的比特流传输, 比如将 0101 转换成电压信号通过电缆传输处于协议最底层
链路层: 局域网内的不同 MAC 地址之间的信息传输, 数据包会封装 MAC 信息
网络层: 通过 IP 协议, 实现不同 IP 地址间 IP 数据包 (含有源 ip 和目的 ip 信息) 的传输
传输层: 构建于 IP 协议之上, 实现不同主机端口间的通信如 TCPUDP 协议 TCP 传输的是数据流, 该协议保证了数据包的有序可靠传输
应用层: 各种网络应用会有自己独特的通信协议, 比如邮件传输协议 ftp 协议以及本文要讨论的 http 协议
HTTP 协议
HTTP 协议全称为超文本传输协议 (HyperText Transfer Protocol), 是客户端(主要为浏览器) 和服务端 (网站) 之间的通信标准, 基于该协议构建了无处不在的万维网 (world wide web)HTTP 通常基于 TCP 进行传输, 由客户端发起对某一资源的请求, 此时会建立到服务器指定端口(默认 80) 的 TCP 连接, 服务端对该请求作出响应 HTTP 协议规定了请求和响应的格式请求方法和响应状态码等
HTTP 请求
当在浏览器地址栏输入 www.baidu.com 时, 会发出如下请求(有简化):
- GET / HTTP/1.1
- Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
- Accept-Encoding: gzip, deflate, br
- Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
- Connection: keep-alive
- Host: www.baidu.com
- User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:59.0) Gecko/20100101 Firefox/59.0
该请求符合以下格式标准:
请求行
请求头
[空行]
消息体[可选]
在上面请求信息中, 请求行包含三项信息:
请求方法 -> GET
请求的资源路径 -> / 表示对网站根目录的请求, 根据网站设定, 通常是 index.html 或 index.php
协议 -> HTTP/1.1 HTTP 第一个广泛使用的版本是 1.0, 这里使用 1.1, 最新的 2.0 协议也推出了
对请求头的说明如下:
Accept 告知 server 本客户端能够接受的回应内容类型(Content-Types)
Accept-Encoding 能够接受的编码方式
Accept-Language 能够接受的回应内容的自然语言列表
Connection 连接类型 keep-alive 表示保持连接以备其它资源如 CSS 图片等请求使用
HOST 主机信息, 指定向哪个网站发出请求, 除 host 外, 头信息中其它内容都是可选的
User-Agent 客户端类型不同浏览器一般都不一样, 服务器可据此返回差异化内容
根据需要, 请求头中还可能携带其它信息列举几个比较常用的:
Cookie 由于 http 是无状态协议, cookie 通常用来传递一些个性化信息, 如 PHPSESSID, 据此实现了 session 会话控制, 以保持用户状态
Referer 表示浏览器所访问的前一个页面, 正是那个页面上的某个链接将浏览器带到了当前所请求的这个页面
If-Modified-Since 对应于 HTTP 响应头中的 Last-Modified(资源最后修改时间), 如果服务器发现资源在此时间后没被修改, 则返回 304 Not Modified 响应, 这样浏览器会直接使用本地缓存, 节省了文件传输的消耗
If-None-Match 对应于 HTTP 响应头中的 ETag(资源版本号)文件的唯一标志符, 类似哈希或者指纹, 如果文件发生变化, 则 ETag 也会改变服务器文件 ETag 与请求头中 If-None-Match 内容相同时, 就发出 304 响应, 否则返回新的文件由于服务器时间可能不准确, ETag 优先级高于 Last-Modified
Range 请求资源的范围, 一般为字节 (可理解为分页) 可实现断点续传
请求头结束后, 会有一个空行, 然后是可选的消息体, 用来向服务器提交数据, 如 post 请求的表单信息本例中, 请求没有消息体
HTTP 响应
请求到达 baidu.com 服务器后, 处理完会发出如下响应:
- HTTP/1.1 200 OK
- Cache-Control: private
- Connection: Keep-Alive
- Content-Encoding: gzip
- Content-Type: text/html; charset=utf-8
- Date: Fri, 30 Mar 2018 07:26:56 GMT
- Expires: Fri, 30 Mar 2018 07:26:05 GMT
- Server: BWS/1.1
- Set-Cookie: BDSVRTM=0; path=/
- <!DOCTYPE html>
- <!--STATUS OK-->
[省略 html 内容]
同样的, 响应也有一定的格式:
状态行
响应头
[空行]
响应体
状态行中也包含三项信息:
HTTP/1.1 协议版本
200 状态码(status code)
OK 状态描述
对响应头中各字段说明如下:
Cache-Control 缓存控制, private 意味着这个文件对不同的用户是不同的只有用户自己的浏览器能够进行缓存, 中间的代理服务器不允许缓存; no-cache 不能缓存
Connection TCP 连接选项 Keep-Alive 保持并复用该连接
Content-Encoding 内容编码方式 gzip 使用 gzip 压缩, 则浏览器要用对应的方式解压
Date 服务器发出响应的时间
Expires 资源过期时间
Server 服务器软件类型
Set-Cookie 设置 cookie
除此之外, 还有其它比较重要的响应头:
Location 重定向
Access-Control-Allow-Origin 指定哪些网站可参与到跨来源资源共享过程中
Last-Modified 资源最后修改时间
Pragma 常见值 no-cacheHTTP1.0 可用此禁止缓存
ETag 资源的唯一标示符
响应结束后, 会有一个空行, 然后是响应的正文, 本例中是 baidu.com 首页的 html 内容
HTTP 请求方法
注: 这一部分内容参考了中文 wiki
HTTP/1.1 协议中共定义了八种方法 (也叫动作) 来以不同方式操作指定的资源:
GET 向指定的资源发出显示请求使用 GET 方法应该只用在读取数据, 而不应当被用于产生副作用的操作中
HEAD 与 GET 方法一样, 都是向服务器发出指定资源的请求只不过服务器将不传回资源的本文部分它的好处在于, 使用这个方法可以在不必传输全部内容的情况下, 就可以获取其中关于该资源的信息(元信息或称元数据)
POST 向指定资源提交数据, 请求服务器进行处理 (例如提交表单或者上传文件) 数据被包含在请求本文中这个请求可能会创建新的资源或修改现有资源, 或二者皆有
PUT 向指定资源位置上传其最新内容
DELETE 请求服务器删除 Request-URI 所标识的资源
TRACE 回显服务器收到的请求, 主要用于测试或诊断
OPTIONS 这个方法可使服务器传回该资源所支持的所有 HTTP 请求方法用 * 来代替资源名称, 向 Web 服务器发送 OPTIONS 请求, 可以测试服务器功能是否正常运作
CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器通常用于 SSL 加密服务器的链接(经由非加密的 HTTP 代理服务器)
方法名称是区分大小写的当某个请求所针对的资源不支持对应的请求方法的时候, 服务器应当返回状态码 405(Method Not Allowed), 当服务器不认识或者不支持对应的请求方法的时候, 应当返回状态码 501(Not Implemented)
HTTP 响应状态码
1** 服务器收到请求, 需要请求者继续执行操作
2** 成功, 操作被成功接收并处理典型的如 200 OK, 响应一切顺利
3** 重定向, 需要进一步的操作以完成请求, 如 304 Not Modified, 资源未修改, 用你的缓存吧
4** 客户端错误, 请求包含语法错误或无法完成请求著名的 404 Not Found 你要的东西没有哦
5** 服务器错误, 服务器在处理请求的过程中发生了错误比如 500 Internal Server Error, 服务器内部错误, 大概是程序员比较怕看到的
来源: http://www.bubuko.com/infodetail-2544239.html