Web使用HTTP(HyperText Transfer Protocal) 超文本传输协议作为规范, 完成从客户端到服务端的一系列流程. 可以说 Web 是在 HTTP 协议上通信的.

1.0 网络基础TCP/IP

通常我们使用的网络是在 TCP/IP 协议族的基础上运行的, 而 HTTP 是属于 TCP/IP 族群中的一种协议. 在计算机和网络相互通信的时候, 两者都必须要遵守同一种协议.

1.1 TCP/ IP分层管理

TCP/IP协议族里最重要的一点就是分层, 每一层就只需要专注于自己任务就行了, 按层次分别为以下四层:

  1. 应用层
    决定向用户提供应用服务时的通信活动, 在 TCP/IP 中预存了各类通用的应用服务. 比如: FTP(File Transfer Protocol, 文件传输协议)和 DNS(Domain Name System, 域名系统), HTTP 协议也属于这层.

  2. 传输层
    给两个计算机在网络中提供数据传输. TCP(传输控制协议)和 UDP(用户数据报协议)

  3. 网络层
    处理网上流动的数据包, 决定数据通过哪条传输路线到对方计算机并把数据传输给对方.

  4. 链路层
    处理连接网络的硬件部分. 网卡/ 驱动/ 光纤什么的

1.2 TCP/IP 传输流程

TCP/IP 在网络通信时, 会按照分层顺序与对方通信. 发送端从应用层往下, 接收端从应用端网上.

TCP/IP传输流程

2.0 与 HTTP 关系密切的协议: IP/TCP 和 DNS

  • 负责传输的 IP 协议
    将数据包传递给对方并确认到达, 确认到达的重要条件包括: IP 地址和 MAC 地址.
    IP
  • 确保可靠性的 TCP 协议
    为了方便传输将大数据包分割成以报文段为单位的数据包进行管理, 再将数据准确可靠的传递给对方. 那么如何准确可靠的传递给对方呢, 所以就有了TCP 的三次握手策略: 发送端先发送一个带有 SYN标志的数据包给对方, 接收端回传一个带有SYN/ACK标志的数据包传达确认信息, 最后发送端再回传一个带有ACK标志的数据包, 代表握手结束.
    TCP
  • 负责域名协议的 DNS 服务
    提供域名到 IP 地址之间解析服务.
    DNS

2.1 HTTP 协议的通信过程

通过一整套流程来看一下, IP协议/ TCP协议 和 DNS服务在 HTTP协议的通信过程中各自发挥了什么作用.
HTTP协议通信过程

从上图来看, 从输入一个网址到页面的展示过程大致如下:

  1. 域名解析(DNS 服务)
  2. 建立TCP, 发送 HTTP 请求(三次握手)
    1. 客户端向服务器发送请求(SYN)
    2. 服务器应答并要求确认(SYN/ACK)
    3. 客户端确认(ACK)
  3. IP 搜索对方地址, 一边中转一边传输数据包
  4. 服务器处理请求返回 HTTP 响应报文
  5. 连接结束(四次挥手)
    1. 客户端发送一个 FIN 来告诉服务器数据发送完毕
    2. 服务器收到这个 FIN 之后回发一个 ACK(这个时候服务器还可以向客户端发送数据)
    3. 服务器发送一个 FIN 告诉客户端服务器的数据发送完毕, 请求关闭连接
    4. 客户端回发 ACK 确认, 关闭连接
  6. 浏览器解析渲染页面

2.2 HTTP 是否保存状态

HTTP 是一种不保存状态(无状态)协议, 协议本身不会保留之前的请求或响应报文的信息. 这是为了更快的处理大量请求, 但是随着 Web 发展
很多业务都需要保存用户的状态, 因此引入 Cookie 来管理状态.

3.0 HTTP 返回状态码

状态码是用来告诉客户端从服务器响应的请求结果, 可以通过状态码知道该次请求是正常处理了还是发生了错误.

3.1 状态码的类别

类别 原因短句
1XX 信息类 接收的请求正在处理
2XX 成功类 请求正常处理完毕
3XX 重定向类 需要附加操作完成请求
4XX 客户端错误类 服务器无法处理请求
5XX 服务器错误类 服务器发生错误

3.2 具有代表性的14种状态码

  • 2XX 成功类
    1. 200 OK
      表示请求在服务端被正常处理了
    2. 204 No Content
      表示请求处理成功但是响应报文不包含实体的主体(本身也不允许返回实体的主体)
    3. 206 Partial Content
      服务端成功处理了客户端发出的范围请求
  • 3XX 重定向
    1. 301 Moved Permanently
      永久性重定向. 请求的资源已经被分配了新的 URI 应该使用新的 URI
    2. 302 Found
      临时性重定向. 请求的资源被分配了新的 URI, 希望本次请求用新的 URI
    3. 303 See Other
      请求的资源存在另一个 URI, 应使用 GET 方法定向获取请求的资源(跟302的功能相同)
    4. 304 Not Modified
      表示请求时附带了条件, 服务端允许请求资源但为满足条件. 所以返回时, 不包含任何响应的主体部分(跟重定向并没有半毛钱关系).
    5. 307 Temporary Redirect
      临时重定向, 跟302有着同样的一样. 尽管302标准不允许 POST 变为 GET, 但是并没有人遵守; 307会遵守标准但是处理响应时, 每个浏览器有可能出现不同的情况
  • 4XX 客户端错误
    1. 400 Bad Request
      请求报文中有语法错误
    2. 401 Unauthorized
      请求需要通过 HTTP 认证
    3. 403 Forbidden
      请求资源访问被服务端拒绝(一般都是权限问题)
    4. 404 Not Found
      服务端上无法找到请求的资源
    5. 405 Not Allow
      对于请求的资源, 服务端不允许使用请求中使用的方法
  • 5XX 服务器错误
    1. 500 Internal Server Error
      服务端在执行请求任务时发生错误
    2. 503 Service Unavailable
      服务端暂时处于超负载或者停机维护, 无法处理请求(一般就是服务器挂了)

总结

主要为了大致了解一下 HTTP 的基础/大概的执行流程和常见的HTTP 状态码. 对于状态码之前一直分不太清301和302的区别, 简单的来说: 301 改变资源的URI 后, 如果这个资源是被保存在书签中的, 那么这时要根据新的 URI 保存; 302 表示这个资源只是临时性的移动, 之后这个 URI 可能还会变化. 那么如果也被保存在了书签中, 仍然会保留原来的 URI. 状态码中的 304 放在下次放在缓存策略中再捋一捋吧.

Create on 2018-1-3 By Cara