【Linux】访问一个网站的全过程

admin / Linux / / 5894 字 · 约 16 分钟 / 355 次阅读 /

大致流程

第一步:客户端用户从浏览器输入 www.baidu.com 网站网址后回车,系统会查询本地 hosts 文件及 DNS 缓存信息,查找是否存在网址对应的 IP 解析记录。如果有就直接获取到 IP 地址,然后访问网站,一般第一次请求时, DNS 缓存是没有解析记录的(读 hosts 文件); 第二步:如果客户端没有 DNS 缓存或 hosts 没有对应 www.baidu.com 网站网址的域名解析记录,那么,系统会把浏览器的解析请求,交给客户端本地设置的 DNS 服务器地址解析(此 DNSLDNS ,即 Local DNS ),如果 LDNS 服务器的本地缓存有对应的解析记录( dnsmasq 等),就会直接返回 IP 地址;如果没有, LDNS 会负责继续请求其它的 DNS 服务器;

第三步: LDNS 会从 DNS 系统的“.”根开始请求 www.baidu.com 域名的解析,经过一系列的查找各个层次 DNS 服务器,最终会查找到 www.baidu.com 域名对应的授权 DNS 服务器,而这个授权 DNS 服务器,正是该企业购买域名时用于管理域名解析的服务器。这个服务器有 www.baidu.com 对应的 IP 解析记录,如果此时都没有,就表示企业的运维人员没有给 www.baidu.com 域名做解析;

第四步: baidu.com 域名对应的授权 DNS 服务器会把 www.baidu.com 对应的最终 IP 解析记录发给 LDNS

第五步: LDNS 把收到来自授权 DNS 服务器关于 www.baidu.com 对应的 IP 解析记录发给客户端浏览器,并且在 LDNS 本地把域名和 IP 的对应解析缓存起来,以便下一次更快的返回相同的解析请求的记录;

第六步:客户端浏览器获取到了 www.baidu.com 的对应 IP 地址,接下来浏览器会请求获得的 IP 地址对应的 Web 服务器, Web 服务器接收到客户的请求并响应处理,将客户请求的内容返回给客户端浏览器;

至此,一次访问浏览网页的完整过程就完成了。

DNS 解析原理

dns 解析的流程:计算机之间只能通过 ip 相互通信,因为 ip 不好记,于是才使用 dns 服务器把域名解析为相应的 ip,这里以解析 www.baidu.com 为例,当我们输入这个网址回车的时候,浏览器会首先查询浏览器的缓存,这个缓存存活时间可能只有 1 分钟,如果没找到,则去查询本地的 dns 缓存和 hosts 文件,如果有 www.baidu.com 这个域名对应的 ip,则直接通过这个 ip 访问网站服务器。如果本地的 dns 缓存和 hosts 文件没找到,这时候就会把请求发送给,网卡配置信息里的 dns 服务器,默认有两个,只有当 dns1 不能访问时,才会使用 dns2 。我们也称网卡配置信息里的 dns 为 local dns ,这时候 local dns 会先查询它的缓存,有没有 www.baidu.com 相应的记录,如果有,则返回给用户,如果没有,就会访问根域名服务器,世界一共有 13 台根域名服务器,根域名服务器一看,是找.com 的,于是会把.com 的顶级域名服务器的 ip 发送给 local dns ,这时 local dns 再次访问 .com 的顶级域名服务器, .com 的顶级域名服务器一看,是找一级域名 baidu.com 的,于是再将 baidu.comip 发送给 local dns ,然后继续往下找,直到找到 www.baidu.com 的权威 dns 的 A 记录或者 cname,这时候 local dns 会把找到的 www.baidu.com 的 ip 发送给客户端,并记录在缓存中,这样的话,下次如果有其他的用户访问 www.baidu.com 这个域名时,local dns 的缓存中就有记录了。客户端收到 local dns 发送过来的 ip 就会通过 ip 去访问服务器,并将这个 ip 记录在 dns缓存 (本地)中。

TCP/IP 三次握手

通过 dns 解析之后,拿到了 ip ,就可以通过 ip 向服务器发送 http 请求了,因为 http 是工作在第七层应用层, tcp 是工作在第四层传输层,所以发生 http 请求之前,还会进行 tcp 的三次握手。 tcp 的三次握手是:客户端首先向服务器发送一个带有 SYN 标识和一个 seq 的随机数,服务端收到后,需要给客户端回应一个 ackack 的值就是刚才的 seq 随机数的值+1,在回应包里,还包含一个 SYN 的标识和一个 seq 随机数。客户端收到服务端发过来的回应包之后,再给服务端发送一个 ack,ack 的值就是刚才服务端发过来的 seq 的值 +1 。上面三步完成之后,三次握手就完成了,下面就可以开始传数据了。

