从输入一个URL到页面呈现,网络上都发生了什么?

时间:2021-01-24 16:23:35

归纳一下其中涉及到前端的一些基础知识,主要包括:http协议、web标准、w3c标准等。
       这个问题虽然只有两个2个动作:输入URL和呈现页面,但这背后发生了很多"有趣"的事情,这个过程也涉及到很多方面的技术,包括像浏览器、DNS、http、html、服务器等。如果让我来回答,它大致的过程应该是这样的:DNS解析-->建立连接,发送数据包 -->服务器响应请求,返回给浏览器-->浏览器渲染程序页面。

1.DNS解析
      当我搜索这个问题的时候,首先在浏览器输入了一个URL地址,但URL中服务器地址是一个域名而不是一个指定的IP地址,路由器并不知道你想要查找的地址,那么DNS域名解析系统会将该域名解析成ip,而IP地址是唯一的, 每一个ip地址对应网络上的一台计算机。
                                                                                                                       从输入一个URL到页面呈现,网络上都发生了什么?
      URL(Uniform Resoure Locator)统一资源定位器,URL的组成:<scheme>资源类型+<host>服务器地址(域名/ip):<port>端口号/path路径(服务器资源的路径)
    
      2.建立网络连接,发送数据包
      由于1的努力,已经能够根据ip和端口号与网络上对应的服务器建立连接,浏览器这边会向服务器发送一个数据包,里面包含了大量的信息,但这个数据包有一定的格式。就像我给你邮个快递,也得遵循邮递公司的一些规则吧!我得写上我的身份信息、寄的物品、标明邮递地址....道理是一样的,到了网络中这些规则就是“Http协议(网络协议)”。
                                                                                 从输入一个URL到页面呈现,网络上都发生了什么?
       涉及到的一些问("面试")题:
       什么是http协议?它的主要内容。
       http协议是客户端和服务器端两者通信共同遵循的一些规则。主要内容是定义了客户端如何向服务器请求资源,服务器如何响应客户端请求。
       请求中的POST与 GET方法有什么区别?
          1.根据HTTP规范,GET用于信息获取,而且应该是安全的,这里的安全是指非修改的信息,就像在数据库执行查询一样,不会修改数据,也不会增加删减数据,不会影响资源的状态,而post可能会改变数据的原始状态。
          2.GET提交的数据最多只有1024字节,理论上POST是没有限制的。
          3.从请求的URL中可以找到一个区别:GET请求的数据会附在URL之后,在浏览器URL栏就能看的。似乎POST比GET更可靠一些,因为它请求把提交的数据放在包体中,地址栏上不可见。(也有的解释说两者都没有长度限制,根本的区别就是一个是获取数据,一个修改数据!)
                                                                                    
      3.服务器响应请求,返回给浏览器
       服务器会分解你的数据包,例如你查找的是一个文档,那么服务器可能会返回一个doc文档或者zip压缩资源给你;如果你访问的是一个链接页面,那么服务器相应的返回一个包含HTML/CSS标记文档,这些请求和响应都有一个通用的写法,这些规则也就是前面提到的"http协议"。
      客户端向服务器请求资源时,除了告诉服务器要请求的资源,同时还会附带一些其他的信息,这部分信息放在"header"部分(服务器响应请求也一样!),主要有请求头(略)和响应头,这里以响应头部信息为例:
                       从输入一个URL到页面呈现,网络上都发生了什么?

