精华内容
下载资源
问答
  • about:blankWhile most people prefer to use a specific webpage as the home page in their web browser, others have chosen to use about:blank instead. Is about:blank simply a blank webpage or does it hav...
    about:blank

    about:blank

    what-is-the-about-blank-page-in-web-browsers-for

    While most people prefer to use a specific webpage as the home page in their web browser, others have chosen to use about:blank instead. Is about:blank simply a blank webpage or does it have a special purpose? Today’s SuperUser Q&A post has the answers to a curious reader’s questions.

    尽管大多数人喜欢在其网络浏览器中使用特定的网页作为主页,但其他人则选择使用about:blank。 about:blank仅仅是一个空白网页,还是有特殊目的? 今天的“超级用户问答”帖子回答了好奇的读者的问题。

    Today’s Question & Answer session comes to us courtesy of SuperUser—a subdivision of Stack Exchange, a community-driven grouping of Q&A web sites.

    今天的“问答”环节由SuperUser提供,它是Stack Exchange的一个分支,该社区是由社区驱动的Q&A网站分组。

    问题 (The Question)

    SuperUser reader “Guy named Jon” wants to know what the about:blank page in web browsers is for:

    超级用户阅读器“ Guy named Jon”想知道Web浏览器中的about:blank页面的用途是:

    What is the about:blank page in a web browser used for? I was just wondering why it is there. Is it an actual webpage or just something that is built in? It seems to be completely empty except for the header and body.

    网络浏览器中的about:blank页面用于什么? 我只是想知道为什么它在那里。 它是实际的网页还是内置的? 除标题和正文外,它似乎完全是空的。

    What is the about:blank page in web browsers for?

    Web浏览器中的about:blank页面是什么?

    答案 (The Answer)

    SuperUser contributors Keltari and bwDraco have the answer for us. First up, Keltari:

    超级用户贡献者Keltari和bwDraco为我们提供了答案。 首先,Keltari:

    It is simply a blank page that is built into some web browsers. Some people just like to have a blank page rather than see/load anything else when they start their web browser or open a new tab/page.

    它只是一些Web浏览器内置的空白页面。 有些人只是喜欢空白页,而不喜欢在启动Web浏览器或打开新的标签/页面时看到/加载其他内容。

    Followed by the answer from bwDraco:

    随后是bwDraco的回答:

    The about URI scheme is designated for internal web browser use. It originated in Netscape Navigator, the web browser that gave rise to Mozilla Firefox. This includes about:blank.

    about URI方案指定供内部Web浏览器使用。 它起源于Netscape Navigator ,这是Web浏览器,产生了Mozilla Firefox。 这包括about:blank。

    Per IETF RFC 6694, about:blank is reserved for a blank page. Essentially, every web browser that supports about implements about:blank and it is pretty much the same everywhere.

    根据IETF RFC 6694 ,about:blank保留用于空白页。 本质上,每个支持about的Web浏览器都实现about:blank,并且到处都差不多。

    Because about:blank is little more than a blank internal page, it does not depend on any external resources and serves as a good default on metered connections or slow systems.

    因为about:blank只不过是空白的内部页面,所以它不依赖任何外部资源,并且在计量连接或速度较慢的系统上可以作为默认设置。



    Have something to add to the explanation? Sound off in the comments. Want to read more answers from other tech-savvy Stack Exchange users? Check out the full discussion thread here.

    有什么补充说明吗? 在评论中听起来不错。 是否想从其他精通Stack Exchange的用户那里获得更多答案? 在此处查看完整的讨论线程

    翻译自: https://www.howtogeek.com/264181/what-is-the-aboutblank-page-in-web-browsers-for/

    about:blank

    展开全文
  • 编码与解码-浏览器什么浏览器是如何解码的浏览器基本的工作流程编码和解码发生的顺序URL 解析HTML 解析CSS 的编码问题JS 解释器总结 浏览器是如何解码的 无论是作为开发,还是作为黑客,企图从Web 端注入SQL,...

    不论是xss还是注入的各种编码绕过,不搞清楚浏览器的工作原理即使绕过成功了一定还是会让人迷迷糊糊的,找到一篇讲的比较好的文章,转载记录方便以后查,转来这里有很多缺图和错误,建议去看原文:
    https://www.jianshu.com/p/cfdf1747d30e

    浏览器是如何解码的

    无论是作为开发,还是作为黑客,企图从Web 端注入SQL,或者是XSS 的时候,编码和解码都是一个重要的问题、作为一个浏览器,有URL解析引擎,有HTML解析引擎,还有JS 解析引擎。其执行的先后顺序往往决定了输出的结果。这种多标签语言互相嵌入的,同时又需要客户端服务器交互的技术,正是给了XSS 可趁之机。下面我们要做的,是去了解浏览器到底如何解码,该如何在解码过程中避免漏洞的产生。在此之上,我更愿意揭开整个浏览器的工作流程,了解其本质。

    这里有篇神文How browsers work, 也是本篇文章的重要参考。

    浏览器基本的工作流程

    进入主话题之前,先闲扯一些废话,先罗列一下浏览器的主要构成:

    用户界面- 包括地址栏、后退/前进按钮、书签目录等,也就是你所看到的除了用来显示你所请求页面的主窗口之外的其他部分
    浏览器引擎- 用来查询及操作渲染引擎的接口
    渲染引擎- 用来显示请求的内容,例如,如果请求内容为html,它负责解析html及css,并将解析后的结果显示出来
    网络- 用来完成网络调用,例如http请求,它具有平台无关的接口,可以在不同平台上工作
    UI 后端- 用来绘制类似组合选择框及对话框等基本组件,具有不特定于某个平台的通用接口,底层使用操作系统的用户接口
    JS解释器- 用来解释执行JS代码
    数据存储- 属于持久层,浏览器需要在硬盘中保存类似cookie的各种数据,HTML5定义了web database技术,这是一种轻量级完整的客户端存储技术
    

    其组件架构是这样的:

    值得一提的是,对于Chrome 浏览器来说,Chrome 为每个Tab 都分配了各自的渲染引擎,每个Tab 都是一个独立的进程。

    实际上,我们重点关注的就是其中的Rendering engine 和 JavaScript Interpreter ,渲染引擎和解释器。说了那么多废话,我们开始了解浏览器的主流程。

    这是浏览器从接收代码,到渲染完成的过程,从开头我们能看到它有三个主要部分:

    HTML/SVG/XHTML 解析,事实上,Webkit有三个C++的类对应这三类文档。解析这三种文件会产生一个DOM Tree。
    CSS 解析,解析CSS会产生CSS规则树。
    Javascript DOM,主要是通过DOM API和CSSOM API来操作DOM Tree和CSS Rule Tree.
    

    浏览器最早开始解析HTML,将标签转化为内容树中的DOM 节点,此时识别标签的时候,HTML 解析器是无法识别哪些被实体编码的内容的,只有建立起DOM 树,才能对每个节点的内容进行识别,如果出现实体编码,则会进行实体解码。在此基础上,JavaScript DOM API 参与进来,可以对DOM 树进行修改,改变DOM树的结构和内容。而此时,CSS解析器则解析外部CSS 文件以及Style 标签中的样式内容,这些信息将搭配HTML 中的可见指令构建起一个Rendering Tree。

    这里CSS 解析器在构造Redering Tree 之前,为了辅助会有CSS Rule Tree,他是为了完成匹配,然后把CSS Rule 附加给Rendering Tree 上的每个element,也就是每个DOM 节点。其中有一个layout/reflow 的过程,就是为了计算每个frame 位置等信息。

    当然,个人并不是一个Web 开发者,无意在CSS 这一块花费巨大的时间,下面这个视频会很形象的让你感受到layout/reflow 的过程。Gecko reflow visualization

    完成布局之后,使用UI 后端完成每个节点的绘制,完成显示。

    编码和解码发生的顺序

    在看完浏览器工作流程之后(当然,这个流程讲的有点简单了),我们来看一下编码和解码的顺序,对应着工作流程就很容易记清楚了。

    URL 解析

    在这些所有工作流程开始之前,浏览器一定需要有一个URL 来指示资源的位置,为什么刚才没有说呢,因为这个URL 是浏览器发送给服务器的请求信息,其处理工作并不是浏览器的工作。比如我们考虑一段简单的代码:

    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    </head>
    <body>
    <a href="javascript:alert('<?php echo $_GET['input'];?>');">test</a>
    </body>
    </html>
    

    input 内容参数为: %26lt%5cu4e00%26gt

    该值构造在URL 里,浏览器直接发送给服务器,服务器接收之后,先进行URL 解析,看到了% 这个符号,于是URL 解码,input 内容变成了&lt\u4e00&gt,所以对于浏览器从服务器端获取的页面数据来说,此时test 对应的标签变成了如下:

    <a href="javascript:alert('<\u4e00>');">test</a>
    

    这一步完成在所有的工作之前,URL 解码发生在第一部,而且它基本上都发生在服务器上。

    HTML 解析

    浏览器接收到页面数据,于是开始进行HTML 解析,构造DOM树。构造的过程与语言的编译过程是相似的,接收文档,先进行词法分析,然后语法分析,构建解析树。

    解析过程是迭代的,解析器从词法分析器处取道一个新的符号,并试着用这个符号匹配一条语法规则,如果匹配了一条规则,这个符号对应的节点将被添加到解析树上,然后解析器请求另一个符号。如果没有匹配到规则,解析器将在内部保存该符号,并从词法分析器取下一个符号,直到所有内部保存的符号能够匹配一项语法规则。如果最终没有找到匹配的规则,解析器将抛出一个异常,这意味着文档无效或是包含语法错误。

    而最后输出的树,也就是这里的解析树,是由DOM元素及属性节点组成的。对于以下一个最常见的例子:

    <html>
        <body>
            <p>
              Hello DOM
            </p>
            <div><img src=”example.png” /></div>
        </body>
    </html>
    

    它将转换为下面的DOM 树:

    所以,HTML 的分析器只能识别特定的词法规则,才能构建起DOM 树,这一块,HTML 不会做解码的工作,因为它做不了。所以,试图这样构造利用漏洞,是不可能的:

    <img src&#x3d;"http://www.example.com">
    

    因为在构建DOM 树的时候,这样是无法识别的,也就破坏了标签本身的结构。而HTML 解码,是在DOM树结构OK,对节点内容解析的时候,会进行转码,所以以下两种写法,是完全一样的:

    <img src="http://www.example.com">
    <img src="http://www.example.com">
    

    所以,在DOM 树构建完毕之后,这些HTML 实体编码的内容就会被解码。JS 的解释器还没有走进战场。不过由于DOM 的存在,JavaScript还是参与了DOM Tree 的构建过程,这时候,编码的解析就变得绕了一些。在此我们先忽略掉这一个,先继续讲主过程讲完,继续考虑这个代码:

    <a href="javascript:alert('<\u4e00>');">test</a>
    

    HTMl 解析器构建DOM Tree, href中的内容,如果识别为实体编码的,会透明的解码,于是它就变成了这样:

    <a href="javascript:alert('<\u4e00>')">test</a>
    

    CSS 的编码问题

    一般来说,CSS 解析器会做接下来的工作,不过一般来说,为了考虑到更好的体验和性能,并不会等到所有的html都解析完成之后再去构建和布局render树。它是解析完一部分内容就显示一部分内容,同时,可能还在通过网络下载其余内容。

    当然CSS不会干扰到DOM 树的建立,他会结合CSS文件和style 标签,以及HTML中的课件指令来构建起reder tree。这里JavaScrit 的 CSSOM api 也会出一些力。

    CSS 编码解析是用了一套不太正统的转义策略:用一个反斜杠,后边跟1~6位十六进制数字构成。,所以字母e 可以编码为 \65, \065,\000065。而因为这样,后边就不能直接紧跟数字或字母,否则会被当成转义里的内容处理,所以CSS 选择了空格作为终止标识,在解码的时候,再将空格去除。

    同时,CSS还支持直接使用反斜杠对非十六进制字符进行转义的方式,就按紧跟着反斜杠后边的字符的字面意思进行解释,这种机制可用来转义引号和反斜杠本身,不过不能转义HTML 控制的字符,比如尖括号,那是因为HTML 解析器总是先于CSS 解析器。

    由于CSS 转义规定的语焉不详,许多解析器会对本该用引号括起来的字符串进行任意的转义,特别的,在IE 浏览器里,这种转义优先级高于伪函数语法,于是下边两种情况的写法是一样的:

    color:expression(alert(1))
    color:expression\028 alert \028 1 \029 \029
    

    如果对该部分内容感兴趣,可以阅读开始提到的那篇文章,或者是我之前写的一些文章。

    JS 解释器

    上边提到了style ,是建立reder tree 的时候使用的,它怎么工作的呢。考虑到我们的浏览器为了让不同的解析器来工作处理不同的内容,实际上,在处理诸如< script> < style> 这样的标签,解析器会自动切换到特殊解析模式,而src href 后边加入的JavaScript 伪URL,也会进入JS 的解析模式。而进入该解析模式的时候,该DOM节点已经建立起来了。

    还是上边的例子,经过HTML 的解码,代码已经变成这样:

    <a href="javascript:alert('<\u4e00>')">test</a>
    

    javascript 出发了JS 解释器,JS会先对内容进行解析,里边有一个转义字符\u4e00,前导的 \u 表示他是一个Unicode 字符,根据后边的数字,解析为’一’,于是在完成JS的解析之后变成了:

    <a href="javascript:alert('<一>')">test</a>
    

    然后JS 解释器执行alert(“< 一>”),这句话会交给浏览器渲染,最终弹窗。

    这里边会有一个看起来让人有些疑惑的东西,仍以上一段代码为例,假如我们编码的位置不是括号里,而是在alert上,我们知道,js 是会对它进行逆转义的:

    <a href="javascript:\u0061lert('<一>')">test</a>
    

    而另一方面,如果想用这种方式来替换掉圆括号,或者引号,会判定为失败。同时,主要注意的方式,上边这种直接在字符串外进行专一的方式,只有Unicode 转义方式呗支持,其他转义方式则不行。其实,这样的策略是正确的,因为对于JavaScript,转义编码应当只出现在标示符部分,不能用于对语法有真正影响的符号,也就是括号,或者是引号。其实,这样的处理方法,反而是比CSS 更加合理的。

    在一个页面中,可以出发JS 解析器的方式有这么几种:

    直接嵌入< script> 代码块。
    通过< script sr=… > 加载代码。
    各种HTML CSS 参数支持JavaScript:URL 触发调用。
    CSS expression(…) 语法和某些浏览器的XBL 绑定。
    事件处理器(Event handlers),比如 onload, onerror, onclick等等。
    定时器,Timer(setTimeout, setInterval)
    eval(…) 调用。
    

    我们看到,这些藏匿在HTML 便签中的各种JS 调用,就可以想到Web 开发者的头有多大了,我们举一个简单的栗子:

    比如定时器那里,考虑以下代码:

    < script>
    var value = "user_string";
    ...
    setTimeout("do_stuff('"+value+"')", 1000);
    < /script>
    

    表面上看他没有问题,对 value 只做一次转义就好了,但实际呢,考虑其解析过程,首先是HTML 解析出script 块,然后JavaScript 做第一次解析,检查setTimeout 语法,而等到1秒之后,才会解析do_stuff,如果不多做一次转义,就有可能构造成一次注入,比如user_string 中插入一个JavaScript编码的构造,截断前边函数,然后构造自己的攻击部分。

    下面我们说一说DOM,我们知道常见的DOM 操作:

    DOM 常见的方法有:

    获取节点
        getElementsById()
        getElementsByTagName()
        getElementsByClassName()
    新增结点
        document.createElement() 创建节点对象,参数是字符串也就是html标签
        createTextNode 创建文本节点,配合上一个使用
        appendChild(element) 把新的结点添加到指定节点下,参数是一个节点对象
        insertChild() 在指定结点钱插入新的节点
    修改节点
        replaceChild() 节点交换
        setAttribute() 设置属性
    删除节点
        removeChild(element) 删除节点,要先获得父节点然后再删除子节点
    一些属性
        innerHTML 节点内容,可以获取或者设置
        parentNode 当前节点的父节点
        childNode 子节点
        attributes 节点属性
        style 修改样式
    

    这样就有一些疑惑了,之前,我们说了,基本的解析顺序是这样的,URL 解析器,HTML 解析器, CSS 解析器,JS解析器,如果安安静静的按照这个顺序下去,应该很容易理清楚。然而DOM 操作里我们可以看到可以新增节点,也可以修改节点属性,节点的内容和样式都可以修改。那么假如我们使用innerHTML 修改了某节点的内容,让其构成了一个新的节点,那么会有什么效果呢?我在Chrome 上做了一些实验,代码如下:

    <html>
    <body>
    <p id="1">hello</p>
    <img src=# onerror="alert(1)" />
    <script>
    document.getElementById("1").innerHTML = "<img src=# on\u0065rror=alert(1)>";  
    </script>
    <!--<script>
    document.getElementById("1").innerHTML = "<img src="1" οnerrοr="alert(1)">";  
    &#97;
    </script>-->
    </body>
    <html>
    

    一个正常的容易理解的过程是这一行:

    <img src=# onerror="alert(1)" />
    

    HTML 解析到标签,建立DOM 树,然后对节点内容进行实体解码,&#97; 就变成a, 随后在js 解析阶段,正常的触发了弹窗,先后顺序OK。

    但对于下面这段代码:

    <script>
    document.getElementById("1").innerHTML = "<img src=# on\u0065rror=alert(1)>";  
    </script>
    

    使用了DOM 操作,修改前边标签中的内容,添加了一个img 内容,因为进入了script 进入了JavaScript的特殊解析模式,所以此处HTML 不得干扰,首先JavaScript解析器,会先对其中编码的内容解码,于是onerror 就还原回来了,于是正常的执行了JS 语句,在HTML 文档中,将hello 变成了img。

    那么问题来了,如上那样,对onerror 的内容作了HTML 实体编码,会不会弹窗呢? 答案是显然的,该标签传回给HTML,HTML 建立DOM节点,透明的解码节点内容,onerror 又会执行其中的JS 脚本,弹出窗口。

    其实,这里也不难理解,因为HTML 是从上到下解析,遇到< script> 于是进入了特殊的解析模式,使用JS 解析器,做了一个DOM 操作,该DOM 操作修改了前边的DOM 树,该块内容,需要使用HTML 解析重塑DOM 树,那么节点内容中的实体编码就会被解码,然后onerror 中触发脚本,JS 又会对内容进行一次解析。

    这一点很好理解:

    <img src="1" onerror="al\u0065rt(1)" />
    

    如上,内容中有HTML实体编码,还有js 的Unicode 编码,正常弹窗没有问题。

    总结说来,实际上,DOM 操作实际上是js强势介入 HTML 和CSS 的结果,使用DOM 操作,对DOM Tree 造成了改变,会调用到HTML 解析器重新对其解析,于是流程又会返回到最开始说的那个解析流程里去。这样反复的情况,再加上编码的重叠,很容易让开发者无所适从,考虑下面的代码:

    <p id="1">hello</p>
    <img src="1" onerror="al\u0065rt(1)" />
    <script>
    document.getElementById("1").innerHTML = "bye";
    function a(){
    document.getElementById("1").innerHTML = "<img src=# on\u0065rror=alert(1)>";
    }
    function timedMsg()
    {
    var t=setTimeout("a()",5000)
    }
    </script>
    <input type="button" value="111" onClick = "timedMsg()" />
    

    整个页面渲染完毕,而当点击按钮之后,会触发DOM操作的脚本,五秒钟之后,弹窗。

    如果想要修改的内容中有脚本,内容中的脚本部分使用JS编码,再使用HTML 编码,然后再使用JS Unicode编码,那么解码的过程就是先JS 解码,再HTML 解码,再JS 解码,然后执行。

    总结

    其实总的来说,其道理还是易于理解的,只是由于一些特别的操作,造成了一些困扰,于是在编码上,会理不清头绪,如果再此基础上我们再使用String.fromCharCode() 这个一直以来容易被开发者忽略的功能,更会摸不清头脑。

    而正是由于这种摸不清头脑的开发之下,黑客们才有可趁之机,制造各种变体,绕过孱弱的过滤器。

    总体来说,在编码这件事上,只要理清楚,URL解码,HTML解码,CSS解码,JS解码,以及DOM 操作在其中扮演的角色,就基本上能理清楚了。作为一个开发者,安全编码是必须要重视的内容,所以,对于编码,不可以逃避,在构建安全的过滤规则的时候,一定要考虑清楚各种可能的编码绕过的方式,以避免损失。

    如何避免这些漏洞的产生,我会再以后继续写,关于浏览器的解码过程就写到这里吧。对这一问题,仍然还有一些问题有待解决,个人能力有限,其中也有可能存在错误和疏漏,请谅解~

    PS. 参考:开头提到的文章,W3cschool 上各种函数,各种编码。《The Tangled Web》这本神书,和一堆谷歌搜索。

    转载自http://xuelinf.github.io/2016/05/18/%E7%BC%96%E7%A0%81%E4%B8%8E%E8%A7%A3%E7%A0%81-%E6%B5%8F%E8%A7%88%E5%99%A8%E5%81%9A%E4%BA%86%E4%BB%80%E4%B9%88/ 如有侵权,请联系我删除

    展开全文
  • Web浏览器里的那些事

    2019-02-25 19:46:00
    大脑中一直存在误区:一个Web前端工作者只要完美实现产品所提需求,至于浏览器究竟怎么工作或者其中间都经历了些什么事情,就不用刨根问底了。直到最近看见前端大神winter老师关于浏览器部分的系列文章后,方才...

    初衷:

    大脑中一直存在误区:一个Web前端工作者只要完美实现产品所提需求,至于浏览器究竟是怎么工作或者其中间都经历了些什么事情,就不用刨根问底了。直到最近看见前端大神winter老师关于浏览器部分的系列文章后,方才意识到浏览器的这些知识,还得好好研究一番。

    刨根问底:

    1.浏览器如何工作的?

    对于浏览器实现者来说,他们所做的事情就是把一个URL链接变成用户眼睛所能看见的网页。

    1690fb4a114a2976?w=923&h=299&f=png&s=15904

    主要过程描述:
    1.浏览器首先使用HTTP或者HTTPS协议,向服务器端请求页面;
    2.把请求回来的HTML解析,构建为DOM树;
    3.计算DOM树上的CSS属性,对元素逐个进行渲染,得到内存中的位图;
    4.合成位图,绘制到页面上。

    2.http报文头部有哪些字段? 有什么意义 ?

    2.1 HTTP报文:它是HTTP应用程序之间发送的数据块。这些数据块以一些文本形式的元信息开头,这些信息描述了报文的内容及含义,后面跟着可选的数据部分。这些报文都是在客户端、服务器和代理之间流动。

    2.2 所有的HTTP报文都可以分为两类,请求报文和响应报文。它俩结构大致相同,只是起始行的语法不同。

    请求报文的格式:
    
    起始行: <method> <request-URL> <version>
    
    头部:   <headers>
    
    主体:   <entity-body>
    响应报文的格式:
    
    起始行:  <version> <status> <reason-phrase>
    
    头部:    <headers>
    
    主体:    <entity-body>

    主要的http报文头部字段以及其含义:
    169146a28a533778?w=703&h=750&f=png&s=65005
    16924652ff2f4ef8?w=703&h=750&f=png&s=18452

    3.HTTP状态码

    3.1详细的HTTP状态码解释请看这里

    3.2最早之前看过有位大神写过的文章中,描述的简单易记忆版的:

    1XX:Informational(信息性状态码)           接收的信息正在处理
    
    2XX:Success(成功状态码)                  请求正常处理完毕
    
    3XX:Redirection(重定向状态码)            需要进行附加操作已完成请求
    
    4XX:Client Error(客户端错误状态码)        服务器无法处理请求
    
    5XX:Server Error(服务器错误状态码)        服务器处理请求出错

    4.TCP三次握手、四次的过程

    4.1:

    ①TCP:Transmission Control Protocol.传输控制协议

    TCP共有6个标志位,分别是:SYN(synchronous),建立联机;ACK(acknowledgement),确认;PSH(push),传输;FIN(finish),结束;RST(reset),重置;URG(urgent),紧急。

    169235ad88f67e5d?w=818&h=592&f=png&s=24113

    Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源。Client端接收到ACK报文后也向Server段发生ACK报文,并分配资源,这样TCP连接就建立了。
    ②TCP在传输之前会进行三次沟通,一般称为“三次握手”;传输数据断开的时候需要进行四次沟通,一般称为“四次挥手”。

    1692371e872d4f48?w=818&h=571&f=png&s=36357

    断开连接端可以是Client端,也可以是Server端

    假设Client端发起中断连接请求,就先发送FIN报文。Server端接到FIN报文后,但是如果还有数据没有发送完成,则不必急着关闭Socket,可以继续发送数据。所以服务器端先发送ACK,告诉Client端:请求已经收到了,但是我还没准备好,请继续等待停止的消息。这个时候Client端就进入FIN_WAIT状态,继续等待Server端的FIN报文。当Server端确定数据已发送完成,则向Client端发送FIN报文,告诉Client端:服务器这边数据发完了,准备好关闭连接了。Client端收到FIN报文后,就知道可以关闭连接了,但是他还是不相信网络,所以发送ACK后进入TIME_WAIT状态, Server端收到ACK后,就知道可以断开连接了。Client端等待了2MSL后依然没有收到回复,则证明Server端已正常关闭,最后,Client端也可以关闭连接了至此,TCP连接就已经完全关闭了!

    参考文章:这里

    5. get post请求的区别:

    HTTP协议中的两种发送请求的方法;这里更详细

    6.浏览器事件有哪些过程? 为什么一般在冒泡阶段, 而不是在捕获阶段注册监听? addEventListener 参数分别是什么 ?

    浏览器事件一般经历的过程:事件捕获、处于目标阶段、事件冒泡阶段。

    考虑浏览器的兼容性

    addEventListener可接受3个参数:要处理的事件名、作为事件处理程序的函数和一个布尔值。布尔值若为true,表示在捕获阶段调用事件处理程序;若为false,表示在冒泡阶段调用事件处理程序。

    ……(再补)

    结语:

    干瘪的海绵叶叶,迅速膨大吧!

    转载于:https://www.cnblogs.com/zhengyeye/p/10432924.html

    展开全文
  • 详细了解它作为图书馆用户可以做什么以及可以为您做什么。 例子 该库附带许多示例,可以在文件夹中找到它们。 单击链接以获取有关如何运行它们的更多信息。 桌面应用 Threepenny主要用于编写在本地网络上运行的GUI...
  • 问题:请谈谈从浏览器输入URL到拿到网页的整个过程 浏览器了哪些事? 内核协议栈了哪些事? web服务器了哪些事? CDN加速网络服务。 ...看到https,就知道要访问的web服务器,www.baidu.comweb...web浏览器中的g

    问题:请谈谈从浏览器输入URL到拿到网页的整个过程

    • 浏览器做了哪些事?
    • 内核协议栈做了哪些事?
    • web服务器做了哪些事?
    • CDN加速网络服务。

    浏览器

    1. 当你在搜索栏输入https://www.baidu.com/ ,浏览器进行URL解析。
      看到https,就知道要访问的是web服务器,www.baidu.com是web服务器的名字。根据上面的解析结果生成HTTP请求信息。
    2. 浏览器生成了HTTP请求之后(如果业务有加密需要的话,可以使用HTTPS),需要操作系统把数据发出去,内核协议栈用的是IP,并不是域名,所以要进行域名解析。web浏览器中的gethostbyname,就可以获得IP地址。
    3. 获得目标IP地址,浏览器调用socket,委托内核帮忙发送数据。
    4. 发送请求之后,会得到服务器的响应信息,解析报文,对于HTML文件,调用排版引擎、JS引擎等来处理,然后浏览器展示。(近期访问过的网页,很可能缓存在本地,这样再次访问,就不需要去服务器拿数据,提高响应速度)

    PS:gethostbyname函数内部就是生成DNS查询消息,发送UDP查询到DNS服务器,得到DNS服务器的响应,从响应消息中取出IP。国内的三大运营商的通用DNS:144.144.144.144;还可以使用一种更加精准的地址簿查找协议HTTPDNS
    PS:DNS系统是三层树状、分布式服务。目前全球有13台根域名服务器,又有几百台镜像,保证一定能被访问到。在查询域名www.baidu.com对应的IP时,首先访问根域名服务器,它告诉我们com服务器的地址;访问com域名服务器,它告诉我们baidu.com的地址;最后访问baidu.com域名服务器,得到www.baidu.com的地址。

    加速域名解析的一些手段:

    • 在公司内部搭建DNS服务器,缓存域名对应的IP
    • 在操作系统的hosts文件中,记录域名对应的IP地址

    内核协议栈

    HTTP协议底层用的是TCP协议(面向连接的,TCP会保证这个包能够到达目的地。如果不能到达,就会重新发送,直至到达),所以要经过三次握手进行连接,传送数据,最后四次挥手断开连接。内核协议栈主要是将应用层HTTP请求按照TCP/IP协议栈的要求,经过层层封装成帧,然后将报文的类似0101001串转换成电信号发送出去。这里要注意MAC头部的目标机器MAC,是下一跳的MAC,如果当前机器没有缓存,就需要ARP广播,先得到去往目标机器的下一跳机器的MAC。这样才能逐跳转发。还有局域网的IP地址也不能在公网上使用,所以在出网关的时候,IP地址通过NAT转换成公网地址。网关往往是一个路由器,到某个IP地址应该怎么走叫做路由表。常见的路由协议有OSPF和BGP。

    web服务器相关话题

    目标服务器得到客户端的HTTP请求,如果找到相应的资源文件,组成HTTP响应报文,将资源发送回来,如果没有找到,就会给课户端返回404错误。

    目标网站的服务器对外表现是一个IP,为了能够抗住高并发,内部往往是一套非常复杂的架构,入口有负载均衡设备,比如四层的LVS和七层的Nginx,后面又许多服务器构成一个集群。

    负载均衡服务器先访问内存级的缓存,比如redis,把频繁访问的数据缓存几秒到几分钟,减轻后端服务器的压力。如果缓存没有相应的数据,再把请求转发给应用服务器,应用服务器如果需要数据,再访问后端的数据库服务器,为了提高数据库并发能力,可以做成读写分离,目前主流的数据库都实现了这个功能。

    在服务器端如何告诉相关的进程呢?使用往往通过 RPC 调用,即远程过程调用的方式来实现。

    CDN加速网络服务

    CDN的中文名称是内容分发网络,它主要解决的问题是就近访问的问题。CDN分发源站的内容,也就是把源站的内容缓存在各个节点上。用户上网就不直接访问源站的内容,而是访问距离它最近的一个CDN节点,术语叫做边缘节点,其实就是缓存了源站的内容,就是源站的一个代理服务器,避免远距离访问源站,实现网络加速。

    CDN里面缓存的数据,主要是HTML、图片、视频等静态资源。动态资源往往需要源站加载。可以短暂的缓存动态资源,在这段短暂的时间内,动态资源就变成了静态资源,可以被CDN缓存实现加速。

    CDN只能缓存最常见的资源。如果访问的资源就在CDN缓存中,也就是命中了,直接返回客户端;如果没有命中,则要去源站取数据,也叫回源。我们应该尽可能提高命中率,降低回源率。

    总结

    1. 浏览器主要发送HTTP请求,接收HTTP响应,然后进行渲染,展示到界面。
    2. HTTP底层走的是TCP/IP,如果不知道IP,就需要DNS协议解析。
    3. TCP连接后收发HTTP数据包
    4. 为了降低服务器压力,加快访问速度,有很缓存,比如客户端缓存,CDN缓存,负载均衡缓存等

    来源:IT面试真题讲解

    协议的三要素:

    • 语法:这一段内容要符合一定的规则和格式。例如括号要成对,结束要使用分号等
    • 语义:就是这一段内容要代表某种意义。例如数字减去数字是有意义的,数字减去文本是没有意义的
    • 顺序:先干啥后干啥。

    下图是OSI七层模型中的每一层所对应的网络协议:
    在这里插入图片描述

    展开全文
  • 问题其实很简单,你这个web项目可能是做了前后分离,所谓前后分离表现形式就是前端和后台分成了2个服务,所以你的web入口其实是有2个的。你访问前端页面的url请求的服务与后台的服务不是同一个服务,
  • 微信内置浏览器是什么

    万次阅读 多人点赞 2015-02-04 00:35:03
    那么问题来了,我们会用到HTML5的一些新特性,我想知道微信内置的浏览器是使用什么内核的,是直接调用系统的内核还是自己放了一个内核进去呢? 注意:浏览器内核是非常复杂的东西,本文目的主要是帮助和我一样,在...
  • 大家好,我军哥今天分享的系列文章如何用python徒手撸一个web服务器。我们学知识大致都会经历...同理,对于一个做web开发的程序员来说,没有什么比自己写一个web服务器或web框架更能了解web编程的本质了。这个系...
  • 3. 浏览器根据IP地址与目标web服务器在80端口上建立TCP连接4. 浏览器获取请求页面的html代码。5. 浏览器在显示窗口内渲染HTML。6. 窗口关闭时,浏览器终止与服务器的连接。 这其中最有趣的第1步和第2步(...
  • Web浏览器的体系结构 User Interface:用户界面。可以使最终用户能够与界面上所有可视元素进行交互。 Browser Engine:浏览器引擎。浏览器引擎的核心组件,充当用户界面与渲染引擎的中介,根据从用户界面接收到的...
  • Deskreen一个基于electron.js的应用程序,它使用WebRTC将您的桌面实时流传输到任何设备上的Web浏览器。 它构建在顶部为了获得更好的安全性机制,实施了端到端加密,这受到启发。 不同之处在于,它用Typescript重写...
  • 这能做什么? 这段代码试图随着时间的推移学习视频背景的构成,以便我可以尝试从场景中移除任何人。 所有这些都使用TensorFlow.js在浏览器中实时发生的。 #MadeWithTFJS 这一个实验。 并非在所有情况下都...
  • 那么问题来了,我们会用到HTML5的一些新特性,我想知道微信内置的浏览器是使用什么内核的,是直接调用系统的内核还是自己放了一个内核进去呢? 注意:浏览器内核是非常复杂的东西,本文目的主要是帮助和我一样,在...
  • 前端开发,简单来说,就是把平面效果图转换成网页,把静态转换成动态。...Web前端开发工程师,从事Web前端开发工作的工程师。主要进行网站开发,优化,完善的工作。网页制作是Web 1.0时代的产物,那时网
  • 2.前端有没有前景前端的人有一个简称叫Web前端开发工程师,这个职业在十年前一个新兴职业,最近5年越来越受到重视,因为移动互联网时代的普及加上HTML5技术的出现,Web前端开发成为各个企业重要的环节...
  • 众所周知,这就是所谓的B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件。那顺道就来简单的看一下,所谓的Web服务器(例如知名的Tomcat)与浏览器...
  •  - 首先去查找浏览器缓存,浏览器一般会保存你之前访问网站的DNS信息,保存的时间根据浏览器不同有所差异。  - 若浏览器缓存中没有,浏览器系统调用(gethostbyname)访问系统缓存中保存的DNS信息。Windows下...
  • Aaron描述的version-targeting机制完全错误的, 完全倒退的, 和我们应该的事情完全相反的. 在web开发领域浸淫了十多年的我的每条神经都在反对. 为什么我会如此的抗拒? 部分原因目标转换器像"浏览器嗅探...
  • 缓存优点通常所说的Web缓存指的可以自动保存常见http请求副本的http设备。对于前端开发者来说,浏览器充当了重要角色。除此外常见的还有各种各样的代理服务器也可以缓存。当Web请求到达缓存时,缓存从本地副本中...
  • 我们需要了解,你在浏览器地址栏中输入url到页面展示的短短几秒中,浏览器究竟什么,才能了解到为什么我们口中所说的优化方案能够起到优化作用。 浏览器的多进程架构(以下的例子都以chrome为例) chrome由...
  • 什么是沙箱 操作系统层面的沙盒的含义就是操作系统对进程的可访问的内存地址所的限制,限制进程可访问的内存在其被分配的内存...chromium多进程架构,浏览器前端界面由browser进程管理,各个web page的tab属于r
  • 在我还小的时候,WWW(World Wide Web)几乎就是互联网的代名词,上网上网不就是上的WWW吗?等我长大后,我才知道,WWW(万维网)一个平易近人的传道者,它让我们看到了互联网的强大,但它并不是互联网。 ...
  • Flex Web部分浏览器兼容问题解决

    千次阅读 2014-06-05 19:57:11
    照理来说Flex应该没什么兼容性的问题的,但是我的这个web应用却有那么几个问题,在IE8内核的电脑上会出现,部分360浏览器 第一个问题: Flex页面显示不全,由于在我的应用中需要的面积比较大,所以没有用...
  • 众所周知,这就是所谓的B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件。 那顺道就来简单的看一下,所谓的Web服务器(例如知名的Tomcat)与...
  • 众所周知,这就是所谓的B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件。 那顺道就来简单的看一下,所谓的Web服务器(例如知名的Tomcat)与...
  • 什么是浏览器跨域访问操作?js如何实现? 1.什么是跨域?...javascript跨域访问是web开发者经常遇到的问题,什么是跨域,一个域上加载的脚本获取或操作另一个域上的文档属性,下面将列出三种实现jav

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,557
精华内容 1,022
关键字:

web浏览器是做什么