第一节 Web介绍知识

重点:

Web的工作流程

第一节 Web介绍知识 第一节 Web介绍知识

浏览器上如何工作的

第一节 Web介绍知识

初级扩展:

1.Web架构熟悉

前后端的划分,可以简单地理解为凡是运行在用户设备上的技术都可以称为前端技术( 比如 HTML / CSS / JS,甚至移动设备的 Obj-C / Swift );而后端的作用就是负责将这些东西封装在 HTTP 的数据包中然后通过网络传送到前端。当然除了这些前端文件,后端还有一个更重要的职能,即保存和提供用户数据,比如移动端常见的 JSON 就是目前最流行的在后端和前端之间传输的一个文件格式。

以 Web 端为例,在浏览器输入一个网址后,浏览器向服务器发送了一个 HTTP 请求;服务器通过一个 HTTP 响应,把显示这个网页所需要的资源传回给了浏览器。而需要在浏览器中执行的技术,HTML / CSS / Javascript 等就叫做前端;需要在服务器端执行的、通常我们看不到技术就叫做后端。


 1)列出Web前端相关的开发语言并了解。

HTML 和带样式的 HTML

HTML 就是一组标签和文本的组合,是一个最基本的网页。它已经包含了网页常见的元素,实际上在 Web 早期的很长一段时期内,网页都是这个样子。后来随着使用网络的人群越来越广泛,在 HTML3.0 中引入了对网页样式的定义,某种程度上可以说,也是从这个时候开始产生了网页设计师的角色。
CSS
带样式的 HTML 也拥有一个缺点,它需要为每个标题和文字都设定样式,工作量非常庞大。 CSS 就是在这样的情况下诞生了。CSS ,又称叠层样式表,简言之是一种用来表现 HTML 文件样式的样式设计语言。CSS 能够对网页中的对象的位置排版进行像素级的精确控制,实现基础的静态的交互设计;而CSS 目前的最新版本 CSS3 能够真正做到网页表现与内容分离。
Javascript
差不多在 CSS 诞生的同一时间,大家开始觉得这样静态的网页似乎略显无聊,能不能给网页加入一些可以动起来的元素?比如点击一个按钮之后变个颜色。当时网景公司的工程师Brendan Eich 就给他们自家的浏览器引入了这种实现动态效果的脚本语言,这就是 Javascript(简称 JS)的诞生。所以通俗来说,Javascript 就是用来给 HTML 网页增加动态功能,实现更炫酷的交互。

提到 Javascript ,就得提一下 jQuery 。 jQuery 是一个优秀的 Javascript 库。jQuery 使用户能更方便地处理 HTML ,它能够使用户的 HTML 页面保持代码和 HTML 内容分离,通过 jQuery ,可以不用在 HTML 里面插入一堆 JS 来调用命令,只需要定义 ID 即可。此外,由 Twitter 设计师 Mark Otto 和 Jacob Thornton 合作开发的 Bootstrap 也是一个受欢迎的前端框架


2)列出常见的Web后端相关的开发语言并了解;

1/ .net/java
庞大,复杂。但 Java 的优点就是适合处理特别大的数据量,如果你的项目会很快实现大爆发,需要处理海量的请求,那么 Java 是一个不错的选择。
2/ PHP
可以快速上手,相比其他语言,可以更快的为应用添加各种新功能。当然,可维护性就另当别论了。
3/ Ruby
非常接近自然语言,基本上即使不懂编程,也能看明白 70% 或 80%。04 年出现了一个用 Ruby 编写的 Web 开发框架 Ruby on Rails,当时的效果是非常震撼的,以前需要一个团队才能搞定的事情,使用 Ruby on Rails 后 1 个人就可以胜任了,所以 Ruby on Rails 在极短的时间内就成为了 Ruby 的代名词,也成为了新手学习 Web 开发的不二选择,但是 Ruby 语言也并非十全十美,快的同时,他的最大短板就是性能。Twitter 最早就是使用 Ruby on Rails 开发的,但是随着用户数的逐步增长,Twitter 的宕机开始变得非常频繁,后来他们迫不得已将整个系统从 Ruby 迁移到到了一个从 Java 派生出来的语言 Scala。
4/ node.js
简单来说,可以把 node.js 理解为跑在服务器上的 javascript,再直白一点,就是一个跑在服务器上的浏览器,因为 node.js 最早就是从 chrome 浏览器的Javascript 引擎 V8 中剥离出来的。相比 Ruby,Node.js 程序可以获得更高的并发性能,这在一些高并发的场景下(比如群聊,多人协作等)会很有优势。
5/ 其它(python,closure 等)
6/ 无后端(leancloud)