http响应头详解
       Request URL:https://static.zhihu.com/static/revved/-/css/m.652b53b3.css
       Request Method:GET
       Status Code:200 OK (from cache)
       Remote Address:123.125.110.16:443
       Response Headers
       accept-ranges:bytes //在整个返回体中本部分的字节位置
       access-control-allow-origin:*//跨域请求,*则允许所有域名的脚本访问该资源。
       cache-control:max-age=600  //指定请求和响应遵循的缓存机制,当你请求头里设置no-cache时,是告诉服务器我这里没有缓存。响应头里这里设置的时间是600,意思浏览器600秒之内别来找我,自己去缓存找吧!
       content-encoding:gzip   // web服务器支持的返回内容压缩编码类型为gzip,web服务器表明自己使用了什么压缩方法。
       content-length:49207 //资源长度
       content-type:text/css //告诉客户端,资源文件的类型,一般还有字符编码,例如charset=UTF-8,客户端将通过utf-8对资源进行解码,然后对资源进行html解析。
       date:Mon, 07 Mar 2016 12:23:37 GMT//记录时间
       expires:Mon, 07 Mar 2016 12:33:37 GMT //表明该实体将于什么时候过期
       last-modified:Mon, 07 Mar 2016 07:19:19 GMT//请求资源的最后修改时间
       server:nnws/1.7.3.6 //服务器信息,by the way!这是啥服务器?
       status:200 OK //状态码
       version:HTTP/1.1 //http协议版本1.1
       x-cache-lookup:Hit From MemCache Gz //查看服务器中是否有某个网页缓存,有则返回Hit,没有返回Miss
看到http响应状态码我突然想到了404,= =!顺便带几个常见的:
       100  Continue  继续,一般在发送post请求时,已发送了http、header之后服务端将返回此信息,表示确认,之后发送具体参数信息
       200 OK   正常返回信息
       201  Created  请求成功并且服务器创建了新的资源
       301  Moved Permanently  请求的网页已永久移动到新位置。
       400 Bad Request  服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求。
       404 Not Found  找不到如何与 URI 相匹配的资源。   
       500 Internal Server Error  最常见的服务器端错误。

4.浏览器渲染呈现
         浏览器拿到响应的页面代码,将其解析呈现在用户面前,至于为什么会是看到的这个样子,有时又是另外的一些页面效果,这里就涉及到web标准了,也就是我们经常提到的w3c标准。根据资源的类型,在网页上呈现给用户,这个过程叫网页渲染。解析和呈现的过程主要由浏览器的渲染引擎实现,浏览器的渲染引擎质量就决定了浏览器的好坏(引擎这一块已经超出了我的理解范围了)。
       W3c标准:
        web标准不是某一个标准,而是一系列标准的集合。
        网页主要由三部分组成:结构(Structure)、表现(Presentation)和行为(Behavior)。
        对应的标准也分三方面:结构化标准语言主要包括XHTML和XML,表现标准语言主要包括CSS,行为标准主要包括对象模型(如W3C DOM)、ECMAScript等。这些标准大部分由万维网联盟(外语缩写:W3C)起草和发布,也有一些是其他标准组织制订的标准,比如ECMA(European Computer Manufacturers Association)的ECMAScript标准。
        HTML、XHTML、XML三者有什么区别?
        从名字上基本可以看出点端倪,HTML是超文本标记语言,XHTML是可扩展超文本标记语言,XHTML比HTML更加规范、严格。其实是用xml语意重新定义了html,XHTML是扮演者html角色的可扩展标记语言(就是XML)。XHTML是一个过渡技术,结合了XML的强大功能,及大多数html的基本特性。可以这么认为:XHTML=XML+HTML,XHTML被创造出来的目的是取代HTML,显然它并没有完成历史使命。
        为什么HTML5里面我们不需要DTD(Document Type Definition文档类型定义)?
HTML5使用最新的HTML标准,它并没有使用SGML或者XHTML,但是你仍然需要使用<! DOCTYPE html>让浏览器识别这是HTML文档。
        顺便带一下SGML
        SGML(标准通用标记语言)是一个标准,告诉我们怎么去指定文档标记。他是只描述文档标记应该是怎么样的元语言,HTML是被用SGML描述的标记语言。
