Skip to content

《面渣逆袭》计算机网络 篇 · 第 3/7 章。原版 PDF(下载 / 打印)

8.说说 HTTP 常用的状态码及其含义?

HTTP 状态码首先应该知道个大概的分类:

1XX :信息性状态码2XX :成功状态码3XX :重定向状态码4XX :客户端错误状态码5XX :服务端错误状态码几个常用的,面试之外,也应该记住:

配图

之前写过一篇:程序员五一被拉去相亲,结果彻底搞懂了 HTTP 常用状态码,还比较有意思,可以看看。

说一下 301 和 302 的区别?

301 :永久性移动,请求的资源已被永久移动到新位置。服务器返回此响应时,会返回新的资源地址。

302 :临时性性移动,服务器从另外的地址响应资源,但是客户端还应该使用这个地址。

用一个比喻,3 01 就是嫁人的新垣结衣,3 02 就是有男朋友的长泽雅美。

9.HTTP 有哪些请求方式?

配图

其中,POST 、DELETE 、PUT 、GET 的含义分别对应我们最熟悉的增、删、改、查。

10.说一下 GET 和 POST 的区别?

可以从以下几个方面来说明 GET 和 POST 的区别:

配图

  1. 从 HTTP 报文层面来看,GET 请求将信息放在 URL ,POST 将请求信息放在请求体中。这一点

使得 GET 请求携带的数据量有限,因为 URL 本身是有长度限制的,而 POST 请求的数据存放在报文体中,因此对大小没有限制。而且从形式上看,GET 请求把数据放 URL 上不太安全,而

POST 请求把数据放在请求体里想比较而言安全一些。

  1. 从数据库层面来看,GET 符合幂等性和安全性,而 POST 请求不符合。这个其实和 GET/POST

请求的作用有关。按照 HTTP 的约定,GET 请求用于查看信息,不会改变服务器上的信息;而

POST 请求用来改变服务器上的信息。正因为 GET 请求只查看信息,不改变信息,对数据库的一次或多次操作获得的结果是一致的,认为它符合幂等性。安全性是指对数据库操作没有改变数据库中的数据。

  1. 从其他层面来看,GET 请求能够被缓存,GET 请求能够保存在浏览器的浏览记录里,GET 请求

的 URL 能够保存为浏览器书签。这些都是 POST 请求所不具备的。缓存是 GET 请求被广泛应用的根本,他能够被缓存也是因为它的幂等性和安全性,除了返回结果没有其他多余的动作,因此绝大部分的 GET 请求都被 CDN 缓存起来了,大大减少了 We b 服务器的负担。

11.GET 的长度限制是多少?

HTTP 中的 GET 方法是通过 URL 传递数据的,但是 URL 本身其实并没有对数据的长度进行限制,真正限制 GET 长度的是浏览器。

例如 IE 浏览器对 URL 的最大限制是 2000 多个字符,大概 2kb 左右,像 Chrome 、Firefox 等浏览器支持的 URL 字符数更多,其中 FireFox 中 URL 的最大长度限制是 65536 个字符,Chrome 则是8182 个字符。

这个长度限制也不是针对数据部分,而是针对整个 URL 。

12.HTTP 请求的过程与原理?

HTTP 协议定义了浏览器怎么向服务器请求文档,以及服务器怎么把文档传给浏览器。

配图

每个服务器都有一个进程,它不断监听 TCP 的端又 80 ,以便发现是否有浏览器向它发出连接建立请求监听到连接请求,就会建立 TCP 连接浏览器向服务器发出浏览某个页面的请求,服务器接着就返回所请求的页面作为响应最后,释放 TCP 连接在浏览器和服务器之间的请求和响应的交互,必须按照规定的格式和遵循一定的规则,这些格式和规则就是超文本传输协议 HTTP 。

PS: 这道题和上面浏览器输入网址发生了什么那道题大差不差。

13.说一下 HTTP 的报文结构?

HTTP 报文有两种,HTTP 请求报文和 HTTP 响应报文:

配图

HTTP 请求报文

HTTP 请求报文的格式如下:

GET/HTTP/1.1

User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5)

Accept:/

HTTP 请求报文的第一行叫做请求行,后面的行叫做首部行,首部行后还可以跟一个实体主体。请求首部之后有一个空行,这个空行不能省略,它用来划分首部与实体。

请求行包含三个字段:

方法字段:包括 POST 、GET 等请方法。

URL 字段

HTTP 版本字段。

HTTP 响应报文

HTTP 响应报文的格式如下:

HTTP/1.0200OK

Content-Type:text/plain

Content-Length:137582