无后端编程是最近的一个新趋势,但她并非说是真的没有后端,而只是把后端交给一些第三方的云平台,比如 Leancloud,Firebase 等。如果你开发一个手机 App,这样的好处就是你可以在早期没有后端程序员的情况下快速开工,像Leancloud 这样的云平台已经可以胜任大部分的应用场景,如果后期业务逻辑复杂之后再寻找合适的后端工程师迁移也不迟。
7/ 最强编程语言 Lisp
如果要评选一个最强的编程语言,该是哪个呢?答案就是Lisp。为什么是 Lisp?Lisp 的作者在很早以前就从数学的层面总结了一个完美的编程语言应该具备的 9 种能力,而 Lisp 就是为了配合他的这个理论而产生出来的语言。Hacker News 是由 YC 的创始人 Paul Graham 开发的,而 Paul Graham 本身就是一个 Lisp 程序员,他为了开发 Hacker News,专门发明了一种新语言叫做 Arc,但因为它是基于 Lisp 的,所以也被归为了 Lisp 的方言之一。
| 数据库
我们平常访问的大部分网站都是需要登录操作的,登录之后我们看到的就是只和自己相关的那部分内容。这些用户信息是保存在什么地方的呢?这就需要用到数据库。关于数据库,代表性的有两个:
1/ MySQL
2/ MongoDB
MySQL 是最常用的结构化数据库,也是大多数创业公司的选择。为什么是结构化的?就是说它的表的结构是固定的,比如我们常见的 User 表在 MySQL 中就是这样的:
id name email password
1 一元 [email protected] $2a$10$ZxNhLyDTdagtUc...
2 产品集小妹 [email protected] $2a$10$zK7TnBXYYFz...
如果我们需要取得一条用户记录来检查他输入的密码是否正确,这时我们就需要使用 SQL,SQL 就是结构化查询语言。
简单来说,SQL 数据库保存的是结构化数据,NOSQL 数据库则可以保存非结构化数据。举个例子,还拿上面的用户表来举例,如果我们现在想要给产品集小妹增加一些额外的属性,比如她给某个产品点赞可以效果 x2,那么如果是 SQL 数据库,我们就需要给数据库增加一个新的字段来保存这个属性:
id name email x2
1 一元 [email protected] false
2 产品集小妹 [email protected] true
但是如果是 MongoDB 这样的 NOSQL 数据库,我们就不需要给所有用户都增加一个x2的属性,只需要给产品集小妹单独增加就可以了,NOSQL 中保存到数据是如下这个样子的:
{id: ‘1’, name: ‘一元’, email: '[email protected]’, password: ‘…’}
{id: ‘1’, name: ‘产品集小妹’, email: '[email protected]’, password: ‘…’, x2: true}
| Cookie 和 Session
服务器要处理成千上万用户的请求,那么他是如何区分每个用户,并返回给每个用户他所需要的内容的 ?这就要涉及到 Cookie 和 Session。我们可以将 Cookie 理解为是服务器给每个用户分配的唯一 ID,这个 ID 由用户浏览器保存,而 Session 则是服务器为了维护这个会话在服务器端保存的与 cookie 对应的用户数据。
| 移动开发
移动端和浏览器的区别就在于,大部分 App,我们打开的一瞬间,就已经看到了它的界面,而不用再去向服务器来拿显示界面的 HTML 等文件。所以移动端,开发原生应用所运用到的技术(比如 Objective C,swift)就相当于前端的 HTML,只不过它是直接保存在应用本地的。这样就产生了一个问题:如何来获取应用数据?如果是网页应用,我们可以直接将数据包含在HTML 中一并反馈给浏览器;但是对于移动应用就需要有一个专门的协议来传送应用需要的数据,这就是 JSON。
移动应用的前端技术,目前来说主要有以下三种:
1/ 原生
2/ 混合式
3/ HTML5
HTML5 必经要经过浏览器这个中间层,所以在性能上多少会有些损失,所以如果你的应用对性能特别敏感,原生就会是比较好的选择;对于普通的性能要求没那么严格的应用来说,HTML5是完全可以满足的。而如果已经有了一个移动端的网站,这种情况下混合式就会是一个比较好的选择,它可以最大程度的利用已有的资源。如果说你是从头开发一个移动应用,并且这个应用对用户体验的要求也不是特别严格,那么 HTML5 就会是一个很好的选择,HTML5 移动应用比较显著的应用就是 Dailycost 。

如果说开发一个原生应用需要 4-6 周,那么同样功能的应用如果我们把其中的一部分用 HTML来实现,那么可能就只需要 3-4 周的时间,但是如果我们全部使用 HTML ,可能就只需要1-2 周。

3)了解数据库服务器、Web服务器和DNS服务器。

后端的任务实际上就是向前端提供需要显示网页和 APP 内容的数据,可能是 HTML,也可能是JSON 数据,也可以是音视频或者 PDF 文件。简单的来划分,一个服务器包含3个部分:
1/ HTTP 服务器
2/ 应用服务器
3/ 数据库
HTTP 服务器的唯一任务就是把需要返回给客户端的资源文件封装在 HTTP 数据包里,这个资源有可能是它后面的应用服务器动态生成的,也有可能是保存在硬盘上的静态文件。这是所有后端程序都必须有的,也是直接和我们的浏览器通信,返回给我们数据的程序。它的作用就是把它后面的编程语言生成的各种 HTML/CSS/Javascript,打包成一个 HTTP 请求,然后再封装到一个 TCP/IP 的数据包里发回给我们。而最常用的两个 HTTP 服务器叫做 Apach 和 Nginx。

应用服务器就是通常意义上所说的码农负责的部分。他们的职责就是生成前端需要的HTML/CSS/JS 交给浏览器。

Web服务器:

Web服务器一般指网站服务器,是指驻留于因特网上某种类型计算机的程序,可以向浏览器等Web客户端提供文档,也可以放置网站文件,让全世界浏览;可以放置数据文件,让全世界下载。目前最主流的三个Web服务器是Apache Nginx IIS。

        数据库服务器:

数据库服务器由运行在局域网中的一台/多台计算机和数据库管理系统软件共同构成,数据库服务器为客户应用程序提供数据服务。

        DNS服务器:

DNS服务器和域名服务器同义。
DNS(Domain Name Server,域名服务器)是进行域名(domain name)和与之相对应的IP地址 (IP address)转换的服务器。DNS中保存了一张域名(domain name)和与之相对应的IP地址 (IP address)的表,以解析消息的域名。 域名是Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。域名是由一串用点分隔的名字组成的,通常包含组织名,而且始终包括两到三个字母的后缀,以指明组织的类型或该域所在的国家或地区。
DNS是计算机域名系统 (Domain Name System 或Domain Name Service) 的缩写,它是由域名解析器域名服务器组成的。域名服务器是指保存有该网络中所有主机的域名和对应IP地址,并具有将域名转换为IP地址功能的服务器。其中域名必须对应一个IP地址,一个IP地址可以有多个域名,而IP地址不一定有域名。域名系统采用类似目录树的等级结构。域名服务器通常为客户机/服务器模式中的服务器方,它主要有两种形式:主服务器和转发服务器。将域名映射为IP地址的过程就称为“域名解析”。


高级拓展
1. 流程描述

详细的描述当我们在浏览器输入URL后的Web流程。

作者:zxcodestudy
链接:https://www.nowcoder.com/discuss/3853?pos=264&type=1&order=0
来源:牛客网

         这个问题经常可以看到,今天我好好总结了下,是从网络模型的角度来分析问题的,主要涉及应用层:DNS,HTTP,传输层:TCP,网络层:IP和路由选择协议:RIP,OSPF(内部网关协议),BGP(外部网关协议)和数据链路层:ARP。下面来具体分析:


       1.应用层:客户端浏览器通过DNS解析到www.baidu.com的IP地址220.181.27.48,通过这个IP地址找到客户端到服务器的路径。客户端浏览器发起一个HTTP会话到220.161.27.48,然后通过TCP进行封装数据包,输入到网络层。

DNS解析IP:

第一节 Web介绍知识

HTTP访问服务器:

第一节 Web介绍知识
       2、传输层:在客户端的传输层,把HTTP会话请求分成报文段,添加源和目的端口,如服务器使用80端口监听客户端的请求,客户端由系统随机选择一个端口如5000,与服务器进行交换,服务器把相应的请求返回给客户端的5000端口。然后使用IP层的IP地址查找目的端。


第一节 Web介绍知识
       3、客户端的网络层不用关心应用层或者传输层的东西,主要做的是通过查找路由表确定如何到达服务器,期间可能经过多个路由器,这些都是由路由器来完成的工作,通过查找路由表决定通过那个路径到达服务器,其中用到路由选择协议

第一节 Web介绍知识
路由选择协议:

因特网有两大类路由选择协议:

        内部网关协议IGP(Interior Gateway Protocol)即在一个自治系统内部使用的路由选择协议。目前这类路由选择协议使用得最多,如RIP和OSPF协议。外部网关协议EGP(External Gateway Protocol)若源站和目的站处在不同的自治系统中,当数据报传到一个自治系统的边界时,就需要使用一种协议将路由选择信息传递到另一个自治系统中。这样的协议就是外部网关协议EGP。在外部网关协议中目前使用最多的是BGP-4。

       1)RIP协议

       工作原理:

       路由信息协议RIP是内部网关协议IGP中最先得到广泛使用的协议。RIP是一种分布式的基于距离向量的路由选择协议。RIP协议要求网络中的每一个路由器都要维护从它自己到其他每一个目的网络的距离记录。距离的解释:从一路由器到直接连接的网络的距离定义为1。从一个路由器到非直接连接的网络的距离定义为所经过的路由器数加1。RIP协议中的“距离”也称为“跳数”(hop count),因为每经过一个路由器,跳数就加1。这里的“距离”实际上指的是“最短距离”。RIP认为一个好的路由就是它通过的路由器的数目少,即“距离短”。RIP允许一条路径最多只能包含15个路由器。“距离”的最大值为16时即相当于不可达。可见RIP只适用于

