1,域名系统DNS

1.1,互联网的域名结构

许多应用层软件经常直接使用域名系统 DNS,但计算机的用户只是间接而不是直接使用域名系统。互联网采用层次结构的命名树作为主机的名字,并使用分布式的域名系统 DNS名字到 IP 地址的解析是由若干个域名服务器程序完成的。域名服务器程序在专设的结点上运行,运行该程序的机器称为域名服务器。 

互联网采用了层次树状结构的命名方法。… . 三级域名 . 二级域名 . 顶级域名

任何一个连接在互联网上的主机或路由器,都有一个唯一的层次结构的名字,即域名

域名只是个逻辑概念,并不代表计算机所在的物理地点。变长的域名和使用有助记忆的字符串,是为了便于人来使用。而 IP 地址是定长的 32 位二进制数字则非常便于机器进行处理。

域名中的“点”和点分十进制 IP 地址中的“点”并无一一对应的关系。点分十进制 IP 地址中一定是包含三个“点”,但每一个域名中“点”的数目则不一定正好是三个。

1.2,域名服务器

区:一个服务器所负责管辖的(或有权限的)范围。各单位根据具体情况来划分自己管辖范围的区。但在一个区中的所有节点必须是能够连通的。

每一个区设置相应的权限域名服务器,用来保存该区中的所有主机的域名到 IP 地址的映射。

根域名服务器

根域名服务器是最高层次的域名服务器,也是最重要的域名服务器。所有的根域名服务器都知道所有的顶级域名服务器的域名和 IP 地址。

不管是哪一个本地域名服务器,若要对互联网上任何一个域名进行解析,只要自己无法解析,就首先求助于根域名服务器。

顶级域名服务器

顶级域名服务器(即 TLD 服务器)负责管理在该顶级域名服务器注册的所有二级域名。

当收到 DNS 查询请求时,就给出相应的回答(可能是最后的结果,也可能是下一步应当找的域名服务器的 IP 地址)。

权限域名服务器

负责一个区的域名服务器。当一个权限域名服务器还不能给出最后的查询回答时,就会告诉发出查询请求的 DNS 客户,下一步应当找哪一个权限域名服务器。

本地域名服务器

当一个主机发出 DNS 查询请求时,这个查询请求报文就发送给本地域名服务器。

每一个互联网服务提供者 ISP,或一个大学,甚至一个大学里的系,都可以拥有一个本地域名服务器。

提高域名服务器的可靠性:DNS 域名服务器都把数据复制到几个域名服务器来保存,其中的一个是主域名服务器,其他的是辅助域名服务器当主域名服务器出故障时,辅助域名服务器可以保证 DNS 的查询工作不会中断。主域名服务器定期把数据复制到辅助域名服务器中,而更改数据只能在主域名服务器中进行。这样就保证了数据的一致性。

1.3,DNS 解析过程

【步骤 1】客户端先检查本地的 DNS 缓存,查看是否存在并且是存活着的该域名的地址记录。DNS 是以存活时间(Time to Live,TTL)来衡量缓存的有效情况的,所以,如果某个域名改变了 IP 地址,DNS 服务器并没有任何机制去通知缓存了该地址的机器去更新或者失效掉缓存,只能依靠 TTL 超期后的重新获取来保证一致性。后续每一级 DNS 查询的过程都会有类似的缓存查询操作。

【步骤 2】客户端将地址发送给本机操作系统中配置的本地 DNS(Local DNS),这个本地 DNS 服务器可以由用户手工设置,也可以在 DHCP 分配时或者在拨号时从 PPP 服务器中自动获取到。

【步骤 3】本地 DNS 收到查询请求后,会按照下面的顺序,依次查询自己的地址记录,如果都没有查询到,就会一直找到最后点号代表的根域名服务器为止。

是否有 www.baidu.com.cn 的权威服务器
👇
是否有 baidu.com.cn 的权威服务器
👇
是否有 com.cn 的权威服务器
👇
是否有 cn 的权威服务器

【步骤 4】如果本地 DNS 是全新的,上面不存在任何域名的权威服务器记录,所以当 DNS 查询请求按【步骤 3】的顺序一直查到根域名服务器之后,它将会得到“cn的权威服务器”的地址记录,然后通过“cn的权威服务器”,得到“com.cn的权威服务器”的地址记录,以此类推,最后找到能够解释www.baidu.com.cn的权威服务器地址。

【步骤 5】通过“www.baidu.com.cn的权威服务器”,查询www.baidu.com.cn的地址记录,地址记录并不一定就是指 IP 地址,在 RFC 规范中有定义的地址记录类型已经多达数十种,譬如 IPv4 下的 IP 地址为 A 记录,IPv6 下的 AAAA 记录、主机别名 CNAME 记录,等等。

1.4,迭代查询 & 递归查询 

递归查询主机向本地域名服务器的查询一般都是采用递归查询。如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向其他根域名服务器继续发出查询请求报文。

迭代查询本地域名服务器向根域名服务器的查询通常是采用迭代查询。当根域名服务器收到本地域名服务器的迭代查询请求报文时,要么给出所要查询的 IP 地址,要么告诉本地域名服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地域名服务器进行后续的查询。