Expires:Thu,05Dec199716:00:00GMT

Last-Modified:Wed,5August199615:55:28GMT

Server:Apache0.84 <html><body>HelloWorld</body></html>

HTTP 响应报文的第一行叫做状态行,后面的行是首部行,最后是实体主体

状态行包含了三个字段:协议版本字段、状态码和相应的状态信息。

实体部分是报文的主要部分,它包含了所请求的对象。

首部行首部可以分为四种首部,请求首部、响应首部、通用首部和实体首部。通用首部和实体首部在请求报文和响应报文中都可以设置,区别在于请求首部和响应首部。

常见的请求首部有 Accept 可接收媒体资源的类型、Accept-Charset 可接收的字符集、Host 请求的主机名。

常见的响应首部有 ETag 资源的匹配信息,Location 客户端重定向的 URI 。

常见的通用首部有 Cache-Control 控制缓存策略、Connection 管理持久连接。

常见的实体首部有 Content-Length 实体主体的大小、Expires 实体主体的过期时间、Last-

Modified 资源的最后修改时间。

14.URI 和 URL 有什么区别?

配图

URI,统一资源标识符(Uniform Resource Identifier, URI),标识的是 Web 上每一种可用的

资源,如 HTML 文档、图像、视频片段、程序等都是由一个 URI 进行标识的。

URL ,统一资源定位符(UniformResourceLocation ),它是 URI 的一种子集,主要作用是提供资源的路径。

它们的主要区别在于,URL 除了提供了资源的标识,还提供了资源访问的方式。这么比喻,URI 像是身份证,可以唯一标识一个人,而 URL 更像一个住址,可以通过 URL 找到这个人— — 人类住址协议: // 地球/ 中国/ 北京市/ 海淀区/ xx 职业技术学院/ 14 号宿舍楼/ 525 号寝/ 张三. 男。

15.说下 HTTP/1.0,1.1,2.0 的区别?

关键需要记住HTTP/1.0默认是短连接,可以强制开启,HTTP/1.1 默认长连接,HTTP/2.0 采用

路复用

HTTP/1.0

默认使用短连接,每次请求都需要建立一个 TCP 连接。它可以设置Connection:keep-alive这个字段,强制开启长连接。

HTTP/1.1

引入了持久连接,即 TCP 连接默认不关闭,可以被多个请求复用。

分块传输编码,即服务端每产生一块数据,就发送一块,用” 流模式” 取代” 缓存模式” 。

管道机制,即在同一个 TCP 连接里面,客户端可以同时发送多个请求。

HTTP/2.0

二进制协议,1 .1 版本的头信息是文本(ASCII 编码),数据体可以是文本或者二进制;2 .0 中,头信息和数据体都是二进制。

完全多路复用,在一个连接里,客户端和浏览器都可以同时发送多个请求或回应,而且不用按照顺序一一对应。

报头压缩,HTTP 协议不带有状态,每次请求都必须附上所有信息。Http/2.0 引入了头信息压缩机制,使用 gzip 或 compress 压缩后再发送。

服务端推送,允许服务器未经请求,主动向客户端发送资源。

16.HTTP/3 了解吗?

HTTP/3 主要有两大变化,传输层基于 UDP、使用QUIC 保证 UDP 可靠性

HTTP/2 存在的一些问题,比如重传等等,都是由于 TCP 本身的特性导致的,所以 HTTP/3 在 QUIC的基础上进行发展而来,QUIC (QuickUDPConnections )直译为快速 UDP 网络连接,底层使用

UDP 进行数据传输。

HTTP/3 主要有这些特点:

使用 UDP 作为传输层进行通信在 UDP 的基础上 QUIC 协议保证了 HTTP/3 的安全性,在传输的过程中就完成了 TLS 加密握手

HTTPS 要建立一个连接,要花费 6 次交互,先是建立三次握手,然后是 TLS/1.3 的三次握手。

QUIC 直接把以往的 TCP 和 TLS/1.3 的 6 次交互合并成了3次,减少了交互次数。

QUIC 有自己的一套机制可以保证传输的可靠性的。当某个流发生丢包时,只会阻塞这个流,其他流不会受到影响。

我们拿一张图看一下 HTTP 协议的变迁:

配图

17.HTTP 如何实现长连接?在什么时候会超时?

什么是 HTTP 的长连接?

  1. HTTP 分为长连接和短连接,本质上说的是 TCP 的长短连接。TCP 连接是一个双向的通道,它

是可以保持一段时间不关闭的,因此 TCP 连接才具有真正的长连接和短连接这一说法。

  1. TCP 长连接可以复用一个 TCP 连接,来发起多次的 HTTP 请求,这样就可以减少资源消耗,比