小型互联网。RIP不能在两个网络之间同时使用多条路由。RIP选择一个具有最少路由器的路由(即最短路由)哪怕还存在另一条高速(低时延)但路由器较多的路由。

      2)内部网关协议OSPF(Open Shortest Path First)

       基本特点:

   “开放”表明OSPF协议不是受某一家厂商控制,而是公开发表的。“最短路径优先”是因为使用了Dijkstra提出的最短路径算法SPF。OSPF只是一个协议的名字,它并不表示其他的路由选择协议不是“最短路径优先”。是分布式的链路状态协议。

工作原理:

 向本自治系统中所有路由器发送信息,这里使用的方法是洪泛法。发送的信息就是与本路由器相邻的所有路由器的链路状态,但这只是路由器所知道的部分信息。“链路状态”就是说明本路由器都和哪些路由器相邻,以及该链路的“度量”(metric)。 

只有当链路状态发生变化时,路由器才用洪泛法向所有路由器发送此信息。

     3)外部网关协议 BGP

BGP是不同自治系统的路由器之间交换路由信息的协议。边界网关协议BGP只能是力求寻找一条能够到达目的网络且比较好的路由(不能兜圈子),而并非要寻找一条最佳路由。

BGP发言人:每一个自治系统的管理员要选择至少一个路由器作为该自治系统的“BGP发言人”。一般说来,两个BGP发言人都是通过一个共享网络连接在一起的,而BGP发言人往往就是BGP边界路由器,但也可以不是BGP边界路由器。

