美文网首页
一次完整的http请求过程

一次完整的http请求过程

作者: lndyzwdxhs | 来源:发表于2019-01-23 00:34 被阅读14次

从浏览器输入域名www.baidu.com,敲击回车开始,都经历了一些什么?

0x01 DNS请求

  • 浏览器首先会查找浏览器本地的DNS缓存,如果缓存没有过期(一般期限也就是一分钟,并且只能容纳1000条,各家浏览器可能不尽相同),则返回服务器IP进行下一步;

  • 如果本地缓存没有的话,浏览器就会查看操作系统(win/Linux等)的DNS缓存;

  • 如果系统缓存没有的话,就查看hosts文件(c:\Windows\System32\drivers\etc\),如果有对应的域名与ip则解析结束;

  • 如果系统缓存中依然没有,就会发起DNS的系统调用,系统会向本地配置的首选DNS服务器发起域名解析请求,i.e. 一般会向ISPDNS服务器通过udp53号端口发起DNS请求。DNS请求一般是递归的,也就是说,不管找没找到域名对应的IPISPDNS服务器都必须给我们一个答复。ISPDNS服务器先在自己的缓存中查找域名对应的IP,如果存在并且没有过期则解析成功,将IP返回给请求方客户端浏览器;如果不存在,则该DNS服务器会代替浏览器发起迭代DNS解析请求,首先他会找到根域DNSIP地址,向根域发起DNS解析(请问你知道www.baidu.comIP地址吗?),根域发现这是一个顶级域com域的一个域名,根域回复:我不知道www.baidu.com的地址,但是我知道com域的IP地址,你去找他。然后ISPDNS服务器找到了com域的DNS服务器,向他发起了DNS解析请求(请问你知道www.baidu.comIP地址吗?),com域回复说,我不知道www.baidu.com的地址,但是我知道baidu.com域的IP地址,你去找他吧。最后找到baidu.com域的DNS服务器,一般到这就结束了,这个就是你购买域名的厂商(万网、新网等)的DNS服务器,如果你配置了www.baidu.com的地址,就会将IP返回,否则就是找不到IP地址,该域名无法解析。ISPDNS服务器收到返回的IP地址以后,他会将IP地址返回给最初请求方,并且自己缓存,系统内核收到IP地址以后返回给浏览器,然后进行下一步的TCP/IP连接。

0x02 TCP三次握手

  • 拿到服务器的IP之后,User-Agent(浏览器等)会以一个随机端口([102465535])向服务器的WEB程序(httpdnginx等)的80端口发起TCP连接请求。

  • HTTP的原始请求经过TCP/IP协议栈的层层封包,经过物理层传输到服务器设备端,然后经过服务器的TCP/IP协议栈的层层解包,最终达到WEB程序(i.e. nginx)。

三次握手数据包
  • 如下图所示建立连接:


    TCP 三次握手

0x03 客户端发起HTTP请求

  • TCP连接建立完成后就可以开始传输数据了。HTTP可以发起请求。
http请求数据包
  • 使用的http方法是GET,请求的URL/,协议是HTTP/1.0

协议这里有三种版本:

http/0.9: stateless
http/1.0: MIME, keep-alive (保持连接), 缓存
http/1.1: 更多的请求方法,更精细的缓存控制,持久连接(persistent connection) 比较常用

chrome发起的http请求报文头部参数:

chrome 请求头

Accept 就是告诉服务器端,我接受那些MIME类型

Accept-Encoding 这个看起来是接受那些压缩方式的文件

Accept-Lanague 告诉服务器能够发送哪些语言

Connection 告诉服务器支持keep-alive特性

Cookie 每次请求时都会携带上Cookie以方便服务器端识别是否是同一个客户端

Host 用来标识请求服务器上的那个虚拟主机,比如Nginx里面可以定义很多个虚拟主机,这里就是用来标识要访问那个虚拟主机。

User-Agent 用户代理,一般情况是浏览器,也有其他类型,如:wget curl 搜索引擎的蜘蛛等

条件请求首部:

If-Modified-Since 是浏览器向服务器端询问某个资源文件如果自从什么时间修改过,那么重新发给我,这样就保证服务器端资源文件更新时,浏览器再次去请求,而不是使用缓存中的文件

安全请求首部:

Authorization: 客户端提供给服务器的认证信息;

0x04 服务器响应HTTP请求

  • nginx读取配置文件

  • WEB程序,即nginx等,在收到请求(GET / HTTP/1.1)时,会读取http请求里面的头部信息;

  • 根据Host来匹配自己的所有虚拟主机的配置文件的server_name,看看有没有匹配到;

  • 有匹配的话就查看该虚拟主机的配置,找到配置(root /var/www/html/),这个就表示所有的网页文件都在这个目录下,也就是网站的根目录;

  • 如果直接输入www.baidu.com,会默认进入首页,首页的配置从这个配置项获取(index index.html index.htm index.php);

  • 如果在上面的配置没有找到,就将请求交给uwsgi来处理,uwsgi经过后端逻辑的处理返回json数据,或者是渲染好的html页面。

0x05 浏览器解析返回的数据,渲染页面

  • 浏览器拿到html页面或者json数据,开始解析html代码,加载js/css/image等静态资源,请求服务器下载静态文件,这个时候就利用了keep-alive特性,即建立一次HTTP连接,可以请求多个资源;

欢迎关注微信公众号(coder0x00)或扫描下方二维码关注,我们将持续搜寻程序员必备基础技能包提供给大家。


相关文章

  • 一次完整的HTTP请求过程

    完成一次完整的HTTP请求的过程大概如下: 域名解析 → TCP建连 → HTTP请求 → HTTP响应 →...

  • 完整的HTTP请求过程

    当我们在web浏览器的地址栏中输入: www.baidu.com,然后回车,到底发生了什么 过程概览 1.对www...

  • Android经验分享 - 收藏集 - 掘金

    一次完整的 HTTP 请求与响应涉及了哪些知识? - Android - 掘金本文以HTTP请求和响应的过程来讲解...

  • Android程序员的自我修养-计算机网络篇(二)

    HTTP和HTTPS 描述一次完整的HTTP请求过程 一张经典的http请求过程图,虽然是从浏览器角度,但放在io...

  • 面试遇到的问题(三)

    介绍一下一次网络请求的过程 参考:一次完整的Http请求过程TCP 三次握手HTTP 协议 简单理解: 域名解析 ...

  • 一次完整的HTTP请求过程

    当我们在浏览器的地址栏输入 www.linux178.com ,然后回车,回车这一瞬间到看到页面到底发生了什么呢?...

  • 一次完整的 HTTP 请求过程

    Http 的header会给我们的请求包装,比如AF中经常设置的可接受的Accept(text/html)--》域...

  • 一次完整的http请求过程

    对于新入门的互联网开发小白来说,熟悉整个http请求链路能够帮助你更清晰直观的认识整个架构,下图是大多数互联网公司...

  • 一次完整的http请求过程

    1,使用DNS域名解析: 1)首先会搜索浏览器自身的DNS缓存(缓存时间比较短,大概只有1分钟,且只能容纳10...

  • 一次完整的http请求过程

    一个完整的HTTP过程包括建立连接、数据传输、断开连接等七个步骤。 下面详细介绍一下每一步 1、TCP建立连接 H...

网友评论

      本文标题:一次完整的http请求过程

      本文链接:https://www.haomeiwen.com/subject/faudjqtx.html