一、输入网址浏览器生成消息

当我们输入网址,浏览器在生成消息之前,需要解析网址,浏览器是如何解析网址的?我们随意输入一个字符串,浏览器肯定不会搭理我们。因此,我们输入的网址(URL)必须按照一定的格式才行。

我们常见的url都是以http://+字符串,其实还有以“ftp:”,“file:”,“mailto:”等开头。

用http协议访问web服务器:http://user:password@www.glasscom.com:80/dir/file1.htm

用FTP协议下载和上传文件

ftp://user:password@ftp.glasscom.com:21/dir/file1.htm

读取客户端计算机本地文件

file://localhost/c:/path/file1.zip

其中的用户名和密码以及端口号可以省略,从上面的三个例子,我们可以总结出url的结构:

对 URL 进行解析之后,浏览器确定了 Web 服务器和文件名,接下来就是根据这些信息来生成 http请求消息了。http请求消息也是有格式要求的,一个http请求消息包括请求行、请求头、空行和消息体四部分。

生成http消息之后,接下来我们需要委托操作系统将消息发送给Web 服务器,但是web服务器很矫情,它不认识域名,只认识ip地址。因此生成http消息,下一个步骤需要根据域名查询ip地址。

灵魂拷问:

(1)去哪里查询ip地址呢?

答:当然是DNS服务器。

(2)既然要访问DNS服务器,那么必须通过客户端的形式访问,客户端在哪里?

答:DNS客户端也叫解析器,解析器实际上是一段程序,它包含在操作系统的Socket库,Socket库是用于调用网络功能的程序组件集合。

(3)要访问DNS服务器,需要知道DNS服务器的ip地址,我们去哪里查询呢?

答:不需要查询,这个 ip 地址是作为 TCP/IP 的一个设置项目事先设置好的,不需要再去查询了

浏览器调用解析器后,解析器会向 DNS 服务器发送查询消息,然后 DNS 服务器会返回响应消息。响应消息中包含查询到的 IP 地址,解析器会取出 IP地址,并将其写入浏览器指定的内存地址中。浏览器在向 Web 服务器发送消息时,只要从该内存地址取出 IP 地址,并将它与 HTTP 请求消息一起交给操作系统就可以了。

二、 用电信号传输TCP/IP数据

知道ip地址之后,就可以委托操作系统内部的协议栈向Web服务器发送消息了。前面提到查询DNS服务器需要用到Socket库的程序组件,这里收发数据也需要调用Socket库,只是委托给协议栈按照指定的顺序来调用Socket库。

收发数据首先要在两台计算机之间建立一条数据通道,数据沿着这条通道流动,最终到达目的地。而关键在于管道两端的数据出入口,这些出入口称为套接字,数据收发结束关闭管道。

综上所述,收发数据的操作分为若干个阶段,可以大致总结为以下 4 个:

(1)创建套接字(创建套接字阶段)

(2)将管道连接到服务器端的套接字上(连接阶段)

(3)收发数据(通信阶段)

(4)断开管道并删除套接字(断开阶段)

套件字是什么?

例如通信对象的 IP 地址、端口号、通信操作的进行状态等,协议栈则需要根据这些信息判断下一步的行动,这就是套接字的作用。

远程端的ip地址,0.0.0.0还没有通信,采用UDP协议不需要绑定对方ip和端口号,故采用*:*表示

本地ip地址和端口号,一个计算机安装多个网卡,就会显示多个ip地址

LISTENING等待对方连接,ESTABLISHED表示完成连接并正在进行数据通信

协议栈收到请求消息后,会委托TCP模块,TCP按照网络包的长度对数据进行拆分,在每个包前面加一个TCP头部(保存客户端和服务器互相联络时交换的控制信息),网络包由头部和数据两部分构成的,大家可以把它理解为快递包裹的面单;头部后面就是委托方要发送给对方的数据,也就相当于快递包裹里的货物。

接下来TCP模块会将信息传递给IP模块进行发送,IP模块会生成包含接收方IP地址的IP头部,将其附加在TCP头部前面,同时IP模块还会在IP头部前面加上MAC头部,因为IP协议会委托以太网协议将包发送出去,可是以太网的世界不认识TCP/IP的。