BGP交换路由信息:

一个BGP发言人与其他自治系统中的BGP发言人要交换路由信息,就要先建立TCP连接,然后在此连接上交换BGP报文以建立BGP会话(session),利用BGP会话交换路由信息。使用TCP连接能提供可靠的服务也简化了路由选择协议。使用TCP连接交换路由信息的两个BGP发言人,彼此成为对方的邻站或对等站。


第一节 Web介绍知识

       4、客户端的链路层,包通过链路层发送到路由器,通过邻居协议查找给定IP地址的MAC地址,然后发送ARP请求查找目的地址,如果得到回应后就可以使用ARP的请求应答交换的IP数据包现在就可以传输了,然后发送IP数据包到达服务器的地址。

       ARP(地址解析协议)

       不管网络层使用的是什么协议,在实际网络的链路上传送数据帧时,最终还是必须使用硬件地址。每一个主机都设有一个 ARP 高速缓存(ARP cache),里面有所在的局域网上的各主机和路由器的 IP 地址到硬件地址的映射表。当主机 A 欲向本局域网上的某个主机 B 发送 IP 数据报时,就先在其 ARP 高速缓存中查看有无主机 B 的 IP 地址。如有,就可查出其对应的硬件地址,再将此硬件地址写入 MAC 帧,然后通过局域网将该 MAC 帧发往此硬件地址。

 第一节 Web介绍知识