2,内容分发网络 CDN

内容分发网络(CDN) 是一种通过分布式节点部署和内容缓存技术,将内容从源站分发到接近用户的边缘节点,提高访问速度、减轻源站压力,并增强网络可靠性与稳定性的技术体系。类比来说,它就像企业的本地经销商,用户无需跨国访问源服务器,而是通过就近节点获取内容,从而提升访问效率。从纯网络传输角度看,网站访问速度主要受四个因素影响:

  • 网站服务器的出口带宽;

  • 用户的入口带宽;

  • 各运营商之间互联节点的带宽;

  • 跨地域传输的物理时延(延迟/Ping 值)。

其中,除了用户本地带宽(第2点)外,其余三项都可以通过 CDN 有效优化。CDN 通过将内容缓存在各地节点,显著降低跨运营商、跨地域的访问延迟,并缓解源站带宽压力。例如在大型活动如双十一期间,淘宝能承受海量访问,离不开阿里云 CDN 网络的强力支撑。

2.1,路由解析

【DNS 解析】

$ dig icyfenix.cn

; <<>> DiG 9.11.3-1ubuntu1.8-Ubuntu <<>> icyfenix.cn
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60630
;; flags: qr rd ra; QUERY: 1, ANSWER: 17, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;icyfenix.cn.                   IN      A

;; ANSWER SECTION:
icyfenix.cn.            600     IN      CNAME   icyfenix.cn.cdn.dnsv1.com.
icyfenix.cn.cdn.dnsv1.com. 599  IN      CNAME   4yi4q4z6.dispatch.spcdntip.com.
4yi4q4z6.dispatch.spcdntip.com.	60 IN	A	101.71.72.192      #浙江宁波市
4yi4q4z6.dispatch.spcdntip.com.	60 IN	A	113.200.16.234     #陕西省榆林市
4yi4q4z6.dispatch.spcdntip.com.	60 IN	A	116.95.25.196      #内蒙古自治区呼和浩特市
4yi4q4z6.dispatch.spcdntip.com.	60 IN	A	116.178.66.65      #新疆维吾尔自治区乌鲁木齐市
4yi4q4z6.dispatch.spcdntip.com.	60 IN	A	118.212.234.144
4yi4q4z6.dispatch.spcdntip.com.	60 IN	A	211.91.160.228
4yi4q4z6.dispatch.spcdntip.com.	60 IN	A	211.97.73.224
4yi4q4z6.dispatch.spcdntip.com.	60 IN	A	218.11.8.232
4yi4q4z6.dispatch.spcdntip.com.	60 IN	A	221.204.166.70
4yi4q4z6.dispatch.spcdntip.com.	60 IN	A	14.204.74.140
4yi4q4z6.dispatch.spcdntip.com.	60 IN	A	43.242.166.88
4yi4q4z6.dispatch.spcdntip.com.	60 IN	A	59.80.39.110
4yi4q4z6.dispatch.spcdntip.com.	60 IN	A	59.83.204.12
4yi4q4z6.dispatch.spcdntip.com.	60 IN	A	59.83.204.14
4yi4q4z6.dispatch.spcdntip.com.	60 IN	A	59.83.218.235

;; Query time: 74 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: Sat Apr 11 22:33:56 CST 2020
;; MSG SIZE  rcvd: 152

DNS 服务为icyfenix.cn的查询结果先返回了一个CNAME 记录(icyfenix.cn.cdn.dnsv1.com.),递归查询该 CNAME 时候,返回了另一个看起来更奇怪的 CNAME(4yi4q4z6.dispatch.spcdntip.com.)。继续查询后,这个 CNAME 返回了十几个位于全国不同地区的 A 记录,很明显,那些 A 记录就是分布在全国各地、存有本站缓存的 CDN 节点。

【CND 解析】

【步骤 1】在搭建好网站 “icyfenix.cn” 的服务器后,需要将这个服务器的 IP 地址 提交给你使用的 CDN 服务商,作为“源站”。提交完成后,CDN 服务商会返回一个特殊的地址,称为 CNAME,比如:icyfenix.cn.cdn.dnsv1.com.。

【步骤 2】接下来,你需要在你购买域名时使用的 DNS 服务商 那里,设置一条 CNAME 记录,将你的域名 icyfenix.cn 指向这个 CDN 提供的 CNAME。

【步骤 3】当有用户第一次访问你的站点时,浏览器会进行一次 DNS 查询:

  • DNS 服务商返回刚才设置的 CNAME;
  • 此时,CDN 的调度系统开始接管解析过程。

【步骤 4】CDN 的权威 DNS 会根据用户的地理位置、网络状况、节点负载等因素,挑选一个离用户最近、访问速度最快的 CDN 边缘节点,并把该节点的 IP 地址返回给用户的本地 DNS。

【步骤 5】浏览器拿到这个 IP 地址后,就会把它当作“服务器地址”发起请求。

【步骤 6】最后,这个 CDN 节点就会响应用户的请求:如果有缓存,直接返回内容; 如果没有缓存,它会从源站拉取数据,再返回给用户,并缓存一份备下次使用。

2.2,内容分发

