每一次http请求(浏览器输入地址回车,或者点击浏览器里的某一连接),首先根据域名解析IP地址(DNS解析),获取到实际IP后,客户端向这个IP和对应端口号建立一个TCP连接(三次握手),然后客户端向WEB服务器发送HTTP请求,而服务器端响应该HTTP请求,回返给客户端HTML代码,接着浏览器解析HTML代码,构建Dom树,渲染页面,并请求HTML代码中的资源,最后关闭TCP连接。
- DNS解析
DNS,即“Domain Name System”中文通常翻译成“域名系统”。到DNS服务器来对我们输人的域名进行解析,转换成该服务器的实际公网IP地址。
DNS解析的步骤顺序(从上往下的顺序)
浏览器DNS缓存 —> 本地操作系统DNS缓存 —> 本地计算机HOSTS文件 —> ISP互联网的DNS缓存 —> 根服务器进行递归搜索
- 浏览器DNS缓存:浏览器会按照一定频率缓存DNS记录(缓存的时间比较短,大概只有1分钟,且只能容纳1000条缓存)
- 本地操作系统的DNS缓存: 如果浏览器缓存中找不到需要的DNS记录,那就去操作系统找。
- 本地HOSTS文件: Windows系统中位于C:\Windows\System32\drivers\etc
- 路由器DNS(可以登录后台设置DNS服务器地址): 路由器自动获取DNS地址,也可以手动修改(路由器DNS被篡改会造成域名劫持,你访问的网址都会被定位到同一个位置,但是IP直接可以访问)
- ISP的DNS服务器: ISP(互联网服务提供商、联通电信移动),ISP有专门的DNS服务器应对DNS查询请求
- 根服务器: ISP的DNS服务器还找不到的话,它就会向根服务器发出请求,进行递归查询
- 建立TCP连接
得到IP地址后,浏览器会开启一个随机端口向web服务器的对应端口发起tcp连接请求,经过三次握手后建立TCP连接。
- 客户端请求服务器(发起HTTP请求)
HTTP请求报文由三部分组成:请求行,请求头、空格、请求正文
- 请求行:用于描述客户端的请求方式(GET/POST等),请求的资源名称(URL)以及使用的HTTP协议的版本号
- 请求头:用于描述客户端请求哪台主机及其端口,以及客户端的一些环境信息等
- 空行:空行就是\r\n (POST请求时候有)
- 请求正文:当使用POST等方法时,通常需要客户端向服务器传递数据。这些数据就储存在请求正文中(GET方式是保存在url地址后面,不会放到这里)
Get请求
Post请求
可以看出,上面的请求包含三个部分:请求行、请求头、空格、消息体,比之前的 GET 请求多了一个请求消息,其中 请求头和消息体之间用一个空行分割。POST 请求的参数不在 URL 中,而是在消息体中,请求头中多了一项 Content-Length 用于表示消息体的字节数,这样服务器才能知道请求是否发送结束。这也就是 GET 请求和 POST 请求的主要区别。
- 服务器响应客户端(返回html代码)
HTTP响应也由三部分组成:状态行,响应头,空格,消息体
状态行包括:协议版本、状态码、状态码描述
状态码:状态码用于表示服务器对请求的处理结果
1xx:指示信息——表示请求已经接受,继续处理
2xx:成功——表示请求已经被成功接收、理解、接收
3xx:重定向——要完成请求必须进行更进一步的操作
4xx:客户端错误——请求有语法错误或请求无法完成
5xx:服务器错误——服务器未能实现合法的请求处理
响应头:响应头用于描述服务器的基本信息,以及客户端如何处理数据
空格:CRLF(即 \r\n)分割
消息体:服务器返回给客户端的数据
- 浏览器解析html代码,请求代码中的资源,渲染页面
浏览器拿到html文件后,就开始解析其中的html代码,遇到js/css/image等静态资源时,就向服务器端去请求下载(会使用多线程下载,每个浏览器的线程数不一样),这是时候就用上 keep-alive特性了,建立一次HTTP连接,可以请求多个资源,下载资源的顺序就是按照代码里面的顺序,但是由于每个资源大小不一样,而浏览器又是多线程请求请求资源,所以这里显示的顺序并不一定是代码里面的顺序。
- 断开TCP连接
通过四次握手断开连接
一般情况下,一旦Web服务器向浏览器发送了请求数据,它就要关闭TCP连接,然后如果浏览器或者服务器在其头信息加入了这行代码:
Connection:keep-alive
TCP连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。