输入域名
在浏览器中输入网址以后,浏览器会根据历史记录、书签智能匹配补全域名或者url/
解析域名
当浏览器发起请求时,会经过以下流程,来解析该域名。
1.查看本地hosts文件,查找相关域名所对应的ip地址。
如果找到了就直接使用该ip地址,如果没找到,则跳转2.
2.浏览器向本地DNS服务器发起DNS请求,查找其缓存记录。
如果找到了,就返回结果。如果没找到,则跳转3.
3.浏览器向DNS根服务器发起请求,根 DNS 服务器没有记录具体的域名与 ip 地址的映射关系,而是返回域服务器的地址。跳转4。
4.本地DNS继续向域服务器发起请求,查找域名解析服务器的地址。跳转5.
5.本地DNS服务器向域名解析服务器发起请求,返回域名与ip的映射关系。跳转6.
6.本地DNS服务器将映射关系保存在缓存中,同时返回ip地址给用户电脑。
浏览器发起http请求
浏览器获取到域名对应的 ip 地址之后,便会以一个随机端口(1024< port < 65535)向服务端 web 程序 80 端口发起 TCP 连接请求。
浏览器与服务端经过 3 次 TCP 握手之后,建立 TCP 连接,然后浏览器发起一个 http 请求。一般的浏览器只能发起 GET 或者 POST 请求。
请求信格式包含四个部分:
- 请求行(请求方法 URI 协议/版本)
- 请求头(缓存、客户端身份信息等)
- 空行
- 消息体
TCP 三次握手的目的是:为了防止已经失效的连接请求报文发送到服务端,服务端因而产生不必要的响应开销。
TCP 四次挥手的目的是:为确保收发双方数据传输的完整性。
服务器返回 http 响应
服务端返回 http 响应的格式包含四个部分:
- 响应行(状态行)(协议/版本号 状态码 状态说明)
- 响应头(响应头是服务器传递给客户端用于说明服务器的一些信息,以及将来继续访问该资源时的策略。)
- 空行
- 消息体(响应体是服务端返回给客户端的 HTML 文本内容,或者其他格式的数据,比如:视频流、图片或者音频数据。)
服务器在返回响应之前可能会经过重定向、反向代理服务器请求等过程。
以服务端响应消息体为 HTML 文本为例,浏览器解析 HTML 文本时,会”自上而下“加载,并在加载过程中进行解析渲染展现给用户。在解析过程中,如果遇到请求外部资源时,如图片、外链的 CSS 、 js 等,请求过程是异步的,并不会影响整个 HTML 文档的加载。