CDN(内容分发网络)借助 DNS 服务器的协助,实现了用户和服务器之间的“透明加速”——用户请求的资源实际上由 CDN 缓存节点响应,而非源站服务器,用户和源站对此无需知情。但这种机制的前提是缓存节点必须具备所请求资源的副本,因此衍生出两个关键问题:如何从源站获取资源(即内容分发),以及如何对这些资源进行管理和更新

【主动分发(Push)】分发由源站主动发起,将内容从源站或者其他资源库推送到用户边缘的各个 CDN 缓存节点上。由于主动分发通常需要源站、CDN 服务双方提供程序 API 接口层面的配合,所以它对源站并不是透明的,只对用户一侧单向透明。主动分发一般用于网站要预载大量资源的场景。譬如双十一之前一段时间内,淘宝、京东等各个网络商城就会开始把未来活动中所需用到的资源推送到 CDN 缓存节点中,特别常用的资源甚至会直接缓存到你的手机 APP 的存储空间或者浏览器的localStorage上。

【被动回源(Pull)】被动回源由用户访问所触发全自动、双向透明的资源缓存过程。当某个资源首次被用户请求的时候,CDN 缓存节点发现自己没有该资源,就会实时从源站中获取,这时资源的响应时间可粗略认为是资源从源站到 CDN 缓存节点的时间,再加上资源从 CDN 发送到用户的时间之和。因此,被动回源的首次访问通常是比较慢的(但由于 CDN 的网络条件一般远高于普通用户,并不一定就会比用户直接访问源站更慢),不适合应用于数据量较大的资源。被动回源的优点是可以做到完全的双向透明,不需要源站在程序上做任何的配合,使用起来非常方便。这种分发方式是小型站点使用 CDN 服务的主流选择,如果不是自建 CDN,而是购买阿里云、腾讯云的 CDN 服务的站点,多数采用的就是这种方式。

【超时被动失效】超时失效是指给予缓存资源一定的生存期,超过了生存期就在下次请求时重新被动回源一次。

【手工失效】CDN 服务商一般会提供给程序调用来失效缓存的接口,在网站更新时,由持续集成的流水线自动调用该接口来实现缓存更新,譬如“icyfenix.cn”就是依靠Travis-CI的持续集成服务来触发 CDN 失效和重新预热的。

2.3,CDN 应用

【加载静态资源】这是 CDN 的核心功能,通过分布式节点缓存静态资源,减少用户访问源站的距离和时间,显著提升访问速度和网站性能。

【安全防御】CDN 起到保护源站的作用,使其不直接暴露在公网之中,有效抵御 DDoS 等攻击。但安全不能完全依赖 CDN,一旦源站真实 IP 泄露,仍存在较高风险。

【协议升级】CDN 可充当协议转换中间层,如实现:

  • 源站用 HTTP,用户访问为 HTTPS(通过代售 SSL)

  • 源站用 HTTP/1.x,CDN 对外提供 HTTP/2 或 HTTP/3

  • 源站使用 IPv4,CDN 支持 IPv6 用户接入

【状态缓存】CDN 可缓存源站的 HTTP 状态响应,如 301/302 跳转或 404 页面等,以减少源站负担。同时支持 HSTS、OCSP 装订等功能的加速,需注意及时刷新缓存以应对状态变化。

【修改资源内容】CDN 可以动态修改返回资源,如:

  • 自动压缩内容并修改 Content-Encoding

  • 为未配置缓存的资源添加缓存 Header

  • 修改 CORS Header 实现跨域支持

访问控制支持按 IP 实现黑/白名单、访问频率控制(QoS),或通过 Referer 实现防盗链等多种访问策略。

注入功能CDN 可在不改动源站代码的前提下,注入第三方功能(如 Google Analytics、性能分析、加固工具等),提升网站功能扩展性和安全性。

3,HTTP

3.1,URL,端口号,HTTP版本

资源定位符 URL 是对可以从互联网上得到的资源的位置和访问方法的一种简洁表示。URL 相当于一个文件名在网络范围的扩展。因此 URL 与互联网相连的机器上的任何可访问对象的一个指针。  

由以冒号隔开的两大部分组成,并且在 URL 中的字符对大写或小写没有要求。
<协议>://<主机>:<端口>/<路径> 
协议包括:ftp,http等

端口号:在计算机网络中,端口是一种用于标识应用程序的逻辑地址,它通过与 IP 地址相结合来唯一标识一个进程或服务(URL)。一个端口号是一个 16 位的整数,有效范围是 0 到 65535,其中 0 到 1023 是保留端口,一般用于系统级别的服务。

端口的作用主要有以下几个方面:

  • 区分不同应用程序:由于一个计算机可以运行多个应用程序,因此需要通过端口来区分不同的应用程序,以便正确地将数据传递给相应的应用程序。

  • 数据传输:端口可以实现应用程序之间的数据传输,例如客户端通过特定的端口连接到服务端,然后通过这个端口发送和接收数据。

  • 安全性:通过端口可以对应用程序进行访问控制和安全性限制,例如关闭不必要的端口可以减少系统面临的攻击风险。