MAC头部主要是接收方和发送方的MAC地址,发送方的MAC地址可以从网卡读取,但是接收方MAC地址如何获得呢?这时候需要ARP协议。ARP就是对同一以太网中的所有设备进行广播查询MAC地址,不过每次这样查询会很浪费时间,因此ARP也是有缓冲的。

IP 生成的网络包只是存放在内存中的一串数字信息,没有办法直接发送给对方,因此需要将IP包转换成电或光信号发送出去,负责执行这一操作的是网卡,但网卡也无法单独工作,要控制网卡还需要网卡驱动程序。

网卡驱动程序收到IP发来的包,将其转交给网卡并发出发送指令,网卡检查以太网的可发送状态,将包转换成电信号通过双绞线发送出去。

网卡驱动从IP模块取得包,之后将其复制到缓冲区,MAC模块从缓冲区获得包,在包的开头加报头和起始帧分界符,在末尾加上用于检测错误的FCS(帧校验序列)。

三、 从网线到网络设备

网卡将网络包转换成电信号发送出去,信号通过双绞线到达集线器,集线器将信号广播到所有端口号,这样信号便到了交换机,交换机根据收到的包的接收方MAC地址查询自身的地址表找到输出端口,并将包转发到输出端口。网络包经过集线器和交换机之后,现在到达了路由器,路由器根据路由表的IP地址信息判断转发目标

四、四通过接入网进入互联网内部

客户端计算机可以通过家庭或公司的局域网接入互联网,也可以单独直接接入互联网。连接用户和互联网的入口线路叫接入网,接入网的线路有多种,一般家用的接入网方式包括ADSL、FTTH等,公司还可能使用专线。互联网基本结构和家庭、公司网络是相同的,也是通过路由器转发的。

互联网的实体并不是由一个组织运营管理的单一网络,而是由多个运营商网络相互连接组成的。

五、 网络包进入Web服务器所在的局域网

通过骨干网后,网络包会最终到达Web服务器所在的局域网,接着,它会遇到防火墙,防火墙对进入的包进行检查,检查完之后,网络包可能还是不能到达Web服务器,因为如果大量请求到达服务器时,服务器的压力巨大,会导致服务器的性能跟不上。因此可以通过将请求平均分配给多台服务器来平衡负载,也可以使用缓冲服务器分担压力。缓存服务器就是一种按功能来分担负载的方法,即将整个系统按功能分成不同的服务器,如 Web 服务器、数据库服务器。缓存服务器是一台通过代理机制对数据进行缓存的服务器。代理介于Web 服务器和客户端之间,具有对 Web 服务器访问进行中转的功能。

接下来聊聊正向代理和反向代理

正向代理:由客户端发送对某一个目标服务器的请求,代理服务器在中间将请求转发给该目标服务器,目标服务器将结果返回给代理服务器,代理服务器再将结果返回给客户端。客户端并没有直接与服务器相连。正向代理隐藏了真实的客户端地址。可以很好地保护客户端的安全性。

反向代理:由客户端发起对代理服务器的请求,代理服务器在中间将请求转发给某一个服务器,服务器将结果返回给代理服务器,代理服务器再将结果返回给客户端。

正向代理和反向代理核心区别代理对象不同,正向代理是代理客户端,反向代理是代理服务器,正向代理隐藏真实客户端,反向代理隐藏真实服务端。

六、 请求到达Web服务器

(1)到达服务器的网络包本质是电信号或者光信号,因此首先是网卡将信号转换为数字信号。

(2)当网络包转交到协议栈时,IP 模块会首先开始工作,检查 IP 头部,判断是不是发给自己的。

(3)IP模块再将包转交给TCP或者UDP模块。

(4)Web服务器将请求的URI转换为实际的文件名

Web服务器还好检查URI指定的文件是一个程序还是一个HTML文档或者图片,如果是图片等内容直接将文件内容作为响应消息返回客户端就可以了。服务器一般通过文件的扩展名来分别是程序还是其他内容,如果是文件扩展名是.cgi、.php等即为程序。如果是程序,Web服务器会委托操作系统运行它,然后将程序的运行结果返回给服务器。

服务器程序的结构可以分成两个模块,即等待连接模块和负责与客户端通信的模块,当服务器程序启动并读取配置文件完成初始化操作后,就会运行等待连接模块(a)。这个模块会创建套接字,然后进入等待连接的暂停状态。接下来,当客户端连发起连接时,这个模块会恢复运行并接受连接,然后启动客户端通信模块(b),并移交完成连接的套接字。接下来,客户端通信模块(b)就会使用已连接的套接字与客户端进行通信,通信结束后,这个模块就退出了。

