精华内容
下载资源
问答
  • 浏览器发起请求到服务器处理请求的过程
    2021-12-31 19:08:06

    前言问题:为什么很多站点第二次打开速度会很快?

    前面我们已经说了tcp的一些流程,而http协议是建立在tcp协议基础之上的
    http是一种无状态的丶允许浏览器向允许浏览器向服务器获取资源的协议,是Web的基础
    通常由浏览器发起请求,用来获取不同类型的文件,例如html文件,css文件,js文件,图片,视频等.此外,http也是浏览器使用的最广泛的协议,要学好浏览器和前端,就必须要深入了解http协议

    浏览器发起http请求流程

    如果你在浏览器输入地址www.baidu.com,那么接下来,浏览器会完成哪些动作呢?

    1.构建请求

    首先浏览器构建请求行信息GET /index.html HTTP1.1 get是请求方式,index.html是请求资源,http1.1是版本号(目前大部分还是http1.1,http版本以后介绍)
    构建好请求后,浏览器发起网络请求,前面已经说过 由网络进程发起

    2.查找缓存

    在真正发起请求之前,浏览器会现在浏览器缓存中查询是否有要请求的资源.其中浏览器缓存是是一种在本地保存资源副本,供下一次请求使用的技术

    当浏览器发现请求的资源已经在浏览器中缓存有副本,那么它会拦截请求,返会该资源的副本,并直接结束请求,不会去服务器上下载了.(其实这里有一个强缓存和协商缓存的方式来判断一下缓存是否过期,没有过期才会直接返回,否则过期了还要去服务器判定,这里只做简单描述)
    这么做的好处有:
    1.缓解服务器的压力,提升性能(获取资源的耗时更短了)
    2.对于网站来说,缓存是实现快速资源加载的重要组成部分
    当然,如果缓存查找失败,就会进入网络请求

    3.准备ip地址和端口

    先别急,在这之前先说说tcp协议和http协议的联系.因为浏览器使用的是http协议作用应用层协议,用来封装请求文本的信息,并且使用tcp/ip协议传输层发到网络上,所以http工作之前,浏览器需要通过tcp与服务器建立连接(准备工作要先做好嘛,不然之前做的都是白费)
    也就是说http的内容是通过tcp/ip协议来传输来实现的.
    流程大概是是这样:

    服务器和浏览器建立一个tcp连接(连接建立阶段)->发送请求行(前面说过)->发送请求头->服务器响应请求行->服务器响应请求头->服务器回复内容(html,css,js,img文件等)->断开tcp连接
    

    上面分为3个过程可以:连接建立阶段和数据传输阶段和连接释放阶段
    我用的是访问www.baidu.com做例子,没有请求体之类的,有的网站有那就加上
    好了,tcp前面我已经说过了,如果是看着我的之前的博客来的,那应该比较了解了,那么http是怎么请求的呢?
    tcp要工作,首先你得给他一个域名和端口号吧?域名和端口号从哪来呢? 对的.我们有一个url地址,可是url地址怎么变成ip地址和端口信息呢?
    前面我已经说过ip地址是一个纯数字的逻辑地址,难以记忆.于是呼,就出现了域名(baidu.com)来帮助用户记忆,所以这个基于需求就需要把域名和ip地址做一个映射关系,
    了解js的同学直接理解为map结构中的一对一的映射关系就行,这套域名映射ip的系统就叫做域名系统,简称**DNS**

    DNS的具体作用

    我们在网址栏输入一个地址,这个地址就是个域名,计算机其实是不认识这个域名的,因为底层只认识ip地址,而dns服务器就是将这个域名解析成ip地址,供底层去查找服务器所在的位置.
    DNS:

    • 一个分层的DNS服务器实现的分布式数据库
    • 一个使得主机能够查询分布式数据库的应用层
      **分布式数据库系统:**通常使用较小的计算机系统,每台计算机可单独放在一个地方,每台计算机中都可能有DBMS的一份完整拷贝副本,或者部分拷贝副本,并具有自己局部的数据库,位于不同地点的许多计算机通过网络互相连接,共同组成一个完整的、全局的逻辑上集中、物理上分布的大型数据库 .(ps:和我们平时学的关系数据库不太一样,了解就好)

    我们发送一个域名请求,它将返回我们一个与其主机名对应得ip地址,因为是分布式数据库,全世界有太多得ip地址,所以整个DNS系统是分散在世界各地,由很多台DNS服务器组成,这么说把,你可以把他看成一个小网络,每台dns服务器都存了一些数据

    所以DNS查询就是简单来说,就是去dns服务器上问:’‘你知道这个域名的ip地址吗?’’
    不知道就去别的dns服务器上找,直到找到或者找不到

    算了,我还是说清楚一点,之前字节面试问到了,但我没理解的那么深…所以芭比Q了
    DNS服务器有3个层次或者说类型:

    • 根DNS服务器.
    • 顶级域DNS服务器
    • 权威DNS服务器

    根DNS服务器:
    首先明确域名是什么,www.baidu.com,千万不要以为com是根域名啊,其实他是顶级域名,它的完整写法应该是www.baidu.com.最后这个写的.才是根域名 只是通常省略了
    根DNS服务器的作用就是管理他的下一级,也就是顶级域DNS服务器,通过询问根DNS服务器,我们可以知道一个主机名对应的顶级域DNS服务器的ip是多少,然后根据这个ip去顶级域DNS服务器上查找

    顶级域DNS服务器
    除了com是顶级域名,常见的顶级域名还有cn,org,edu等.顶级域DNS服务器,也就是TLD(简称),提供了它的下级,也就是权威DNS服务器的ip地址

    权威DNS服务器
    这才是可以返回主机-ip的最终映射的玩意
    我先告诉大家他们之间的关系,接下来我尽可能用我的语言简洁说出来

    本地DNS
    本地DNS服务器严格来说不属于DNS的层次结构,但是它有很重要.
    每个ISP(互联网服务供应商)都有一台本地DNS服务器,比如一个居民区的ISP,一个大学的ISP,一个机构的ISP,都有一台或者多台的DNS服务器,当你所在的那个网络区域的主机发起DNS请求时,该请求先被发往本地的DNS服务器,注意本地DNS服务器只起到代理的作用,本身并不会存储相关太多的DNS映射,最多做一个缓存.定时会清除本地DNS将请求转发到DNS层次中

    好了,现在正式讲流程了,我们给浏览器一个url地址,然后浏览器去查找浏览器中DNS缓存(浏览器本身有一个DNS缓存),浏览器DNS缓存中没有的话就去本地DNS服务器中查找,
    然后呢就是一个递归+迭代的过程了

    1.浏览器(主机假设是m.n.com)发起一个域名查询报文给本地DNS服务器,其中包含带查询的域名(假设是a.b.com)
    2.本地DNS收到之后将这个报文转发给根DNS服务器
    3.根DNS服务器主要com是顶级域名就将com对应的TLD对应的ip地址列表返回给本地DNS服务器
    4.本地DNS服务器收到TLD的ip地址,将报文又向这个返回的ip发送
    5.TLD收到查询报文,检测到b.com前缀,便向本地DNS服务器返回权威DNS服务器的ip地址
    6.本地DNS服务器又向返回的权威DNS服务器ip地址发送查询报文,
    7.权威DNS终于查询到了最终返回要找的a.b.com的ip地址 返回给本地DNS
    8.本地DNS服务器将这个返回的结果ip地址做一个缓存,然后返回你的主机

    好了 至此ip地址找到了,而且还做了缓存,一定时间内你再次发起这个域名请求是直接走缓存的
    那么,问题来了?一定是这种递归+迭代的模式吗?
    …emmm好在我踩了脚刹车,还真不一定…
    他可能不是每次都返回本地DNS的,而是本地DNS发送查询报文给根DNS服务器,而根DNS服务器直接去TLD查找…
    这样就没有递归,只有迭代了
    也就是迭代是一定的,递归不一定

    ip地址拿到了之后,如果没有特别指定端口号,那么就是默认的http端口号80了,好了,说了这么多,现在终于可以发起请求了吧?
    答案是还是不行!为什么?因为浏览器还有一个机制
    chrome有个机制,同一个域名最多同时建立6个tcp连接,如果同一个域名下同时有超过6个的请求发生,那么多余的就要排队等待了,等到进行中的请求释放

    好了 判断结束后,就可以正式建立TCP连接了(终于来了!呜呜呜~~)
    TCP建立之后(如何建立看我的上一篇博客)
    浏览器就可以和服务器进行通信了,而http中的数据就是在这个通信过程中传输的
    请求行:

    GET /index.html http/1.1
    

    请求头:

    Host:目标地址
    Connection:keep-alive //长连接 具体以后说
    Pragma:no-cache  
    Cache-Control:no-cache
    cookie:...
    ....
    

    首先浏览器向服务器发送请求行,告诉服务器我用什么方法请求的,请求url,http用的什么协议,这其实就是告诉服务器我请求的资源位置,如果是POST请求,还需要一个请求体,请求体里面携带数据传递给服务器.至于请求头的话,里面携带一些基本信息,源地址,连接形式,缓存,cookie,浏览器内核等

    然后呢 然后就是

    服务器处理HTTP请求

    1.返回请求
    一旦服务器处理结束,便可以将数据返回给浏览器,同样的
    有一个响应行

    HTTP/1.1 200 OK
    

    响应头.响应体
    首先返回响应行,包括协议版本和状态码
    但是并不是所有的请求,服务器都会处理,对于一些无法处理或者内部的错误的请求,服务器回通过请求行中的状态码告诉浏览器 ‘哥们,你这活我干完了/我干不了’
    状态码大家伙可以自己去看看,那都是一些死记硬背的东西,背几个常用的就OK了
    然后就是返回响应头了,里面有一些content-type(这个搞前端的大家伙都熟悉),set-cookie,之类的一些简单信息,发送完响应头之后,就回发送响应体, 响应体就是你需要的文件,比如html文件之类的

    以上就是服务器响应浏览器的具体过程了

    2.断开连接
    通常情况下,服务器发送完了请求数据后,就要开始关闭tcp连接了,不过如果浏览器或者服务器在其头信息中加入了connection:Keep-alive那么tcp连接在发送后就仍然保持打开状态,这样的话就可以继续通过这同一个tco连接发送请求,减少连接建立时的资源,时间的浪费
    这些具体以后讲http版本的时候说

    3.重定向
    到这里请求流程似乎结束了?,不过还有一种情况必须了解,也是面试问的比较多的
    你在地址栏搜baidu.com,打开的确实https:www.baidu.com,这两个url不一样,但是内容是一样的就涉及到了重定向的操作.你会看到返回的响应行中状态码时301,响应头中多了一个Location:https://www.baidu.com,这就是告诉浏览器,我需要重定向到另外一个网址,而那个网址就是location中的网址,重新导航,这就是一个完整的重定向流程.
    这个流程不是必然的.百度有,别的服务器可能没有这个处理,比如12306,你必须输入完整的12306才能打开

    总结

    我们开头提到的问题可以解答了,首次打开页面,需要进行tcp连接,dns查询,然后就是一系列数据请求,传输等,但是当我们第二次请求页面时,首先dns缓存已经给你缓存好,浏览器也会给你缓存一些静态数据,需要就直接从缓存拿了,所以第二次打开页面时,速度会快很多
    浏览器缓存我下一篇博客具体讲,顺便方便自己理解

    这篇的内容比较碎片一点,我也是想到什么说什么
    大致分为8个阶段吧
    构建请求->查找缓存->准备ip和端口->等待TCP队列->建立TCP连接->发起http请求->服务器处理请求->服务器返回请求->断开连接
    期间还聊到了一点缓存,dns映射缓存就不多讲了,底层是一个hash表的数据结构和es6中的map底层结构一样,感兴趣的可以自己去看一看(我也没过多了解)

    更多相关内容
  • 浏览器服务器交互解析

    千次阅读 2018-08-08 19:06:41
    目前来说,网站页面主要分为静态页面和动态页面,纯静态页面组成的网站现在相对比较少见,大型网站一般使用的是动态网站建站技术,还有一部分网站是静态网页与动态网页共存,本文以Apache服务器、php语言为例,详解...

    目前来说,网站页面主要分为静态页面和动态页面,纯静态页面组成的网站现在相对比较少见,大型网站一般使用的是动态网站建站技术,还有一部分网站是静态网页与动态网页共存,本文以Apache服务器、php语言为例,详解动态网站的访问过程,下面直接切入本文主题。

         (1)用户端访问服务器端的html文件

        S1:通过本机配置好的DNS域名服务器地址寻找DNS服务器,将网站URL中的Web主机域名解析为Web服务器所在的Linux操作系统(Apache通常与Linux操作系统组合使用)中对应的IP地址。

    S2:通过HTTP协议(超文本传输协议)去连接上述IP地址的服务器系统,通过默认80端口(默认的端口是80,也有其他端口,输入URL时一般不用输入端口)请求Apache服务器上相应目录下的html文件(如index.htm)。

      S3:Apache服务器收到用户的访问请求后,在它管理的文档目录中找到并打开相应的html文件(如index.htm),将文件内容响应给客户端浏览器(即用户)。

      S4:浏览器收到Web服务器的响应后,接收并下载服务器端的html静态代码,然后浏览器解读代码,最终将网页呈现出来(由于不同的浏览器对于代码的解读规则会不一样,所以不同浏览器对于相同的网页呈现的最终页面效果会有所差异)。

         (2)用户端访问服务器端的php文件

      S1:该步与上面访问html静态网页是一样的,通过DNS服务器解析出相应的Web服务器的IP地址。

      S2:与上面访问html静态页面相似,不过最后请求的是Apache服务器上相应目录下的php文件,如index.php。

      S3:Apache服务器本身不能处理php动态语言脚本文件,就寻找并委托PHP应用服务器来处理(服务器端事先得安装PHP应用服务器),Apache服务器将用户请求访问的php文件(如index.php)文件交给PHP应用服务器。

      S4:PHP应用服务器接收php文件(如index.php),打开并解释php文件,最终翻译成html静态代码,再将html静态代码交还给Apache服务器,Apache服务器将接收到的html静态代码输出到客户端浏览器(即用户)。

      S5:与上面访问html静态页面相同,浏览器收到Web服务器的响应后,接收并下载服务器端的html静态代码,然后浏览器解读代码,最终将网页呈现出来。

       (3)用户端访问服务器端的MySQL数据库

      如果用户需要对MySQL数据库中的数据进行操作,那么就需要在服务器端安装数据库管理软件MySQL服务器,用来存储和管理网站数据。由于Apache服务器是无法连接和操作MySQL服务器,所以还需要安装php应用服务器,这样Apache服务器就委托php应用服务器去连接和操作数据库,在对数据库中的数据进行管理的时候,一般都需要用到结构化查询语句,即SQL语句。

      S1:该步与上面访问php文件一样,通过DNS服务器解析出相应的Web服务器的IP地址。

      S2:与上面访问php文件一样,请求访问Apache服务器上相应目录下的php文件。

      S3:与上面访问php文件一样,PHP应用服务器接收Apache服务器的委托,收到相应的php文件。

      S4:PHP应用服务器打开php文件,在php文件中通过对数据库连接的代码来连接本机或者网络上其他机器上的MySQL数据库,并在php程序中通过执行标准的SQL查询语句来获取数据库中的数据,再通过PHP应用服务器将数据生成html静态代码。

      S5:浏览器收到Web服务器的响应后,接收并下载服务器端的html静态代码,然后浏览器解读代码,最终将网页呈现出来。

                需要注意的是,文中(2)与(3)的区别是,一个访问了数据库,另一个没有访问数据库,所以在过程中有点差别。

    展开全文
  • 众所周知,这就是所谓的B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件。 1.Server与浏览器通信协议 那顺道就来简单的看一下,所谓的Web服务器...

    我们基本每天都在通过WEB浏览器,去浏览一些新闻,看看视频之类的。
    众所周知,这就是所谓的B/S结构(Browser/Server,浏览器/服务器模式),是WEB兴起后的一种网络结构模式,WEB浏览器是客户端最主要的应用软件。

    1.Server与浏览器通信协议

    那顺道就来简单的看一下,所谓的Web服务器(例如知名的Tomcat)与浏览器,基本的实现原理是什么样的呢?

    首先可以明确的就是,例如我们所做的通过浏览器输入一个地址,访问一个网页的操作。实际对应的底层操作简单来说就是:客户端(浏览器)面向于WEB服务器的网络通信。那么,既然是网络通信。对应于Java当中来说,就自然离不开Socket与IO流。其实这也正是Web服务器与浏览器的基础实现原理。

    我们知道,将开发的web项目部署到tomcat服务器之后,就可以通过浏览器对服务器上的资源进行访问。但重要的一点是,存在多种不同厂商开发的不同浏览器。但各个类型的WEB浏览器,都可以正常的访问tomcat服务器上的资源。对此,我们可以这样理解:我开发了一个WEB服务器,并且能够保证其他人开发的客户端都能够与我的服务器正常通信。

    能够实现这样的目的的前提自然就是,你要制定一个规范,并让想要与你开发的服务器正常进行通信的客户端都遵循这个规范来实现。

    这个规范,也就是所谓的协议。

    所以,正如在网络通信中,数据的传输可以遵循TCP/IP或UDP协议一样。WEB服务器与WEB浏览器之间,也通过一种双方都熟悉的语言进行通信。这种协议即是:超文本传输协议,也就是HTTP协议。不同的是,TCP/IP与UDP议是传输层当中的通信协议,而HTTP协议是应用层当中的协议。

    2. Server端HTTP通信规范实现-Servlet

    所以,当我们想要使用Java语言实现所谓的WEB通信,自然也应当遵循HTTP协议。Java中已经为我们提供了这样的一种实现规范,也就是广为人知的:Servlet接口。而我们开发web项目时,最常用到的HttpServlet类,就是基于此接口实现的具体子类。该类封装和提供了,针对基于Http协议通信的内容进行访问和操作的常用方法。

    说了这么多,我们通过一些小的实例,方便进行更形象的理解。

    首先,我们通过一段简单的Servlet代码来看一下,基于HTTP协议进行WEB通信的请求信息:

    public class ServletTest extends HttpServlet {  
      
        public void doGet(HttpServletRequest request, HttpServletResponse response)  
                throws ServletException, IOException {  
            for (Enumeration e = request.getHeaderNames(); e.hasMoreElements();) {  
                String header = (String) e.nextElement();  
                if (header != null)  
                    System.out.println((new StringBuilder(String.valueOf(header)))  
                            .append(":").append(request.getHeader(header))  
                            .toString());  
            }  
      
        }  
      
        public void doPost(HttpServletRequest request, HttpServletResponse response)  
                throws ServletException, IOException {  
      
        }  
      
    }
    

    上面的代码中,我们的目的是通过HttpSerlvetRequest当中的方法,
    来打印web浏览器基于http协议发起的请求当中,封装的HTTP请求详情。程序输出的结果如下:

    在这里插入图片描述

    一个HTTP协议的请求中,通常主要包含三个部分:

    1. 方法/统一资源标示符(URI)/协议/版本
    2. 请求标头
    3. 实体主体

    其中方法也就是所谓的get/post之类的请求方法,统一资源标示符也就是要访问的目标资源的路径,包括协议及协议版本,这些信息被放在请求的第一行。随后,紧接着的便是请求标头;请求标头通常包含了与客户端环境及请求实体主体相关的有用信息。最后,在标头与实体主体之间是一个空行。它对于HTTP请求格式是很重要的,空行告诉HTTP服务器,实体主体从这里开始。

    我们可以简单的模拟一个最简易功能的山寨服务器:

    public class MyTomcat {  
        public static void main(String[] args) {  
            try {  
                ServerSocket tomcat = new ServerSocket(9090);  
                System.out.println("服务器启动");  
                //  
                Socket s = tomcat.accept();  
                //  
                byte[] buf = new byte[1024];  
                InputStream in = s.getInputStream();  
                //  
                int length = in.read(buf);  
                String request = new String(buf,0,length);  
                //  
                System.out.println(request);  
      
            } catch (IOException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
        }  
    }  
    

    这次我们在通过对应的URL在浏览器中对我们的山寨服务器进行访问,得到的输出结果是:
    在这里插入图片描述

    通过成果我们看到,我们已经成功的简单山寨了一下tomcat。

    不过这里需要注意的是,我们自己山寨的tomcat服务器当中,之所以也成功的输出了Http协议的请求体,是因为:

    我们是通过web浏览器进行访问的,如果通过普通的socket进行对serversocket的连接访问,是没有这些请求信息的。因为我们前面已经说过了,web浏览器与服务器之间的通信必须遵循Http协议。所以,我们日常生活中使用的web浏览器,会自动的为我们的请求进行基于http协议的包装。

    3. 浏览器端

    山寨浏览器 :

    //山寨浏览器  
    public class MyBrowser {  
      
        public static void main(String[] args) {  
            try {  
                Socket browser = new Socket("192.168.1.102", 9090);  
                PrintWriter pw = new PrintWriter(browser.getOutputStream(),true);  
                // 封装请求第一行  
                pw.println("GET/ HTTP/1.1");  
                // 封装请求头  
                pw.println("User-Agent: Java/1.6.0_13");  
                pw.println("Host: 192.168.1.102:9090");  
                pw.println("Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2");  
                pw.println("Connection: keep-alive");  
                // 空行  
                pw.println();  
                // 封装实体主体  
                pw.println("UserName=zhangsan&Age=17");  
                // 写入完毕  
                browser.shutdownOutput();  
                  
                  
                // 接受服务器返回信息,  
                InputStream in = browser.getInputStream();  
                //  
                int length = 0;  
                StringBuffer request = new StringBuffer();  
                byte[] buf = new byte[1024];  
                //  
                while ((length = in.read(buf)) != -1) {  
                    String line = new String(buf, 0, length);  
                    request.append(line);  
                }  
                System.out.println(request);  
                //browser.close();  
            } catch (IOException e) {  
                System.out.println("异常了,操!");  
            }finally{  
                  
            }  
        }  
    }  
      
    //修改后的山寨tomcat服务器  
    public class MyTomcat {  
        public static void main(String[] args) {  
            try {  
                ServerSocket tomcat = new ServerSocket(9090);  
                System.out.println("服务器启动");  
                //  
                Socket s = tomcat.accept();  
                //  
                byte[] buf = new byte[1024];  
                InputStream in = s.getInputStream();  
                //  
      
                int length = 0;  
                StringBuffer request = new StringBuffer();  
                while ((length = in.read(buf)) != -1) {  
                    String line = new String(buf, 0, length);  
                    request.append(line);  
                }  
                //  
                System.out.println("request:"+request);  
      
                PrintWriter pw = new PrintWriter(s.getOutputStream(),true);  
                pw.println("<html>");  
                pw.println("<head>");  
                pw.println("<title>LiveSession List</title>");  
                pw.println("</head>");  
                pw.println("<body>");  
                pw.println("<p style=\"font-weight: bold;color: red;\">welcome to MyTomcat</p>");  
                pw.println("</body>");  
                s.close();  
                tomcat.close();  
            } catch (IOException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
        }  
    }  
    

    我们先启动服务器,然后运行浏览器模拟网页浏览的过程,首先看到服务器端收到的请求信息:
    在这里插入图片描述

    紧接着,服务器收到请求进行处理后,返回资源给浏览器,于是得到输出信息:

    在这里插入图片描述

    可以看到,我们在山寨浏览器当中得到的返回信息,实际上就是一个HTML文件的源码,之所以我们的山寨浏览器中,这些信息仅仅是以纯文本形式显示,是因为我们的山寨浏览器不具备解析HTML语言的能力。所以说,浏览器另外一个重要的功能其实就是:可以对超文本标记语言进行解析。而实际上,这也是浏览器开发的难点和重点。

    上面这样的输出结果看上去显然不爽,所以说山寨货毕竟还是坑爹!

    我们还是通过正规的WEB浏览器,来试着访问一下我们的山寨服务器,结果发现,效果帅多了:
    在这里插入图片描述

    而顺带一提的是,既然当浏览器向WEB服务器发起访问请求时,会封装有对应的HTTP请求体。那么,对应的,当WEB服务器处理完浏览器请求,返回数据时,也会有对应的封装,就是所谓的HTTP响应体。举例来说,假如我们将我们的山寨浏览器的代码进行修改,去连接真正的tomcat服务器:

    public class MyBrowser {  
      
        public static void main(String[] args) {  
            try {  
                Socket browser = new Socket("192.168.1.102", 8080);  
                PrintWriter pw = new PrintWriter(browser.getOutputStream(),true);  
                // 封装请求第一行  
                pw.println("GET / HTTP/1.1");  
                // 封装请求头  
                pw.println("User-Agent: Java/1.6.0_13");  
                pw.println("Host: 192.168.1.102:8080");  
                pw  
                        .println("Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2");  
                pw.println("Connection: keep-alive");  
                // 空行  
                pw.println();  
                // 封装实体主体  
                //pw.println("UserName=zhangsan&Age=17");  
                // 写入完毕  
                browser.shutdownOutput();  
                  
                  
                // 接受服务器返回信息,  
                InputStream in = browser.getInputStream();  
                //  
                int length = 0;  
                StringBuffer request = new StringBuffer();  
                byte[] buf = new byte[1024];  
                //  
                while ((length = in.read(buf)) != -1) {  
                    String line = new String(buf, 0, length);  
                    request.append(line);  
                }  
                System.out.println(request);  
                //browser.close();  
            } catch (IOException e) {  
                System.out.println("异常了,操!");  
            }finally{  
                  
            }  
        }  
    }  
    

    运行程序,你将会发下如下的输出信息:
    在这里插入图片描述

    与HTTP请求类似,通常一个HTTP响应也包含三个部分:

    1. 协议/响应码/状态描述:协议也就是指HTTP协议的信息,响应码是指代表该次请求的处理结果的码(例如常见的200、404、500),其实就是该次请求处理的响应描述
    2. 响应标头:响应标头也包含与HTTP请求中的标头类似的有用信息。
    3. 响应实体:通常也就是指响应本身的HTML内容。

    与HTTP请求一样,响应表头与响应实体之间,也会使用一个空行进行分割,方便解读。同时我们也可以发现,其实真正被解析显示在浏览器网页上的内容,其实只是响应实体的部分。响应行和响应标头当中,实际上是负责将相关的一些有用信息返回给我们,但这部分是不需要在浏览器中所展示的。也就是说,我们的浏览器除了应当具备获取一个完整的HTTP响应的能力之外,还应该具备解析HTTP协议响应的能力。

    事实上,Java也为我们提供了这样的对象,那就是URL及URLConnection对象。如果我们在我们的山寨浏览器中,植入这样的对象,来进行与服务器之间的HTTP通信,那么:

    public class MyBrowser2 {  
        public static void main(String[] args) {  
            try {  
                URL url = new URL("http://192.168.1.102:8080");  
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
      
                InputStream in = conn.getInputStream();  
                byte[] buf = new byte[1024];  
                int length = 0;  
                StringBuffer text = new StringBuffer();  
                String line = null;  
                while ((length = in.read(buf)) != -1) {  
                    line = new String(buf, 0, length);  
                    text.append(line);  
                }  
      
                System.out.println(text);  
      
            } catch (IOException e) {  
                // TODO Auto-generated catch block  
                e.printStackTrace();  
            }  
        }  
    

    这次当我们再运行程序,查看输出信息,发现我们从URLConnection对象获取到的输入流当中,读取的响应信息,就如我们所愿的,只剩下了需要被解析显示在页面的响应实体的内容。实际上这也就是Java为我们提供的对象,将对HTTP协议内容的解析功能进行了封装。而究其根本来说,我们基本可以想象到,URLConnection = Socket + HTTP协议解析器。也就是说,该对象的底层除了通过Socket连接到WEB服务器之外,还封装了对HTTP协议内容的解析功能。于是到此,我们已经简单的了解了关于WEB服务器与浏览器的基本实现原理。

    另外,附录一般浏览器的高层结构

    在这里插入图片描述

    浏览器的主要组件包括:

    用户界面 - 包括地址栏、前进/后退按钮、书签菜单等。除了浏览器主窗口显示的你请求的页面外,其他显示的各个部分都属于用户界面。
    浏览器引擎 - 在用户界面和渲染引擎之间传送指令。
    渲染引擎 - 负责显示请求的内容。如果请求的内容是 HTML,它就负责解析 HTML 和 CSS 内容,并将解析后的内容显示在屏幕上。
    网络 - 用于网络调用,比如 HTTP 请求。其接口与平台无关,并为所有平台提供底层实现。
    用户界面后端 - 用于绘制基本的窗口小部件,比如组合框和窗口。其公开了与平台无关的通用接口,而在底层使用操作系统的用户界面方法。
    JavaScript 解释器。用于解析和执行 JavaScript 代码,比如chrome的javascript解释器是V8。
    数据存储。这是持久层。浏览器需要在硬盘上保存各种数据,例如 Cookie。新的 HTML 规范 (HTML5)定义了“网络数据库”,这是一个完整(但是轻便)的浏览器内数据库。

    展开全文
  • 浏览器、中间件和服务器的关系 一次完整的http请求包括三次握手与四次挥手的过程。(http是基于tcp协议的)1、 打开浏览器,地址栏输入:www.cnblogs.com;2、 开始进行域名解析浏览器自身搜dns缓存 搜blog.csdn.net...

    浏览器、中间件和服务器的关系

    一次完整的http请求包括三次握手与四次挥手的过程。(http是基于tcp协议的)
    1、 打开浏览器,地址栏输入:www.cnblogs.com;
    2、 开始进行域名解析
    浏览器自身搜dns缓存 搜blog.csdn.net有没有缓存 看看有没有过期,如果过期就这个结束;
    搜索操作系统 自身的dns缓存;
    读取本地的host文件;
    浏览器发起一个dns的一个系统调用
    3、 浏览器获得域名对应的ip地址后 发起http三次握手 
    4、 tcp/ip 链接建立起来后,浏览器就可以向服务器发送http 请求 。
    5、 服务器端接受到请求,根据路径参数,经过后端的一些处理之后,把处理后的一个结果数据返回给浏览器,如果是一个完整的网页,就是把完整的html页面代码返回给浏览器。
    6、 浏览器拿到html页面代码,解析和渲染页面,里面的 js、css图片资源都需要经过上面的步骤。
    7、 浏览器拿到资源对页面进行渲染,最终把一个完整的页面呈现给用户。
    一个网站源码的执行是无法直接在服务上执行的,需要一个“中间软件”来协调源码和服务器之间的关系,让服务器能够间接的执行源码。

    一、服务器的定义

    服务器指的是一个管理资源并为用户提供服务的计算机,通常分为文件服务器、数据库服务器和应用程序服务器。运行以上软件的计算机或计算机系统也被称为服务器。

    二、中间件

    中间件是服务器上负责解析http请求的一组应用程序,负责接收并解析http请求数据包,在服务器上找到数据包所请求的文件后,将其返回给客户端,如果http数据包所请求的是一个动态脚本文件,如php等,中间件就要靠CGI与脚本语言解析软件进行交互,处理好动态脚本文件后,再将处理后的文件其返回给浏览器。

    说白了,中间件就是服务器上web端口(通常为80端口)的一个翻译官,负责告诉服务器用户要请求哪些文件,如果用户请求的是一个静态的html页面,就直接在服务器上找到对应文件并将其交给用户浏览器,如果用户请求的是一个动态页面如php,asp等,中间件在找到该文件后,将其交给对应的脚本语言解析程序,脚本语言解析程序将文件解析成html后,再把解析过的文件发送给浏览器。

    所以,浏览器本身并不能渲染解析动态脚本文件,以php为例,浏览器解析的.php文件,实际上是经服务器php程序解析后的html文件。

    再者,如果服务器上没有安装中间件,那么服务器就不能理解用户发来的http数据包是什么意思,当然也就无法对http请求包进行正确的响应。

    三、Web服务器

    web服务器就是安装了中间件的服务器。

    展开全文
  • 转载来源 :http://www.shazidoubing.com/fwq/webserv/385.html... 对于普通的上网过程,系统其实是这样做的:浏览器本身是一个客户端,当你输入URL的时候,首先浏览器会去请求DNS服务器,通过DNS获取相应的 域名对...
  • 电脑浏览器打不开解决方法

    千次阅读 2021-08-13 03:52:39
    有很多用户在使用电脑的时候发现自己的浏览器打不开,但是网络可能显示正常,一般情况下就是DNS设置有问题,解决方法非常...2、造成DNS的问题可能是连网时获取DNS出错或DNS服务器本身问题;网络连接右键WLAN ——&...
  • (1)尽管浏览器能解析网址并生成HTTP消息,但它本身是不能发送网络消息的,这必须委托给操作系统来实现。在此之前,我们要查询网址中的服务器域名找到对应的IP地址。所以任务又可以细分为: 生成HTTP消息->根据...
  • 浏览器输入URL到服务器响应的过程

    千次阅读 2018-04-03 08:28:42
    先查浏览器缓存,没有再查寻系统缓存,即本地host文件,再没有向ISP的DNS服务器请求解析域名得到IP地址的映射关系 3.浏览器服务器之间建立TCP连接,通过socket发送HTTP请求;发送端从应用层往链路层,接收端从...
  • C/S(Client/Server或客户/服务器模式)结构与B/S(Browser/Server,浏览器/服务器模式)结构 C/S(Client/Server或客户/服务器模式)结构 C/S结构,即客户机和服务器结构。它是软件系统体系结构,通过它可以充分...
  • 浏览器服务器的交互过程

    千次阅读 2014-09-27 22:55:39
    譬如一个http://Lulingniu网站,以indexhtml为主页,该主页使用index.manifest文件为manifest文件,在该文件中请求本地缓存index.html、hello.js、hello.jpg、hello2.jpg这几个资源...①浏览器请求访问http://Lulingniu
  • B/S结构(Browser/Server结构)结构即浏览器服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端
  • 想要在浏览器访问一个文件,那么这个文件肯定是在web服务器上的,基于这个,我们只需要将我们的文件放在远程服务器的web服务器上,之前做过网站有放在远程服务器,只需要将现在的文件添加到网站上就可以了,也不会...
  • 很多下伙伴在使用360浏览器 的过程中都会遇到打不开网页的时候...如果连接没有问题,先试试其他浏览器,如果能够打开,那证明是360浏览器本身的问题,可以选择关闭浏览器重新打开进行搜索。其次,小编发现,在近期几...
  • 打开网页浏览器提示:此...如果不能解决,则可能是服务器配置的问题,而不是您的计算机有问题。错误 310 (net::ERR_TOO_MANY_REDIRECTS):重定向过多。其实,浏览器已经提供给我们解决问题的办法了。 首先就是清除...
  • 很多人都知道,通过浏览器访问一张图片链接,服务器就会返回图片,于是浏览器就月显示出来。真那么简单么,细节是什么?为了从零开始实现服务器浏览器的交互,我们必须去了解http协议,然后才是编程实现...
  • 标签: 服务器浏览器sessionservlet文档web服务 2012-04-26 17:48 12966人阅读 评论(2) 收藏 举报  分类: C# ASP.NET(137)  目录(?)[+]  http协议学习系列 1. 基础概念篇
  • http协议的参考:... (1)浏览器先搜索自身的DNS缓存 (2)操作系统搜索自身的DNS缓存(浏览器没有找到缓存或者缓存已经失效) ...(4)浏览器发起一个DNS的一个系统调用 ... 宽带运营商服务器查看
  • 采集浏览器指纹

    千次阅读 2021-12-15 15:11:01
    在实际攻击浏览器之前,首先必须确切知晓目标使用的浏览器类型及版本。确定这些信息的过程叫做采集指纹。 一、使用HTTP首部 每一个Http请求和响应中都包含HTTP首部,它随同每一个Web请求发送的信息,详细描述了...
  • 1.tomcat文件设置编码格式为utf-8 2.txt文件本身如果使用Notepad++编译编码格式。需要设置为UTF-8-BOM才好使。不乱码了
  • 浏览器安全概述

    千次阅读 2021-12-31 10:16:41
    信息流大体上可以分为四个过程,用户与浏览器有两个,浏览器与web服务器有两个。 浏览器与用户本机之间: 不受限制的访问 浏览器与web服务器之间: cookie等隐私信息泄露 不安全的代码运行 2、浏览器本体的结构...
  • 闪虎专用浏览器

    2013-05-05 01:38:29
    大部分的浏览器本身支持除了HTML之外的广泛的格式,例如JPEG、PNG、GIF等图像格式,并且能够扩展支持众多的插件(plug-ins)。另外,许多浏览器还支持其他的URL类型及其相应的协议,如FTP、Gopher、HTTPS(HTTP协议...
  • 浏览器服务器互动过程解析

    千次阅读 2014-10-19 13:51:39
    目前来说,网站页面主要分为静态页面和动态页面,纯静态页面组成的网站现在相对比较少见,大型网站一般使用的是动态网站建站技术,还有一部分网站是静态网页与动态网页共存,本文以Apache服务器、php语言为例,详解...
  • 通过 Chrome浏览器 查看http请求报文

    千次阅读 2021-08-05 07:04:53
    as we all know HTTP 请求报文 包含请求行、请求头和请求体三部分请求行:(请求方式 资源路径 协议/版本)例如:POST /test/index.html HTTP/1.1PS:各部分以空格隔开以 MAC Chrome浏览器为例:① 进入开发者工具 ...
  • 当请求服务器向域所在的授权服务器发送请求时就是这种情况。 一旦请求到达授权服务器,它就会用 www.wljslmz.com 的 IP 地址回复请求服务器 当请求服务器获得此信息时,它会将其保存以备将来请求,并将响应发送回您...
  • 【综合篇】浏览器的工作原理:浏览器幕后揭秘

    千次阅读 多人点赞 2020-01-21 18:18:13
    web(给达达前端加星标,提升前端技能)了解浏览器是如何工作的,能够让你站在更高的角度去理解前端浏览器的发展历程的三大路线,第一是应用程序web化,第二是web应用移动化,第三是web操...
  • 浏览器缓存详解

    千次阅读 多人点赞 2021-01-12 18:28:22
    刷新当前页面时浏览器会根据当前运行环境内存来决定是从 Memory Cache 还是 从Disk Cache中拿(可以看到下图最后几个文件有时候是从 Memory Cache中拿有时候是从Disk Cache中拿) 注意:以上回答全部基于chrome...
  • 你该知道的浏览器请求与Header

    千次阅读 多人点赞 2021-05-14 23:23:13
    从url到页面展示过程中发生了什么 让我们从一道“经典前端面试题” —— 从url到页面展示...url 编码是以 utf-8 为标准,但不是所有浏览器对所有情况都是这样。像JS的话就有 encodeURIComponent 和 encodeURI 来保证以
  • 浏览器的强缓存和协商缓存

    千次阅读 2019-05-01 16:30:50
    浏览器的强缓存和协商缓存 这里说的缓存是指浏览器(客户端)在本地磁盘中对访问过的资源保存的副本文件。 浏览器缓存主要有以下几个优点: ...如果浏览器命中强缓存,则不需要给服务器发请求;而协商缓存最终由浏览...
  • 代理服务器(Proxy)原理

    千次阅读 2021-12-15 20:59:40
    代理服务器原理背景什么是代理服务器为什么会出现 `代理服务器可能有问题,或地址不正确` 的错误动手实验一下使用Python实现简陋的代理服务器运行代理服务器更改主机设置使用浏览器测试 背景 之所以要写这篇文章,是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 250,276
精华内容 100,110
关键字:

浏览器本身就是服务器吗