HTTP(Hypertext Transfer Protocol)的版本有1.0、1.1、2和3,它们之间的主要区别如下:

  • HTTP 1.0:是最早的 HTTP 版本,使用短连接,在服务器响应完客户端请求后直接断开连接。每个请求都需要客户端重新建立连接,效率低下。
  • HTTP 1.1:引入了持久连接(Persistent Connections)以及管道化(Pipelining)技术,可以在一个连接上传输多个请求和响应,减少了连接建立和关闭的次数,提高了性能。同时还添加了一些新特性,如分块传输编码(Chunked Transfer Encoding)、状态码增加等。
  • HTTP 2:在 HTTP 1.1 的基础上进行了全面优化,采用二进制协议,使用多路复用技术(Multiplexing),可以在一个连接上同时处理多个请求和响应,避免了队头阻塞(Head-of-Line Blocking)的问题。同时还支持服务器推送(Server Push)等新特性,提高了性能和安全性。
  • HTTP 3:基于 QUIC 协议,使用 UDP 协议传输数据,具有更快的连接建立和传输速度,并可实现零流量拥塞控制。同时还支持 TLS 1.3 加密和 0-RTT(Zero Round Trip Time)等新特性,提高了安全性和性能。

3.2,HTTP:操作流程

HTTP是超文本传输协议,其主要负责服务器与浏览器之间的通信。HTTP把客户端浏览器的请求发送到服务器,并把响应的网页内容由服务器返回到客户端浏览器。

事件(完整的HTTP流程):用户点击 URL http://www.tsinghua.edu.cn/chn/yxsz/index.htm

可能会建立多个TCP连接,以同时处理不同的资源和服务。这有助于提高性能和用户体验,因为浏览器可以并行下载多个资源,从而更快地加载网页内容。
(1) 浏览器分析超链指向页面的 URL。
(2) 浏览器向 DNS 请求解析 www.tsinghua.edu.cn 的 IP 地址。
(3) 域名系统 DNS 解析出清华大学服务器的 IP 地址。
(4) 浏览器与服务器通过TCP三次握手建立连接。
(5) 浏览器发出HTTP请求:获取取文件 GET /chn/yxsz/index.htm。
(6) 服务器响应请求,返回HTML等资源。
(7) 浏览器接受文件,然后 释放 TCP 连接。
(8) 浏览器按照HTML、CSS、JavaScript等标记语言将 index.html 等发送过来的文件渲染出来

优化:

  • 减少DNS解析时间:通过减少域名解析的次数和使用CDN技术等方式,可以减少DNS解析时间。
  • 减少HTTP请求次数:合并CSS和JavaScript文件,压缩图片等方式,可以减少HTTP请求次数。
  • 减少页面渲染时间:通过优化HTML、CSS和JavaScript代码,避免使用不必要的DOM操作和JavaScript运算等方式,可以减少页面渲染时间。
  • 使用缓存:使用缓存可以减少对服务器的请求次数,提高页面加载速度。
  • 采用异步加载:通过使用AJAX等技术实现页面的异步加载,可以提高页面响应速度。

协议:

(1)浏览器要将URL解析为IP地址,解析域名就要用到DNS协议,首先主机会查询DNS的缓存,如果没有就给本地DNS发送IP查询请求。
(2)DNS服务器是基于UDP的,因此会用到UDP协议。
(3)得到IP地址后,浏览器就要与服务器建立一个http连接。因此要用到http协议。
(4)http生成一个get请求报文,将该报文传给TCP层处理,所以还会用到TCP协议。
(5)如果采用https还会使用https协议先对http数据进行加密。
(6)TCP层如果有需要先将HTTP数据包分片,分片依据路径MTU和MSS。
(7)TCP的数据包然后会发送给IP层,用到IP协议。IP层通过路由选路,一跳一跳发送到目的地址。
(8)当然在一个网段内的寻址是通过以太网协议实现(也可以是其他物理层协议,比如PPP,SLIP),以太网协议需要直到目的IP地址的物理地址,有需要ARP协议。 

3.3,HTTP:请求和响应

HTTP的组成:

  • HTTP 请求的组成:请求的网址,请求方法,请求头,请求体。
  • HTTP 响应的组成:状态行、响应头、响应正文。

HTTP请求

(1)请求网址:请求网址即URL。

(2)POST和GET(请求方法)

  • GET一般是从服务器上获取数据,POST是向服务器传送数据。
  • get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。但理论上,IIS4中最大量为80KB,IIS5中为100KB。
  • get安全性非常低,post安全性较高。但是执行效率却比Post方法好。 
  • 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数。

(3)请求头

  • Acccept:指定客户端可识别的内容类型。
  • Accept-Encoding:指定客户端可识别的内容编码。
  • Accept-Language:指定客户端可是被的语言类型。
  • Cookie:万维网站点为了辨别用户身份进行会话跟踪而存储在用户本地的数据,主要功能是维持当前访问会话Cookie 表示在 HTTP 服务器和客户之间传递的状态信息。使用 Cookie 的网站服务器为用户产生一个唯一的识别码。利用此识别码,网站就能够跟踪该用户在该网站的活动。 
  • Host:指定请求的服务器的域名和端口号。
  • User-Agent:使服务器识别客户端使用的操作系统及版本、浏览器及版本信息等信息,实现爬虫时加上此信息,可以伪装成浏览器。
  • Content-Type:请求的媒体类型信息。(application/x-www-form-urlencoded,表单数据)、(multipart/form-data,表单文件),(appliation/json,序列化JSON数据),(text/xml,XML数据)。
  • Content-Length:请求的内容长度。
  • Referer:包含一个URL,用户以该URL代表的页面出发访问当前请求页面。

