一次完整的 http 请求过程

每一次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缓存 —> 根服务器进行递归搜索

  1. 浏览器DNS缓存:浏览器会按照一定频率缓存DNS记录(缓存的时间比较短,大概只有1分钟,且只能容纳1000条缓存)
  2. 本地操作系统的DNS缓存: 如果浏览器缓存中找不到需要的DNS记录,那就去操作系统找。
  3. 本地HOSTS文件: Windows系统中位于C:\Windows\System32\drivers\etc
  4. 路由器DNS(可以登录后台设置DNS服务器地址): 路由器自动获取DNS地址,也可以手动修改(路由器DNS被篡改会造成域名劫持,你访问的网址都会被定位到同一个位置,但是IP直接可以访问)
  5. ISP的DNS服务器:  ISP(互联网服务提供商、联通电信移动),ISP有专门的DNS服务器应对DNS查询请求
  6. 根服务器: ISP的DNS服务器还找不到的话,它就会向根服务器发出请求,进行递归查询
  • 建立TCP连接

得到IP地址后,浏览器会开启一个随机端口向web服务器的对应端口发起tcp连接请求,经过三次握手后建立TCP连接。

  • 客户端请求服务器(发起HTTP请求)

HTTP请求报文由三部分组成:请求行,请求头、空格、请求正文

  1. 请求行:用于描述客户端的请求方式(GET/POST等),请求的资源名称(URL)以及使用的HTTP协议的版本号
  2. 请求头:用于描述客户端请求哪台主机及其端口,以及客户端的一些环境信息等
  3. 空行:空行就是\r\n (POST请求时候有)
  4. 请求正文:当使用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连接在发送后将仍然保持打开状态,于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为每个请求建立新连接所需的时间,还节约了网络带宽。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值