题目 36 - 题目 40
36.HTTP1.1 中如何解决 HTTP 的队头阻塞问题?
并发连接
对于一个域名允许分配多个长连接,那么相当于增加了任务队列,不至于一个队伍的任务阻塞其它所有任务。在 RFC2616 规定过客户端最多并发 2 个连接,不过事实上在现在的浏览器标准中,这个上限要多很多,Chrome 中是 6 个。
但其实,即使是提高了并发连接,还是不能满足人们对性能的需求。
域名分片
一个域名不是可以并发 6 个长连接吗?那我就多分几个域名。
比如 static1.test.com 、static2.test.com。
这样一个 test.com 域名下可以分出非常多的二级域名,而它们都指向同样的一台服务器,能够并发的长连接数更多了,事实上也更好地解决了队头阻塞的问题。
37.HTTP 中如何处理表单数据的提交?
- application/x-www-form-urlencoded:
- 数据被编码成以&分隔的键值对,并以 URL 编码方式处理字符。
- 例如,
{a: 1, b: 2}会被转换为 a=1&b=2,最终形式为 "a%3D1%26b%3D2"。
- 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 编码,这在上传文件时尤为重要,因为它可以避免不必要的编码和空间浪费。