在Web开发的世界里除了PHP之外还有很多编程语言可供挑选,主流的有Node.js、Python、Java,.NET、Golang,Ruby。其中使用最多的是PHP,特别是在中小企业、互联网创业公司。
在说编程语言之前,我们先了解一下网站是如何在浏览器打开的:
1. 输入地址
向浏览器输入一个网址
2. DNS解析
- 请求一旦发起,浏览器首先要做的事情就是解析这个域名,一般来说,浏览器会首先查看本地硬盘的 hosts 文件,看看其中有没有和这个域名对应的规则,如果有的话就直接使用 hosts 文件里面的 ip 地址。
- 如果在本地的 hosts 文件没有能够找到对应的 ip 地址,浏览器会发出一个 DNS请求到本地的DNS服务器 ,本地DNS服务器一般都是由你的网络接入服务器商提供,比如中国电信、中国移动。
- 你输入的网址的DNS请求到达本地DNS服务器之后,本地DNS服务器会首先查询它的缓存记录,如果缓存中有此条记录,就直接返回结果,此过程是递归的方式进行查询。如果没有,本地DNS服务器还要向DNS根服务器进行查询。
- 根DNS服务器没有记录具体的域名和IP地址的对应关系,而是告诉本地DNS服务器,你可以到域服务器上去继续查询,并给出域服务器的地址,这个过程是迭代的过程。
- 本地DNS服务器继续向域服务器发出请求,在这个例子中,请求的对象是.com域服务器, .com域服务器收到请求之后,也不会直接返回域名和IP地址的对应关系,而是告诉本地DNS服务器请求的域名的解析服务器地址。
- 最后,本地DNS服务器向域名的解析服务器发出请求,这时就能收到一个域名和IP地址对应关系,本地DNS服务器不仅要把IP地址返回给用户电脑,还会把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。
3. 浏览器向 web 服务器发送一个 HTTP 请求
浏览器和服务器建立连接以后,浏览器接着给这个IP地址给服务器发送一个http请求,方式为get,例如访问www.baidu.com。其本质是在建立起的TCP连接中,按照HTTP协议标准发送一个索要网页的请求。
这个get请求包含了主机(Host)、用户代理(User-Agent),用户代理就是自己的浏览器,它是你的"代理人",Connection(连接属性)中的keep-alive表示浏览器告诉对方服务器在传输完现在请求的内容后不要断开连接,不断开的话下次继续连接速度就很快了。可能还会有Cookies,Cookies保存了用户的登陆信息,在每次向服务器发送请求的时候会重复发送给服务器。
在建立连接发送请求时每个服务端需要和客户端保持通信,有很多客户端都会和服务器进行通信。服务器为了识别是哪个客户端与它通信,就必须用一个标识记录客户端的信息。客户端首次访问服务器,服务端返回响应时通过附带一个记录的客户端信息的标识来返回给客户端。当客户端再次向服务器发送请求时上就使用上次记录的Cookies,这样服务器就知道是哪个浏览器了。这样他们之间就能保持通信了。
4. 服务器处理请求
服务器收到浏览器的请求以后,会解析这个请求(读请求头),然后生成一个响应头和具体响应内容。接着服务器会传回来一个响应头和一个响应,响应头告诉了浏览器一些必要的信息,例如重要的Status Code。响应就是具体的要请求的页面内容。
5. 浏览器解析渲染页面
- 浏览器显示HTML
当服务器返回响应之后,浏览器读取关于这个响应的说明书(响应头),然后开始解析这个响应并在页面上显示出来。
浏览器打开一个网址的时候会慢慢加载这个页面,一部分一部分的显示,直到完全显示,知道最后的旋转进度条停止。因此在浏览器没有完整接受全部HTML文档时,它就已经开始显示这个页面了。 - 浏览器向服务器发送请求获取嵌入在HTML中的对象
在浏览器显示HTML时,打开一个网页的过程中,主页(index)页面框架传送过来以后,浏览器还会因页面上的静态资源多次发起连接请求,需要获取嵌入在HTML中的其他地址的资源。这时,浏览器会发送一些请求来获取这些文件。这些内容也要一点点地请求过来,所以标签栏转啊转,内容刷啊刷,最后全部请求并加载好了就终于好了。
这时请求的内容是主页里面包含的一些资源,如图片,视频,css样式,JavaScript文件等等。
这在文件属于静态文件,首次访问会留在浏览器的缓存中,过期才会从服务器去取。缓存的内容通常不会保存很久,因为难保网站不会被改动。
静态的文件一般会从CDN中去取,CDN根据请求获取资源的时候可能还会用到负载均衡。 - 浏览器发送异步(AJAX)请求
对于那些动态的请求,动态网页等就必须要从服务器获取了。对于静态的页面内容,浏览器通常会进行缓存,而对于动态的内容,浏览器通常不会进行缓存。对于这些动态请求,Nginx可能会专门设置一些服务器用来处理这些访问动态页面的请求。
概念解释
- 什么是URL
统一定位资源符,英文全称为Uniform Resource Locator,是对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是互联网上标准资源的地址。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。它最初是由蒂姆·伯纳斯·李发明用来作为万维网的地址。现在它已经被万维网联盟编制为互联网标准RFC1738了。
URL有如下常见传输协议:
http——超文本传输协议
ftp——文件传输协议
file——主要用于访问本地计算机中的文件
https——数据经过加密的超文本传输协议
注:开头只有//不是协议,代表该URL的协议与当前页面一致。
- 什么是IP与IP地址?
IP是在TCP/IP协议中网络层的主要协议,任务是根据源主机和目的主机的地址传送数据。为此目的,IP定义了寻址方法和数据报的封装结构。
IP是分配给网络上使用网际协议(英语:Internet Protocol, IP)的设备的数字标签。常见的IP地址分为IPv4与IPv6两大类。IP地址相当于一台主机的门牌号。
IP地址根据网络ID的不同分为A,B,C,D,E 五类,其中最常用到的是A类B类和C类,常以32二进制组成常以XXX.XXX.XXX.XXX形式表现,每组XXX代表小于或等于255的10进制数。
公网IP:是由国际互联网分配的唯一的IP地址,是个静态IP地址。
内网IP:由路由器建立子网分配IP地址。
- 服务器
服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。
服务器的构成包括处理器、硬盘、内存、系统总线等,和通用的计算机架构类似,但是由于需要提供高可靠的服务,因此在处理能力、稳定性、可靠性、安全性、可扩展性、可管理性等方面要求较高。
在网络环境下,根据服务器提供的服务类型不同,分为文件服务器,数据库服务器,应用程序服务器,WEB服务器等。常见的系统如Linux、windows server 2012。常见的web服务器有Apache、Nginx、IIS、Lighttpd等。
- 什么是DNS?
DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。
通俗的讲,我们更习惯于记住一个网站的名字,比如www.baidu.com,而不是记住它的ip地址,比如:167.23.10.2。而计算机更擅长记住网站的ip地址,而不是像www.baidu.com等链接。因为,DNS就相当于一个电话本,比如你要找www.baidu.com这个域名,那我翻一翻我的电话本,我就知道,哦,它的电话(ip)是167.23.10.2。
DNS劫持:将系统缓存hosts文件里的域名对应的IP改成其他IP,致使用户访问该域名时访问到其他的网站。