第一章 计算机网络概述
1.1 什么是互联网
- 互联网本质是世界各地的ISP(Internet Service Provider,互联网服务提供商)的骨干路由器相互连接而成的网络。
- 包交换设备:一种用于计算机网络中数据包交换的设备,其主要功能是接收来自源设备的数据包并将其封装成新的数据包,然后通过网络传输到目标设备,包括两种:路由器(router)、交换机(switch)
- 网络核心的两大功能:路由 和转发 。
- 路由:确定数据分组从源到目标所使用的路径(全局操作)
- 转发:路由器或交换机将接收到的数据分组转发出去(即移动到该设备的某个输出接口)(本地操作)。
- 互联网由网络边缘 与网络核心 构成:
- 网络边缘:位于互联网边缘与互联网相连的计算机和其他设备,如桌面计算机、移动计算机、服务器、其他智能终端设备。
- 网络核心:由互联端系统的分组交换设备和通信链路构成的网状网络,如:分组交换路由器、链路层交换机、通信链路(光纤、铜缆、无线电、激光链路)
- 边界上的设备如何连接到互联网上:家庭网络 、机构网络 、移动接入 。
- 家庭网络:路由器的其中一个端口接在光猫上,光猫负责解析光纤送来的信号,另一个端口接ap,负责无线信号的发送,国内一般三合一组建一个局域网。
- 企业接入网(以太网):机构连接到ISP机构路由器。目前,终端系统通常连接到以太网交换机。
- 无线网络:wireless LANs:WLAN(无线局域网),wide-area wireless access:网络广域无线接入网,也叫蜂窝网络。(补充知识tips:当周围无基站或者基站信号极弱时,手机的通讯模块会以正常的数倍的发射功率,则对身体辐射大,平时无论基站还是手机的辐射对身体都几乎无影响,太阳光的辐射都大一点。)
1.2 网络分类
- 个域网PAN( Personal Area Network )
- 能在便携式消费电器与通信设备之间进行短距离通信的网络
- 覆盖范围一般在10米半径以内,如蓝牙耳机等
- 局域网LAN(Local Area Network)
- 局部地区形成的区域网络,如企业网络
- 分布地区范围有限,可大可小,大到一栋建筑、小到办公室内的组网
- 电脑WLAN接入,打印机共享等等
- 城域网MAN(Metropolitan Area Network )
- 范围覆盖一个城市的网络
- 广域网WAN(Wide Area Network)
- 覆盖很大地理区域,乃至覆盖地区和国家
1.3 网络层次结构
1.3.1 OSI 七层模型
1.3.1.1 应用层
OSI
参考模型中最靠近用户的一层,是为计算机用户提供应用接口,也为用户直接提供各种网络服务。我们常见应用层的网络服务协议有:HTTP
,HTTPS
,FTP
,POP3
、SMTP
等。
- 在客户端与服务器中经常会有数据的请求,这个时候就是会用到
http(hyper text transfer protocol)(超文本传输协议)
或者https
.在后端设计数据接口时,我们常常使用到这个协议。 FTP
是文件传输协议,在开发过程中,个人并没有涉及到,但是我想,在一些资源网站,比如百度网盘``迅雷
应该是基于此协议的。SMTP
是simple mail transfer protocol(简单邮件传输协议)
。例如用户邮箱验证码登录的功能便会使用到这个协议。
1.3.1.2 表示层
表示层提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。如果必要,该层可提供一种标准表示形式,用于将计算机内部的多种数据格式转换成通信中采用的标准表示形式。数据压缩和加密也是表示层可提供的转换功能之一。
在项目开发中,为了方便数据传输,可以使用base64
对数据进行编解码。如果按功能来划分,base64
应该是工作在表示层。
1.3.1.3 会话层
会话层就是负责建立、管理和终止表示层实体之间的通信会话。该层的通信由不同设备中的应用程序之间的服务请求和响应组成。
1.3.1.4 传输层
传输层建立了主机端到端的链接,传输层的作用是为上层协议提供端到端的可靠和透明的数据传输服务,包括处理差错控制和流量控制等问题。该层向高层屏蔽了下层数据通信的细节,使高层用户看到的只是在两个传输实体间的一条主机到主机的、可由用户控制和设定的、可靠的数据通路。我们通常说的,TCP
UDP
就是在这一层。端口号既是这里的"端"。
1.3.1.5 网络层
本层通过IP
寻址来建立两个节点之间的连接,为源端的运输层送来的分组,选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层。就是通常说的IP
层。这一层就是我们经常说的IP
协议层。IP
协议是Internet
的基础。我们可以这样理解,网络层规定了数据包的传输路线,而传输层则规定了数据包的传输方式。
1.3.1.6 数据链路层
将比特组合成字节,再将字节组合成帧,使用链路层地址 (以太网使用MAC地址)来访问介质,并进行差错检测。 网络层与数据链路层的对比,通过上面的描述,我们或许可以这样理解,网络层是规划了数据包的传输路线,而数据链路层就是传输路线。不过,在数据链路层上还增加了差错控制的功能。
1.3.1.7 物理层
实际最终信号的传输是通过物理层实现的。通过物理介质传输比特流。规定了电平、速度和电缆针脚。常用设备有(各种物理设备)集线器、中继器、调制解调器、网线、双绞线、同轴电缆。这些都是物理层的传输介质。
1.3.2 TCP/IP 五层模型
-
应用层 (application layer) :直接为应用进程提供服务。应用层协议定义的是应用进程间通讯和交互的规则,不同的应用有着不同的应用层协议,如 HTTP协议(万维网服务)、FTP协议(文件传输)、SMTP协议(电子邮件)、DNS(域名查询)等。
-
传输层 (transport layer) :有时也译为运输层,它负责为两台主机中的进程提供通信服务。该层主要有以下两种协议:
- 传输控制协议 (Transmission Control Protocol,TCP):提供面向连接的、可靠的数据传输服务,数据传输的基本单位是报文段(segment);
- 用户数据报协议 (User Datagram Protocol,UDP):提供无连接的、尽最大努力的数据传输服务,但不保证数据传输的可靠性,数据传输的基本单位是用户数据报。
-
网络层 (internet layer) :有时也译为网际层,它负责为两台主机提供通信服务,并通过选择合适的路由将数据传递到目标主机。
-
数据链路层 (data link layer) :负责将网络层交下来的 IP 数据报封装成帧,并在链路的两个相邻节点间传送帧,每一帧都包含数据和必要的控制信息(如同步信息、地址信息、差错控制等)。
-
物理层 (physical Layer) :确保数据可以在各种物理媒介上进行传输,为数据的传输提供可靠的环境。
1.3.3 两种模型比较
1.3.3.1 对应关系
TCP/IP
五层协议和OSI
的七层协议对应关系如下: 从上图中可以看出,TCP/IP
模型比OSI
模型更加简洁,它把应用层/表示层/会话层
全部整合为了应用层
。
1.3.3.2 每层的设备
在每一层都工作着不同的设备,比如我们常用的交换机就工作在数据链路层的,一般的路由器是工作在网络层的。
1.3.3.3 每层的协议
在每一层实现的协议也各不同,即每一层的服务也不同,下图列出了每层主要的传输协议:
1.3.3.4 两种模型各自的不足
1.3.3.5 共同的通信特点------对等通信
对等通信,为了使数据分组从源传送到目的地,源端模型的每一层都必须与目的端的对等层进行通信,这种通信方式称为对等层通信。在每一层通信过程中,使用本层自己协议进行通信。对等通信图示如下:
1.4 关于丢包和延迟
1.4.1 丢包和延迟如何发生的
1.4.1.1 延迟
在路由器的buffers缓冲里面,可能有一个正在传送的数据包的队列。若该队列长度为0,则后续数据包可以被立即传送出去;但如果该队列不为0,则后面的包要排队等待被传送,这个等待产生了延迟。
为什么会有等待队列?本质原因是路由器输出端口连接的数据线带宽不够。
为什么会停留在路由器里面呢?因为缓冲器buffers,等待顺序不一定按先后顺序,有调度算法。
1.4.1.2 丢包
为什么会丢包?buffers如果满的话,路由器可能就会把新来的数据包给丢掉,导致丢包。
如何解决丢包的问题?要扩大带宽,提高buffers只会增加冗余阻塞。
1.4.2 四种延迟
1.4.2.1 dproc(节点处理延迟)
- dproc:nodal processing(节点处理延迟):因路由器处理数据包发生的延迟。
- 检测比特错误
- 选择输出端口
- 通常小于msec
1.4.2.2 dqueue(队列等待延迟)
- dqueue:queueing delay(队列等待延迟):数据包在路由缓冲器buffers里面因等待队列而发生的延迟,依赖于当前的调度算法、冗塞程度。
1.4.2.3 dtrans(传输延迟)
- dtrans:transmission delay(传输延迟):一个数据包在经过路由器的输出端口时,要做一个信号转化(网卡负责转化),产生一个延迟。
- 数据包:二进制信息
- 链路是双脚线:要转化为电流信号
- 链路是光纤:要转化为光信号
- 带宽:信号转化的速度。
- dtrans = 数据包的宽度(bit)/带宽(bits/s)
1.4.2.4 dprop(传播延迟)
- dprop:propagation delay(传播延迟):一个数据包从链路的这头走到链路的那头所需的时间。
- dprop = 链路长度L(m)/传输速度(m/s)
1.4.2.5 时延带宽积
- 时延带宽积(bits) = 传播时延 × 带宽 = d prop × R
时延带宽积又称为以比特为单位的链路长度,带宽-时延积 = 链路上的比特数量最大值。 - 宽度 = 链路长度/带宽延迟乘积
- 带宽:bps,表示每秒钟传输的二进制位数
1.4.2.6 吞吐率(吞吐量)
- 吞吐率:单位时间内通过一个系统的数据量。(可以是一个网络、一条链路、一个网口)
- 与带宽的的区别:
- 带宽相当于一个水管,水管的直径和进入水管的速度决定了水流的速度,带宽相当于这条水管的理论值容量,吞吐率相当于这条水管的实际容量。吞吐率小于等于带宽。
- 吞吐率不单指链路。
第二章 物理层
2.1 物理层作用
物理层 (physical Layer) :确保数据可以在各种物理媒介上进行传输,为数据的传输提供可靠的环境。
2.2 物理层设备
- 中继器【Repeater,也叫放大器】 :同一局域网的再生信号;两端口的网段必须同一协议;5-4-3规程: 10BASE-5以太网中,最多串联4个中继器,5段中只能有3个连接主机;
- 集线器:同一局域网的再生、放大信号(多端口的中继器);半双工,不能隔离冲突域也不能隔离广播域。
2.3 物理传送介质
2.3.1 双绞线
- twisted pair(TP): 双绞线,材质为铜,分为两种:
- UTP:unshielded-TP(无屏蔽层,常见),常见有两种:
- 五类线:速率100 Mbps
- 六类线:速率10Gbps
- STP:shielded-TP(有屏蔽层,一对传送线外边包裹着一层铝线作为屏蔽层,通讯质量好于UTP,但是价格较高)
- UTP:unshielded-TP(无屏蔽层,常见),常见有两种:
- 传输距离一般为为100米
2.3.2 光纤
fiber optic cable(FOC),光纤,材质为二氧化硅。
光纤好于上述两种线,成本较低,光信号收到的干扰较低。
第三章 应用层
3.1 相关概念
3.1.1 应用程序结构(Application Structure)
3.1.1.1 客户机-服务器体系结构(client-server)
- 服务器:不间断的主机、永久IP地址、用于伸缩的数据中心
- 客户机:与服务器通信、可能是间歇性连接、可能有动态IP地址(因为IP地址不够用)、不直接沟通
3.1.1.2 同等延迟机制(peer-to-peer (P2P))
P2P ( Peer-to-Peer )网络即点对点网络,是无中心服务器、依靠用户群(Peers)交换信息的互联网体系(图2-1),是分布式网络的一种。通常而言,该网络中各个节点之间的地位是对等的。与有中心服务器的中央网络 C/S 系统(Client-Server)(图2-1)不同,点对点网络的每个节点既是客户端,也是服务器。节点之间依靠相互间的连接进行信息交流,各节点共享它们所拥有的资源(如磁盘存储空间、网络带宽、处理器使用率等)来提供服务和内容。因此,当新节点加入网络时,整个系统的容量也相应增大。
- 在一个P2P体系结构中,对位于数据中心的专用服务器有最小的依赖。相反的是,应用程序在间断连接的主机之间使用直接通信,这些主机对被称为对等方。因为这种对等方通信不需要专门的服务器,所以该体系结构被称为P2P,即对等方到对等方的。
- 许多目前流行的,流量密集型应用都是P2P体系结构的。这些应用包括文件共享、协助下载加速器(迅雷)因特网电话和视频会议。
- 事实上,某些应用具有混合的体系结构,它结合了客户-服务器和P2P的元素。例如,对于许多即时讯息应用而言,服务器被用于跟踪用户的IP地址,但用户到用户的报文在用户主机之间直接发送,无需服务器。
- P2P优点是效率很高,P2P的缺点在于因为其高度非集中式结构,将面临安全性、性能和可靠性挑战且架构复杂。
- (tracker存储携带种子的节点主机IP地址表,另外的主机参与到该P2P网络请求该种子资源时,该主机可以同时像前面已携带该资源种子的主机发出请求,效率很高)
客户-服务器 就相当于我们在百度查信息,这些信息不管我们查不查都放在那里,等待人去搜索访问。 而 P2P 则是没有放在那里信息,而是类似微信一样,咱们之间实时通讯。
3.1.2 实现进程间通信(Interprocess Communication)
- 进程:在主机中运行的程序
- 在同一主机内,两个进程使用进程间通信(由OS定义)进行通信
- 不同主机中的进程通过交换信息进行通信
- 客户端进程:发起通信的进程
- 服务端进程:等待被联系的进程
3.1.3 应用程序需要什么样的传输服务?(Transport Service)
3.1.3.1 数据完整性
- 对于需要100%可靠的数据传输(如文件传输、web事务):利用内核中的TCP协议
- 其它应用程序(如音频)可以容忍一些损失:应用层利用UDP协议(速度快、可能丢包)
3.1.3.2 实时性
- 有些应用程序(如网络电话、互动游戏)需要低延迟才能"有效"
3.1.3.3 吞吐量
- 有些应用(如多媒体)需要最低的吞吐量才能有效
3.1.3.4 安全性(应用层和传输层中间的夹层解决该问题)
- 加密、数据完整性
3.2 web 和 http
3.2.1 web页面与http介绍
3.2.1.1 web页面介绍
一个web页面由多个对象组成,网页包括基本的html文件,其中包括几个引用的对象。
每个对象都可以通过url寻址,例如:(主机名+路径名)
3.2.1.2 http介绍
-
超文本传输协议:web的应用层协议(hypertext transfer protocol)
-
客户机-服务器体系结构(client-server):
- 客户端:请求、接收(使用http协议)和显示web对象的浏览器------发送request
- 服务器:Web服务器(使用http协议)发送对象以响应请求------发送response (两种不同类型的数据包:request/response)
-
使用TCP:
- 客户端发起TCP连接(创建套接字)到服务器,端口80
- 服务器接受来自客户端的TCP连接HTTP消息,之后进行交换。
3.2.1.3 http1.1,2.0,3.0的区别
- HTTP 1.1:这是最常用的HTTP协议版本,它支持持久连接(keep-alive),可以在单个连接上发送多个请求和响应。此外,它还支持分块传输编码(chunked transfer encoding),可以在传输大文件时提高效率。(停-等协议、文本格式)
- HTTP 2.0:HTTP 2.0是HTTP 1.1的升级版本,它采用二进制协议而不是文本协议,并支持多路复用(multiplexing)。这意味着可以在单个连接上并行发送多个请求和响应,提高了性能和效率。此外,HTTP 2.0还支持服务器推送(server push),可以在客户端请求之前主动向客户端发送数据,提高了性能和用户体验。(多路复用并行(流水线协议)、二进制格式、服务器推送、头部压缩算法不同)
- HTTP 3.0:HTTP 3.0是HTTP协议的最新版本,它采用QUIC协议(Quick UDP Internet Connections)作为传输协议,而不是TCP协议。QUIC协议可以提高传输速度和可靠性,并减少延迟。此外,HTTP 3.0还支持0-RTT连接建立,可以在客户端和服务器之间建立更快的连接。(UDP、头部压缩算法不同、速度快、可靠性好)
3.2.1.4 常见端口号概括
使用TCP协议常见端口主要有以下几种:
(1)FTP------文件传输协议------21号端口
(2)Telnet------远程登陆协议------23号端口
(3)SMTP------简单邮件传送协议------25号端口
(4)POP3------接收邮件------110号端口 (POP3仅仅是接收协议,POP3客户端使用SMTP向服务器发送邮件。)
使用UDP协议常见端口主要有以下几种:
(1)HTTP------超文本传输协议------80号端口
HTTPS------服务器,默认端口号为443/tcp 443/udp
(2)DNS------域名解析服务------53号端口
(3)SNMP------简单网络管理协议------161号端口 (SMTP真正关心的不是邮件如何被传送,而只关心邮件是否能顺利到达目的地。)
(4)TFTP------简单文件传输的协议------69号端口
另外代理服务器常用以下端口:
(1)HTTP协议代理服务器常用端口:80/8080/3128/8081/9080
(2)SOCKS代理协议服务器常用端口:1080
(3)FTP协议代理服务器常用端口:20/21 (20端口用于数据传输,21端口用于控制信令的传输,控制信息和数据能够同时传输,这是FTP的特殊这处。FTP 采用的是TCP连接。)
(4)Telnet协议代理服务器常用端口:23
(5)DHCP协议------动态主机设置协议------用于内部网或网络服务供应商自动分配IP地址
DHCP:服务器端的端口号是67
DHCP:客户机端的端口号是68
计算机端口号查询命令------netstat -a
3.2.2 http连接
- non-persistent HTTP(非持久性http):
- 最多通过TCP连接发送一个对象,连接后然后关闭,下载多个对象需要多个连接。(即重复上面所画过程)
- 同一时刻只有一个包在链路上传输(请求包或者响应包)------停等传输,链路资源利用率低
- persistent HTTP(持久性http):
- 客户端和服务器之间可以通过一个TCP连接发送多个对象。(即与上面的区别就是,http response完成后,不会断掉TCP连接,只是重新发起http request,相当于访问同样数量的文件,比非持久性http会少一个RTT时间)
- 同一时刻有两个包在链路上传输(上一次请求的响应包与本次请求的请求包)------流水线传输,链路资源利用率高
- 停等传输(stop-and-wait protocols)与流水线传输(pipelined protocols)在超长传输中,传播延迟差距很显著
3.2.3 http信息
两种类型的http消息:请求、响应。
3.2.3.1 http报文
- 浏览器向服务器发送请求时,请求本身就是信息,叫请求报文。
- 服务器向浏览器发送响应时传输的信息,叫响应报文。
- 请求分为请求头(起始行+首部)和请求体,响应分为响应头(起始行+首部)和响应体。
- get请求没有请求体,数据通过请求头携带;post请求有请求体,数据通过请求体携带。
3.2.3.2 http请求报文
请求报⽂由4部分组成:
- 请求⾏
- 请求头部
- 空⾏
- 请求体
其中:
(1)请求⾏包括:请求⽅法字段、URL字段、HTTP协议版本字段。它们⽤空格分隔。例如,GET /index.html HTTP/1.1。
(2)请求头部:请求头部由关键字/值对组成,每⾏⼀对,关键字和值⽤英⽂冒号":"分隔
- Accept:浏览器能够处理的内容类型
- Accept-Charset:浏览器能够显示的字符集
- Accept-Encoding:浏览器能够处理的压缩编码
- Accept-Language:浏览器当前设置的语言
- Connection:浏览器与服务器之间连接的类型(两个可选: keep-alive:持久化连接 close:断开连接)
- Cookie:当前页面设置的任何Cookie
- Host:发出请求的页面所在的域
- Referer:发出请求的页面的URL
- User-Agent:浏览器的用户代理字符串(产⽣请求的浏览器类型)
(3)请求体: post put等请求携带的数据
3.2.3.3 http响应报文
响应报⽂由4部分组成:
- 响应⾏
- 响应头
- 空⾏
- 响应体
- 响应⾏:由网络协议版本,状态码和状态码的原因短语组成,例如 HTTP/1.1 200 OK 。
- 响应头:响应部⾸组成
- 响应体:服务器响应的数据
3.2.3.4 常见的http状态码
(1)2XX 成功
- 200 OK,表示从客户端发来的请求在服务器端被正确处理
- 204 No content,表示请求成功,但响应报文不含实体的主体部分
- 205 Reset Content,表示请求成功,但响应报文不含实体的主体部分,但是与 204 响应不同在于要求请求方重置内容
- 206 Partial Content,进行范围请求
(2)3XX 重定向
- 301 moved permanently,永久性重定向,表示资源已被分配了新的 URL
- 302 found,临时性重定向,表示资源临时被分配了新的 URL
- 303 see other,表示资源存在着另一个 URL,应使用 GET 方法获取资源
- 304 not modified,表示服务器允许访问资源,但因发生请求未满足条件的情况
- 307 temporary redirect,临时重定向,和302含义类似,但是期望客户端保持请求方法不变向新的地址发出请求
(3)4XX 客户端错误
- 400 bad request,请求报文存在语法错误
- 401 unauthorized,表示发送的请求需要有通过 HTTP 认证的认证信息
- 403 forbidden,表示对请求资源的访问被服务器拒绝
- 404 not found,表示在服务器上没有找到请求的资源
(4)5XX 服务器错误
- 500 internal sever error,表示服务器端在执行请求时发生了错误
- 501 Not Implemented,表示服务器不支持当前请求所需要的某个功能
- 503 service unavailable,表明服务器暂时处于超负载或正在停机维护,无法处理请求
3.2.4 http请求方法
3.2.4.1 常见的http请求方法
- GET: 向服务器获取数据;
- POST:将实体提交到指定的资源,通常会造成服务器资源的修改;
- PUT:上传文件,更新数据;
- DELETE:删除服务器上的对象;
- HEAD:获取报文首部,与GET相比,不返回报文主体部分;
- OPTIONS:询问支持的请求方法,用来跨域请求;
- CONNECT:要求在与代理服务器通信时建立隧道,使用隧道进行TCP通信;
- TRACE: 回显服务器收到的请求,主要⽤于测试或诊断。
3.2.4.2 GET和POST的请求的区别
Post 和 Get 是 HTTP 请求的两种方法,其区别如下:
- 应用场景: GET 请求是一个幂等的请求,一般 Get 请求用于对服务器资源不会产生影响的场景,比如说请求一个网页的资源。而 Post 不是一个幂等的请求,一般用于对服务器资源会产生影响的情景,比如注册用户这一类的操作。
- 是否缓存: 因为两者应用场景不同,浏览器一般会对 Get 请求缓存,但很少对 Post 请求缓存。
- 发送的报文格式: Get 请求的报文中实体部分为空,Post 请求的报文中实体部分一般为向服务器发送的数据。
- 安全性: Get 请求可以将请求的参数放入 url 中向服务器发送,这样的做法相对于 Post 请求来说是不太安全的,因为请求的 url 会被保留在历史记录中。
- 请求长度: 浏览器由于对 url 长度的限制,所以会影响 get 请求发送数据时的长度。这个限制是浏览器规定的,并不是 RFC 规定的。
- 参数类型: post 的参数传递支持更多的数据类型。
3.2.5 cookie介绍
3.2.5.1 初识cookie
- Cookie是什么:全称是HTTP Cookie,简称Cookie,是浏览器存储数据的一种方式,因为存储在用户本地,而不是存储在服务器上,是本地存储,一般会自动随着浏览器每次请求发送到服务器端。
- Cookie作用:利用Cookie跟踪统计用户访问该网站的习惯,比如什么时间访问,访问了哪些页面,在每个页面的停留时间等。
- 在浏览器中操作Cookie:不要在Cookie中保存密码等敏感信息。
3.2.5.2 cookie创建过程
若某个用户从未浏览过某网站,则:
- 网站服务器为用户在后端数据库创建ID XXX
- 然后服务器给用户的响应包增加:【set-cookie: XXX】字段,且存储在用户本地浏览器
- 从此,每次用户通过该浏览器访问该网站,每次请求都会携带该cookie
3.2.6 Web caches (proxy server)(web缓存,代理服务器)
互联网中具有特殊意义的节点,使得访问网页资源的时间显著缩短。
- http请求会先到web caches检查是否存在访问的资源,如果web caches没有该资源,则继续向远端服务器请求资源。远端服务器响应之后,该资源会先传输到web caches,再传输给用户,下一次访问该资源就会变快了,因为可以直接从web caches获取。
- 如何知道资源是从远端服务器响应的还是从web caches响应的:通过响应时间可知。
- 主要有以下三类:正向代理,反向代理,CDN加速
- CDN和反向代理的基本原理都是缓存,区别在于CDN部署在网络提供商的机房,使用户在请求网站服务时,可以从距离自己最近的网络提供商机房获取数据;而反向代理则部署在网站的中心机房,当用户请求到达中心机房后,首先访问的服务器反向代理服务器,如果反向代理服务器中缓存着用户请求的资源,就将其直接返回给用户。使用这两个技术,都是为了:一方面加快用户访问速度,另一方面也减轻了后端服务器的负载压力。
- 正向代理和反向代理的区别:
- 代理对象不同。正向代理代理的是客户端,反向代理代理的是服务器。正向代理帮助客户访问其无法访问的服务器资源,反向代理帮助服务器做负载均衡,另外,由于客户端跟真实服务器不直接接触,能起到一定安全防护的作用。
- 架设主体不同。正向代理一般是客户端架设的,比如在自己的机器上装一个代理软件,反向代理一般是服务器架设的,通常是在机器集群中部署个反向代理服务器。
- 保护对象不同。正向代理保护对象是客户端,反向代理保护对象是原始资源服务器。
- 作用目的不同。正向代理主要目的是解决访问限制问题,而反向代理一方面是作为负载均衡,再就是起到安全防护的作用。
3.2.6.1 正向代理(Forward Proxy)
- 正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
3.2.6.2 反向代理(Reverse Proxy)
- 反向代理(Reverse Proxy)一般就是指Nginx,是在主服务器之外加一层代理服务器,用户的请求会发送到代理服务器上,由代理服务器请求真正的服务器,获得到结果后再将结果返回给用户。反向代理主要的用处就是会加一层安全保障,所有的请求不是直接请求主服务器,而是代理服务器,这样就保护了主服务器不受侵害。第二个用处就是代理服务器会有缓存,命中缓存的请求可以不用再请求主服务器,提高响应速度。
3.2.6.3 CDN加速
- CDN的全称是Content Delivery Network,即内容分发网络。
- 其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输得更快、更稳定。通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。
- 其目的是使用户可就近取得所需内容,解决Internet网络拥挤的状况,提高用户访问网站的响应速度。
3.2.7 Conditional GET(条件GET方法)
3.2.7.1 条件GET方法初识
- 尽管缓存可以减少用户感知到的响应时间,但是缓存引入了一个新的问题。 存储在cache中的对象可能是陈旧的。换句话说,自从对象的副本被缓存到这个cache,存储在web服务器端的对象可能被修改过。 幸运的是,HTTP提供了条件GET(conditional GET)机制,这个机制使得cache能够确认它的对象是最新的。
- 客户端第一次向服务端请求某个资源,cache将这个对象转发给请求的浏览器并且将这个对象缓存到自己的本地存储。重要的是,cache将这个对象上次修改的时间也存储了起来。
- 什么样的HTTP请求报文属于条件请求报文呢?
(1)请求报文使用了GET方法
(2)请求报文包括了一个If-Modified-Since头行
3.2.7.2 条件GET方法运作过程
1、代理服务器代表请求浏览器发送一条请求报文给web server:
bash
GET /fruit/kiwi.gif HTTP/1.1
Host: [www.exotiquecuisine.com](http://www.exotiquecuisine.com/)
2、Web服务器将带有请求对象的响应报文发送给cache:
bash
HTTP/1.1 200 OK
Date: Sat, 8 Oct 2011 15:39:29
Server: Apache/1.3.0 (Unix)
Last-Modified: Wed, 7 Sep 2011 09:23:24
Content-Type: image/gif
(data data data ...)
cache将这个对象转发给请求的浏览器并且将这个对象缓存到自己的本地存储。重要的是,cache将这个对象上次修改的时间也存储了起来。
3、一周之后,另一个浏览器通过cache请求了相同的对象,并且这个对象仍然在cache里。由于这个对象可能在过去的一周里被修改过,cache就发起一个conditional GET来做一个更新检查。
具体的报文如下:
bash
GET /fruit/kiwi.gif HTTP/1.1
Host: www.exotiquecuisine.com
If-modified-since: Wed, 7 Sep 2011 09:23:24
注意If-modified-since的值就是一周前Last-Modified的值。这个条件GET告诉服务器仅在对象在这个时间之后被修改的情况下才发送这个对象给我。
假定这个对象自从一周前没有被修改过,那么第4步:
4、Web服务器就会发送一个响应报文
bash
HTTP/1.1 304 Not Modified
Date: Sat, 15 Oct 2011 15:39:29
Server: Apache/1.3.0 (Unix)
(empty entity body)
我们可以看到,在回复条件GET时,web server依然发送了一个响应报文但是并没有在响应消息中包含请求的对象。包含请求的对象会浪费带宽,增加用户感知响应时间。
注意,最后一条响应报文有一个304的状态码,意思是Not Modified。这也就告知了缓存它可以继续了,将这个对象的cached copy发送给请求的browser。
3.3 HTTPS协议
3.3.1 什么是HTTPS协议?
超文本传输安全协议(Hypertext Transfer Protocol Secure,简称:HTTPS)是一种通过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,利用SSL/TLS来加密数据包。HTTPS的主要目的是提供对网站服务器的身份认证,保护交换数据的隐私与完整性。 HTTP协议采用明文传输 信息,存在信息窃听 、信息篡改 和信息劫持 的风险,而协议TLS/SSL具有身份验证 、信息加密 和完整性校验的功能,可以避免此类问题发生。
安全层的主要职责就是对发起的HTTP请求的数据进行加密操作 和 对接收到的HTTP的内容进行解密操作。
3.3.2 TLS/SSL的工作原理
TLS/SSL 全称安全传输层协议(Transport Layer Security), 是介于TCP和HTTP之间的一层安全协议,不影响原有的TCP协议和HTTP协议,所以使用HTTPS基本上不需要对HTTP页面进行太多的改造。
TLS/SSL的功能实现主要依赖三类基本算法:散列函数hash 、对称加密 、非对称加密。这三类算法的作用如下:
- 基于散列函数验证信息的完整性
- 对称加密算法采用协商的秘钥对数据加密
- 非对称加密实现身份认证和秘钥协商
(1)散列函数hash
常见的散列函数有MD5、SHA1、SHA256。该函数的特点是单向不可逆,对输入数据非常敏感,输出的长度固定,任何数据的修改都会改变散列函数的结果,可以用于防止信息篡改并验证数据的完整性。
特点: 在信息传输过程中,散列函数不能三都实现信息防篡改,由于传输是明文传输,中间人可以修改信息后重新计算信息的摘要,所以需要对传输的信息和信息摘要进行加密。
(2)对称加密
对称加密的方法是,双方使用同一个秘钥对数据进行加密和解密。但是对称加密的存在一个问题,就是如何保证秘钥传输的安全性,因为秘钥还是会通过网络传输的,一旦秘钥被其他人获取到,那么整个加密过程就毫无作用了。 这就要用到非对称加密的方法。
常见的对称加密算法有AES-CBC、DES、3DES、AES-GCM等。相同的秘钥可以用于信息的加密和解密。掌握秘钥才能获取信息,防止信息窃听,其通讯方式是一对一。
特点: 对称加密的优势就是信息传输使用一对一,需要共享相同的密码,密码的安全是保证信息安全的基础,服务器和N个客户端通信,需要维持N个密码记录且不能修改密码。
(3)非对称加密
非对称加密的方法是,我们拥有两个秘钥,一个是公钥,一个是私钥。公钥是公开的,私钥是保密的。用私钥加密的数据,只有对应的公钥才能解密,用公钥加密的数据,只有对应的私钥才能解密。我们可以将公钥公布出去,任何想和我们通信的客户, 都可以使用我们提供的公钥对数据进行加密,这样我们就可以使用私钥进行解密,这样就能保证数据的安全了。但是非对称加密有一个缺点就是加密的过程很慢,因此如果每次通信都使用非对称加密的方式的话,反而会造成等待时间过长的问题。
常见的非对称加密算法有RSA、ECC、DH等。秘钥成对出现,一般称为公钥(公开)和私钥(保密)。公钥加密的信息只有私钥可以解开,私钥加密的信息只能公钥解开,因此掌握公钥的不同客户端之间不能相互解密信息,只能和服务器进行加密通信,服务器可以实现一对多的的通信,客户端也可以用来验证掌握私钥的服务器的身份。
特点: 非对称加密的特点就是信息一对多,服务器只需要维持一个私钥就可以和多个客户端进行通信,但服务器发出的信息能够被所有的客户端解密,且该算法的计算复杂,加密的速度慢。
综合上述算法特点,TLS/SSL的工作方式就是客户端使用非对称加密与服务器进行通信,实现身份的验证并协商对称加密使用的秘钥。对称加密算法采用协商秘钥对信息以及信息摘要进行加密通信,不同节点之间采用的对称秘钥不同,从而保证信息只能通信双方获取。这样就解决了两个方法各自存在的问题。
3.3.3 数字证书是什么?
现在的方法也不一定是安全的,因为没有办法确定得到的公钥就一定是安全的公钥。可能存在一个中间人,截取了对方发给我们的公钥,然后将他自己的公钥发送给我们,当我们使用他的公钥加密后发送的信息,就可以被他用自己的私钥解密。然后他伪装成我们以同样的方法向对方发送信息,这样我们的信息就被窃取了,然而自己还不知道。为了解决这样的问题,可以使用数字证书。
首先使用一种 Hash 算法来对公钥和其他信息进行加密,生成一个信息摘要,然后让有公信力的认证中心(简称 CA )用它的私钥对消息摘要加密,形成签名。最后将原始的信息和签名合在一起,称为数字证书。当接收方收到数字证书的时候,先根据原始信息使用同样的 Hash 算法生成一个摘要,然后使用公证处的公钥来对数字证书中的摘要进行解密,最后将解密的摘要和生成的摘要进行对比,就能发现得到的信息是否被更改了。
这个方法最要的是认证中心的可靠性,一般浏览器里会内置一些顶层的认证中心的证书,相当于我们自动信任了他们,只有这样才能保证数据的安全。
3.3.4 HTTPS通信(握手)过程
HTTPS的通信过程如下:
- 客户端向服务器发起请求,请求中包含使用的协议版本号、生成的一个随机数、以及客户端支持的加密方法。
- 服务器端接收到请求后,确认双方使用的加密方法、并给出服务器的证书、以及一个服务器生成的随机数。
- 客户端确认服务器证书有效后,生成一个新的随机数,并使用数字证书中的公钥,加密这个随机数,然后发给服 务器。并且还会提供一个前面所有内容的 hash 的值,用来供服务器检验。
- 服务器使用自己的私钥,来解密客户端发送过来的随机数。并提供前面所有内容的 hash 值来供客户端检验。
- 客户端和服务器端根据约定的加密方法使用前面的三个随机数,生成对话秘钥,以后的对话过程都使用这个秘钥来加密信息。
3.3.5 HTTPS的特点
HTTPS的优点如下:
- 使用HTTPS协议可以认证用户和服务器,确保数据发送到正确的客户端和服务器;
- 使用HTTPS协议可以进行加密传输、身份认证,通信更加安全,防止数据在传输过程中被窃取、修改,确保数据安全性;
- HTTPS是现行架构下最安全的解决方案,虽然不是绝对的安全,但是大幅增加了中间人攻击的成本;
HTTPS的缺点如下:
- HTTPS需要做服务器和客户端双方的加密个解密处理,耗费更多服务器资源,过程复杂;
- HTTPS协议握手阶段比较费时,增加页面的加载时间;
- SSL证书是收费的,功能越强大的证书费用越高;
- HTTPS连接服务器端资源占用高很多,支持访客稍多的网站需要投入更大的成本;
- SSL证书需要绑定IP,不能再同一个IP上绑定多个域名。
3.3.6 HTTPS是如何保证安全的?
先理解两个概念:
- 对称加密:即通信的双⽅都使⽤同⼀个秘钥进⾏加解密,对称加密虽然很简单性能也好,但是⽆法解决⾸次把秘钥发给对⽅的问题,很容易被⿊客拦截秘钥。
- ⾮对称加密:
- 私钥 + 公钥= 密钥对
- 即⽤私钥加密的数据,只有对应的公钥才能解密,⽤公钥加密的数据,只有对应的私钥才能解密
- 因为通信双⽅的⼿⾥都有⼀套⾃⼰的密钥对,通信之前双⽅会先把⾃⼰的公钥都先发给对⽅
- 然后对⽅再拿着这个公钥来加密数据响应给对⽅,等到到了对⽅那⾥,对⽅再⽤⾃⼰的私钥进⾏解密
⾮对称加密虽然安全性更⾼,但是带来的问题就是速度很慢,影响性能。
解决⽅案:
结合两种加密⽅式,将对称加密的密钥使⽤⾮对称加密的公钥进⾏加密,然后发送出去,接收⽅使⽤私钥进⾏解密得到对称加密的密钥,然后双⽅可以使⽤对称加密来进⾏沟通。
此时⼜带来⼀个问题,中间⼈问题: 如果此时在客户端和服务器之间存在⼀个中间⼈,这个中间⼈只需要把原本双⽅通信互发的公钥,换成⾃⼰的公钥,这样中间⼈就可以轻松解密通信双⽅所发送的所有数据。
所以这个时候需要⼀个安全的第三⽅颁发证书(CA),证明身份的身份,防⽌被中间⼈攻击。 证书中包括:签发者、证书⽤途、使⽤者公钥、使⽤者私钥、使⽤者的HASH算法、证书到期时间等。
但是问题来了,如果中间⼈篡改了证书,那么身份证明是不是就⽆效了?这个证明就⽩买了,这个时候需要⼀个新的技术,数字签名。
数字签名就是⽤CA⾃带的HASH算法对证书的内容进⾏HASH得到⼀个摘要,再⽤CA的私钥加密,最终组成数字签名。当别⼈把他的证书发过来的时候,我再⽤同样的Hash算法,再次⽣成消息摘要,然后⽤CA的公钥对数字签名解密,得到CA创建的消息摘要,两者⼀⽐,就知道中间有没有被⼈篡改了。这个时候就能最⼤程度保证通信的安全了。
3.4 DNS
3.4.1 初始DNS
- DNS:Domain Name System(域名系统)------域名解析协议
- DNS协议则是用来将域名转换为IP地址。(IP地址是面向主机的,而域名则是面向用户的。)
- 为什么不集中DNS:单点故障、交通量、远程集中式数据库维护
- DNS占用53号端口,同时使用TCP和UDP协议。
-
在区域传输的时候使用TCP协议: 辅域名服务器会定时(一般3小时)向主域名服务器进行查询以便了解数据是否有变动。如有变动,会执行一次区域传送,进行数据同步。区域传送使用TCP而不是UDP,因为数据同步传送的数据量比一个请求应答的数据量要多得多。TCP是一种可靠连接,保证了数据的准确性。
-
在域名解析的时候使用UDP协议:客户端向DNS服务器查询域名,一般返回的内容都不超过512字节,用UDP传输即可。不用经过三次握手,这样DNS服务器负载更低,响应更快。理论上说,客户端也可以指定向DNS服务器查询时用TCP,但事实上,很多DNS服务器进行配置的时候,仅支持UDP查询包。
-
3.4.2 DNS结构(分布式、分层的数据库)
3.4.3 域名解析过程
DNS服务器解析域名的过程:
- 首先会在浏览器的缓存中查找对应的IP地址,如果查找到直接返回,若找不到继续下一步
- 将请求发送给本地DNS服务器,在本地域名服务器缓存中查询,如果查找到,就直接将查找结果返回,若找不到继续下一步
- 本地DNS服务器向根域名服务器发送请求,根域名服务器会返回一个所查询域的顶级域名服务器地址
- 本地DNS服务器向顶级域名服务器发送请求,接受请求的服务器查询自己的缓存,如果有记录,就返回查询结果,如果没有就返回相关的下一级的权威域名服务器的地址
- 本地DNS服务器向权威域名服务器发送请求,域名服务器返回对应的结果
- 本地DNS服务器将返回结果保存在缓存中,便于下次使用
- 本地DNS服务器将返回结果返回给浏览器
比如要查询 [www.baidu.com]
的 IP 地址,首先会在浏览器的缓存中查找是否有该域名的缓存,如果不存在就将请求发送到本地的 DNS 服务器中,本地DNS服务器会判断是否存在该域名的缓存,如果不存在,则向根域名服务器发送一个请求,根域名服务器返回负责 .com 的顶级域名服务器的 IP 地址的列表。然后本地 DNS 服务器再向其中一个负责 .com 的顶级域名服务器发送一个请求,负责 .com 的顶级域名服务器返回负责 .baidu 的权威域名服务器的 IP 地址列表。然后本地 DNS 服务器再向其中一个权威域名服务器发送一个请求,最后权威域名服务器返回一个对应的主机名的 IP 地址列表
3.4.4 DNS 记录和报文
DNS 服务器中以资源记录的形式存储信息,每一个 DNS 响应报文一般包含多条资源记录。一条资源记录的具体的格式为
bash
(Name,Value,Type,TTL)
其中 TTL 是资源记录的生存时间,它定义了资源记录能够被其他的 DNS 服务器缓存多长时间。
常用的一共有四种 Type 的值,分别是 A、NS、CNAME 和 MX ,不同 Type 的值,对应资源记录代表的意义不同:
- 如果 Type = A,则 Name 是主机名,Value 是主机名对应的 IP 地址。因此一条记录为 A 的资源记录,提供了标 准的主机名到 IP 地址的映射。
- 如果 Type = NS,则 Name 是个域名,Value 是负责该域名的 DNS 服务器的主机名。这个记录主要用于 DNS 链式 查询时,返回下一级需要查询的 DNS 服务器的信息。
- 如果 Type = CNAME,则 Name 为别名,Value 为该主机的规范主机名。该条记录用于向查询的主机返回一个主机名 对应的规范主机名,从而告诉查询主机去查询这个主机名的 IP 地址。主机别名主要是为了通过给一些复杂的主机名提供 一个便于记忆的简单的别名。
- 如果 Type = MX,则 Name 为一个邮件服务器的别名,Value 为邮件服务器的规范主机名。它的作用和 CNAME 是一样的,都是为了解决规范主机名不利于记忆的缺点。
3.4.5 DNS攻击
3.4.5.1 基于主机耗尽型的dns查询拒绝服务攻击(DNS query Flooding)
-
攻击方法: 攻击采用的方法是向被攻击的服务器发送大量的域名解析请求,通常请求解析的域名是随机生成或者是网络上根本不存在的域名,被攻击的DNS 服务器在接收到域名解析请求的时候首先会在服务器上查找是否有对应的缓存,如果查找不到并且该域名无法直接由服务器解析的时候,DNS 服务器会向其上层DNS服务器递归查询域名信息。域名解析的过程给服务器带来了很大的负载,每秒钟域名解析请求超过一定的数量就会造成DNS服务器解析域名超时。
-
通常攻击者采用的手段包括:
- 利用发包程序向DNS服务器发送不带任何负载的NULL数据包。由于数据包本身不符合协议规定,服务器在收到报文的时候将直接丢弃。因此这种攻击方式除非攻击流量比较大,否则不会有明显的效果。
- 利用程序构造DNS解析请求固定的域名,由于DNS服务器在解析请求的时候会在系统cache存放上一次解析的结果,这种攻击方式也需要较大的流量。
- 向DNS服务器发起解析请求随机的、不存在的域名;这样DNS服务器就需要进行频繁的字符串匹配,由于在本地无法查到对应的结果,服务器必须使用递归查询向上层域名服务器提交解析请求,引起连锁反应。 目前尚没有防火墙能对DNS服务器的攻击进行防护,只有少数的专业防护设备可以做到。
3.4.5.2 基于宽带耗尽型的DNS反弹式拒绝服务攻击(DNS reflector attacks,又称DNS amplification attacks)
-
攻击方法
- 此DDoS攻击是基于反射的体积分布式拒绝服务(DDoS)攻击,其中攻击者利用开放式DNS解析器的功能,以便使用更大量的流量压倒目标服务器或网络,从而呈现服务器和它周围的基础设施无法进入。
- 所有放大攻击都利用了攻击者和目标Web资源之间的带宽消耗差异。当在许多请求中放大成本差异时,由此产生的流量可能会破坏网络基础设施。通过发送导致大量响应的小查询,恶意用户可以从更少的内容获得更多。由具有在每个机器人这个倍数乘以僵尸网络进行类似的请求,攻击者是从检测既混淆和收获大大提高了攻击流量的好处。
- DNS放大攻击中的一个机器人可以被认为是一个恶意的少年打电话给餐馆并说"我将拥有一切,请给我回电话并告诉我整个订单。"当餐厅要求时一个回叫号码,给出的号码是目标受害者的电话号码。然后,目标接收来自餐馆的电话,其中包含许多他们未请求的信息。
- 由于每个机器人都要求使用欺骗性IP地址打开DNS解析器,该IP地址已更改为目标受害者的真实源IP地址,然后目标会从DNS解析器接收响应。为了创建大量流量,攻击者以尽可能从DNS解析器生成响应的方式构造请求。结果,目标接收到攻击者初始流量的放大,并且他们的网络被虚假流量阻塞,导致拒绝服务。
-
DNS放大可分为四个步骤:
- 攻击者使用受损端点将带有欺骗性IP地址的UDP数据包发送到DNS recursor。数据包上的欺骗地址指向受害者的真实IP地址。
- 每个UDP数据包都向DNS解析器发出请求,通常会传递诸如"ANY"之类的参数,以便接收可能的最大响应。
- 在收到请求后,尝试通过响应提供帮助的DNS解析器会向欺骗的IP地址发送大量响应。
- 目标的IP地址接收响应,周围的网络基础设施因流量泛滥而变得不堪重负,导致拒绝服务。