其实普通web应用,实际上就是对http的应用,http是一种基于TCP协议的网络传输协议,工作在应用层,作为web开发者,我主要从http的角度来看待这个问题:

  • 首先,对于http肯定是有客户端和服务器的,在这个语境中,客户端和服务器本质上也都是一个软件,实现了http协议相关标准的软件。
  • 客户端一般由都是由浏览器充当,也就是说,在浏览器中实现了http客户端的相关功能。
  • 而服务器的实现就多种多样啦,我们可以用java写servlet,c#写ASP.net,还有php,ruby,Python,nodejs等。
  • 实际上我想,http服务在操作系统底层应该有实现,而这些语言只不过是利用操作系统的http服务封装成自己的接口供开发人员编写web服务器程序。

  • 而我们熟悉的IIS,Tomcat,Apache,Web logic,都是能够作为某些web服务器容器的大型服务器平台,它们都会包括很多更为强大的功能。一般来说,我们这里所说的服务器指的是自己用特定语言写的web应用服务器程序。nodejs不需要web容器,本身就有对http的直接应用模块,所以用nodejs创建一个web服务器是很方便的。

整体通信

有了客户端和服务器,就可以开始通信了,整体上分为3个步骤:

1. 因为http是构建在TCP之上,那么自然是要经过3次握手创建连接。

2. 创建连接后,服务器会根据url请求中的信息进行处理,作出响应,一般来说是找到一个html文件返回给客户端。

3. 客户端即浏览器得到html,进行渲染。

下面详细说下这3个步骤:

创建连接

这个跟网络关联多一些,我网络学的马马虎虎,只能大体说一下。

  • 对于http的客户端,它的输入就是一个url
  • 而对于创建连接,它需要的只是url的host(主机)部分
  • 主机地址一般是网站的域名,所以第一步肯定是域名解析,也就是要通过DNS服务器进行域名解析得到网站的ip地址,然后向这个ip地址发送一个连接建立的请求,如果服务器接收到请求会返回一个确认,客户端得到确认再次发送确认,连接建立成功

当然在这个过程中还会涉及到很多细节,这是网络中的知识,在这里不多讲。

服务器处理

建立好连接后,客户端就会发送http请求,请求信息包含一个头部和一个请求体

一般的web技术都会把请求进行封装然后交给我们的服务器进行处理,比如servlet会把请求封装成httpservletrequest对象,把响应封装成httpsevletresponse对象。nodejs的http模块,当你创建服务器的时候会写一个回调函数,回调的参数用来接受http请求对象和响应对象,然后在回调函数中对请求进行处理。

