HTTP
HTTP 全称是 HyperText Transfer Protocol 超文本转移(传输)协议
目前主流的 Http 版本是 1.1,于 1997 年 1 月发布
通常使用的网络是在 Tcp/IP 协议的基础上运行的
HTTP 协议是在 TCP/IP 协议的子集
TCP/IP 协议族按层次分类可以分为:
应用层:应用程序间通讯
表达层(后加):处理数据格式,数据加密
会话层(后加):建立、维护和管理会话
传输层:提供处于网络连接中的两台计算机之间的数据传输,建立主机端到端连接
网络层:处理网络上的数据包,选择到达对方计算机的传输路线,并把数据包传送给对方,即:寻址和路由选择
数据链路层:处理连接网络的硬件部分
层与层传输时,发送时每经过一层都会打上一个该层所属的首部信息。反之,接收时每经过一层就把对应的首部消去
层次化的好处是,一个层如果需要改变设计可以尽量减少对其他层的影响(封装解藕的概念?)
每个层只需要考虑自己的工作,不需要知道完整的网络流程
DNS 的缓存
DNS 域名系统 解析域名为对应的服务器 ip,这个解析的结果会被缓存
读取 DNS 缓存的顺序
- 先看浏览器的缓存,比如 Chrome 的缓存在
chrome://net-internals/#dns
- 如果没有就再看操作系统的缓存, Host 文件是手动给操作系统添加 DNS 解析缓存
- 如果没有最后去看 ISP 端的缓存 ISP 是通信服务商
三次握手
DNS 找到 ip 后,浏览器开始建立 TCP 连接,建立 TCP 连接会进行三次握手
为了准确无误地将数据送达目标处,TCP 协议采用了三次握手
使用 TCP 标志(flag):
SYN(synchronize: 与 x 同步,同步完毕)、
ACK(acknowledgement:收到收到,确认收到)
这有点像对讲机里的对话:
- 浏览器(发送端)发送 SYN(x) 给服务器(接收端):这里是长江,请求同步信息,收到请回复
- 服务器(接收端)收到后发送 ACK(x+1)/SYN(y) 给浏览器(发送端):这里是黄河,确认收到你的同步信息请求,收到请回复
- 浏览器(发送端)发送 ACK(y+1) 给服务器(接收端):这里是长江,已收到你的回复确认,成功建立连接
因为可能同一时间都多个请求,故使用 x,y 来标记,x 和 y 一般是从 0 开始的
SYN 是 synchronize(同步)的缩写
ACK 是 acknowledge(获悉,收到)的缩写
三次握手确保:
- A 可以向 B 发信息
- B 可以收到该信息,B 也可以向 A 发信息
- A 可以收到该信息
此时双方都知道了对方准备好了,完全建立了通讯,A 就可以正式发送 HTTP 请求了
当省略第三步的时候,服务器会认为 A 无法接收信息,A 或许已经断开连接了,建立就失败
四次挥手
- A 对 B 说 FIN(x)
- B 回复 A ACK(x+1)
- B 回复 A FIN(y)
- A 回复 B ACK(y+1)
之后就可以正式关闭 HTTP 连接了,避免资源的浪费
在步骤 2 和步骤 3 中可能有其他 B 最后要发送给 A 的信息,所以没有像 3 次握手时合并
关闭时 x 和 y 一般不是 0
FIN finish
一次简单的浏览 web 页
一次浏览 web 页面:
HTTP 协议发送针对 web 服务器 llane.xyz 的 HTTP 请求报文,
DNS 协议负责通过域名找到对应的 IP 地址
TCP 协议把请求报文分割成报文段(按照序号分)
IP 协议搜索对方地址一边中转一边传送
TCP 协议从对方那里接收报文段按顺序重组
HTTP 协议从对方那里对 web 服务器请求的内容进行处理
URI | URL
URI 统一资源标识符,用字符串标识某一互联网资源
URL 统一资源定位符,表示资源的地址
URL 是 URI 的子集
URI: 协议方案名|登陆信息认证|服务器地址|服务器端口号|带层次的文件路径|查询字段|片段标识符
HTTP 无状态
HTTP 是一种不保存状态,即无状态(stateless)协议。HTTP 协议自身不对请求和响应之间的通信状态进行保存。
也就是说在 HTTP 这个级别,协议对发送过的请求或响应都不能做持久化处理
HTTP 初始版本需要每进行一次 HTTP 连接就要断开 TCP 连接
如果一个 HTML 文档中包含多个图片,就要进行多次 HTTP 和 TCP 的断开和连接
HTTP1.1 和部分 1.0 使用持续连接,只要任意一段不提出 TCP 断开就保持连接状态
管线化使得可以同时并行发送多个请求,不用一个接一个等
因为 HTTP 不对之前发生过的请求和响应的状态进行管理,也就是无法根据之前的状态进行本次的请求处理
目前主流的办法是用 cookie 来做状态(session 会话)管理
Cookie 会根据服务端发送的响应报文中的 Set-Cookie 通知客户端保存 Cookie,之后客户端的请求会自动加入 Cookie 的值
HTTP 方法
GET 获取资源,请求访问已被 URI 识别的资源
POST 传输实体主体,虽然 GET 也可以传输实体的主题,但是一般不用 GET 方法传输
PUT 传输文件,要求在报文主体中包含文件内容,保存到请求 URI 指定的位置,但不带验证机制有安全问题
HEAD 获取报文首部,和 GET 方法类似但是不返回报文主体部分
DELETE 删除文件,和 PUT 相反的方法,按照请求 URI 删除指定的资源,但不带验证机制有安全问题
OPTIONS 查询针对请求 URI 指定资源支持的方法,类似返回 Allow: GET,POST,HEAD,OPTIONS
TRACE 追踪路径,让 web 服务器端将之前的请求通信环回给客户端
CONNECT 要求用隧道协议连接代理 要求与代理服务器通信时建立隧道,实现用隧道协议进行 TCP 通信。主要用 SSL(Secure Sockets Layer 安全套接层) 和 TLS(Transport Layer Security 传输层安全)协议把通信内容加密后经网络隧道传输
提升编码效率
1.压缩编码
常见的内容编码有:
gzip(GNU zip)
compress(UNIX 系统的标准压缩)
deflate(zlib)
identity(不进行编码)
2.分割发送的分块传输编码
在传输大容量数据时,通过把数据分割成多块,能让浏览器逐步显示页面
请求报文中的 Content-type
请求报文中发送的数据可能是多部分对象集合
multipart/form-data
web 表单上传时使用
multipart/byteranges
状态码 206(Partial Content,部分内容)响应报文包含了多个范围的内容时使用
HTTP 状态码
200 ok
204 No content 请求成功但是没有信息返回
206 Partial content 对资源一部分的请求,响应报文中有 Content-Range
301 Moved Permanently 永久重定向,希望以后用新的 URI 访问
302 Found 临时重定向 资源分配了新的 URI,希望(本次)用新的临时 URI 访问
303 See other 资源有另一个 URI,应用 GET 方法定向(和 302 几乎一样,但指定了要用 GET 重定向)
304 Not Modified 虽然是 3xx 但不是重定向,表示本次请求不符合某些条件
307 Temporary Redirect 临时重定向 与 302 有相同的含义,禁止 POST 变 GET
400 Bad Request 请求报文中有语法错误
401 Unauthorized 请求需要有用户认证信息 WWW-Authenticate 信息 (此时如果用户未登录,表示需要登录)
403 Forbidden 请求的资源被服务器拒绝了 (此时如果用户已经登录,表示没有权限)
404 Not Found 服务器上无法找到请求的资源
500 Internal Server Error 服务器在执行时发生了错误
503 Service Unavailable 服务器处于超负载或停机维护,现在无法处理请求
一台服务器(对应一个 IP)可能托管了多个主机名和域名的 web 网站,不能只写 IP 需要在 Host 内指定完整的主机名或域名的 URI
保护资源缓存
缓存是指代理服务器或客户端本地磁盘内保存的资源副本。利用缓存可减少对源服务器的访问,因此也就节省了通信流量和通信时间。
缓存服务器是代理服务器的一种,当代理转发从服务器返回的响应时,代理服务器会保存一份资源的副本
缓存服务器的优势在于利用缓存可以避免多次从源服务器转发资源。因此客户端可就近从缓存服务器上获取资源,而源服务器也不必多次处理相同的请求了
缓存的有效期
当遇上源服务器上的资源更新时,如果还是使用不变的缓存,那就会演变成返回更新前的“旧”资源了
所以需要确认资源的有效性
缓存不仅可以在于缓存服务器内,还可以存在客户端浏览器中
常见的 HTTP 请求首部
Cache-Control: no-cache 表示缓存服务器在确认有效性后不缓存过期的资源
Cache-Control: no-store 表示缓存服务器不进行任何缓存
Cache-Control: max-age 缓存服务器不再确认有效性,只关注 max-age(秒)的缓存最长时间
Connect: close HTTP1.1 默认是持久连接的,服务器要断开时指定值为 close
Connet: Keep-Alive HTTP1.1 之前默认是非持久连接,需要额外指定为 Keep-Alive
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8 表示用户代理能处理的资源的媒体类型和 q 优先级
Accept-Charset: iso-8859-5, unicode-1-1;q=0.8 表示用户代理支持的优先级和优先级
Accept-Encoding: gzip, deflate 表示用户代理支持的内容编码方式和优先级
Accept-Language: zh-cn, zh; q=0.7,en-us,en;q=0.3 表示用户代理能处理的自然语言集和优先级
Authorization Basic xxxxxxxxxx 用来告知用户代理的认证信息,用户在收到 401 状态码后会把首部字段 Authorization 加入请求
Expect: 100-contine 告知服务器,期望出现某种特定行为
Host: llane.xyz 虚拟主机运行在同一个 IP 上,因此需要用首部字段 Host 来区分
If-Match: “123456” 用来匹配资源所用的实体标记 ETag,一致时才会执行请求
If-None-Match: 如果资源在 ETag 不匹配时才会执行请求
If-Modified-Since 如果资源在 xxx 日期后更新,才会接受请求
If-Range: + 一个 Etag
Range: bytes=500-10000 或 bytes=500-
表示资源 ETag 匹配后资源请求的范围
Referer 请求的 URI 是从哪个 web 页面发起的
User-Agent 创建请求的浏览器或用户代理的名称和信息等
网络安全
Xss (跨站脚本攻击 Cross Site Scripting)
被动攻击 通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序
csrf(跨站请求伪造 Cross-site request forgery)
被动攻击 一种挟制用户在当前已登录(利用 cookie 或者 session 会话)的 Web 应用程序上执行非本意的操作的攻击方法
Chrome 51 开始,浏览器的 Cookie 新增加了一个 SameSite 属性,用来防止 CSRF 攻击和用户追踪。cookie samesiteSite 文章