如一次请求 HTML ,如果是短连接的话,可能还需要请求后续的 JS/CSS 。

如何设置长连接?

通过在头部(请求和响应头)设置Connection字段指定为keep-alive,HTTP/1.0 协议支持,但是是默认关闭的,从 HTTP/1.1 以后,连接默认都是长连接。

在什么时候会超时呢?

HTTP 一般会有 httpd 守护进程,里面可以设置keep-alivetimeout,当 tcp 连接闲置超过这个时间就会关闭,也可以在 HTTP 的 header 里面设置超时时间

TCP 的keep-alive包含三个参数,支持在系统内核的 net.ipv4 里面设置;当 TCP 连接之后,闲置了tcp_keepalive_time,则会发生侦测包,如果没有收到对方的 ACK ,那么会每隔

tcp_keepalive_intvl 再发一次,直到发送了tcp_keepalive_probes,就会丢弃该连接。

  1. tcp_keepalive_intvl=15

  2. tcp_keepalive_probes=5

  3. tcp_keepalive_time=1800

18.说说 HTTP 与 HTTPS 有哪些区别?

  1. HTTP 是超文本传输协议,信息是明文传输,存在安全⻛险的问题。HTTPS 则解决 HTTP 不安

全的缺陷,在 TCP 和 HTTP 网络层之间加入了 SSL/TLS 安全协议,使得报文能够加密传输。

  1. HTTP 连接建立相对简单, TCP 三次握手之后便可进行 HTTP 的报文传输。而 HTTPS 在 TCP

三次握手之后,还需进行 SSL/TLS 的握手过程,才可进入加密报文传输。

  1. HTTP 的端又号是 80 ,HTTPS 的端又号是 443 。

  2. HTTPS 协议需要向 CA (证书权威机构)申请数字证书,来保证服务器的身份是可信的。

19.为什么要用 HTTPS?解决了哪些问题?

因为 HTTP 是明文传输,存在安全上的风险:

窃听,比如通信链路上可以获取通信内容,用户账号被盗。

篡改,比如强制植入垃圾广告,视觉污染。

冒充,比如冒充淘宝网站,用户金钱损失。

配图

所以引入了 HTTPS ,HTTPS 在 HTTP 与 TCP 层之间加入了 SSL/TLS 协议,可以很好的解决了这些风险:

信息加密:交互信息无法被窃取。

校验机制:无法篡改通信内容,篡改了就不能正常显示。

身份证书:能证明淘宝是真淘宝。

所以 SSL/TLS 协议是能保证通信是安全的。

20.HTTPS 工作流程是怎样的?

这道题有几个要点:公私钥、数字证书、加密、对称加密、非对称加密

HTTPS 主要工作流程:

  1. 客户端发起 HTTPS 请求,连接到服务端的 443 端又。

  2. 服务端有一套数字证书(证书内容有公钥、证书颁发机构、失效日期等)。

  3. 服务端将自己的数字证书发送给客户端(公钥在证书里面,私钥由服务器持有)。

  4. 客户端收到数字证书之后,会验证证书的合法性。如果证书验证通过,就会生成一个随机的对称

密钥,用证书的公钥加密。

  1. 客户端将公钥加密后的密钥发送到服务器。

  2. 服务器接收到客户端发来的密文密钥之后,用自己之前保留的私钥对其进行非对称解密,解密之

后就得到客户端的密钥,然后用客户端密钥对返回数据进行对称加密,酱紫传输的数据都是密文啦。

  1. 服务器将加密后的密文返回到客户端。

  2. 客户端收到后,用自己的密钥对其进行对称解密,得到服务器返回的数据。

配图

这里还画了一张更详尽的图:

配图

21.客户端怎么去校验证书的合法性?

首先,服务端的证书从哪来的呢?

为了让服务端的公钥被大家信任,服务端的证书都是由 CA (CertificateAuthority ,证书认证机构)签名的,CA就是网络世界里的公安局、公证中心,具有极高的可信度,所以由它来给各个公钥签名,信任的一方签发的证书,那必然证书也是被信任的。

配图

CA 签发证书的过程,如上图左边部分:

首先 CA 会把持有者的公钥、用途、颁发者、有效时间等信息打成一个包,然后对这些信息进行

Hash 计算,得到一个 Hash 值;

然后 CA 会使用自己的私钥将该 Hash 值加密,生成 CertificateSignature ,也就是 CA 对证书做了签名;

最后将 CertificateSignature 添加在文件证书上,形成数字证书;

