juejin.cn/post/712455… juejin.cn/post/710949…
HTTP协议工作流程
URI资源标识符及URL资源定位符
scheme:表示使用的协议类型,例如http、https、ftp、chrome等。://:协议类型与后续描述符之间的分隔符。domainName:网站域名,经DNS解析后会得到具体服务器IP。/path:请求路径,代表客户端请求的资源所在位置,不同层级目录之间用/区分。?query1=value:请求参数,?后面表示请求的参数,采用K-V键值对形式。&query2=value:多个请求参数,不同的参数之间用&分割。#fragment:表示所定位资源的一个锚点,浏览器可根据这个锚点跳转对应的资源位置。
DNS域名解析系统
在计算机网络中,每个主机都存在一个IP地址,但由于IP是一串数字不方便人类记忆,因此出现了一种协议名为DNS,它可以把生涩的IP地址转换为便于人类记忆的域名,
DNS服务器主要分为三类:
- ①根域名服务器
- ②
TLD顶级域名服务器 - ③授权域名(子域)服务器
DNS域名查询
DNS中主要分为递归查询、迭代查询两种方式:
DNS解析请求具体查询过程
-
①客户端输入域名准备访问网站。
-
②先查询「浏览器的
DNS缓存」,命中直接向IP发起访问,未命中继续往下。 -
③继续查询「
OS的hosts文件」,如果仍然未命中,则向「本地域名服务器」发起「递归查询」请求。 -
④「本地域名服务器」先查询自身缓存,未命中则向「根域名服务器」进行「迭代查询」:
- A.「根域名服务器」返回「顶级域名服务器」的地址
- B.「本地域名服务器」再根据地址向「顶级域名服务器」发起查询
- C.「顶级域名服务器」返回负责该「域名」的「授权域名服务器」地址
- D.「本地域名服务器」再根据地址向「授权域名服务器」发起查询
- E.「授权域名服务器」返回「域名」的具体
IP地址
-
⑤「本地域名服务器」将
IP返回给客户端并将「域名/IP映射」缓存起来。 -
⑥「浏览器」得到
IP后,向其发出具体的「用户请求」,并将「域名/IP映射」缓存。
HTTP中Get和Post方法的区别
-
①
HTTP中功能的定义不同,GET用来获取数据,POST用于提交数据。 -
②传输数据的方式不同,
GET直接在URL拼接参数显式传输,POST则是隐式传输。 -
③允许传输数据时的长度不同,
GET通常情况下受到浏览器和服务器的限制,因此可传输的参数有限,而POST则没有限制。 -
④
GET总体而言,执行的效率远高于POST方式,GET也是form表单的默认方法。 -
⑤支持的数据传输格式不同,
GET仅支持ASCII字符,而POST支持整个ISO10646字符集。 -
⑥安全性不同,
GET由于是显式传输,数据被放在URL中,因此安全性远低于POST方式。 -
⑦浏览器缓存方面支持性不同,
GET请求的资源默认会被浏览器缓存,下次请求相同资源会直接从本地中读取,而POST请求的资源默认情况下不会缓存。 -
⑧一次请求产生的数据包数量不同,
GET只会发出一个TCP包,POST会将头信息和主体信息分成两个包发送。 -
⑨当浏览器回退或前进时,
GET方式获取的资源可直接使用,而POST则会重新请求服务器获取资源(因为GET可以从本地缓存中读取资源)
长连接
HTTP是基于“请求/响应”模型所构建的协议,每次请求时,客户端和服务端之间都要新建立一个连接,服务端响应完成后又会立马断开连接。这种方式带来的缺点很明显,频繁的创建/销毁TCP连接造成的开销较大,资源浪费较多。
Keep-Alive(长连接/持久连接)模式,开启这种模式的情况下,可以复用已建立的TCP连接
长连接模式下,当一个客户端的请求与服务端建立连接后,这个连接并不会在服务端响应结果后立马关闭,而是会持续有效,后续新的请求获取服务器资源时,可以通过这个TCP连接发送多个请求与接收多个响应。
HTTP/1.0中默认关闭,需要手动在请求头中添加Connection:
Keep-Alive才可开启,HTTP/1.1默认开启,可以手动添加Connection: close关闭。
HTTP队头阻塞
HTTP本质上会将请求串行化,所有的请求会被放入到一个队列中依次交由服务器处理,那么假设前面的请求任务执行时间过长,最终就会导致后面的所有请求全部被阻塞,因此这个问题就被称为队头阻塞