网络通讯

293 阅读5分钟

这里有一份简洁的前端知识体系等待你查收,看看吧,会有惊喜哦~如果觉得不错,麻烦star哈~


前言

浏览器首先要做的事就是根据URL把数据取回来,取回数据使用的是HTTP协议(实际上这个过程之前还有DNS查询,不过这里就不详细展开了。)

我先来了解下HTTP的标准。

HTTP协议是基于TCP协议出现的,对TCP协议来说,TCP协议是一条双向的通讯通道,HTTP在TCP的基础上,规定了Request-Response的模式。这个模式决定了通讯必定是由浏览器端首先发起的

大部分情况下,浏览器的实现者只需要用一个TCP库,甚至一个现成的HTTP库就可以搞定浏览器的网络通讯部分。HTTP是纯粹的文本协议,它是规定了使用TCP协议来传输文本格式的一个应用层协议


HTTP


HTTP协议格式

HTTP协议,大概可以划分成如下部分。



上面这张图基本涵盖了HTTP协议中的绝大部分知识。其中:

  • path是请求的路径完全由服务端来定义,没有很多的特别内容
  • version几乎都是固定字符串
  • response body是我们最熟悉的HTML。

下面我们就来逐个给你介绍其它部分。


HTTP Method

我们首先来介绍一下request line里面的方法部分。这里的方法跟我们编程中的方法意义类似,表示我们此次HTTP请求希望执行的操作类型。方法有以下几种定义:

  1. GET
  2. POST
  3. HEAD
  4. PUT
  5. DELETE
  6. CONNECT
  7. OPTIONS
  8. TRACE

浏览器通过地址栏访问页面都是GET方法。表单提交产生POST方法。

HEAD则是跟GET类似,只返回请求头,多数由JavaScript发起。

PUT和DELETE分别表示添加资源和删除资源,但是实际上这只是语义上的一种约定,并没有强约束。

CONNECT现在多用于HTTPS和WebSocket。

OPTIONS和TRACE一般用于调试,多数线上服务都不支持。


HTTP Status code、 Status text

接下来我们看看response line的状态码和状态文本。常见的状态码有以下几种。

  1. 1xx:临时回应,表示客户端请继续。
  2. 2xx:请求成功。
    • 200:请求成功。
  3. 3xx: 表示请求的目标有变化,希望客户端进一步处理。
    • 301&302:永久性与临时性跳转。
    • 304:跟客户端缓存没有更新。
  4. 4xx:客户端请求错误。
    • 403:无权限。
    • 404:表示请求的页面不存在。
  5. 5xx:服务端请求错误。
    • 500:服务端错误。
    • 503:服务端暂时性错误,可以一会再试。

对我们前端来说,1xx系列的状态码是非常陌生的,原因是1xx的状态被浏览器http库直接处理掉了,不会让上层应用知晓。

2xx系列的状态最熟悉的就是200,这通常是网页请求成功的标志,也是大家最喜欢的状态码。

3xx系列比较复杂,301和302两个状态表示当前资源已经被转移,只不过一个是永久性转移,一个是临时性转移。实际上301更接近于一种报错,提示客户端下次别来了。

304又是一个每个前端必知必会的状态,产生这个状态的前提是:客户端本地已经有缓存的版本,并且在Request中告诉了服务端,当服务端通过时间或者tag,发现没有更新的时候,就会返回一个不含body的304状态。


HTTP Head

HTTP头可以看作一个键值对。原则上,HTTP头也是一种数据,我们可以自由定义HTTP头和值。不过在HTTP规范中,规定了一些特殊的HTTP头,我们现在就来了解一下它们。

在HTTP标准中,有完整的请求/响应头规定,这里我们挑几个重点的说一下:

我们先来看看Request Header。



接下来看一下Response Header。



这里仅仅列出了我认为比较常见的HTTP头,这些头是我认为前端工程师应该做到不需要查阅,看到就可以知道意思的HTTP头。完整的列表还是请你参考我给出的rfc2616标准。


HTTP Request Body

HTTP请求的body主要用于提交表单场景。实际上,http请求的body是比较自由的,只要浏览器端发送的body服务端认可就可以了。一些常见的body格式是:

  1. application/json
  2. application/x-www-form-urlencoded
  3. multipart/form-data
  4. text/xml

我们使用html的form标签提交产生的html请求,默认会产生 application/x-www-form-urlencoded 的数据格式,当有文件上传时,则会使用multipart/form-data。


HTTPS

在HTTP协议的基础上,HTTPS和HTTP2规定了更复杂的内容,但是它基本保持了HTTP的设计思想,即:使用Request-Response模式。

我们首先来了解下HTTPS。HTTPS有两个作用,一是确定请求的目标服务端身份,二是保证传输的数据不会被网络中间节点窃听或者篡改

HTTPS是使用加密通道来传输HTTP的内容,即HTTPS首先与服务端建立一条TLS加密通道。TLS构建于TCP协议之上,它实际上是对传输的内容做一次加密,所以从传输内容上看,HTTPS跟HTTP没有任何区别


HTTP 2

HTTP 2.0 最大的改进有两点,一是支持服务端推送,二是支持TCP连接复用

服务端推送能够在客户端发送第一个请求到服务端时,提前把一部分内容推送给客户端,放入缓存当中,这可以避免客户端请求顺序带来的并行度不高,从而导致的性能问题。

TCP连接复用,则使用同一个TCP连接来传输多个HTTP请求,避免了TCP连接建立时的三次握手开销,和初建TCP连接时传输窗口小的问题。

Note: 其实很多优化涉及更下层的协议。IP层的分包情况,和物理层的建连时间是需要被考虑的。