在请求对象中我们可以得到path(路径),queryString(查询字符串),body(post请求中提交的数据)等。

对请求的处理就可以很复杂,也可以很简单。

我们可以根据path找到客户端想要的文件,读取这个文件,然后通过响应对象把内容返回给客户端,这个过程,不同的技术提供的api可能不同,尤其是用惯了MVC框架的人,可能只是指定一个文件,或者在配置文件中设置一下就好了。

但是最终的实现肯定是符合http响应标准的,也就是要有一个响应头和一个响应体

我一般接触到的设置响应头就是设置content-type来决定MIME类型,设置Cache-Control,last-modify等缓存内容。

一般来说返回给客户端的内容是一个html字符串,然后content-type设为text/html。

当然也可能客户端请求的是一个image文件,那么就是读取image文件后,content-type可能设为image/png,image/jpg等,然后把内容返回给客户端。

这样一次对请求的处理就结束了。

当然这个过程太单一,而且处理过程也可能很复杂,又有数据的操作,又有页面的构建,又有路径的查找匹配,又有文件的读取等等,于是就出现了MVC框架以及后来演变出的各种MV框架。这里不细讲MVC的内容,因为需要很长的篇幅

只是概述一下MVC主要做了什么,在我看来最重要的就是解耦和模块化。我认为MVC实现最重要的有两点:

1.路由匹配,http请求的path中就不需要指定到具体的视图位置,而是按照我们制定的规则进行匹配,这样就有了很大的灵活性,可编程性。

2.模板技术,一般来说我们最后返回给客户端的是一个html字符串,而有时候这个字符串往往不是静态单一的,有的时候需要和数据进行结合,需要拼接。这就带来了很大的麻烦,模板技术为解决这个问题带来很大的便利性,同时又能够把视图和数据进行解耦。

客户端渲染

客户端接收到服务器传来的响应对象,从中得到html字符串和MIME,根据MIME知道了要用页面渲染引擎来处理内容即html字符串,于是进入页面渲染阶段,这又是一个很庞杂的体系。我只能大体上说一下:

从浏览器的角度讲,它包含几大组件,网络功能(比如http的实现)算是其中之一,渲染引擎也是其中之一,还有其它的一些比如自己UI界面,javascript解释器,客户端数据存储等等。在这里我们主要关注渲染引擎和javascript解释器,对于web开发者来说,这才是浏览器的核心

我们能够在浏览器中看到一个页面,那么这个页面是怎么出现的呢?实际上就是调用底层绘图API给画出来的。不同的渲染引擎,它的实现也不同,主流的引擎包括IE的Trident,chrome和safary的webkit,firefox的Gecko,chrome又出了一个Blink,放弃webkit。于是乎才有了让人头疼的各种兼容性问题。

整体上页面渲染的过程大致是这样的:

渲染引擎得到html字符串作为输入,然后对html进行转换,转化成能够被DOM处理的形式,接着转换成一个dom树,在解析html的过程,解析到<link>,<script>,<img>等一些请求标签时,会发送请求把对应的内容获取到。这时又会同步进行css的解析,构建出css样式规则应用到dom树上,然后进行一定的布局处理,比如标记节点块在浏览器中的坐标等形成最终的渲染树,最后根据这棵渲染树在浏览器窗口中进行绘制。

最终我们就看到了页面的样子。

当然在页面渲染过程中还会同步进行javascript的解析,而且这两者是在同一个线程中的,所以一旦javascript死循环,页面的渲染也就进行不下去了

以上是我从一个web开发者的角度思考的整个过程。如果从别的角度更细化的去想,还包括许多内容:

比如整个网络通信中协议的封装:

在本机中,把要传输的内容即请求对象在应用层上加上App首部,传递到传输层加上TCP首部,到网络层加上IP首部,数据链路层加上以太网的首部和尾部,然后转换成bit流进入网络环境中。到达主机后在一层层解封装,最后把内容交给服务器程序。

再比如这个过程中的认证,加密,安全,编码等问题都会有一定的处理,不过这些内容我就不是很了解。

转自http://www.cnblogs.com/lichenghan/p/4019370.html