HTTP 基础

526 阅读9分钟

OSI 七层模型和 TCP/IP 四层模型

两个模型每层分别是什么?作用?有哪些协议?

概念

长连接和短连接

  • TCP 连接的建立需要经过三次握手,断开需要经历四次挥手。在客户端与服务端建立连接后,后续的读写操作一直使用这个连接,并不会在一次读写完成后断开,直到客户端和服务端主动断开连接。所以 TCP 连接本质上是长连接。
  • HTTP 协议是建立在 TCP 协议的基础上的,当浏览器向服务器发送一个 http 请求时,TCP 会在浏览器与服务器间建立一个连接通道,当本次 http 请求的数据传输完毕后,会立即断开 TCP 连接。所以 http 连接是一个短连接。

有连接 无连接

  • TCP 是面向连接的,是客户端与服务端必须经过三次握手建立连接之后才会开始传输数据。
  • UDP 是无连接的,是发送数据之前不需要建立连接,发送结束之后也没有连接可释放。

有状态 无状态

  • TCP 是有状态的,TCP 包括 CLOSED\LISTEN\SYN_RCVD\SYN_SENT 等多个状态。多次读写操作可以使用同一个 TCP 连接。(握手和挥手会改变 TCP 状态)
  • HTTP 是无状态的,http 协议本身无法在浏览器与服务器上留下数据,同一个浏览器与服务器间的几次请求都是相互独立的,没有数据就没有办法区分一系列请求之间的联系。(由此引出了 session、cookie 等机制)

全双工 半双工

  • 单工通信是指消息只能单方向传输的工作方式。(例如广播、电视)
  • 半双工通信可以实现双向的通信,但不能在两个方向上同时进行,必须轮流交替地进行。(例如对讲机)
  • 全双工通信是指在通信的任意时刻,线路上存在 A 到 B 和 B 到 A 的双向信号传输。全双工通信允许数据同时在两个方向上传输,又称为双向同时通信,即通信的双方可以同时发送和接收数据。(例如计算机)

TCP 和 UDP

TCP 连接和断开

《计算机网络 第 7 版》谢希仁

  1. 三次握手的过程?为什么要三次握手?
  • 客户端 A 向服务端 B 发出连接请求报文段,这时首部中的同步位 SYN=1,同时选择一个初始序列号 seq=x。
  • 服务端 B 收到连接请求报文段后,如同意建立连接,则向 A 发送确认。在确认报文中,应将 SYN 与 ACK 位都置 1,确认号是 ack=x+1,同时也为自己选择一个初始序列号 seq=y。
  • 客户端 A 收到 B 的确认后,还要向 B 给出确认。确认报文段的 ACk 置 1,确认号 ack=y+1,而自己的序列号 seq=x+1。
  1. 四次挥手的过程?为什么要四次挥手?
  • 客户端 A 向服务端 B 发出连接释放请求报文段,将报文段首部的终止控制为 FIN 置 1,其序列号 seq=u,为前边已经传输过的数据的最后一个字节+1。
  • B 收到连接释放请求后即发送确认,确认号是 ack=u+1,其序列号 seq=v,为前边已经传输过的数据的最后一个字节+1。A 收到 B 的确认后就进入终止等待 2 状态。
  • 若 B 已经没有要发送的数据,则向 A 发送连接释放请求,并将报文段首部的终止控制为 FIN 置 1,确认号为 ack=u+1,其序列号 seq=w,为前边已经传输过的数据的最后一个字节+1。
  • A 收到 B 的连接释放请求后,对此发出确认。确认报文中 ACK 置 1,确认号 ack=w+1,序列号 seq=u+1。

TCP 和 UDP 区别

比较 UDP TCP
是否连接 无连接 面向连接
是否可靠 不可靠传输,不使用流量控制和拥塞控制 可靠传输,使用流量控制和拥塞控制
连接对象个数 支持一对一,一对多,多对一和多对多交互通信 只能是一对一通信。全双工
传输方式 面向报文 面向字节流
首部开销 首部开销小,仅 8 字节 首部最小 20 字节,最大 60 字节
使用场景 适用于实时应用(IP 电话、视频会议、直播等) 适用于要求可靠传输的应用,例如文件传输

IP

  • 在数据链路层中我们一般通过 MAC 地址来识别不同的节点,而在 IP 层我们也要有一个类似的地址标识,这就是 IP 地址。

HTTP

1. 解释 HTTP 是无状态,有会话的?有什么应对手段?

  • HTTP是无状态的:在同一个连接中,两个执行成功的请求之间是没有关系的。把Cookies添加到头部中,创建一个会话让每次请求都能共享相同的上下文信息,达成相同的状态。HTTP本质是无状态的,使用Cookies可以创建有状态的会话。

2. 状态码

204 No Content
  • 响应没有响应体,浏览器不需要刷新等任何变化。
  • 请求方法 head,和响应码 204 没有必然联系。
206 Partial Content
304 Not Modified
  • 如果服务端提示缓存资源未改动(Not Modified),资源会被重定向到浏览器缓存。