(4)请求体:GET请求体为空,POST请求体为Form表单内容。

HTTP响应

(1)响应状态码

  • 100:Continue,服务器已收到请求的一部分,正在等待其余部分,应继续提出请求。
  • 200:OK,服务器已成功处理了请求。
  • 302:Move Temporarily,服务器要求客户端重新发起一个请求。
  • 304:Not Modified,此请求返回网页未修改,继续使用上次的资源。
  • 404:Not Found,服务器找不到请求的网页。
  • 500,Internal Server Error,服务器遇到错误,无法完成请求。

(2)响应头

  • Content-Encoding:Web服务器支持的编码类型。
  • Content-Language:响应体的语言。
  • Content-Length:响应体长度。
  • Content-Type:返回内容的媒体类型。
  • Date:原始服务器消息发出的时间。
  • Expires:响应过期的日期和时间。
  • Last-Modified:请求资源的最后修改时间。
  • Set-Cookie:设置HTTP Cookie。
  • Location:重定向接收到请求的URL位置。

(3)响应体:包含响应的正文数据,即Response。

3.4,TCP,RPC,HTTP

【问题】HTTP,TCP的区别?

(1)区别

  • 层级不同:TCP是传输层协议,位于OSI模型的第四层,负责数据的可靠传输和流控制。HTTP是应用层协议,位于OSI模型的第七层,负责定义数据传输的规则和内容格式。

  • 功能不同:TCP提供了一种可靠的、面向连接的数据传输机制,确保数据可靠地到达目的地。HTTP是一种用于在Web上传输超文本文档的协议,它定义了浏览器和服务器之间如何请求和响应Web资源的规则。

  • 数据单位不同:TCP工作在比特级别,负责将数据流分割成小的数据段并在网络上传输。HTTP工作在应用层,操作的是更高层次的数据单位,如HTTP请求和响应。

(2)联系

  • 协议层次:HTTP通常在TCP连接上运行。客户端通过TCP连接到Web服务器,然后使用HTTP协议在该连接上发送HTTP请求,服务器接收并用HTTP协议响应。

  • 传输可靠性:TCP提供了HTTP所需的可靠性。HTTP在TCP上运行,因此可以确保数据的完整性和可靠性,即使在不稳定的网络环境中也可以正常工作。

  • 端口:HTTP和TCP都使用端口号来识别应用程序和服务。默认情况下,HTTP使用端口80,而TCP没有默认端口,它由操作系统动态分配。

  • 连接管理:HTTP/1.1引入了持久连接(Keep-Alive),允许多个HTTP请求和响应在单个TCP连接上进行多次交互,以减少连接的建立和断开开销。

【问题】RPC通信流程?

  • 调用方发起调用:调用方(客户端)通过RPC库调用远程服务的方法,就像调用本地函数一样。传入的参数和方法名被封装为一个请求消息。
  • 请求序列化:RPC库会将请求消息进行序列化,将其转换为二进制数据。
  • 网络传输:序列化后的请求消息通过底层的物理、数据链路、网络和传输层协议传输到远程服务器。
  • 服务器接收请求:远程服务器接收到请求消息后,将其反序列化为原始请求。
  • 服务器处理请求:服务器调用相应的服务方法来处理请求,并生成一个响应。
  • 响应序列化:服务器将响应消息序列化为二进制数据。
  • 网络传输:序列化后的响应消息通过网络传输到客户端。
  • 客户端接收响应:客户端接收到响应消息后,将其反序列化为原始响应。
  • 调用方处理响应:客户端。

【问题】HTTP,RPC的区别?

HTTP RPC
设计目的 用于传输超文本(如HTML) 用于构建分布式应用程序,使应用程序之间可以像调用本地函数一样进行通信
通信方式 基于请求-响应模式 基于远程过程调用模式
数据格式 支持多种数据格式,如文本、图像、音频、视频等 主要用于传输结构化的二进制数据
可扩展性 支持扩展,可以通过添加header字段或者使用Content-Type来指定数据格式和编码 可以支持不同的编程语言和操作系统,但需要使用共同的接口定义(IDL)来描述服务方法和参数
安全性 可以在应用层使用TLS协议加密通信 通常使用自定义的安全机制来保证通信安全
应用场景 用于Web浏览器与Web服务器之间的通信 用于构建分布式应用程序,尤其是跨平台的终端和服务之间的通信

【问题】在交互过程中如果数据传送完了,还不想断开连接怎么办,怎么维持?

【答案】可以通过发送心跳包来维持连接。心跳包就是一种特殊的数据包,通常是由客户端定时向服务端发送,用于告诉服务端自己还活着,以维持连接。心跳包一般是一个非常小的数据包,通常只包含一个特殊的标识,如心跳包类型。由于心跳包的数据量非常小,所以可以非常频繁地发送,从而保证连接的活跃性。

