对于任何一个有志于从事Web研发(不管前端或后端)的人来说,了解这一基础知识都是十分必要的。于是,作为一个志于从事前端研发的好少年,我也研究了一下这个问题,并以通俗简单的形式整理下来,一方面加深自己的理解,另一方面如果能帮到几个人,那当然是最好的了。
一、URL
URL(Uniform Resource Locator)统一资源定位符是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。
基本URL包含模式(或称协议)、服务器名称(或IP地址)、路径和文件名,如:协议://用户名:密码@子域名.域名.顶级域名:端口号/目录/文件名.文件后缀?参数=值#标志。我们可以把URL分割成3个部分:协议、网络地址、资源路径。
网络地址指示该连接网络上哪一台计算机,可以是域名或者IP地址,可以包括端口号;
协议是从该计算机获取资源的方式,常见的是HTTP、HTTPS、FTP,不同协议有不同的通讯内容格式;
资源路径指示从服务器上获取哪一项资源。
比如你访问http://www.daidaixiong.com/
协议部分:http
网络地址:www.daidaixiong.com
资源路径:/
二、DNS
DNS(Domain Name System,域名系统),因特网上作为域名和IP(Internet Protocol Address)地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。
在整个互联网体系中,约定俗成的用于标识网络上设备的地址是IP,=E4__我们输入的是DNS,因为域名更方便人们记忆,不然那么多网站,人怎么可能记住所有的IP地址。
那这样浏览器就必须知道这个域名对应的IP才能知道服务器真正的地址。那浏览器如何去查询URL对应的IP呢?
浏览器缓存:浏览器会按照一定的频率缓存DNS记录。
操作系统缓存:如果浏览器缓存中找不到需要的DNS记录,那就去操作系统中找。
路由缓存:路由器也有DNS缓存。
ISP的DNS服务器:ISP是互联网服务提供商(Internet Service Provider)的简称,ISP有专门的DNS服务器应对DNS查询请求。
根服务器:ISP的DNS服务器还找不到的话,它就会向根服务器发出请求,进行递归查询。递归查询的意思就是,DNS服务器先问根域名服务器.com域名服务器的IP地址,然后再问.com域名服务器,依次类推。
很多人都会问,在网上查到某个网站的IP地址,在自己的浏览器上输入为什么就连接不上。原因是大的高并发网站可能不止一个IP地址,根据不同的网络他们会有很多的IP来做集群。有的是通过DNS来实现负载均衡,有的是用squid来实现的。这里就不对其展开了。
三、TCP三次握手连接
当DNS解析完成后,我们就拥有了目标IP和端口号,浏览器知道了服务器的IP地址之后就要跟服务器建立连接了。
浏览器先发一个报文段,告诉服务器我想上你;服务器收到后回复一个报文段说我准备好了,可以上;浏览器收到了之后回复说我也准备好了,并且告诉服务器:你已经允许我上你了。三次握手之后,TCP连接就建立起来了,这个时候,浏览器就可以和服务器进行正式通信了,也就是开始基于HTTP协议的信息交换。
四、HTTP通信
超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。HTTP规定了客户机和服务器之间沟通的“语言”和规则,就好像两个人之间要正常对话必须基于共同的语言一样,没有HTTP,客户机和服务器的对话很可能变成鸡同鸭讲。
在web应用中,浏览器端发送请求数据包,服务器端返回响应数据包来实现web应用
程序的工作。当服务器向客户端返回响应后,整个连接就会关闭,是一种无状态的连接。
于是你的浏览器按照HTTP协议发出了请求,请求长成这个样子:
GET http://daidaixiong.com/ HTTP/1.1
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8
Accept-Encoding:gzip, deflate, sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Connection:keep-alive
Host:daidaixiong.com
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_5) AppleWebKit/537.36(KHTML, like Gecko) Chrome/53.0.2785.101 Safari/537.36
HTTP请求由请求行(request line)、首部行/请求头部/请求头(headerline,由于翻译不一致,中文名有多个)、空行、请求
数据组成。关于HTTP请求的详细解释可以参考HTTP的GET和POST格式解析。
数据包在网络中的漫游经历
首先,你要清楚网络分层模型,OSI7层模型,但通常习惯去记忆TCP/IP的四层模型:应用层,传输层,网络层(网际层IP),网络接口层(链路层),不同版本的教材对这四层的名字不一样。
TCP/IP参考模型的相关常用协议
应用层
HTTP、HTTPS、FTP、TELNET、SMTP、DNS
SNMP、TFTP、NTP
传输层
TCP
UDP
网络层
IP、ARP、RARP
物理链路层
MAC地址、路由器(router)、中继器(repeater)、集线器(hub)
在浏览器和服务器通信过程中,可能会经过缓存和代理服务器等,
缓存有浏览器端的缓存,有服务器端的缓存,有代理服务器的缓存,有页面缓存,对象缓存。数据库也有缓存,等等。
HTTP中具有缓存功能的是浏览器缓存,以及缓存代理服务器。
五、HTML和DynamicHTML
HTML(HyperText Markup Language,超文本标记语言)是一种用于创建网页的标准标记语言。HTML是一种基础技术,常与CSS、JavaScript一起被众多网站用于设计令人赏心悦目的网页、网页应用程序以及移动应用程序的用户界面。
传统的HTML网页就像搬到互联网上的书本,与浏览者缺乏交互。随着互联网应用领域的日益广泛,传统的HTML网页的表现力显得捉襟见肘。为了增_=8A_网页的交互性和表现力,发展了很多技术:如 Java Applet、ActiveX、DHTML 等。DHTML只是在传统的HTML的基础之上增加了 CSS和脚本语言,非常容易掌握。
客户机向服务器发出请求后,服务器会客户机回送应答, HTTP/1.1 200 OK ,应答的第一部分是协议的版本号和应答状态码。服务器也会随同应答向用户发送关于它自己的数据及被请求的文档。数据可能是根据HTML协议组织的网页,里面包含页面的布局CSS、文字。数据也可能是图片、脚本程序JS等。现在你可以用浏览器的“查看源代码”功能,感受一下服务器返回的是什么东东。如果资源路径指示的资源不存在,服务器就会返回著名的404错误。
六、Web服务器
HTTP请求到达了Web服务器之后,Web服务器如何处理请求呢?
服务器这一概念既可以指软件也可以指硬件,一般来说,我们在讨论Web服务的时候所说的服务器是指服务器软件(Apache、IIS、Nginx)。Web服务器的基本功能就是存储、处理、分发Web页面。当客户机向服务器发出请求后,服务器找到相应的资源(HTML文件、CSS文件、js文件、图片、视频等),然后以HTTP响应消息的方式发给客户机,这样一个完整的HTTP请求就完成了。
但是以上只是传统的静态网页的服务器端处理方式,现在的网页大多是动态网页,比如你登录了微博,你看到了你关注的用户的动态,我登录了微博,看到的是我关注的用户的动态,那么难道新浪专门为我写了一个HTML网页吗?当然不可能了,这其中实际上是使用了动态网页技术,当客户机向服务器发出请求后,服务器根据客户机传递过来的参数(用户名、会话ID等)动态生成一个页面,然后将这个页面传递给客户机。
七、CGI、FastCGI、Servlet
最开始,动态网页技术是CGI(common gateway interface),CGI根据客户机传来的参数,动态地生成HTML文件,将HTML文件返回给客户机。但是
CGI为每一个请求都会开启一个进程,导致对服务器的消耗特别大。为了解决这一问题,产生了CGI的增强版本FastCGI(Fast Common Gateway Interface),"与为每个请求创建一个新的进程不同,FastCGI使用持续的进程来处理一连串的请求。这些进程由FastCGI服务器管理,而不是Web服务器。 当进来一个请求时,Web服务器把环境变量和这个页面请求通过一个Socket或者一个TCP connection传递给FastCGI进程。
FastCGI 的主要优点是把动态语言和HTTP Server分离开来,所以Nginx与PHP/PHP-FPM经常被部署在不同的服务器上,以分担前端Nginx服务器的压力,使Nginx专一处理静态请求和转发动态请求,而PHP/PHP-FPM服务器专一解析PHP动态请求。
除了FastCGI之外,Java方面推出了Servlet,关于Servlet,《Java Servlet 3.1 规范》中是这样定义的:“Servlet 是基于 Java 的 Web 组件,由容器进行管理,来生成动态内容”。Servlet是Java的一个公共接口(public interface),servlets是这一公共接口的实现,servlets接收并响应客户端的请求。ServletContainer(Servlet 容器) 是 Web 服务器或者应用服务器的一部分,用于提供基于请求/响应发送模式的网络服务,解码基于 MIME的请求,并且格式化基于 MIME 的响应。Servlet 容器同时也包含和管理他们的生命周期里 Servlet。
八、浏览器渲染
当服务器提供了资源之后(HTML,CSS,JS,图片等),浏览器获得数据,渲染网页然后呈现给用户,浏览器会执行下面的操作:
解析 HTML,CSS,JS
渲染——构建 DOM 树 -> 渲染 -> 布局 -> 绘制
渲染结束后,浏览器根据某些时间机制运行JS代码或与用户交互。
声明:部分内容采用网上信息,如有侵权,请联系作者删除。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。