应用层
Http
请求报文
HTTP 报文是面向文本的,报文中的每一个字段都是一些 ASCII 码串,每个字段的长度是不确定的。
HTTP 报文传过来的都是一堆的 0 x ASCII 码,例如” 41 63 63 65 70 74”这段十六进制 ASCII 码串对应的是“accept” 单词。
请求行由 请求方法字段、URL 字段 和 HTTP 协议版本 字段 3 个字段组成,它们用空格分隔
请求方法
HTTP 协议的请求方法有 GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT。GET 和 POST 是最常用的请求方法。
- GET:向指定的资源发出“显示”请求。使用 GET 方法应该只用在读取数据,最好不要对服务器数据产生影响,防止受爬虫影响数据,并且最好不要请求敏感信息,会存储在 URL 中被浏览器记录。
- HEAD:与 GET 方法一样,都是向服务器发出指定资源的请求。但是不返回具体的信息,可以用来快速检查资源状态或缓存时候有效
- POST:向指定资源 提交数据,请求服务器进行处理(例如提交表单或者上传文件,评论等等)。数据被包含在请求数据中。这个请求可能会创建新的资源或修改现有资源,或二者皆有。
- PUT:向指定资源位置上传其最新内容。
- DELETE 请求服务器删除 Request-URI 所标识的资源。
- TRACE 回显服务器收到的请求,主要用于测试或诊断。
- OPTIONS 这个方法可使服务器传回该资源所支持的所有 HTTP 请求方法。用
*
来代替资源名称,向 Web 服务器发送 OPTIONS 请求,可以测试服务器功能是否正常运作。 - CONNECTHTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。通常用于 SSL 加密服务器的链接(经由非加密的 HTTP 代理服务器)。
URL
超文本传输协议(HTTP)的统一资源定位符,
- 传送协议:如 http,https 等等
- 域名:有时也会是 IP 地址
- 端口号:(以数字方式表示,若为 HTTP 的默认值“: 80”可省略)
- 路径:以“/”字符区别路径中的每一个目录名称
- 查询:“?”字符为起点,每个参数以“&”隔开,
- 片段:以“#”字符为起点
以 http://www.luffycity.com:80/news/index.html?id=250&page=1
为例, 其中:
http
,是协议;www.luffycity.com
,是服务器;80
,是服务器上的默认网络端口号,默认不显示;/news/index.html
,是路径(URI:直接定位到对应的资源);?id=250&page=1
,是查询。
版本协议
HTTP 1.0 和 HTTP 1.1 的主要区别
- 长连接 : 在 HTTP/1.0 中,默认使用的是短连接,也就是说每次请求都要重新建立一次连接(TCP)。HTTP 1.1 起,默认使用长连接 ,默认开启
Connection: keep-alive
。 HTTP/1.1 的持续连接有非流水线方式和流水线方式。- 流水线方式 是客户在收到 HTTP 的响应报文之前就能接着发送新的请求报文。效率更高
- 非流水线方式是客户在收到前一个响应后才能发送下一个请求。
- 带宽优化及网络连接的使用 : HTTP 1.0 中,存在一些浪费带宽的现象,例如客户端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且 不支持断点续传功能,HTTP 1.1 则在请求头引入了 range 头域,它 允许只请求资源的某个部分,即返回码是
206(Partial Content)
,这样就方便了开发者自由的选择以便于 充分利用带宽和连接。 - Host 域:区分一台主机多台虚拟机,在 HTTP 1.0 中认为每台服务器都绑定一个唯一的 IP 地址,因此,请求消息中的 URL 并没有传递主机名(hostname)。但随着虚拟主机技术的发展,在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它们共享一个 IP 地址。HTTP 1.1 的请求消息和响应消息都应支持 Host 头域,且请求消息中如果没有 Host 头域会报告一个错误(400 Bad Request)。HTTP 1.0 是没有 host 域的,HTTP 1.1 才支持这个参数。
- 错误状态响应码 : 在 HTTP 1.1 中新增了 24 个错误状态响应码,
- 缓存处理 : 在 HTTP 1.0 中主要使用 header 里的
If-Modified-Since, Expires
来做为缓存判断的标准,HTTP 1.1 则引入了更多的缓存控制策略例如Entity tag,If-Unmodified-Since, If-Match, If-None-Match
等更多可供选择的缓存头来控制缓存策略。
HTTP 2.0 的优化
- 新的二进制格式:HTTP 1. X 的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认 0 和 1 的组合。基于这种考虑 HTTP 2.0 的协议解析决定采用二进制格式,实现方便且健壮。
- 多路复用:在同一个 TCP 连接中,同一时刻可以发送多个请求和响应, 下一次的请求不需要等待上一个响应来之后再发送。但响应的顺序是不变的,FIFO(先进先出)。
- 2.0 之前是同一个连接只能用一次,如果开启了 keep-alive,虽然可以用多次,但是同一时刻只能有一个 HTTP 请求。
- HTTP 2.0 的多路复用主要是指:因为 http 2.0 的传输是基于二进制帧的。每一个 TCP 连接中承载了多个双向流通的流,每一个流都有一个独一无二的标识和优先级,而流就是由二进制帧组成的。二进制帧的头部信息会标识自己属于哪一个流,所以这些帧是可以交错传输,然后在接收端通过帧头的信息组装成完整的数据。这样就解决了线头阻塞的问题,同时也提高了网络速度的利用率。
- 如果是单路那就和 http 1.1 的流水线模式很像了,但是流水线可能会造成阻塞,比如某个请求很耗时等等。
- header 压缩:减少头部信息,提高传输速率。HTTP 1. X 的 header 带有大量信息,而且每次都要重复发送,HTTP 2.0 使用 HPACK 算法对 header 的数据进行压缩,避免了重复 header 的传输,又减小了需要传输数据的大小,基本原理 是客户端和服务端分别缓存一份索引表,如果头部存在于索引表,则用对应的索引值;否则进行霍夫曼编码,并加入索引表。参考
- 服务器推送,当我们对支持 HTTP 2.0 的 web server 请求数据的时候,服务器会顺便把一些客户端需要的资源一起推送到客户端,免得客户端再次创建连接发送请求到服务器端获取。这种方式非常合适加载静态资源。服务器端推送的这些资源其实存在客户端的某处地方,客户端直接从本地加载这些资源就可以了,不用走网络,速度自然是快很多的。
响应报文
HTTP 响应报文由状态行(status line)、响应头部(headers)、空行(blank line)和响应数据(也叫响应体或响应正文)(response body)4 个部分组成。
状态行
状态行由 3 部分组成,分别为:协议版本、状态码、状态码描述。其中协议版本与请求报文一致,状态码描述是对状态码的简单描述。
状态码
重点
HTTP 的缺点
在正式介绍 HTTPS 前我们先来看看 HTTP 协议当前存在的三大缺点:
- 机密性问题:通信使用了明文,第三方可以拦截并获悉通信内容;
- 完整性问题:不验证报文的完整性,第三方可以篡改通信内容;
- 认证问题:不验证对方的身份,第三方可以冒充他人身份参与通信。
Https
DNS 协议
通过域名找到相应 IP 地址协议
DNS 系统
- 一个组织的系统管理机构, 维护系统内的每个主机的 IP 和主机名的对应关系
- 如果新计算机接入网络,将这个信息注册到数据库中
- 用户输入域名的时候,会自动查询 DNS 服务器,由 DNS 服务器检索数据库,得到对应的 IP 地址。
DNS 域名结构
级别最低的域名写在左边,级别最高的域名写在右边。
域名服务主要是基于 UDP 实现的,服务器的端口号为 53
域名服务器
分类 | 作用 |
---|---|
根域名服务器 | 最高层次的域名服务器,本地域名服务器解析不了的域名就会向其求助 |
顶级域名服务器 | 负责管理在该顶级域名服务器下注册的二级域名 |
权限域名服务器 | 负责一个区的域名解析工作, |
本地域名服务器 | 当一个主机发出 DNS 查询请求时,这个查询请求首先发给本地域名服务器 |
例如 www.zzoce.com
, com
是顶级域名,zzoce
是二级域名,www
就是三级域名
权限域名服务器:例如我在华为云服务注册了zzoce.com的域名,那么这个域名的权限域名服务器就是华为提供的
域名解析
- 主机先向本地域名服务器进行递归查询
- 本地域名服务器采用迭代查询,向一个根域名服务器进行查询
- 根域名服务器告诉本地域名服务器,下一次应该查询的顶级域名服务器的 IP 地址
- 本地域名服务器向顶级域名服务器进行查询
- 顶级域名服务器告诉本地域名服务器,下一步查询权限服务器的 IP 地址
- 本地域名服务器向权限服务器进行查询
- 权限服务器告诉本地域名服务器所查询的主机的 IP 地址
- 本地域名服务器最后把查询结果告诉主机
DHCP
DHCP(动态主机配置协议,Dynamic Host Configuration Protocol)是一种网络管理协议,用于自动分配 IP 地址和其他网络配置参数,使设备能够快速、方便地连接到网络,通过 UDP 实现
DHCP 的主要功能
- 自动分配 IP 地址:DHCP 服务器从预定义的 IP 地址池中分配 IP 地址给客户端设备,避免了手动配置的麻烦。
- 提供其他网络配置信息:除了 IP 地址,DHCP 还可以分配子网掩码、网关地址、DNS 服务器地址等网络参数
- IP 地址租赁:DHCP 分配的 IP 地址是有租期的,租期到期后可以续租或重新分配,确保 IP 地址的有效利用
DHCP 的工作原理
DHCP 的工作过程通常分为四个阶段
- 发现(Discover):客户端发送 DHCP 发现报文,寻找可用的 DHCP 服务器。
- 提供(Offer):DHCP 服务器响应发现报文,提供一个可用的 IP 地址和其他配置信息。
- 请求(Request):客户端选择一个 DHCP 服务器,并请求使用提供的 IP 地址。
- 确认(Acknowledge):DHCP 服务器确认请求,并正式分配 IP 地址给客户端。
当客户端重启后只需要进行 3,4
两个步骤就好了
DHCP 的优点
- 简化网络管理:自动分配 IP 地址和网络配置,减少手动配置的工作量。
- 提高网络灵活性:设备可以随时加入或离开网络,IP 地址可以动态分配和回收。
- 减少配置错误:自动化配置减少了人为错误的可能性。
DHCP 协议广泛应用于家庭网络、企业网络和数据中心,确保设备能够快速、可靠地连接到网络。