什么是HTTP
它是一种超文本传输协议,用来传输超文本
- 超文本:早期互联网只有文本被解析成二进制之后进行传输,后来互联网迅速的发展出现了视频、音频、图片等等信息进行传输,这种扩大后的语义称之为超文本。
- 传输:两台计算机之间进行通讯,超文本会被解析成二进制通过载体:光纤、电缆等等传输到另一台计算机。
- 协议:协议意味着有多个参与者为了达成某个共同的目的而站在了一起,除了要无疑义地沟通交流之外,还必须明确地规定各方的责、权、利”
HTTP是一个用在计算机世界里的协议,它确立了一种计算机之间交流通信的规范,以及相关的各种控制和错误处理方式。HTTP是构建互联网的重要基础技术,它没有实体,依赖许多其他的技术来实现,但同时许多技术也都依赖于它。
HTTP相关概念
- 浏览器(Web):用于检索、查看互联网上网页资源的应用程序,本质上是一个HTTP协议中的请求方,使用HTTP协议获取网络上的各种资源,通常都简单地称之为“客户端”
- Web服务器(Web Service):包含硬件和软件两个含义,硬件可以表现为一台机器。软件可以表现为提供Web服务的应用程序,用来响应请求返回信息
- CDN(Content Delivery Network):它可以缓存源站的数据,让用户找到最近的节点,可以用作网络加速外,还提供负载均衡、安全防护、边缘计算、跨运营商网络等功能
- 爬虫(Crawler):是一种可以自动访问Web资源的应用程序
- WebService:是一种由W3C定义的应用服务开发规范,使用client-server主从架构,通常使用WSDL定义服务接口,使用HTTP协议传输XML或SOAP消息,也就是说,它是一个基于Web(HTTP)的服务架构技术,服务端和客户端可以采用不同的语言开发,具有跨平台跨语言的优点。
- 代理(Proxy):是HTTP协议中请求方和应答方中间的一个环节,既可以转发客户端的请求,也可以转发服务器的应答
- 正向代理:靠近客户端,代表客户端向服务器发送请求;
- 反向代理:靠近服务器端,代表服务器响应客户端的请求;
- DNS(Domain Name System):也叫域名解析服务,用有意义的名字来作为IP地址的等价替代。
HTTP相关协议
TCP/IP协议:TCP/IP协议实际上是一系列网络通信协议的统称,主要包含TCP、IP协议还有一些其他协议
IP协议(InternetProtocol):主要是解决寻址和路由,用IP来定位世界上每一台计算机
TCP协议(Transmission Control Protocol):它位于IP协议之上,基于IP协议提供可靠的、字节流形式的通信,是HTTP协议得以实现的基础。
HTTPS协议:由HTTP协议+SSL/TLS加密协议组成,使得访问更加安全了。SSL的全称是“Secure Socket Layer”,综合了对称加密、非对称加密、摘要算法、数字签名、数字证书等技术,相当于在不安全的环境中为HTTP套上一副坚固的盔甲
网络分层模型
TCP/IP协议总共有四层,就像搭积木一样,每一层需要下层的支撑,同时又支撑着上层。它的层次顺序是“从下往上”
- 数据链路层:负责在以太网、WiFi这样的底层网络上发送原始数据包,工作在网卡这个层次,使用MAC地址来标记网络上的设备,所以有时候也叫MAC层。
- 网络层:我们A主机和F主机中间隔了很多其他主机,可能A和F主机就不在同一个子网里面,也可能在,我们就需要去判断发送者和接收者是不是在通一个子网,这时候有一个IP协议
- 传输层:在IP地址标记的两点之间“可靠”地传输,是TCP协议工作的层次,包括TCP和UDP
- 应用层:为应用程序提供服务有各种面向具体应用的协议。例如Telnet、SSH、FTP、SMTP、HTTP等等
MAC层的传输单位是帧(frame),IP层的传输单位是包(packet),TCP层的传输单位是段(segment),HTTP的传输单位则是消息或报文(message)。
OIS七层模型:开放式系统互联通信参考模型(OpenSystem Interconnection Reference Model)
TCP/IP发明于1970年代,当时除了它还有很多其他的网络协议,整个网络世界比较混乱,国际标准组织(ISO)注意到了这种现象,就想要来个“大一统”。于是设计出了一个新的网络分层模型,想用这个新框架来统一既存的各种网络协议。
相比TCP/IP四层多了物理层、表现层、会话层
- 物理层:互联物理链路,物理介质。网线,光纤,无线电波等等,以二进制电信号的形式传输数据
- 会话层:每次断联不可能要手动去连接,它实现了断点续传、自动收发包的功能,还有自动寻址的功能
- 表现层:翻译工作,针对不同的系统如Windows、Linux、Mac,提供一种公共语言,进行通信
两个分层模型的映射关系
协议工作方式
可以把这个过程想像成发快递的过程,需要寄一个毛绒玩具,首先需要拿一个包装袋套一下,然后去到快递点会加上一个箱子,并且贴上一个快递面单,贴上之后利用小三轮运到集散中心,然后在集散中心利用大货车运往目的地
https://www.baidu.com 先通过应用层进入传输层,在传输层封装一个TCP的头部端口,这个端口是用来判断用什么应用程序来处理。(HTTPS默认端口443),发送给网络层,网络层给头部增加了一个IP信息,源主机和目的地址,寻址。
然后发送给数据链路层,数据链路层给头部增加了源MAC地址。然后发送给物理层,物理层转化为比特流,发送给百度服务器。
百度服务器收到信封自下而上,在物理层收到数据把比特流重组,就能够到数据链路层变成了以太帧的数据,拆封信封根据里面的源MAC地址传给网络层,网络层拆开发现有TCP的头部还含有端口。
网络层看完发送给传输层,传输层根据的端口号443,交给对应的协议HTTPS,传输至应用层,应用层根据请求消息给你一个响应请求,响应请求就是一个百度页面
域名简介
HTTP协议是运行在TCP/IP上的,IP协议在MAC层之上,使用IP地址把MAC编号转换成了四位数字,对数据链路层做了一层抽象
IP地址又分为内网外网:
- 内网:在一个局域网内可以访问,不能被外界访问。例如公司内网,出了公司就访问不了了,内网访问外网需要经过交换机,路由器之后才连到外网的,内网的类型
A类:10.0.0.0——10.255.255.255
B类:172.16.0.0——172.31.255.255
C类:192.168.0.0——192.168.255.255
- 外网:在一个广域网内可以访问,广域网并不等同于互联网,外网就不经路由器或交换机就可以上网的网络。
A类:地址范围是1.0.0.0 到 127.255.255.255,主要分配 给大量主机而局域网网络数量较少的大型网络;
B类:地址范围是128.0.0.0 到191.255.255.255,一般用于国际性大公司和政府机构;
C类:地址范围是192.0.0.0 到223.255.255.255,用于一般小公司校园网研究机构等;
D类:地址范围是224.0.0.0 到 239.255.255.255,用于特殊用途,又称做广播地址;
E类:地址范围是240.0.0.0 到255.255.255.255,暂时保留。
一般网站都是使用域名,再通过域名解析服务解析成IP地址,域名方便记忆,它是一个有层次的结构,用.分割成多个单词。例如www.baidu.com, www表示万维网服务,baidu代表百度公司一级域名,com代表网站顶级域名。
域名解析
IP地址必须转换成MAC地址才能访问主机一样,域名也必须要转换成IP地址,这个过程就是“域名解析”DNS。
- 根域名服务器(Root DNS Server):管理顶级域名服务器,返回“com”“net”“cn”等顶级域名服务器的IP地址
- 顶级域名服务器(Top-level DNS Server):管理各自域名下的权威域名服务器,比如com顶级域名服务器可以返回apple.com域名服务器的IP地址
- 权威域名服务器(Authoritative DNS Server):管理自己域名下主机的IP地址,比如apple.com权威域名服务器可以返回www.apple.com的IP地址。
有了这个系统之后,任何一个域名只需要从上至下查询,最终就获得了域名的地址
要访问“www.apple.com”,就要进行下面的三次查询:
- 访问根域名服务器,它会告诉你“com”顶级域名服务器的地址
- 访问“com”顶级域名服务器,它再告诉你“apple.com”域名服务器的地址
- 最后访问“apple.com”域名服务器,就得到了“www.apple.com”的地址
如果每台机器都去根节点访问,那么速度和压力可想而知,为了解决这个问题,用到了缓存服务,在用户访问的时候记录下来,当下次访问就直接从缓存中拿数据了。知名的DNS有Google的“8.8.8.8”,本地也可以配置主机映射,比如访问github太慢,直接映射到对应的IP地址,可以加快访问速度
域名还可以用来做负载均衡,一般一个域名对应多个IP地址,在客户端实现负载均衡。实现重定向,某台服务器需要短暂维护,把域名对应的ip地址改为其他的。
HTTP组成
请求报文由三大部分组成:起始行
、请求头部
、实体
响应报文也类似,唯一的区别是响应行不同
2.1 起始行
包含请求方法、URL、版本号。例如
GET /index.html HTTP/1.1
2.1.1请求方法
- GET:获取资源,可以理解为读取或者下载数据
- HEAD:获取资源的元信息
- POST:向资源提交数据,相当于写入或上传数据
- PUT:类似POST
- DELETE:删除资源
- CONNECT:建立特殊的连接隧道
- OPTIONS:列出可对资源实行的方法
- TRACE:追踪请求-响应的传输路径
2.1.2 URL
用户定位互联网上的具体资源,整个完整URL就是:请求协议+主机+端口
- 请求协议可以为ftp://、http://、ssh://
- 主机就是host
- 端口默认http为80、https为443、ssh为22
最后效果就是:https://www.baidu.com:443
2.1.3 版本号
HTTP 1.0、HTTP 1.1、HTTP 2.0
HTTP 1.0:1996年引入,用户名和密码没有加密、不支持断点续传一次传送全部数据等等,发送短链接都需要三次握手四次挥手效率低,确立了大部分现在使用的技术,但它不是正式标准
HTTP 1.1:1999年引入,使用长连接一次建立可以多次发送数据、可以控制缓存失效、并且支持断点续传。是目前互联网上使用最广泛的协议,功能也非常完善
HTTP 2.0:2015年开发的,使用压缩算法压缩、基于HTTPS更加安全、多路复用。但还未普及
2.2 请求头部
头部字段是key-value的形式,key和value之间用“:”分隔,最后用CRLF换行表示字段结束。
HTTP头字段非常灵活,不仅可以使用标准里的Host、Connection等已有头,也可以任意添加自定义头,这就给HTTP协议带来了无限的扩展可能,基本上可以分为四大类:
- 通用字段:在请求头和响应头里都可以出现
网络异常,图片无法展示| - 请求字段:仅能出现在请求头里,进一步说明请求信息或者额外的附加条件
- 响应字段:仅能出现在响应头里,补充说明响应报文的信息
- 实体字段:它实际上属于通用字段,但专门描述body的额外信息
2.3 实体
实体Body中包含一大坨数据,但是很难判断具体是什么类型的数据,只能靠猜前面一些字节来推导,但也有可能判断失误并且效率也不太高。HTTP协议正对这种情况诞生了一个解决方案,方案的名字叫做 多用途互联网邮件扩展
(MultipurposeInternetMailExtensions),简称为MIME。
MIME把数据分成了八大类,每个大类下再细分出多个子类,标记的字段为Accept
,以下是常见类型
- text:即文本格式的可读数据,我们最熟悉的应该就是text/html了,表示超文本文档,此外还有纯文本text/plain、样式表text/css等。
- image:即图像文件,有image/gif、image/jpeg、image/png等。
- audio/video:音频和视频数据,例如audio/mpeg、video/mp4等。
- application:数据格式不固定,可能是文本也可能是二进制,必须由上层应用程序来解释。常见的有application/json,application/javascript、application/pdf等,另外,如果实在是不知道数据是什么类型,像刚才说的“黑盒”,就会是application/octet-stream,即不透明的二进制数据。
还需要有一个Encodingtype
,告诉数据是用的什么编码格式,标记的字段为Accept-Encoding
- gzip:GNUzip压缩格式,也是互联网上最流行的压缩格式
- deflate:zlib(deflate)压缩格式,流行程度仅次于gzip
- br:一种专门为HTTP优化的新压缩算法(Brotli)
通过Accept和Accept-Encoding就可以轻松识别出body的类型,也就能够正确处理数据了。
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9
accept-encoding: gzip, deflate, br
如果求报文里没有Accept-Encoding字段,就表示客户端不支持压缩数据;如果响应报文里没有Content-Encoding字段,就表示响应数据没有被压缩
语言类型与编码
上面两个字段解决了识别和压缩问题,但是不同国家不同的语言类型,以及有不同的编码规则。不知道对方使用什么编码就会导致接收的时候无法识别有效信息,因此出现了Unicode和UTF-8,一种统一的编码规则方案
请求头传输字段:表示想要的数据语言
Accept-Language:zh-CN,zh,en
Accept-Charset:gbk,utf-8
响应头传输字段:表示实际使用的字段
Content-Language:zh-CN
Content-Type:text/html;charset=utf-8
内容协商的质量值
在使用accept
、Accept-Encoding
、Accept-Language
等请求头字段,可以用q设定优先级,权重的最大值是1,最小值是0.01,默认值是1,如果值是0就表示拒绝。
accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9
accept-encoding: gzip, deflate, br
accept-language: zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6
HTTP大文件传输
有时候网页里面包含太多的数据几百MB或者几G几十G那种图片视频,这样的数据需要带宽太高没发一次性传输过来,只能通过类似水管流水一样输出。为了完成这种传输,HTTP产生了几种方案
- 数据压缩
可以体积变小,对于视频那样的数据本身就经过压缩了,作用就不大 - 分块传输
把一整块数据分为一小块分别传输,这一带宽也不会很高 - 范围请求
有时候看视频需要跳过部分观看,其实就是想获取其中某一段数据,HTTP里面有一个范围请求的概念
请求头里面有一个字段,格式是“bytes=x-y”
range:bytes=1512145-1591415
- 响应头里面有个字段,片段的实际偏移量和资源的总大小,格式是bytesx-y/length
Content-Range: bytes 1512145-1591415/2736753
- 多段数据
一次请求获取多个片段
Range:bytes=0-9,20-29
- 响应报文的数据类型是“multipart/byteranges”,body里的多个部分会用boundary字符串分隔。