经典面试题:浏览器输入www.baidu.com之后,按下回车键之后会发生什么?
从逻辑和网络传输两个方面来看

主要步骤有如下几步:

1.域名解析

2.浏览器与服务器建立连接

3.web浏览器发送HTTP请求

4.web服务器处理请求并返回HTTP响应

5.浏览器接收HTTP响应

6.浏览器渲染页面

1. 域名解析
浏览器首先查询浏览器缓存(浏览器会缓存DNS记录一段时间,各个浏览器缓存时间不等)。
如果缓存中没有,会去电脑中的hosts文件中查找。
如果hosts文件中也没有记录,它将会向DNS服务器发送一条DNS查询请求。DNS服务器是由网络通信栈提供的,通常是本地路由器或者ISP的缓存DNS服务器。(ISP是网络服务提供商,类似于移动,联通)
以上都没有的情况则向根域名服务器查域名对应IP,根域名服务器将请求转发给下一级查询,顺序如下
1、根域名解析服务器
2、com顶级域名服务器
3、baidu.com域名服务器
直至找到IP地址

DNS查询优先级:
a.本地host文件,若没有
b.查找本地DNS解析器缓存,若没有
c.查找TCP/IP参数设置中的首选DNS服务器,若没有
d.DNS服务器间的迭代查询

2. 浏览器与服务器建立连接
一旦浏览器收到正确的IP地址。会与服务器建立TCP连接,通过TCP/IP三次握手的过程建立连接进行数据传输。

3. web浏览器发送HTTP请求
建立连接后,就可以发送HTTP请求,HTTP请求由请求方法,请求头,请求正文三部分组成。

4. web服务器处理请求并返回HTTP响应
web服务器接收到http请求,由控制层处理逻辑,从数据库取得模型,视图层组装页面,返回HTTP响应。

5. 浏览器接收HTTP响应
包括状态行,响应头,响应报文。

重定向: 对于大型网站存在多个主机站点,为了负载均衡或者导入流量,往往不会直接返回请求页面,而是重定向。返回的状态码就不是200OK,而是301,302以3开头的重定向码,浏览器在获取了重定向响应后,在响应报文中Location项找到重定向地址,浏览器重新回到第一步访问。

重定向的作用:重定向是为了负载均衡或者导入流量。利用一个前端服务器接受请求,然后负载到不同的主机上,可以大大提高站点的业务并发处理能力;重定向也可将多个域名的访问,集中到一个站点;比如baidu.com,www.baidu.com,永久重定向会将两个地址关联起来,来提高网站的自然排名。

6. 浏览器渲染页面
HTML字符串被浏览器接收后一句句读取解析
解析到< link >标签后重新发送请求获取css
解析到< scrpit >标签后发送请求获取js,并执行代码
解析到< img > 标签后发送请求获取图片资源
浏览器根据获取到的HTML和CSS计算得到渲染树,绘制到屏幕上。

分析页面中的超链接(如图片,样式等也是一个URL),过程和以上过程类似,之后再显示在当前页面,重复以上过程直至没有超链接需要发送,完成页面的全部加载。


从网络传输方面看这个问题
我们先说说TCP/IP五层模型。
物理层(网关)< >链路层(MAC)< >网络层(IP)< >传输层(TCP)< >应用层(HTTP)

1、 当在浏览器中输入一个域名之后,先通过DNS获得IP地址

2、 浏览器属于客户端,部分浏览器使用的是开源的curl网络连接库,它使用系统提供的套接字接口socket构建HTTP应用层协议,并且监听一个端口号。比如我们写用户登录接口发送username,password等字段都是按照HTTP协议进行封装。

3、 HTTP协议封装完成之后转交给传输层,HTTP建立在TCP连接(好比给别人打电话,电话线接通是TCP,当我们用中文进行沟通的时候,中文在里面就充当的是HTTP,但是我也可以说英语XMPP,法语FTP等等来进行对话,只需要对面能听懂就行),也就是把封装好的HTTP再次进行TCP封装构建请求段。
TCP包头中的源端口号是浏览器监听的,目的端口号是服务器监听的端口号,默认是80端口。