osi 参考模型

TCP/IP 模型处理过程:

以太网的数据链路大致流程:

路由解析:

静态路由:

动态路由

路由算法

http 协议原理(www 服务请求过程)请求细节:

这里就是开始发送 http 请求报文了

HTTP 的请求报文:

  • 请求行
  • 请求头部
  • 空行
  • 请求主体

而请求行又包括,请求方法,url,协议版本,请求方法主要有 GET、HEAD、POST、PUT、DELETE、MOVE ,url 就是统一资源定位符,通过这个能在服务器上找到唯一的网页资源,协议版本,目前主流的是 http1.1,开始流行的协议版本是 http1.0,相对应 http1.0,http1.1 主要从可扩展性、缓存处理、带宽优化、持久连接、host 头、错误通知、消息传递、内容协商等多方面做了一些优化,以上是请求行的内容。

再来说一些,请求头部,请求头部主要有媒体类型,语言类型、支持压缩、客户端类型、主机名等,媒体类型主要有文本文件,图片文件,视频文件等,语言类型就是告诉服务器客户端的接受的语言,支持压缩的话,可以节省带宽,客户端类型,会显示客户端浏览器的版本信息,操作系统信息等 空行,代表请求头部的结束,也代表着请求主体的开始

请求报文主体,只有使用 POST 提交表单的时候才有。

大规模网站集群架构细节

常见的网页资源有三种,分别是静态网页,动态网页,伪静态 静态网页就是没有后台数据库,不含 php,jsp,asp 等程序,不可交互的,开发者编写的是啥,显示的就是啥,不会有任何改变 动态网页,有后台数据库,支持更多的功能,如用户注册,登录,发帖,订单,博客等,动态网页并不独立存在于服务器上的网页文件,而是当用户请求服务器上的动态程序时,服务器解析这些程序,并调用数据库来返回一个完整的网页内容,它跟静态网页的 url 不同,它的 url 中包含?、&等特殊符号,搜索引擎收录的时候存在一定的问题。动态网页为了方便收录,常常会利用 rewrite 技术,把动态网页的 URL 伪装成静态网页 URL,这就是伪静态。

不同的网页资源,打开的流程不一样,下面假设我们访问的是一个静态网站: 客户端会通过 http 协议,下载服务器上的 html 文件,然后去读这个 html 文件,根据 html 页面中的链接,自上而下的请求,每一个请求是一个链接,如果是图片的话,会下载边渲染,遇到 js,就会加载 js,当 js 比较内容较复杂时,浏览器就会等待,鼠标在转圈,我们称这个为 js 阻塞,当 js 下载完毕并执行完成之后,才会显示我们看到的网页。

当我们访问的是一个动态网页时,首先用户发出一个请求,服务器收到这个请求之后,这里假设服务器使用的是 nginx,nginx 会把这个请求转给 php,php 就会去查询数据库,根据数据库返回的值,生成一个完整的网页内容,发送给用户,用户收到之后,也是边下载边渲染,加载 js,执行完毕之后,才会显示我们看到的网页。

当服务器的访问量达到亿级 PV 时,这个访问的过程就更复杂了,用户的请求会先访问全国的 CDN 节点,通过 CDN 挡住全国 80%的请求,当 CDN 上没有时,在访问服务器集群,这个集群一般都有一个 4 层的代理,这个 4 层的代理,使用软件来完成的话,就是 LVS,使用硬件就是 F5,4 层的代理,后面才是 7 层的负载均衡,常用的是 haproxy,nginx,然后才是多台 web 服务器,web 服务器比较多的时候,就有两个问题,一个是用户数据的一致性,不能因为不同的 web 服务器提供服务,而导致数据不同步,这时候,我们就需要使用 NFS 共享存储,第二个问题是 session,不能因为不同的 web 服务器提供服务,session 找不到了,这时候,我们就需要使用 memcached 来存放并共享 session。由于用户访问量太大,这时候的瓶颈就是数据库的压力,我们一般都是使用分布式缓存 memcache,redis 等,另外数据库还需要做读写分离等优化,后面的过程与访问动态网页类似

http 协议原理报文细节 对应的,服务器收到请求报文之后,就会给出响应报文

响应报文主要包含起始行、响应头部、空行、响应报文主体

起始行一般包含 http 版本号,数字状态码,状态情况 而数字状态码,常见有以下几种 200 代表 ok 301 永久跳转 403 没权限 404 没有这个文件 500 未知的错误 502 网关错误 503 服务器超载,停机维护 504 网关超时 响应头部,主要包括,服务器的 web 软件版本,服务器时间,长连接还是短连接,设置字符集等等 这里的空行和请求报文空行一样

HTTP 报文结构 (1)HTTP 报文大致可以分为报文首部和报文主体两块

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/24b3674d-a0f8-4125-ac80-718ad3d3e614/Untitled.png