【问题】HTTP 如何实现长连接?在什么时候会超时?

【答案】实现长连接需要在 HTTP 请求头中添加 Connection: Keep-Alive,表示要求保持连接。在服务端响应头中也需要添加 Connection: Keep-Alive,表示同意保持连接。客户端在发送下一个请求时,可以直接使用已经建立的连接,而不用重新建立连接,从而减少了连接的建立和断开次数。

  • 服务器设置了超时时间。一般情况下,服务器会设置一个超时时间来保护自身,避免连接一直处于打开状态,占用过多的资源。当连接超过设定的时间没有数据传输时,服务器会主动关闭连接,客户端在下次请求时需要重新建立连接。

  • 客户端设置了超时时间。客户端也可以设置一个超时时间,如果连接超过设定的时间没有数据传输,客户端会主动关闭连接,从而避免浪费资源。在客户端发起请求时,可以在请求头中添加 Keep-Alive: timeout=XX 字段,其中 XX 表示超时时间(以秒为单位)。

【问题】谈下你对 HTTP 长连接和短连接的理解?分别应用于哪些场景?

【答案】短连接指的是在每个 HTTP 请求-响应周期中,客户端和服务端之间建立一个新的连接,并在请求结束之后立即关闭连接的方式。这种方式可以避免连接占用过多资源,但是需要频繁地进行连接的建立和释放,会造成较大的开销。短连接通常适用于请求-响应次数较少的场景,如浏览网页、下载小文件等。长连接指的是在一次 HTTP 请求-响应周期中,客户端和服务端之间保持连接不断开,可以重复利用已经建立的 TCP 连接来发送多个 HTTP 请求。这种方式可以减少连接的建立和释放,提高网络传输效率,但是会占用较多的服务器资源。长连接通常适用于请求-响应次数较多的场景,如前后端分离的 Web 应用、长轮询等需要实时推送数据的应用。

3.5,Cookie & Session & JIT

【问题】cookie和session的区别?

  • cookie数据存放在客户的浏览器上,session数据放在服务器上。
  • cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。
  • session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。
  • 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
  • 将登陆信息等重要信息存放为SESSION,其他信息如果需要保留,可以放在COOKIE中。

【问题】Session 原理?

【答案】当访问服务器否个网页的时候,会在服务器端的内存里开辟一块内存,这块内存就叫做session,而这个内存是跟浏览器关联在一起的。这个浏览器指的是浏览器窗口,或者是浏览器的子窗口,意思就是,只允许当前这个session对应的浏览器访问,就算是在同一个机器上新启的浏览器也是无法访问的。而另外一个浏览器也需要记录session的话,就会再启一个属于自己的session。

【问题】如何知道浏览器和这个服务器中的session是一一对应的呢?又如何保证不会去访问其它的session呢?

【答案】

  • 服务器端:当浏览器第一次访问并创建 Session 时,服务器会生成一个唯一的 Session ID(通常是随机数或加密串),并在服务端保存一份 Session 数据(通常存在内存、Redis、数据库等)。
  • 浏览器端:服务器会把这个 Session ID 通过 Set-Cookie 写入浏览器(常见叫 JSESSIONID、PHPSESSID 或者自定义名字)。

Cookie-Session 机制在分布式环境下会遇到 CAP 不可兼得的问题,JWT(JSON Web Token)是目前广泛使用的一种令牌格式,尤其经常与 OAuth2 配合应用于分布式的、涉及多方的应用系统中。

【JIT 令牌头】描述了令牌的类型(统一为 typ:JWT)以及令牌签名的算法

{
  "alg": "HS256",
  "typ": "JWT"
}

【JIT 负载】令牌真正需要向服务端传递的信息。JWT 的负载部分是可以完全自定义的,根据具体要解决的问题不同,设计自己所需要的信息,只是总容量不能太大,毕竟要受到 HTTP Header 大小的限制。

{
  "username": "test",
  "authorities": [
    "ROLE_USER",
    "ROLE_ADMIN"
  ],
  "scope": [
    "ALL"
  ],
  "exp": 1584948947,
  "jti": "9d77586a-3f4f-4cbb-9924-fe2f77dfa33d",
  "client_id": "bookstore_frontend"
}

【JIT 缺点】

  • 令牌难以主动失效:JWT 令牌一旦签发,在到期之前就会始终有效,除非服务器部署额外的逻辑去处理失效问题。
  • 相对更容易遭受重放攻击:首先说明 Cookie-Session 也是有重放攻击问题的,只是因为 Session 中的数据控制在服务端手上,应对重放攻击会相对主动一些。
  • 只能携带相当有限的数据、必须考虑令牌在客户端如何存储。

4,HTTPS

4.1,HTTP & HTTPS

HTTPS是指安全套接字层超文本传输协议,是基于 SSL/TLS 协议的 HTTP 安全传输协议,它在传输层对数据进行加密,主要用于保护网络通信过程中的数据安全,防止中间人攻击、窃听、篡改等安全问题。

HTTP&HTTPS都是无状态的(每个HTTP请求都是独立的,服务器不会在多次请求之间保持任何关于客户端的信息或状态),可以通过Cookies或Session来实现有状态。

