什么是 HTTP
官方解释是 "因特网的多媒体信使", 通俗点说, 就是个送信的. 电话机出来之前, 人与人 (有一定距离) 之间的沟通基本靠写信, 然后由快递员送发. 如果把 web 服务器和客户端比作当时人类, 那么 HTTP 便是快递员. 客户端通过 HTTP 发送请求, 服务器收到后请求后通过 HTTP 返回响应结果. HTTP 生态中常见的客户端便是大家日常上网用到的浏览器(chrome/360 浏览器 / QQ 浏览器), 服务器便是几乎对大家不可见, 被管理员藏在某个暗暗的机房.
资源
Web 资源统一存放在 Web 服务器中, 以供客户端请求使用. 官方说法, Web 服务器是 Web 资源的宿主, 好比人类是细菌的宿主.
Web 资源类型多样, 几乎囊括操作系统中的所有文件类型, 图片, 视频, 文本, 如: html/excel/word/ppt/jpg/avi 等. 此处提到的资源并非一定是提前写好的不会再变的静态文件, 也可能是动态的, 根据需要生成的软件程序, 如, 帮你进行股票交易 / 信息检索等.
如此多的资源类型, 总该有个分类, 就像人类分小孩, 大人和老人. 于是, 媒体类型 这一词汇便衍生出来, 作为标签打在各个资源上. 官方叫法为 MIME (Multipurpose Internet Mail Extension, 多用途因特网邮件扩展), 也许你会奇怪, 为啥起这么个名字, 只因当初该词的出现只是为了解决在不同的电子邮件系统之间搬移报文时存在的问题, 效果比较好, HTTP 便采用了它, 用来描述并标记多媒体内容.
Web 服务器响应请求时会为所有 HTTP 资源对象添加一个 MIME 类型, 以供客户端查看(响应头的 content-type 字段). 为了更明显地区分资源类型, MIME 由主要对象类型和特定子类型构成, 中间由一条斜杠来分隔. 常见的 MIME 类型有数百个, 需要的时候再查吧, 无需记住每一种.
| 文件格式 | MIME 类型 |
- | --- | --- |
- | HTML | text/html |
| 普通 ASCII 文本 | text/plain |
| JPEG | image/jpeg |
| Apple 的 Quicktime 电影 | video/quicktime |
URI/URL 傻傻分不清楚?
上面说的 Web 资源都有一个自己的名字, 这样, 客户端可以根据个人兴趣取到对应的资源内容, 这个名字被称为 统一资源标识符(Uniform Resource Identifier, URI). 就像 A 班的妖艳货去找 B 班的小明, 原本俩人不认识, 但 A 只要到 B 班一问便可找到哪一位是小明了."小明" 就是这个人的统一资源标识符. 明白了 URI, 那啥是 URL 呢? 官方解释是 统一资源定位符(Uniform Resource Location).URI 和 URL 两者的关系就好比 "手机" 和 "小米", 小米是一种手机样式, 是手机的子集. 同样的, URL 是 URI 的一种形式, 是 URI 的子集. URI 的另一种不怎么被使用的形式是 统一资源名 URN (Uniform Resource Name),URN 作为特定内容的唯一名称使用, 与目前资源所在地无关. URL 和 URN 的大区别就是 URL 是客户端根据资源定位符 URL 在某处服务器上寻找资源, 资源定位符包含了服务器地址; URN 则是客户端根据资源名寻找资源, 并不指定地址, 就根据名称寻找, 由于此方式难度较高, 暂时仍处于实验阶段, 未大范围使用.
http://www.qq.com/index.html
上述字串为一个 URL ,`http` 协议部分, `www.qq.com` 域名部分, `index.html` 文件路径部分. 类比寄快递的话, `http` 相当于选择哪家快递公司,`www.qq.com` 相当于邮寄地址, 如: 上海市徐汇区田林路 397 号, `index.html ` 相当于收件人所在房屋及其姓名, 如: XX 小区 XX 号 XX 室 张三(收 ).
事务
一个 HTTP 事务由一条 (从客户端发往服务器的) 请求命令和一个 (从服务器发回客户端的) 响应结果组成.
HTTP 事务支持几种不同的请求命令, 这些命名被称为 HTTP 方法 如下表,
HTTP 方法 | 描述
---| ---
GET | 服务器向客户端发送命名资源
PUT | 将来自客户端的数据存储存储到一个命名的服务器资源中去
DELETE | 从服务器删除命名资源
POST | 将客户端数据发送到一个服务器网关应用程序
HEAD | 仅发送命名资源响应中的 HTTP 首部
每条 HTTP 响应报文返回时都会携带一个状态码, 用以标识当前请求结果状态. 如 200 表示请求成功, 具体状态码和对应的原语可参看: https://baike.baidu.com/item/HTTP状态码 . 常用状态码 (如: 200/301/302/403/400/500 等) 需要记住, 以便问题快速排查.
报文
HTTP 报文都是纯文本, 不是二进制. 从 Web 客户端发往 Web 服务器的的 HTTP 报文称为 请求报文, 从服务器发往客户端的报文则称为 响应报文, 此外, 没有其他类型的 HTTP 报文. HTTP 报文包括以下三个部分: 起始行, 首部字段和主体.
连接
HTTP 是一个应用层协议, 不关心网络通信的具体细节, 把联网的具体细节交给了通信可靠的因特网传输协议 TCP/IP. TCP 提供了 无差错的数据传输, 排序传输和不分段数据流, 保证数据按顺序且完整无误地进行传输. 霸气点说, 只要建立了 TCP 连接, 客户端和服务器之间的报文交换就不会丢失, 不会被破坏, 也不会在接收时出错. 没错, 就是这么屌!
- http://180.163.26.39:80/index.html
- http://www.qq.com:80/index.html
- http://www.qq.com/index.html
上述三个地址访问的均是同一个资源, 只是表述方式不一样.
第一个 URL 使用了机器的 IP 地址, 180.163.26.39 及端口号 80;
第二个 URL 使用的是域名 (主机名) 访问, 端口号仍为 80, 主机名就是 IP 地址比较人性化的名称, IP 全是数字, 不方便记忆, 使用主机名则非常方便记忆, 浏览器访问域名, 通过域名服务 (Domain Name Service, DNS) 机智将主机名转换成 IP, 所以, 其实质也是访问 IP.
第三个 URL 没有端口号, 因 http 默认端口一般为 80, 故可省略不写, https 默认端口号为 443.
下面我们一起看看当用户在浏览器中输入 `http://www.qq.com:80/index.html` 后都发生了什么.
web 的结构组件
代理 位于客户端和服务器之间的 HTTP 中间实体, 接受收所有客户端的 HTTP 请求, 并将这些请求发送给服务器.
缓存 HTTP 的仓库, 使用常用页面的副本可以保存在离客户端更近的地方, 是一种特殊的 HTTP 代理服务器.
网关 连接其他应用程序的特殊 Web 服务器, 可中途改变协议方式, 如 HTTP -> FTP.
隧道 对 HTTP 通信报文进行盲转发的特殊处理, 用于通过 HTTP 连接承载加密的安全套接字层 (SSL, Secure Sockets Layer) 流量, 这样 SSL 流量就可以穿过只允许 Web 流量通过的防火墙了.
Agent 代理 发起自动 HTTP 请求的半智能 Web 客户端, 常见的 Agent 代理是 Web 浏览器和 "网络蜘蛛".
[参考文献]
HTTP 权威指南David Gourley 等编. 陈涓 赵振平译. 人民邮电出版社
来源: https://www.cnblogs.com/codelovers/p/8889172.html