因此利用SGML创建了HTML参照和必须共同遵守的DTD,你会经常在HTML页面的头部发现“DOCTYPE”属性,用来定义用于解析目标DTD。(2016-3-8晚补充更新)
    
     但实际上输入URL到页面呈现这背后涉及的内容远远不止这些,例如后台web服务器、双向的网络数据传输、http缓存策略等,这些知识没有时间再去罗列!归纳一下其中涉及到前端的一些基础知识,主要包括:http协议、web标准、w3c标准等。
       这个问题虽然只有两个2个动作:输入URL和呈现页面,但这背后发生了很多"有趣"的事情,这个过程也涉及到很多方面的技术,包括像浏览器、DNS、http、html、服务器等。如果让我来回答,它大致的过程应该是这样的:DNS解析-->建立连接,发送数据包 -->服务器响应请求,返回给浏览器-->浏览器渲染程序页面。

1.DNS解析
      当我搜索这个问题的时候,首先在浏览器输入了一个URL地址,但URL中服务器地址是一个域名而不是一个指定的IP地址,路由器并不知道你想要查找的地址,那么DNS域名解析系统会将该域名解析成ip,而IP地址是唯一的, 每一个ip地址对应网络上的一台计算机。
                                                                                                                       从输入一个URL到页面呈现,网络上都发生了什么?
      URL(Uniform Resoure Locator)统一资源定位器,URL的组成:<scheme>资源类型+<host>服务器地址(域名/ip):<port>端口号/path路径(服务器资源的路径)
    
      2.建立网络连接,发送数据包
      由于1的努力,已经能够根据ip和端口号与网络上对应的服务器建立连接,浏览器这边会向服务器发送一个数据包,里面包含了大量的信息,但这个数据包有一定的格式。就像我给你邮个快递,也得遵循邮递公司的一些规则吧!我得写上我的身份信息、寄的物品、标明邮递地址....道理是一样的,到了网络中这些规则就是“Http协议(网络协议)”。
                                                                                 从输入一个URL到页面呈现,网络上都发生了什么?
       涉及到的一些问("面试")题:
       什么是http协议?它的主要内容。
       http协议是客户端和服务器端两者通信共同遵循的一些规则。主要内容是定义了客户端如何向服务器请求资源,服务器如何响应客户端请求。
       请求中的POST与 GET方法有什么区别?
          1.根据HTTP规范,GET用于信息获取,而且应该是安全的,这里的安全是指非修改的信息,就像在数据库执行查询一样,不会修改数据,也不会增加删减数据,不会影响资源的状态,而post可能会改变数据的原始状态。
          2.GET提交的数据最多只有1024字节,理论上POST是没有限制的。
          3.从请求的URL中可以找到一个区别:GET请求的数据会附在URL之后,在浏览器URL栏就能看的。似乎POST比GET更可靠一些,因为它请求把提交的数据放在包体中,地址栏上不可见。(也有的解释说两者都没有长度限制,根本的区别就是一个是获取数据,一个修改数据!)
                                                                                    
      3.服务器响应请求,返回给浏览器
       服务器会分解你的数据包,例如你查找的是一个文档,那么服务器可能会返回一个doc文档或者zip压缩资源给你;如果你访问的是一个链接页面,那么服务器相应的返回一个包含HTML/CSS标记文档,这些请求和响应都有一个通用的写法,这些规则也就是前面提到的"http协议"。
      客户端向服务器请求资源时,除了告诉服务器要请求的资源,同时还会附带一些其他的信息,这部分信息放在"header"部分(服务器响应请求也一样!),主要有请求头(略)和响应头,这里以响应头部信息为例:
                       从输入一个URL到页面呈现,网络上都发生了什么?