【加密方式】HTTPS通过使用SSL(安全套接字层)TLS(传输层安全)协议来加密通信内容,防止黑客窃听和篡改数据。在HTTPS连接建立时,客户端和服务器会协商一个加密算法和密钥,用于加密和解密数据。只有知道密钥的双方才能解密数据,其他人无法读取数据内容。在使用HTTPS的网站中,浏览器地址栏会显示一个锁头和网站的域名,以表示当前连接是加密的。

【HTTP&HTTPS】

  • https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。
  • http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl/tls加密传输协议。
  • http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  • http的连接很简单HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

【优点】

  • 数据传输安全:HTTPS 使用 SSL/TLS 协议进行数据传输加密,能够确保数据传输的安全性,防止敏感信息被窃取、篡改、伪造等。

  • 认证和完整性保护:HTTPS 通过数字证书机制,能够保证数据传输的完整性和真实性,防止伪造和中间人攻击。

  • 搜索引擎排名:搜索引擎会对采用 HTTPS 协议的网站进行一定程度的优化,提高搜索引擎排名。

  • 支持多种协议:HTTPS 支持多种应用层协议,如 HTTP、FTP、SMTP 等。

【缺点】

  • 性能损失:HTTPS 通过对数据进行加密传输,会导致传输速度变慢,增加网络延迟,对服务器资源的消耗也比较大。

  • 费用高:HTTPS 需要向权威的数字证书认证机构购买证书,费用相对较高,对小型网站来说可能会增加一定的负担。

  • 证书管理繁琐:HTTPS 使用的数字证书需要进行管理和更新,管理过程相对繁琐。

  • 不可缓存:HTTPS 通过对数据进行加密传输,数据包含动态的内容,无法被中间代理服务器缓存,对网站访问速度造成影响。

【完整的HTTPS流程】

  • 客户端发起 HTTPS 请求:客户端通过 HTTPS 协议访问服务器,并向服务器请求建立 SSL 连接。
  • 服务器响应证书:服务器收到客户端的 SSL 连接请求后,向客户端发送一份包含公钥、证书以及服务器端相关信息的证书。
  • 客户端验证证书:客户端收到服务器返回的证书后,会对证书的合法性进行验证,包括验证证书的颁发机构是否可信、证书中包含的域名是否与服务器的域名匹配等。
  • 客户端生成随机密钥:客户端在验证证书之后,生成一个随机的对称密钥,并使用服务器端发送的公钥进行加密,然后将加密后的密钥发送给服务器端。
  • 服务器使用私钥解密密钥:服务器端使用自己的私钥对加密后的密钥进行解密,得到客户端生成的随机密钥。
  • 客户端和服务器端使用对称密钥进行加密通信:客户端和服务器端双方都持有生成的对称密钥,之后就可以使用对称密钥进行通信,以保障通信过程的安全性。

4.2,SSL&TLS,对称&非对称加密

SSL(安全套接字层)和TLS(传输层安全)协议都是用于保护互联网通信安全的协议。

  • 非对称加密算法使用公钥和私钥,公钥可以公开给任何人使用,而私钥只能由密钥的所有者持有。在握手阶段,客户端和服务器会互相交换公钥,然后使用公钥进行加密,只有对应的私钥才能解密
  • 对称加密算法则使用同一个密钥进行加密和解密,密钥只能由通信的双方知道。在握手阶段,客户端和服务器会协商一种对称加密算法和密钥,用于加密和解密数据。

【客户端请求】客户端向服务器请求进行加密通信,在这个请求里面,它会以明文的形式,向服务端提供:协议版本号、32 Bytes 随机数(后续生成密钥)、可选 SessionID、密钥交换算法、加密算法、消息认证码算法、数据压缩算法。

【服务器回应】服务器接收到客户端的通信请求后,如果客户端声明支持的协议版本和加密算法组合与服务端相匹配的话,就向客户端发出回应。如果不匹配,将会返回一个握手失败的警告提示。

【客户端确认】客户端收到服务器应答后,先要验证服务器的证书合法性。如果证书不是可信机构颁布的,或者证书中信息存在问题,譬如域名与实际域名不一致、或者证书已经过期、或通过在线证书状态协议得知证书已被吊销,等等,都会向访问者显示一个“证书不可信任”的警告,由用户自行选择是否还要继续通信。如果证书没有问题,客户端就会从证书中取出服务器的公钥。

【服务器确认】服务端向客户端回应最后的确认通知。

对称加密&非对称加密

  • 对称加密算法通常比非对称加密算法快得多,因为它们使用相对较少的计算资源。

  • 对称加密的计算复杂度低,适用于大量数据的加密和解密。

  • 对称加密适合用于加密通信,因为它可以在通信双方之间轻松共享密钥。

  • 对称加密需要在通信双方共享密钥,因此密钥管理可能会成为一个问题,尤其是在大规模的分布式系统中。

  • 如果未能安全地传输密钥,那么攻击者可以截取密钥并解密通信内容。

  • 对称加密不能提供数字签名或验证的功能,非对称加密支持数字签名和验证,有助于验证数据的完整性和身份。