(2)请求报文和响应报文的结构实例

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/92622f61-e1ee-4963-9c61-f3ae672d52a7/Untitled.png

HTTP/1.1 规范定义了如下 47 种首部字段

(1)通用首部字段

(2)请求首部字段

(3)响应首部字段

(4)实体首部字段

tcp/ip 四次挥手过程 当浏览器加载一个完整的页面时,还需要与服务器断开连接,这个过程就是 tcp 的四次挥手 首先客户端会发送一个带有 FIN 标识和一个 seq 随机数,服务端收到之后,会回应一个 ack,ack 的值等于刚才的 seq 的值+1,发送之后,服务器会再发一个包,这个包里面也带有 FIN 标识和一个 seq 随机数,客户端收到之后,回应一个 ack,ack 的值等于刚才的 seq 值+1,以上完成之后,服务器和客户端的 4 次挥手就完成了!

持久连接 在 HTTP 协议的初始版本中,每进行一次 HTTP 通信就要断开一次 TCP 连接。因此,每次的请求都会造成无谓的 TCP 连接建立与断开,增加通信量的开销。为了解决这个问题,HTTP/1.1 想出了持久连接(也称为 HTTP keep-alive),其特点是:只要任意一端没有明确提出断开连接,则保持 TCP 连接状态。

针对 Web 应用的攻击模式 (1)主动攻击:攻击者通过直接访问 Web 应用,把攻击代码传入的攻击模式。最具典型的攻击就是 SQL 注入攻击和 OS 命令注入攻击。

(2)被动攻击:利用圈套策略执行攻击代码地攻击模式,在被动攻击过程中,攻击者不直接对目标 Web 应用访问发起攻击。

跨站脚本攻击(XSS) 跨站脚本攻击(Cross-Site Scripting,XSS)是指通过存在安全漏洞的 Web 网站注册用户的浏览器内运行非法的 HTML 标签或者 JavaScript 脚本进行攻击的一种攻击。   跨站脚本攻击可以造成以下影响:   (1)利用虚假输入表单骗取用户个人信息。   (2)利用脚本窃取用户的 Cookie 值,被害者在不知情的情况下,帮助攻击者发送恶意请求。   (3)显示伪造的文章或者图片。

SQL 注入攻击 SQL 注入(SQL Injection)是指针对 Web 应用使用的数据库,通过运行非法的 SQL 而产生的攻击。该安全隐患有可能引起极大地威胁,有时会直接导致个人信息及机密信息的泄露。   SQL 注入攻击有可能造成以下影响:  (1)非法查看或篡改数据库内的数据。 (2)规避认证。  (3)执行和数据库服务器业务关联的程序等。

OS 命令注入攻击 OS 命令注入攻击是指通过 Web 应用,执行非法的操作系统命令达到攻击的目的。只要在能调用 Shell 函数的地方就有存在被攻击的风险。

HTTP 首部注入攻击 HTTP 首部注入攻击是指攻击者通过在响应首部字段内插入换行,添加任意响应首部或主题的一种攻击。属于被动攻击模式。

因会话管理疏忽引发的安全漏洞

  • 会话劫持:攻击者通过某种手段拿到了用户的会话 ID,并非法使用此会话 ID 伪装成用户,达到攻击的目的。
  • 会话固定攻击:强制用户使用攻击者指定的会话 ID,属于被动攻击。
  • 跨站点请求伪造(Cross-Site Request Forgeries,CSRF):攻击者通过设置好的陷阱,强制对已完成认证的用户进行非预期的个人信息或设定信息等某些状态更新,属于被动攻击。
    • CSRF 有可能造成以下影响: 1、利用已通过认证的用户权限更新设定信息等; 2、利用已通过认证的用户权限购买商品; 3、利用已通过认证的用户权限在留言板上发表言论等;

DoS 攻击 DoS 攻击(Denial of Service attack)是一种让运行中的服务呈停止状态的攻击。有时也叫作服务停止或拒绝服务攻击。主要有以下两种 DoS 攻击方式:   (1)集中利用访问请求造成资源过载,资源用尽的同时,实际上也就呈停止状态。   单纯来讲,就是发送大量的合法请求,服务器很难分辨何为正常请求,何为攻击请求,因此很难防止 DoS 攻击。多台计算机发起的 DoS 攻击成为 DDoS 攻击(Distributed Denial of Service attack),DDoS 攻击通常利用那些感染病毒的计算机作为攻击者的攻击跳板。   (2)通过攻击安全漏洞使服务停止。

admin

admin

云原生架构 · 全栈开发

感谢阅读本文!记录系统架构思考与实战复盘。专注于 Python、Django、PostgreSQL 与云原生容器化工程实践。