跳到主要内容

题目 36 - 题目 40

36.HTTP1.1 中如何解决 HTTP 的队头阻塞问题?​

并发连接​

对于一个域名允许分配多个长连接,那么相当于增加了任务队列,不至于一个队伍的任务阻塞其它所有任务。在 RFC2616 规定过客户端最多并发 2 个连接,不过事实上在现在的浏览器标准中,这个上限要多很多,Chrome 中是 6 个。

但其实,即使是提高了并发连接,还是不能满足人们对性能的需求。

域名分片​

一个域名不是可以并发 6 个长连接吗?那我就多分几个域名。

比如 static1.test.com 、static2.test.com。

这样一个 test.com 域名下可以分出非常多的二级域名,而它们都指向同样的一台服务器,能够并发的长连接数更多了,事实上也更好地解决了队头阻塞的问题。

37.HTTP 中如何处理表单数据的提交?​

  1. application/x-www-form-urlencoded:
  • 数据被编码成以&分隔的键值对,并以 URL 编码方式处理字符。
  • 例如,{a: 1, b: 2} 会被转换为 a=1&b=2,最终形式为 "a%3D1%26b%3D2"。
  1. multipart/form-data:
  • 请求头中的 Content-Type 包含 boundary,这是浏览器默认指定的值。

  • 数据被分割成多个部分,每部分都有一个 HTTP 头部描述,如 Content-Type,最后一个部分后面跟着一个结束标记 --。

  • 例如,一个包含两个文本字段的表单,其请求体可能是:

测试代码
Content-Disposition: form-data; name="data1";
Content-Type: text/plain
data1
-----WebkitFormBoundaryRRJKeWfHPGrS4LKe
Content-Disposition: form-data; name="data2";
Content-Type: text/plain
data2
-----WebkitFormBoundaryRRJKeWfHPGrS4LKe--

multipart/form-data 格式的一个显著特点是每个表单元素都是独立的资源表述,并且不需要 URL 编码,这在上传文件时尤为重要,因为它可以避免不必要的编码和空间浪费。

38.对于定长和不定长的数据,HTTP 是怎么传输的?​

定长包体​

对于定长包体而言,发送端在传输的时候一般会带上 Content-Length,来指明包体的长度。

不定长包体​

介绍另外一个 http 头部字段:Transfer-Encoding: chunked。

表示分块传输数据,设置这个字段后会自动产生两个效果:

  • Content-Length 字段会被忽略
  • 基于长连接持续推送动态内容

39.为什么说 HTTP 是无状态的协议​

无状态协议的优点包括:

  • 服务器资源利用:由于每次请求都是独立的,服务器不需要记住前一个请求的状态,这有助于提高服务器的资源利用率。
  • 高效响应:当服务器不需要前一个请求的信息时,它可以更快地响应新请求。

无状态协议也存在缺点:

  • 重复数据传输:每次请求都需要传输完整的数据,这可能导致数据量的增大,尤其是在客户端和服务器之间的数据保持不变时。
  • 状态管理复杂:客户端需要自己管理状态信息,如用户登录状态,这可能增加客户端的复杂性。

40.协商缓存中,有了 Last-Modified,为什么还会出现 ETag?​

ETag 的出现,主要是为了解决 Last-Modified 无法解决的一些问题:

  • 某些服务器不能精确得到文件的最后修改时间, 这样就无法通过最后修改时间来判断文件是否更新了。

  • 某些文件的修改非常频繁,在秒以下的时间内进行修改. Last-Modified 只能精确到秒。

  • 一些文件的最后修改时间改变了,但是内容并未改变。 我们不希望客户端认为这个文件修改了。

Loading Comments...