4、 TCP包传输给网络层,封装成IP包(在网络层IP协议要将源地址、目的地址包装在IP包中,此外,IP包中还包含了版本、首部长度、服务类型TOS、总长度、标识、标志、片偏移、首部检验和、生存时间TTL等)

5、 IP包传给数据链路层,构建MAC帧(MAC全称 Media Access Control 媒体访问控制),本机MAC直接获得,目标MAC需要用到ARP协议获得。

6、 MAC帧构建完成之后就是网关发送数据在真真实实在网络上传送了,可以通过 wifi,网线,光纤进行数据传播,根据路由算法寻址找到目标IP地址所在的网关。

7、 在目标IP地址所在的网关中将MAC和IP包发送到目标主机的网络层,取下IP和MAC地址看和自己是否匹配。如果匹配,把网络层数据传递给传输层,这时候TCP会向反方向发送确认包,这就是传说中的TCP三次握手,在第3步中有个标志位,发送SYN发起一个新连接,到第7步中发送一个ACK确认信号告诉第4步我已经收到,完成第一次握手。然后再到反方向到到第4步中像第7不发送ACK也进行确认完成第二次握手,最后到第7步中收到确认完成第三次握手,完成TCP的连接。

8、 建立完成TCP连接后,这时候进行端口匹配,将内容发送给HTTP服务,服务器端一般使用nginx、tomcat、apache进行HTTP处理。apache把HTTP传递给PHP,PHP直接使用http信息进行相关业务逻辑的处理,比如用户登录,通过$_POST获取http协议的数据区域里面的username和password,再使用PHP提供的相关函数连接数据库,进行对比后把结果信息再次封装成HTTP协议传输给传输层,沿着之前的网络过程进行数据传输,直到用户浏览器。

9、 用户浏览器接收到服务器的HTTP请求,进行相应的逻辑操作(javascript),和页面展示渲染(html/css)出我们能看到的页面、至此整个网络过程传出完毕。


补充:TCP连接中的三次握手,四次挥手

三次握手
第一次握手:
客户端主机将标志位SYN值设为1,再随机产生一个值为seq=x(J的取值范围为=1234567)的数据包通到各协议层封装传输到服务器,客户端A进入SYN_SENT状态(请求连接状态),等待服务端确认;

第二次握手:
服务端收到数据包后由标志位SYN=1就知道客户端的请求是建立连接,服务端将标志位ACK设为1,再设ack=x+1(这里主要ack与ACK的区分),再随机产生一个值seq=y,并将该数据包发送给客户端以确认连接请求,服务端进入SYN_RCVD状态(SYN_RECV是指,服务端被动打开后,接收到了客户端的SYN并且发送了ACK时的状态)。

第三次握手:
客户端收到数据报后,检查ack是否为x+1,如果正确则令ack=y+1,标志位ACK为1,将该数据包发送给服务端,服务端检查ack是否为y+1,ACK是否为1,如果正确则连接建立成功,客户端和服务端进入ESTABLISHED状态(连接成功状态),完成三次握手,随后客户端A与服务端B之间可以开始传输数据了。

四次挥手
第一次挥手:
客户端进程发出连接释放报文,并停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u

第二次挥手:
服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。

第三次挥手:
客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。

第四次挥手:
客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。

参考:
链接:https://www.jianshu.com/p/6533de882211
原文链接:https://blog.csdn.net/weixin_41744192/article/details/105920375
原文链接:https://blog.csdn.net/ali_lili/article/details/90245806
原文链接:https://blog.csdn.net/u010852544/article/details/104950025