400 Bad Request
  • 请求参数有误
403 Forbidden
  • 遇到过浏览器空白页面输入 url 来发送一个请求,服务端返回 403。因为该请求本来是在登录后的页面里发送的,所以服务器会验证身份信息。但现在没有就 403 了。
常见状态码

200 204 206 301 302 304 400 403 404 405 500

3. HTTP 方法

GET
  • 大小限制是由于浏览器对于 url 地址长度限制导致的,并非 HTTP 协议对它的限制。
POST
  • Post 和 Get 的区别
  1. 先引入副作用和幂等的概念:
    • 副作用指对服务器上的资源做改变,搜索是无副作用的,注册是副作用的。
    • 幂等指发送 M 和 N 次请求(两者不相同且都大于 1),服务器上资源的状态一致。注册 10 个和 11 个帐号是不幂等的,对文章进行更改 10 次和 11 次不是幂等的。
    • 在规范的应用场景上说,Get 多用于无副作用,幂等的场景,例如搜索关键字。Post 多用于副作用,不幂等的场景,例如注册
  2. 在技术上说:
    • Get 请求能缓存(直接返回上次的请求数据。可以通过设置时间戳或禁止该请求缓存来解决),Post 不能。
    • Post 相对 Get 安全一点,因为 Get 请求都包含在 URL 里,且会被浏览器保存历史纪录,Post 不会,但是在抓包的情况下都是一样的。
    • Post 可以通过 request body 即请求体来传输比 Get 更多的数据,Get 没有这个技术
    • URL 有长度限制,会影响 Get 请求,但是这个长度限制是浏览器规定的,不是 RFC 规定的
    • Post 支持更多的编码类型且不对数据类型限制
HEAD
  • 只请求响应头,不请求响应体,不下载资源本身。
PUT PATCH
  • PUT 可以用来修改服务器的资源。如果服务器之前没有该资源,那么就新增一个,返回 201 Created。如果之前存在该资源,那么就替换掉之前的,返回 200 或 204。
  • PATCH 对资源局部更新。
DELETE
  • 用于删除指定的资源。
OPTIONS
  • 检测服务器支持的请求方法。在响应头的 Allow 中体现。
  • CORS 中的预检方法。

4. HTTP 报文

5. HTTP Header

如何设置请求头?
  • axios 的参数里设置 headers
  • axios.get(url,{headers:{'Content-Type': 'application/x-www-form-urlencoded'}})
压缩编码
  • 请求 Accept-Encoding: gzip, deflate
    • 设置 request header 就可以开启 GZIP 压缩
  • 响应 Content-Encoding: gzip
设置网络连接
  • 请求 connection: keep-alive / close

    • 如果值为 keep-alive,那么还可以通过 Keep-Alive 请求头来设置保持时长
  • 响应 connection: keep-alive

    • HTTP/1.0 默认值为 close;HTTP/1.1 默认值为 keep-alive;HTTP2 中会被忽略;
  • 这里设置 connection: keep-alive 是为了减少 TCP 连接和断开而提出的一种解决方案,HTTP 持久连接即 TCP 长连接。

资源 MIME 类型
  • 通用:Content-Type
CORS 头
  • Access-Control-Allow-Origin: *; *号代表所有网站可以跨域资源共享
  • Access-Control-Allow-Methods:GET / POST / PUT / DELETE; 允许哪些方法来访问
缓存
  • expires\cache-control\Last-Modified\Etag
cookie
  • 见下方 cookie 部分

6. HTTP 缓存

  • 强缓存 : 从 expires 到 cache-control
  • 协商缓存 : 从 Last-Modified 到 Etag

Cookie

  • HTTP Cookie(也叫 Web Cookie 或浏览器 Cookie)是服务器发送到用户浏览器并保存在本地的一小块数据,它会在浏览器下次向同一服务器再发起请求时被携带并发送到服务器上。通常,它用于告知服务端两个请求是否来自同一浏览器,如保持用户的登录状态。Cookie 使基于无状态的 HTTP 协议记录稳定的状态信息成为了可能。

属性

  1. Secure: 如果设置,则 cookie 只在 HTTPS 下才发送,HTTP 不发送
  2. httpOnly: 客户端无法访问 cookie。防 XSS 攻击。
  3. Expires / Max-Age
    • 过期时间。如果不设置,则表示这是一个会话期 cookie,浏览器关闭时就被删除。
    • Expires 是确定时间。Max-Age 是秒为单位,优先级高。
  4. Domain(mozilla.org)
    • 不可跨域性。不能在不同的域名下用,每个 cookie 都会绑定单一的域名。
    • www.baidu.com 和 image.baidu.com 不通用。
    • cookie 无法设置除当前域名或者其父域名之外的其他 domain
  5. Path(/docs):
    • 会匹配/doc*

session

  • 第一次请求时,服务端生成 Session,保存在服务器。并将 Session 的唯一标识 SessionID 放在 cookie 里一并返回给客户端。
  • 用于一次会话中页面多次跳转的状态保存。