http响应头详解
       Request URL:https://static.zhihu.com/static/revved/-/css/m.652b53b3.css
       Request Method:GET
       Status Code:200 OK (from cache)
       Remote Address:123.125.110.16:443
       Response Headers
       accept-ranges:bytes //在整个返回体中本部分的字节位置
       access-control-allow-origin:*//跨域请求,*则允许所有域名的脚本访问该资源。
       cache-control:max-age=600  //指定请求和响应遵循的缓存机制,当你请求头里设置no-cache时,是告诉服务器我这里没有缓存。响应头里这里设置的时间是600,意思浏览器600秒之内别来找我,自己去缓存找吧!
       content-encoding:gzip   // web服务器支持的返回内容压缩编码类型为gzip,web服务器表明自己使用了什么压缩方法。
       content-length:49207 //资源长度
       content-type:text/css //告诉客户端,资源文件的类型,一般还有字符编码,例如charset=UTF-8,客户端将通过utf-8对资源进行解码,然后对资源进行html解析。
       date:Mon, 07 Mar 2016 12:23:37 GMT//记录时间
       expires:Mon, 07 Mar 2016 12:33:37 GMT //表明该实体将于什么时候过期
       last-modified:Mon, 07 Mar 2016 07:19:19 GMT//请求资源的最后修改时间
       server:nnws/1.7.3.6 //服务器信息,by the way!这是啥服务器?
       status:200 OK //状态码
       version:HTTP/1.1 //http协议版本1.1
       x-cache-lookup:Hit From MemCache Gz //查看服务器中是否有某个网页缓存,有则返回Hit,没有返回Miss
看到http响应状态码我突然想到了404,= =!顺便带几个常见的:
       100  Continue  继续,一般在发送post请求时,已发送了http、header之后服务端将返回此信息,表示确认,之后发送具体参数信息
       200 OK   正常返回信息
       201  Created  请求成功并且服务器创建了新的资源
       301  Moved Permanently  请求的网页已永久移动到新位置。
       400 Bad Request  服务器无法理解请求的格式,客户端不应当尝试再次使用相同的内容发起请求。
       404 Not Found  找不到如何与 URI 相匹配的资源。   
       500 Internal Server Error  最常见的服务器端错误。

4.浏览器渲染呈现
         浏览器拿到响应的页面代码,将其解析呈现在用户面前,至于为什么会是看到的这个样子,有时又是另外的一些页面效果,这里就涉及到web标准了,也就是我们经常提到的w3c标准。根据资源的类型,在网页上呈现给用户,这个过程叫网页渲染。解析和呈现的过程主要由浏览器的渲染引擎实现,浏览器的渲染引擎质量就决定了浏览器的好坏(引擎这一块已经超出了我的理解范围了)。
       W3c标准:
        web标准不是某一个标准,而是一系列标准的集合。
        网页主要由三部分组成:结构(Structure)、表现(Presentation)和行为(Behavior)。
        对应的标准也分三方面:结构化标准语言主要包括XHTML和XML,表现标准语言主要包括CSS,行为标准主要包括对象模型(如W3C DOM)、ECMAScript等。这些标准大部分由万维网联盟(外语缩写:W3C)起草和发布,也有一些是其他标准组织制订的标准,比如ECMA(European Computer Manufacturers Association)的ECMAScript标准。
        HTML、XHTML、XML三者有什么区别?
        从名字上基本可以看出点端倪,HTML是超文本标记语言,XHTML是可扩展超文本标记语言,XHTML比HTML更加规范、严格。其实是用xml语意重新定义了html,XHTML是扮演者html角色的可扩展标记语言(就是XML)。XHTML是一个过渡技术,结合了XML的强大功能,及大多数html的基本特性。可以这么认为:XHTML=XML+HTML,XHTML被创造出来的目的是取代HTML,显然它并没有完成历史使命。
        为什么HTML5里面我们不需要DTD(Document Type Definition文档类型定义)?
HTML5使用最新的HTML标准,它并没有使用SGML或者XHTML,但是你仍然需要使用<! DOCTYPE html>让浏览器识别这是HTML文档。
        顺便带一下SGML
        SGML(标准通用标记语言)是一个标准,告诉我们怎么去指定文档标记。他是只描述文档标记应该是怎么样的元语言,HTML是被用SGML描述的标记语言。
因此利用SGML创建了HTML参照和必须共同遵守的DTD,你会经常在HTML页面的头部发现“DOCTYPE”属性,用来定义用于解析目标DTD。(2016-3-8晚补充更新)
    
     但实际上输入URL到页面呈现这背后涉及的内容远远不止这些,例如后台web服务器、双向的网络数据传输、http缓存策略等,这些知识没有时间再去罗列!