浏览器输入www.baidu.com之后发生了什么相关推荐

  1. 在浏览器输入地址回车后,发生了什么!

    在浏览器输入连接回车后,发生了什么! 一.浏览器查找域名的IP地址 二.浏览器与目标服务器建立TCP连接 三.浏览器通过http协议发送请求 四.某些服务器会做永久重定向响应 五.浏览器跟踪重定项地址 ...

  2. 从浏览器输入 www.bilibili.com 到底发生了什么

    从浏览器输入 www.bilibili.com 到底发生了什么  当我们从浏览器输入 www.bilibili.com 这个网址时,会向 b站 的服务器发送一个 http 的请求报文:b站 服务器接收 ...

  3. 浏览器输入www.baidu.com

    一.浏览器输入www.baidu.com 1.DNS域名解析,为何解析?因为网络标准规定url只能是字母和数字和其他特殊符号需要转义,不转义会出现歧义.DNS解析过程:首先会向浏览器查询有无缓存,无的 ...

  4. 输入www.baidu.com背后发生了什么?

    1.浏览器分析www.baidu.com 2.浏览器向DNS服务器请求解析ip地址         dns域名解析过程:                 客户机首先查看自己浏览器的缓存,如果没有对应的 ...

  5. 浏览器输入www.baidu.com之后,发生了什么?

    1.将域名www.baidu.com解析为IP地址: 解析IP地址的过程依次经过了:浏览器缓存.系统缓存.hosts文件.路由器缓存.递归搜索根域名服务器. 浏览器缓存: 每个浏览器都会有一个DNS缓 ...

  6. 浏览器输入www.baidu.com发生了什么

    1.查找该域名的ip地址 查找浏览器本地缓存,如果浏览器由本地缓存且未过期则返回结果. 否则向上一级DNS服务器查询,直到DNS根服务器. 具体查询是一种递归式搜索,浏览器向DNS服务器发送域名,DN ...

  7. 3.浏览器输入www.baidu.com到显示主页的全过程

    1.客户端浏览器通过DNS解析到www.baidu.com的IP地址202.108.22.5,通过这个IP地址找到客户端到服务器的路径.客户端浏览器发起一个HTTP会话到202.108.22.5,然后 ...

  8. 浏览器输入一个URL地址后发生的事情

    在浏览器中输入一个URL至页面呈现,发生的事情? 1.域名解析:浏览器获得URL地址,向操作系统请求该URL对应的IP地址,操作系统查询DNS(首先查询本地HOST文件,没有则查询网络)获得对应的IP ...

  9. 详细介绍一下浏览器输入www.baidu.com后会发生什么

    (1)    客户端浏览器通过DNS解析到www.baidu.com的IP地址,通过这个IP地址找到客户端到服务器的路径.客户端浏览器发起一个HTTP会话到IP地址,然后通过tcp进行封装数据包,输入 ...

最新文章

  1. 无法启动程序 计算机丢失QT,Win7系统打开程序提示计算机中丢失qt5core.dll如何解决...
  2. 大数据标签获取处理步骤_大数据处理分为哪些步骤
  3. php调用字符串函数参数,如何从包含参数的变量中存储的字符串调用PHP函数
  4. 介绍一下画图小能手matplotlib。
  5. Linux以及各大发行版介绍
  6. 用VML画图(一些基本的矢量图)(转)
  7. 程序员如何在百忙中更有效地利用时间,如何不走岔路,不白忙(忙得要有效率,要有收获)...
  8. 谷爱凌惊“险”一跳,最少价值10个亿!
  9. json 取值判断_对应后台传json ajax 获取值判断
  10. 只因少打一个字符 “”,大量谷歌 Chromebook 无法解锁
  11. 第五章 线性回归 学习笔记上
  12. css 为什么给span加vertical-align: middle不起作用?
  13. java链表打印_java链表打印
  14. html gif 透明通道,164个loading图片gif格式-透明背景
  15. Android TV 开发之 TV视频播放器
  16. 在Linux系统下制作U盘启动盘
  17. 对HTML 标签语义化的理解,常见的语义化标签有哪些?
  18. DNS 服务器 清除缓存
  19. 解决pycharm中画图工具报错无法显示问题
  20. CREO图文教程:三维设计案例之足球设计图文教程之详细攻略

热门文章

  1. 【WEB】前端系统配色方案(全览)
  2. Python类与对象最全总结大全(类、实例、属性方法、继承、派生、多态、内建函数)
  3. Vdbench存储测试教程
  4. d3.js操作svg
  5. python-微信小程序的学习
  6. linux 终端命令行的快捷键列表
  7. 自动上传本地图片和word图片(word图片需使用从word粘贴功能)
  8. 14福师计算机导论在线作业一,(随机)福师18秋《计算机导论》在线作业一资料...
  9. java outputstream初始化_ByteArrayOutputStream简介和使用_动力节点Java学院整理
  10. 计算机网络体系结构-网络管理