客户端校验服务端的数字证书的过程,如上图右边部分:

首先客户端会使用同样的 Hash 算法获取该证书的 Hash 值 H1 ;

通常浏览器和操作系统中集成了 CA 的公钥信息,浏览器收到证书后可以使用 CA 的公钥解密

Certificate

Signature 内容,得到一个 Hash 值 H2 ;

最后比较 H1 和 H2 ,如果值相同,则为可信赖的证书,否则则认为证书不可信。

假如在 HTTPS 的通信过程中,中间人篡改了证书原文,由于他没有 CA 机构的私钥,所以 CA 公钥解密的内容就不一致。

22.如何理解 HTTP 协议是无状态的?

这个无状态的的状态值的是什么?是客户端的状态,所以字面意思,就是 HTTP 协议中服务端不会保存客户端的任何信息。

比如当浏览器第一次发送请求给服务器时,服务器响应了;如果同个浏览器发起第二次请求给服务器时,它还是会响应,但是呢,服务器不知道你就是刚才的那个浏览器。

那有什么办法记录状态呢?

主要有两个办法,Session 和 Cookie 。

先来看看什么是 Session 和 Cookie :

Cookie 是保存在客户端的一小块文本串的数据。客户端向服务器发起请求时,服务端会向客户端发送一个 Cookie ,客户端就把 Cookie 保存起来。在客户端下次向同一服务器再发起请求时,

Cookie 被携带发送到服务器。服务端可以根据这个 Cookie 判断用户的身份和状态。

Session 指的就是服务器和客户端一次会话的过程。它是另一种记录客户状态的机制。不同的是

cookie 保存在客户端浏览器中,而 session 保存在服务器上。客户端浏览器访问服务器的时候,服务器把客户端信息以某种形式记录在服务器上,这就是 session 。客户端浏览器再次访问时只需要从该 session 中查找用户的状态。

配图

Session 和 Cookie 到底有什么不同呢?

存储位置不一样,Cookie 保存在客户端,Session 保存在服务器端。

存储数据类型不一样,Cookie 只能保存 ASCII ,Session 可以存任意数据类型,一般情况下我们可以在 Session 中保持一些常用变量信息,比如说 UserId 等。

有效期不同,Cookie 可设置为长时间保持,比如我们经常使用的默认登录功能,Session 一般有效时间较短,客户端关闭或者 Session 超时都会失效。

隐私策略不同,Cookie 存储在客户端,比较容易遭到不法获取,早期有人将用户的登录名和密码存储在 Cookie 中导致信息被窃取;Session 存储在服务端,安全性相对 Cookie 要好一些。

存储大小不同, 单个 Cookie 保存的数据不能超过 4K ,Session 可存储数据远高于 Cookie 。

Session 和 Cookie 有什么关联呢?

可以使用 Cookie 记录 Session 的标识。

配图

用户第一次请求服务器时,服务器根据用户提交的信息,创建对应的 Session ,请求返回时将此

Session 的唯一标识信息 SessionID 返回给浏览器,浏览器接收到服务器返回的 SessionID 信息后,会将此信息存入 Cookie 中,同时 Cookie 记录此 SessionID 是属于哪个域名。

当用户第二次访问服务器时,请求会自动判断此域名下是否存在 Cookie 信息,如果存在,则自动将 Cookie 信息也发送给服务端,服务端会从 Cookie 中获取 SessionID ,再根据 SessionID查找对应的 Session 信息,如果没有找到,说明用户没有登录或者登录失效,如果找到 Session证明用户已经登录可执行后面操作。

分布式环境下 Session 怎么处理呢?

分布式环境下,客户端请求经过负载均衡,可能会分配到不同的服务器上,假如一个用户的请求两次没有落到同一台服务器上,那么在新的服务器上就没有记录用户状态的 Session 。

这时候怎么办呢?

可以使用 Redis 等分布式缓存来存储 Session ,在多台服务器之间共享。

配图

客户端无法使用 Cookie 怎么办?

有可能客户端无法使用 Cookie ,比如浏览器禁用 Cookie ,或者客户端是安卓、IOS 等等。

这时候怎么办?SessionID 怎么存?怎么传给服务端呢?

首先是 SessionID 的存储,可以使用客户端的本地存储,比如浏览器的 sessionStorage 。

接下来怎么传呢?

拼接到 URL 里:直接把 SessionID 作为 URL 的请求参数放到请求头里:把 SessionID 放到请求的 Header 里,比较常用。

本文整理自三分恶《面渣逆袭》系列的公开内容,仅供个人学习使用

本站仅供个人学习使用,请勿外传