讲一个具体的服务器——Tomcat处理请求的流程

1.Connector组件的Acceptor监听客户端套接字连接并接收Socket。

2.Connector把需求交给Engine,等待Engine的回应。

3.Engine挑选合适的Host,将请求交给它处理。

4.Host挑选合适的Context,将请求交给它处理。

5.Context寻找合适的Servlet,Servlet执行逻辑。

6.Context将执行结果生成HttpServletResponse对象,将它返回给Host,Host将结果返回给Engine,Engine将结果返回Connector,Connector将结果返回给客户Browser。

当服务器对请求消息处理完成,就可以返回响应信息了。响应信息的结构如下,第一行的内容为状态码和响应短语,用来表示请求的执行结果是成功还是出错,之后是消息头,空行以及消息体。

(1)1xx(临时响应)表示临时响应并需要请求者继续执行操作的状态代码。

100   (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。

101   (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。

(2)2xx (成功)  表示成功处理了请求的状态代码。

200   (成功)  服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。

201   (已创建)  请求成功并且服务器创建了新的资源。

202   (已接受)  服务器已接受请求,但尚未处理。

203   (非授权信息)  服务器已成功处理了请求,但返回的信息可能来自另一来源。

204   (无内容)  服务器成功处理了请求,但没有返回任何内容。

205   (重置内容) 服务器成功处理了请求,但没有返回任何内容。

206   (部分内容)  服务器成功处理了部分 GET 请求。

(3)3xx (重定向)表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。

300   (多种选择)  针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。

301   (永久移动)  请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。

302   (临时移动)  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

303   (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。

304   (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。

305   (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。

307   (临时重定向)  服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

(4)4xx(请求错误)这些状态代码表示请求可能出错,妨碍了服务器的处理。

400   (错误请求) 服务器不理解请求的语法。

401   (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。

403   (禁止) 服务器拒绝请求。

404   (未找到) 服务器找不到请求的网页。

405   (方法禁用) 禁用请求中指定的方法。

406   (不接受) 无法使用请求的内容特性响应请求的网页。

407   (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。

408   (请求超时)  服务器等候请求时发生超时。

409   (冲突)  服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。

410   (已删除)  如果请求的资源已永久删除,服务器就会返回此响应。

411   (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。

412   (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。

413   (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。

414   (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。

415   (不支持的媒体类型) 请求的格式不受请求页面的支持。

416   (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。

417   (未满足期望值) 服务器未满足"期望"请求标头字段的要求。

(5)5xx(服务器错误) 这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。

500   (服务器内部错误)  服务器遇到错误,无法完成请求。

501   (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。

502   (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。

503   (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。

504   (网关超时)  服务器作为网关或代理,但是没有及时从上游服务器收到请求。

505   (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。

浏览器收到响应数据,开始渲染页面,渲染页面步骤如下:

1.根据html文件构建DOM树和CSSOM树。构建DOM树期间,如果遇到JS,阻塞DOM树及CSSOM树的构建,优先加载JS文件,加载完毕,再继续构建DOM树及CSSOM树。

2.构建渲染树(Render Tree)。

3.页面的重绘(repaint)与重排(reflow,也有称回流)。页面渲染完成后,若JS操作了DOM节点,根据JS对DOM操作动作的大小,浏览器对页面进行重绘或是重排

从输入网址到收到响应的详细过程相关推荐

  1. 从输入网址到页面呈现的详细过程

    从输入网址到页面呈现的详细过程 面试题经典题目,简要回答如下: a.域名解析 b.发起TCP连接的三次握手 c.建立TCP连接后发起http请求 d.服务端响应http请求,返回响应报文 e.浏览器页 ...

  2. 一个请求到响应的详细过程

    一个请求到响应的详细过程 1,需要提前了解的东西 1.1 http无状态协议 1.2 会话机制 2 详解HTTP,session,cookie 2.1 HTTP 2.1.1 HTTP请求报文和HTTP ...

  3. 浏览器输入网址到浏览器渲染页面的过程

    1) 在客户端浏览器中输入网址URL. 2) 发送到DNS(域名服务器)获得域名对应的WEB服务器的IP地址. 3) 客户端浏览器与WEB服务器建立TCP(传输控制协议)连接. 4) 客户端浏览器向对 ...

  4. --从输入URL到页面展示的详细过程

    基本过程 1.输入网址 2.DNS解析 3.建立tcp连接 4.客户端发送HTPP请求 5.服务器处理请求 6.服务器响应请求 7.浏览器展示HTML 8.浏览器发送请求获取其他在HTML中的资源. ...

  5. 从输入URL到页面展示的详细过程

    其实从输入URL到页面展示在我们眼前所经历的过程其实还是非常复杂的,牵扯到的知识点也是非常的庞杂.其中很多知识都会有专门的学科去研究,所以这里只是简单地概括一下大致流程: 1.输入网址 2.DNS解析 ...

  6. 浏览器之旅:从输入网址到页面呈现的神秘过程揭秘(一)

    亲爱的IT战友们,今天我们要一起探讨一个平时经常遇到,却容易忽视的话题:当我们在浏览器中输入一个网址,按下回车键,神奇的事情就发生了--网页渲染出来!这个过程到底经历了哪些环节呢?一起来揭开神秘的面纱 ...

  7. 1、请简述DNS的作用,并说明当你输入网址“www.nxtc.edu.cn“按下回车后,DNS是怎么工作的?(关键步骤可以给出相应图示) 2、详细描述域名劫持攻击的过程及防御方式。

    一.请简述DNS的作用,并说明当你输入网址"www.nxtc.edu.cn"按下回车后,DNS是怎么工作的?(关键步骤可以给出相应图示) DNS的作用: 把网址解析转化成ip地址, ...

  8. 输入网址按回车,到底发生了什么

    详解输入网址点击回车,后台到底发生了什么.透析 HTTP 协议与 TCP 连接之间的千丝万缕的关系.掌握为何是三次握手四次挥手?time_wait 存在的意义是什么?全面图解重点问题,再也不用担心面试 ...

  9. 如何向学妹解释在地址栏中输入网址后发生了什么?

    前几天有个学妹问我为什么在浏览器里面输了网址就会显示出来页面,虽然这个现象很常见,但是要想解释清楚确实有些小困难,当时也只是简单的回答了她,现在想趁着这个机会好好整理下相关知识.整理完才觉得其实就和我 ...

最新文章

  1. 【学习笔记】16、常用内置函数(Built-in Functions)
  2. Transformer architecture的解释
  3. shell编程详解(一)
  4. Java IO: RandomAccessFile
  5. oracle监听管理工具,oracle监听器管理
  6. 简述台式计算机创建家庭组的步骤,如何创建和设置家庭组
  7. Python深度学习(Deep Learning with Python) 中文版+英文版+源代码
  8. Deep Learning 博文推荐和学习资料
  9. 3月25日 插值-样条插值
  10. 用Python模拟一个区域广播通信网络 2020年4月认证杯数学建模比赛代码
  11. 报表工具能实现怎么的导出效果?
  12. 国家公祭日悼念:黑白网页背景设置教程
  13. 苏州最新税前税后计算机,苏州税前税后工资计算标准
  14. matlab linux x11 display,Xming安裝 + X11-Forwarding使用
  15. 配置fedora 33
  16. 软件工程(速成)——第一章 软件与软件工程
  17. 计算机网络故障的一般识别与解决方法 论文,计算机网络常见故障的一般识别与解决方法-职业学院毕业论文.doc...
  18. <JVM上篇:内存与垃圾回收篇>13-垃圾回收器
  19. 再挤牙膏 2018年英特尔八代酷睿处理器你仍会失望
  20. Kali之Crunch:自定义字典

热门文章

  1. ZigBee设备OTA过程研究及优化
  2. 使用ProcMon 输出调试信息
  3. 萌新改代码系列(一)--VINS+GPS
  4. SpringBoot整合Elasticsearch,中软国际java二面华为面试
  5. c语言限速编程,一种基于c语言的列车限速曲线计算方法和装置的制造方法
  6. open-falcon原理以及使用(不断更新)
  7. 搭载固态硬盘的服务器究竟比机械硬盘快多少
  8. 愤怒的小鸟游戏开发教程(持续更新)
  9. 开手游要选用怎么样的服务器
  10. 【Yocto学习入门】01 - Yocto简介