特点 常见实现 主要用途 主要局限
哈希摘要 不可逆,即不能解密,所以并不是加密算法,只是一些场景把它当作加密算法使用。
易变性,输入发生 1 Bit 变动,就可能导致输出结果 50%的内容发生改变。
无论输入长度多少,输出长度固定(2 的 N 次幂)。
MD2/4/5/6、SHA0/1/256/512 摘要 无法解密
对称加密 加密是指加密和解密是一样的密钥。
设计难度相对较小,执行速度相对较块。
加密明文长度不受限制。
DES、AES、RC4、IDEA 加密 要解决如何把密钥安全地传递给解密者。
非对称加密 加密和解密使用的是不同的密钥。
明文长度不能超过公钥长度。
RSA、BCDSA、ElGamal 签名、传递密钥 性能与加密明文长度受限。

4.3,数字加密、签名、证书

【数字加密】公钥加密,私钥解密:用于向私钥所有者发送信息,这个信息可能被他人篡改,但是无法被他人得知。加密像是给小王写信,用他的 公钥上锁,只有他能用 私钥开锁看内容。

【数字签名】私钥加密,公钥解密:用于让所有公钥所有者验证私钥所有者的身份,并且用来防止私钥所有者发布的内容被篡改。但是不用来保证内容不被他人获得。签名像是小王在公告上盖了一个只有他能盖的章(私钥),大家拿着公开的“印章鉴别器”(公钥)就能验证这确实是小王的章,而且公告没被改过。

数字证书类似于权威公证人:一种用于证明身份和加密通信的证书,数字证书通常包含用户的公钥、用户的身份信息和证书颁发机构的数字签名等信息。数字证书是由数字证书颁发机构(CA)颁发的,并使用数字签名进行保护,以确保证书的真实性和有效性。

数字签名和数字证书通常一起使用,数字证书包含公钥和数字签名等信息,用于验证身份和加密通信,数字签名则用于验证数据的完整性和身份验证。数字签名和数字证书都是保证通信安全的重要技术。

CA证书:在HTTPS中,CA证书是一种数字证书,用于验证服务器的身份。当客户端第一次连接服务器时,服务器会将其公钥以数字证书的形式返回给客户端,客户端会对该数字证书进行验证,以确认服务器的身份是否可信。如果验证通过,则客户端会使用服务器的公钥来加密通信数据,从而保证通信的机密性和完整性。

CA证书的作用在于提供了一个可信的证书颁发机构,用于对服务器的身份进行验证。CA证书是由受信任的证书颁发机构(CA)签发的,该机构会对申请数字证书的服务器进行认证,以确保服务器的身份可信。另外,CA证书还包含了CA的公钥,客户端可以使用该公钥来验证服务器的数字证书的真实性。

4.4,加密算法

单次哈希把明文密码用哈希函数(如 SHA-256)转换成固定长度的摘要,不可逆

  • 明文密码 MyP@ssw0rd! → 哈希后 3a7bd3e2f...

  • 攻击者拿到哈希值,不能直接算出原文。

  • 但如果密码是 123456 这种弱密码,彩虹表(预计算哈希字典)能很快查到对应明文。

加盐哈希在密码前后加上一个随机的“盐值”,再做哈希,使相同密码的结果也不同。

  • 盐值 X7g$ + 密码 123456 → 哈希结果 d93k9f1a...

  • 即使别人也用 123456,哈希结果完全不同,彩虹表也失效。

  • 问题:攻击者如果直接拿到哈希结果,仍能把它发给服务器冒充登录。

动态盐值盐值不固定,每次登录时由服务端发一个随机数(挑战值),客户端用它和密码一起做哈希。

  • 服务端发随机数 Nonce=7890

  • 客户端计算:hash(密码 + 7890)a1b2c3d4...

  • 下次再登录随机数变了,哈希值就不同。即使攻击者窃取上次的结果,也不能重放使用。

动态令牌机制服务端发放临时令牌(一次性/短期有效),客户端必须带令牌才能请求,网关统一校验。

  • 用户登录成功 → 服务端发令牌 token=ABC123(10分钟有效)。
  • 后续请求必须带上 ABC123

  • 过期或被用过一次就失效。

  • 问题:如果传输过程被窃听,攻击者仍能用这个令牌冒充。

【HTTPS/TLS】对客户端和服务器之间的通信建立加密隧道,防止链路被嗅探和篡改。

  • 用户输入密码,经过 TLS 加密,在传输过程中别人只能看到乱码,而非明文。
  • 还能防止攻击者直接重放截获的数据包。

  • 风险:如果证书泄漏或被伪造,TLS 仍可能被中间人攻击。

【更好的加密】

  • 硬件隔离

    • 原理:把密钥存储在硬件(如 U 盾)里,外部程序拿不到。

    • 例子:网银必须插 U 盾,才能完成转账。

  • 多因子认证

    • 原理:登录不只依赖密码,还要通过另一个独立渠道验证。

    • 例子:输入密码后,还要输入手机收到的验证码。

  • 物理隔离网络

    • 原理:重要系统完全脱离公网,使用独立物理网络通信。

    • 例子:军事网络、国家电网内网,只能在专门终端上访问。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