0%

当···时发生了什么?

WHW头图

这篇文章试图回答一个古老的面试问题:当你在浏览器中输入sannaha.moe并且按下回车之后发生了什么?


回车键按下

为了从零开始,我们选择键盘上的回车键被按到最低处作为起点。在这个时刻,一个专用于回车键的电流回路被直接地或者通过电容器间接地闭合了,使得少量的电流进入了键盘的逻辑电路系统。这个系统会扫描每个键的状态,对于按键开关的电位弹跳变化进行噪音消除(debounce),并将其转化为键盘码值。在这里,回车的码值是13。键盘控制器在得到码值之后,将其编码,用于之后的传输。现在这个传输过程几乎都是通过通用串行总线(USB)或者蓝牙(Bluetooth)来进行的,以前是通过PS/2或者ADB连接进行。

解析URL

统一资源定位符(URL),俗称“网址”,标准格式如下:
协议类型:[//服务器地址[:端口号]][/资源层级UNIX文件路径]文件名[?查询][#片段ID]

浏览器通过 URL 能够知道使用的协议和请求的服务器地址。其中服务器的IP地址不便于记忆,因此常使用域名来替代。

域名(Domain Name),是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位。

域名层级

域名层级

域名层级

域名从右向左,依次是根域名顶级域名二级域名三级域名···,其中根域名可以省略不写。

sannaha.moe为例,moe为顶级域名,sannaha.moe为二级域名。

购买域名

购买域名

购买域名

域名是由一家非营利的国际组织ICANN进行管理,此外ICANN还负责IP地址的空间分配,管理通用顶级域名以及国家和地区顶级域名,管理根服务器系统。

域名可以通过域名注册商购买,一般是按年缴费,费用与顶级域名和二级域名的含义、长度等因素有关。

DNS解析

域名系统(DNS)是互联网的一项服务。它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。

  1. 浏览器检查域名是否在浏览器缓存当中
  2. 如果浏览器缓存中没有,就去检查域名是否在本地缓存或本地Hosts文件中
  3. 如果没有找到,它将会向DNS服务器发送查询请求

配置DNS服务

设置DNS解析服务商

设置DNS解析服务商

配置DNS服务

配置DNS服务

DNS常见的资源记录类型

  • 主机记录(A记录):用于名称解析的重要记录,它将特定的主机名映射到对应主机的IP地址上。
  • 别名记录(CNAME记录):用于将某个别名指向到某个A记录上,这样就不需要再为某个新名字另外创建一条新的A记录

使用套接字

当浏览器得到了目标服务器的IP地址以及端口号(http 协议默认端口号是80,https默认端口号是443),它会调用系统库函数 socket,请求一个TCP流套接字,经过封包就可以使用以太网、WiFi、蜂窝数据网络进行传输。

TLS握手

客户端发送一个ClientHello消息到服务器端,消息中同时包含了它的安全传输层协议(TLS) 版本,可用的加密算法和压缩算法。

服务器端向客户端返回一个ServerHello消息,消息中包含了服务器端的TLS版本,服务器所选择的加密和压缩算法,以及数字证书认证机构(CA)签发的服务器公开证书,证书中包含了公钥。客户端会使用这个公钥加密接下来的握手过程,直到协商生成一个新的对称密钥。

密钥交换阶段使用RSA、DHE等非对称加密算法。加密信息传输过程中使用AES、3DES等对称加密算法。

RSA加密

RSA加密是一个非对称密钥加密算法,这是密码学的一种算法,它需要两个密钥,一个是公开密钥,另一个是私有密钥;一个用作加密的时候,另一个则用作解密。使用其中一个密钥把明文加密后所得的密文,只能用相对应的另一个密钥才能解密得到原本的明文。密钥的生成利用了两个质数计算相乘容易,而将其合数分解很难的特性。

AES加密

AES加密是一个对称密钥加密算法,双方使用相同的密钥,必须以绝对安全的形式传送密钥才能保证安全。若果密钥泄露,加密数据将受到威胁。

HTTP协议

超文本传输协议(HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是万维网的数据通信的基础。

通常由HTTP客户端发起一个请求,创建一个到服务器指定端口(默认使用80端口)的TCP连接。HTTP服务器则在那个端口监听客户端的请求。一旦收到请求,服务器便能做出响应,向客户端返回一个状态(比如”HTTP/1.1 200 OK”)以及返回的内容。

扩展:HTTPS协议

超文本传输安全协议(HTTPS,Hypertext Transfer Protocol Secure)是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信(默认使用443端口),但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。

HTTPS的主要作用是在不安全的网络上创建一个安全信道,并可在使用适当的加密包和服务器证书可被验证且可被信任时,对窃听和中间人攻击提供合理的防护。

服务器处理请求

HTTPD(HTTP Daemon)在服务器端处理请求/响应,Linux上常用的有ApacheNginx

购买服务器

购买服务器

购买服务器

通过服务器提供商购买服务器,选择服务器所在的地点,安装的操作系统,服务器的CPU、内存、硬盘和带宽等信息。

服务器信息

服务器信息

服务器信息

服务器提供商部署完服务器后,提供该服务器的IP地址、用户名和密码等信息。使用用户名和密码登录进去后部署Nginx服务器程序。

Nginx服务器配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
worker_processes  1;

events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;

sendfile on;
#tcp_nopush on;

#keepalive_timeout 0;
keepalive_timeout 65;

#gzip on;

server {
listen 80;
server_name www.sannaha.moe;
#rewrite ^(.*)$ https://$host$1 permanent;
return 301 http://sannaha.moe$request_uri;
}

server {
listen 80;
server_name sannaha.moe;
root /home/www/hexo;

location / {
}

error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

浏览器解析与渲染页面

当服务器提供了资源之后(HTML,CSS,JS,图片等),浏览器会执行下面的操作:

  • 解析 —— HTML,CSS,JS
  • 渲染 —— 构建 DOM 树 -> 渲染 -> 布局 -> 绘制

参考资料:
当···时发生了什么
一个网站是如何上线的