一. 网络分层
数据报在
- 传输层加远端口号和目的端口号;
- 在网络层加上原ip和目的ip ;
- 在数据链路层转化成数据桢进行校验;
- 在物理层变成信号(电、光、等信号)发送出去。
1.1 应用层
应用层指能够产生网络流量且能够和用户交互的应用程序。
应用层协议定义了应用进程的通信规则,应用进程互相通信完成网络应用。
包括:
-
域名解析系统 DNS
DNS 是一个分布式数据库系统,存储了域名和 IP 地址的映射关系。
主机向本地域名服务器的查询采用递归查询:如果本地域名服务器不知道被查询域名的 IP 地址,就会以 DNS 客户的身份向其他根域名服务器继续发出查询请求。
本地域名服务器向根域名服务器查询采用迭代查询:根域名服务器会告知顶级域名服务器的地址,顶级域名服务器给出 IP 地址,或者告知下一步应该向哪个权限域名服务器进行查询。
-
文件传送协议 FTP
FTP 通过TCP 保证可靠运输,使用两个端口: 控制端口 21 和数据端口 20,分别进行控制连接和数据连接。
-
电子邮件协议
从用户代理把邮件传送到服务器,以及在服务器之间的传送使用 SMTP 协议。
用户代理从服务器读取邮件时使用 POP3 或 IMAP 协议。
1.2 传输层
传输层负责向主机应用进程间的通信提供数据传输服务,由于一台主机可以同时运行多个进程,因此传输层具有复用和分用的功能:
- 复用就是多个应用进程可以同时使用传输层发送数据
- 分用就是把传输层收到的数据交付给对应的应用进程。
运输层协议包括:
- UDP 用户数据报协议 :提供无连接的、尽最大的交付的数据传输服务,不保证可靠性,传输单位是用户数据报。
- TCP 传输控制协议:提供面向连接的数据传输服务、保证可靠性,传输单位是报文。
1.3 网络层
网络层任务:
- 为分组交换网上的主机提供通信服务,在发送数据时把运输层数据报封装成分组传送。
- 选择合适路由,使源主机的分组通过路由器找到目的主机。
网络层协议包括:
-
网际协议 IP
一般指 IPv4,与 IP 配套使用的还有 ARP、ICMP 和 IGMP。
IP 数据报分为首部和数据两部分。首部前 20 字节是固定的,包含源地址、目的地址、总长度等,生存时间限制了 IP 数据报在网络中能经过的最大路由数,防止其兜圈子。
要解决 IP 地址耗尽的问题,根本方法是采用具有更大地址空间的 IPv6(128 位)。
IP数据报的最大长度是65535个字节。
-
地址解析协议 ARP
由于 IP 使用了 ARP,因此把 ARP 归到网络层。
简单理解ARP就是查 ip-mac 地址映射表。
与 ARP 对应的是 RARP 逆地址解析协议,作用是通过硬件地址找到 IP 地址,被 DHCP 协议取代。
-
路由选择协议
内部网关协议:
-
RIP:分布式的距离向量协议,适用于小型网络,按固定时间间隔与相邻路由器交换路由表信息。
-
OSPF:分布式的链路状态协议,适用于大型网络,只在链路状态变化时才向本自治系统中的所有路由器发送相邻路由器的信息。
外部网关协议:
- BGP-4:针对不同自治系统之间的路由器,目标是寻找一条能够到达目的网络且不兜圈子的路由。
-
-
网际控制报文协议 ICMP
它是TCP/IP协议簇的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
-
网际组管理协议 IGMP
IGMP 的作用是让连接在本地局域网上的多播路由器知道本局域网上是否有主机的某个进程参加或退出了某个多播组。
1.4 链路层
数据链路层将网络层的分组封装成帧,在两个相邻结点间的链路上传输,每一帧包括数据和必要的控制信息(同步信息、地址信息、差错信息)。控制信息使接收端能够知道一个帧从哪个比特开始到哪个比特结束,从帧中提取出数据上交给网络层。控制信息还使接收端可以检测收到的帧有无差错,如果有差错就简单地丢弃,避免继续传送而浪费网络资源。
链路层协议包括:
-
点对点协议 PPP
在通信质量较差的年代使用高级数据链路控制 HDLC 作为数据链路层协议,目前使用最广泛的协议是 PPP。PPP 的特点是简单、只检测差错而不纠正、不使用序号也不进行流量控制、同时支持多种网络层协议。
-
CSMA/CD 协议
以太网采用具有冲突检测的载波监听多点接入协议,特点是:发送前先监听、边发送边监听,一旦发现总线上出现了碰撞就立即停止发送,然后按退避算法等待一段随机时间后再次发送。
-
自动重传请求 ARQ
自动重传请求(Automatic Repeat-reQuest,ARQ)是OSI模型中数据链路层和传输层的错误纠正协议之一,包括停止等待协议、回退 N 步协议和选择重传协议,后两种结合了窗口机制,属于连续 ARQ 协议。
1.5 物理层
物理层的数据单位是比特,发送方和接收方发送和接收 1 或 0,因此物理层需要考虑用多大的电压代表 1 或 0,以及接收方如何识别发送方所发送的比特。此外物理层还要确定传输媒体规范,例如接线器形状、电缆电压范围等。
二. TCP
2.1 TCP 特点
-
TCP 是面向连接的,一个应用进程在向另一个进程发送数据前必须先建立连接,发送某些预备报文段。
-
TCP 提供全双工服务,允许通信双方的应用进程在任何时候发送数据。TCP 连接的两端都有发送缓存和接收缓存:发送时,应用程序把数据传送给 TCP 缓存后就可以做自己的事,TCP 在合适的时候发送;接收时,TCP 把收到的数据放入缓存,应用程序在合适的时候读取。
-
TCP 连接是点对点的,只能在单个发送方和单个接收方之间的连接。
-
TCP 提供可靠的交付服务,通过 TCP 传送的数据无差错、不丢失、不重复,按序到达。
-
TCP 是面向字节流的,流是指流入进程或从进程流出的字节序列。虽然应用程序和 TCP 的交互是每次一个数据块,但 TCP 把数据块仅看成一连串无结构的字节流。TCP 不保证接收方的数据块和发送方的数据块具有对应大小的关系,但接收方的字节流必须和发送方的字节流完全一样。应用程序必须有能力识别收到的字节流,把它还原成应用层数据。
2.2 TCP 和 UDP 的区别?
1.TCP(面向字符流)
- 传递任意长度
- 可靠
- 流量控制
- 拥塞控制
2.UDP(面向报文)
-
一对多通讯
-
效率高
-
简单
-
实时性好
-
无阻塞问题
2.3 TCP 报文结构
-
源端口地址和目标端口地址
标识发送方和接收方应用程序端口号。TCP 的分用功能是通过端口实现的。
-
序号
定义了指派给本报文第一个数据字节的编号。
-
确认号(ack)
定义了接收方期望从对方接收的字节编号。确认号为 N 代表到 N-1 为止都已收到。
-
HLEN:Head Length 首部长度
指出首部一共有多少个4字节。首部长度可以在20~60个字节之间,因此这个字段的值可以在5(5 x 4 = 20) ~ 15(15 x 4 = 60)之间
-
保留
这是一个6位字段,保留为今后使用
-
控制:这个字段定义了6种不同的控制位或标志,可以同时设置1位或多位标志。这些标志用在TCP的流量控制、连接建立和终止、连接异常终止以及数据传送方式等方面。
- URG:紧急,URG=1 时表示存在紧急数据,不再排队等待发送,需要和紧急指针配合使用。
- ACK:确认,ACK=1 时表示成功接收了报文段。
- PSH:推送,PSH=1 时接收方不再等待整个缓存填满再交付数据,而是尽快交付数据。
- RST:复位,当 RST=1 时表示 TCP 连接出现了严重错误,必须释放再重新建立连接。
- SYN:同步,在建立连接时用来同步序号,SYN=1 表示一个连接请求或连接响应报文。
- FIN:终止,用来释放连接,当 FIN=1 时表示发送方已发送完毕,并要求释放连接。
-
窗口尺寸
发送方TCP窗口的大小,以字节为单位。这个字段是16位的,也就是说窗口的最大长度为65535个字节,这个值由接收方来决定,这种情况下发送方必须服从接收方的指示。因为接收方的缓存有限。
-
检验和
检验包括首部和数据两部分,如果接收方检测到差错会丢弃 TCP 报文。
2.4 TCP 的三次握手机制
TCP 是全双工通信,任何一方都可以发起连接请求,假设 A 是客户端,B 是服务器。
-
初始 A 和 B 均处于 CLOSED 状态,B 会创建传输进程控制块 TCB 并进入 LISTEND 状态,监听端口是否收到连接请求。
-
当 A 要发送数据时,就向 B 发送连接请求报文,其中
SYN=1, ACK=0
,SYN 不可以携带数据,但要消耗一个序号(假设 seq=x)。发送后 A 进入 SYN-SENT 同步已发送状态。 -
当 B 收到 A 的连接请求报文后,进入 SYN-RCVD 同步已接收状态,如果同意建立连接就会发送给 A 一个连接响应报文,其中
SYN=1, ACK=1, ack=x+1, seq=y
。ack 的值为 A 发送的序号加 1,ACK 可以携带数据,如果不携带的话则不消耗序号。 -
当 A 收到 B 的确认后,还要对该确认再进行一次确认,发送报文
ACK=1, ack=y+1, seq=x+1
,发送后 A 进入 ESTABLISHED(已确认) 状态,当 B 接收到该报文后也进入 ESTABLISHED 状态,客户端会稍早于服务器端建立连接。
2.4.1 为什么要三次握手
报文的生存时间往往会超过 TCP 请求的超时时间,A 的某个超时连接请求可能会在双方释放连接后到达 B,B 会误以为是 A 创建了新的连接请求,然后发送确认报文创建连接。由于 A 的状态不是 SYN_SENT,将直接丢弃 B 的确认数据。如果是两次握手,连接建立,服务器资源被白白浪费;如果是三次握手,B 由于长时间没有收到确认,最终超时导致连接失败,不会出现脏连接。
2.5 TCP 四次挥手
-
当 A 没有要发送的数据时就会向 B 发送终止连接报文,其中
FIN=1, seq=u
,u 的值为之前 A 发送的最后一个序号加 1,发送后 A 进入 FIN-WAIT-1 状态。客户端发送第一次挥手后,就不能在向 服务端发送数据了。
-
B 收到后响应给 A 一个确认报文,
ACK=1, ack=u+1, seq=v
,v 的值为 B 之前发送的最后一个序号加 1。此时 A 进入 FIN-WAIT-2 状态,B 进入 CLOSE-WAIT 状态,但连接并未完全释放,B 会通知应用进程结束 A 到 B 方向的连接,此时 TCP 处于半关闭状态。Server 第一次响应后,还可以继续向 Client 发送数据,这里只是告诉 Client ,我收到你发送的关闭请求。
-
当 B 也准备释放连接时就向 A 发送连接终止报文,
FIN=1
,同时还要重发ACK=1, ack=u+1, seq=w
,seq 改变的原因是在半关闭状态 B 可能又发送了数据,之后 B 进入 LAST-ACK 状态。当 Server 的数据响应完成后,再告诉 Client,我这边也可以关闭请求了, 此时Server 就不能再向 Client 发送数据了
-
A 收到连接终止报文后还要再进行一次确认,确认报文中
ACK=1, ack=w+1, seq=u+1
,发送完后进入 TIME-WAIT 状态,等待 2MSL 后进入 CLOSED 状态。B 收到该确认后进入 CLOSED 状态,服务器端会稍早于客户端释放连接。
2.5.1 四次挥手原因?
TCP 是全双工通信,两个方向的连接需要单独断开。
2.5.2 等待 2MSL 的原因:
- 保证被动关闭方可以进入 CLOSED 状态。MSL 是最大报文段寿命,等待 2MSL 可以保证 A 发送的最后一个确认报文被 B 接收,如果该报文丢失,B 会超时重传之前的 FIN+ACK 报文,而如果 A 在发送确认报文后立即释放连接就无法收到 B 可能超时重传的报文,也不会再次发送确认报文段,B 就无法正常进入 CLOSED 状态。
- 2MSL 时间后,本连接中的所有报文就都会从网络中消失,防止已失效连接的请求数据包与正常连接的请求数据包混淆而发生异常。
除此之外,TCP 还设有一个保活计时器,用于解决客户端故障问题,服务器每收到一次数据就重新设置保活计时器,如果 2 小时内没有收到数据就间隔 75 秒发送一次探测报文,连续 10 次没有响应后关闭连接。
2.6 TCP 如何保证传输可靠性
TCP 的可靠传输包含很多机制,例如使用检验和来检测传输中的比特错误、使用定时器超时重传、使用序号检测丢失分组和冗余副本、使用确认号告诉发送方确认的分组信息。
2.6.1 校验和
发送的数据包的二进制相加然后取反,目的是检测数据在传输过程中的任何变化。如果收到段的检验和有差错,TCP将丢弃这个报文段和不确认收到此报文段。
2.6.2 确认应答+序列号
TCP给发送的每一个包进行编号,接收方对数据包进行排序,把有序数据传送给应用层。
2.6.3 超时重传
当TCP发出一个段后,它启动一个定时器(一般是0.5秒的整数倍)**,等待目的端确认收到这个报文段。**如果不能及时收到一个确认,将重发这个报文段。
2.6.4 流量控制
TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据,能提示发送方降低发送的速率,防止包丢失。
TCP根据接收端对数据的处理能力,决定发送端的发送速度,这个机制就是流量控制。
2.6.5.阻塞控制
网络中对资源的需求超过可用量的情况就叫拥塞,当吞吐量明显小于理想吞吐量时就出现了轻度拥塞。拥塞控制就是减少注入网络的数据,减轻路由器和链路的负担,这是一个全局性问题,涉及网络中的所有路由器和主机,而流量控制是一个端到端的问题。
如何判断网络拥塞?
- 通过观察网络的吞吐量与网络负载间的关系
- 服务器检测心跳,客户端每隔一段时间会发送心跳报文给服务器,服务器对心跳时间进行检测。
- 服务器发送数据给客户端,累计发送不出去的次数。
拥塞控制主要是四个算法:1)慢启动,2)拥塞避免,3)拥塞发生,4)快速恢复。
-
慢启动机制:在开始发送数据时,先发送少量的数据探路。探清当前的网络状态如何,再决定多大的速度进行传输。
-
**拥塞避免机制:**一旦进入拥塞避免状态,cwnd 值大约是上次拥塞时的 1/2,距离拥塞并不遥远。因此 TCP 不会每经过一个 RTT 就将 cwnd 翻倍,而是较为保守地在每个 RTT 后将 cwnd 加 1。
发生超时事件时,拥塞避免和慢启动一样,将 cwnd 设为 1,并将慢启动阈值设置为 cwnd/2。
-
**快恢复机制:**有时个别报文段丢失,但网络中并没有出现拥塞,如果使用慢启动会降低传输效率。这时应该使用快重传来让发送方尽早知道出现了个别分组的丢失,快重传要求接收端不要等待自己发送数据时再捎带确认,而是要立即发送确认。即使收到了乱序的报文段也要立即发出对已收到报文段的重复确认。当发送方连续收到三个冗余 ACK 后就知道出现了报文段丢失的情况,会立即重传并进入快恢复状态。
在快恢复中,会调整慢启动阈值为 cwnd/2,并进入拥塞避免状态。
2.6.6 滑动窗口
TCP的滑动窗口协议有什么意义呢?
- **可靠性:**滑动窗口只有在队列前部的被确认之后,才会往后移动,保证数据包被接收方确认并接收。
- **传输效率:**假如没有窗口,服务端是杂乱无章地进行发包,因为TCP的队首效应,如果有前面的包没有发送成功,就会不停的重试,反而造成更差的传输效率。
- **稳定性:**TCP的滑动窗口大小,是整个复杂网络商榷的结果,会进行动态调整,可以尽量地避免网络拥塞,更加稳定。
滑动窗口以字节为单位。发送端有一个发送窗口,窗口中的序号是允许发送的序号,窗口的后沿是已发送且确认的序号,窗口的前沿是不允许发送的序号。窗口的后沿可能不动(没有收到新的确认),也有可能前移(收到了新的确认),但不会后移(不可能撤销已经确认的数据)。窗口的前沿一般是向前的,可能不动(没有收到新的请求或对方的接收窗口变小),也可能收缩(TCP 强烈不建议这么做,因为发送端在收到通知前可能已经发送了很多数据,将产生错误)。
发送缓存存放应用程序传给 TCP 准备发送的数据和已发送但还未确认的数据;接收缓存存放按序到达但尚未被应用程序读取的数据和未按序到达的数据。
规则:
- 凡是已经发送过的数据,在未收到确认之前,都必须暂时保留,以便在超时重传时使用。
- 只有当发送方A收到了接收方的确认报文段时,发送方窗口才可以向前滑动几个序号。
- 当发送方A发送的数据经过一段时间没有收到确认(由超时计时器控制),就要使用回退N步协议,回到最后接收到确认号的地方,重新发送这部分数据。
2.7 TCP 拆包粘包
拆包粘包产生的原因
拆包原因:
- 发送的数据大于套接字缓冲区剩余大小。
- 发送的数据大于MTU(最大传输单元)大小。
在TCP通讯协议中TCP的每个包的头的长度都是固定的,总长度不能超过MTU(最大传输单元),且数据长度不能超过MSS(MSS=MTU-20bytes(IP包头)-20bytes(TCP包头))
。如果超过了MTU系统会进行拆包处理。
粘包原因:
- 发送端原因导致的粘包,客户端在发送p1包时,先将p1包放入发送缓存,由于Nagle算法判断其发送的可用数据(去头数据)过小等待一小段时间,这时又发送了p2包,系统将p1和p2合成一个大包发送给服务端。但服务端读到大包,无法区分p1和p2包。
- 接收端原因导致的粘包,服务端缓存接收到客户端发送的p1包,服务端应用未能及时读取缓存,此时服务端缓存又接收到客户端发送的p2包,服务端应用读取缓存,无法区分p1和p2包。
解决方案:
无论拆包还是粘包本质问题都是无法区分包界限,解决包界限的问题主要有以下几种方式:
- 消息数据的定长,比如定长100字节,不足补空格,接收方收到后解析100字节数据即为完整数据。但这样的做的缺点是浪费了部分存储空间和带宽。
- 消息数据使用特定分割符区分界限,比如使用换号符号做分割。
- 把消息数据分成消息头和消息体,消息头带消息的长度,接收方收到后根据消息头中的长度解析数据。
2.8 自动重传请求 ARQ
ARQ 包括停止等待协议、回退 N 步协议和选择重传协议,后两种结合了窗口机制,属于连续 ARQ 协议。
2.8.1 停止等待协议
每发送完一个分组就停止发送,等待对方确认,在收到确认后再发送下一个分组。包括三种情况:
-
无差错
A 发送分组 M1,发送完后暂停并等待 B 的确认;B 收到 M1 后向 A 发送确认;A 收到确认后再发送下一个分组 M2。
-
出现差错
B 收到 M1 后检测到了差错,或者 M1 在传输过程中丢失,这两种情况下 B 都不会发送确认信息,解决方法是:A 只要超过一段时间没有收到确认,就进行超时重传,每发送完一个分组就设置超时计时器,如果在计时器到期前收到确认就撤销计时。
注意:① 发送完分组后必须暂时保留副本,收到确认再清除。② 分组和确认分组都必须进行编号。③ 超时时间应当比分组传输的往返时间稍长,过短会产生不必要的重传,过长会降低通信效率。
-
确认丢失和确认延迟
B 发送的确认丢失,A 会超时重传,B 会丢弃重传分组并重新确认;B 发送的确认迟到,A 收到重复确认后将其丢弃。
通常 A 最终总是可以收到对所有发出分组的确认,如果 A 不断重传分组但总收不到确认,就说明通信线路质量太差,不能通信。
停止等待协议的优点是简单,缺点是信道利用率低。为了提高传输效率,发送方可以连续发送多个分组,不必每发送完一个分组就停下来等待确认,使信道上一直有数据传送。但流水线传输可能会遇到差错,解决方法包括回退 N 步和选择重传。
根据上述的确认和重传机制,我们就可以在不可靠的网络上实现可靠的传输。
2.8.2 回退 N 步协议 GBN
回退 N 步即 GBN 协议,允许发送方发送多个分组而不需要等待确认。GBN 中发送方已发送但还未确认的序号和允许发送但还未发送的序号可以被看作一个长度为 N 的窗口,随协议运行该窗口向前滑动,因此 GBN 也被称为滑动窗口协议。
GBN 采用累积确认的方式,对按序到达的最后一个分组发送确认,如果超时,发送方会重传所有已发送但还未确认的分组。例如发送了序号为 1~5 的五个分组,除了第三个全部收到了,那么确认序号就是 2,发送方将重传 3~5 的分组。
在 GBN 中,接收方丢弃所有失序分组,因为接收方必须按序交付数据。这种做法的优点是缓存简单,不需要缓存任何失序分组;缺点是对失序分组的重传可能出错而导致更多重传。
2.8.3 选择重传协议
GBN 中单个分组的差错就能引起大量分组重传,随着信道差错率的增加,流水线会被不必要重传的分组所充斥。
选择重传即 SR 协议,让发送方仅重传那些它怀疑接收出错的分组,避免不必要的重传。接收方将确认一个正确接收的分组而不管其是否按序,失序分组将被缓存直到收到所有丢失分组,此时将分组按序交付上层。
三. HTTP 协议
HTTP 是一种无状态的协议,服务器不存储任何关于该客户的状态信息。
3.1 HTTP 和 HTTPS
3.1.1 HTTP 和 HTTPS的区别?
- 安全性:https安全,http不安全
- 证书:https需要使用申请 CA证书,http不需要证书
- 传输协议: https密文传输,HTTP是明文传输
- 端口:https端口是443,http端口是80
3.1.2 HTTP 为什么不安全?
- http协议属于明文传输协议,没有加密,无法保证通信内容不被窃听。
- 没有报文完整性验证,无法确保通信内容在传输中不被改变。
- 没有身份鉴别,无法让通信双方确认对方身份。
3.1.3 HTTPS 为什么安全?
-
HTTP over SSL,在 HTTP 传输上增加了 SSL 安全套接字层(Secure Socket Layer),通过机密性、数据完整性、身份鉴别为 HTTP 事务提供安全保证。
-
SSL 会对数据进行加密并把加密数据送往 TCP 套接字,在接收方,SSL 读取 TCP 套接字的数据并解密,把数据交给应用层。
-
HTTPS 采用混合加密机制,使用非对称加密传输对称密钥保证传输安全,使用对称加密保证通信效率。
-
SSL 依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
HTTP 和 HTTPS 建立连接(相同部分):
- HTTP和HTTPS都需要在建立连接的基础上来进行数据传输,是基本操作
- 当客户在浏览器中输入网址的并且按下回车,浏览器会在浏览器DNS缓存,本地DNS缓存,和Hosts中寻找对应的记录,如果没有获取到则会请求DNS服务来获取对应的ip
- 当获取到ip后,tcp连接会进行三次握手建立连接
HTTP 请求过程:
- 建立连接完毕以后客户端会发送响应给服务端
- 服务端接受请求并且做出响应发送给客户端
- 客户端收到响应并且解析响应响应给客户
HTTPS 请求过程:
- 在使用 HTTPS 是需要保证服务端配置正确了对应的安全证书
- 客户端发送请求到服务端
- 服务端返回公钥和证书到客户端
- 客户端接收后会验证证书的安全性,如果通过则会随机生成一个随机数,用公钥对其加密,发送到服务端
- 服务端接受到这个加密后的随机数后会用私钥对其解密得到真正的随机数,随后用这个随机数当做私钥对需要发送的数据进行对称加密
- 客户端在接收到加密后的数据使用私钥(即生成的随机值)对数据进行解密并且解析数据呈现结果给客户
- SSL 加密建立
TLS/SSL 协议是怎样保障信息安全的?
- 证书体系
- 密钥交换协议
- 对称加密算法
3.1.4 对称加密和非对称加密的区别
加密和解密过程不同
-
对称加密过程和解密过程使用的同一个密钥,加密过程相当于用原文+密钥可以传输出密文,同时解密过程用密文-密钥可以推导出原文。
-
非对称加密采用了两个密钥,一般使用公钥进行加密,使用私钥进行解密。
加密解密速度不同
-
对称加密解密的速度比较快,适合数据比较长时的使用。
-
非对称加密和解密花费的时间长、速度相对较慢,只适合对少量数据的使用。
传输的安全性不同
-
对称加密的过程中无法确保密钥被安全传递,密文在传输过程中是可能被第三方截获,如果密码本也被第三方截获,则传输的密码信息将被第三方破获,安全性相对较低。
-
非对称加密算法中私钥是基于不同的算法生成不同的随机数,私钥通过一定的加密算法推导出公钥,但私钥到公钥的推导过程是单向的,也就是说公钥无法反推导出私钥。所以安全性较高。
3.1.5 什么是数字证书?
数字证书有点类似于我们的居民身份证,只是数字证书是基于互联网通信的,用于标记通信双方身份的一种方式。数字证书是由权威机构 Certificate Authority 发行的,又称之为证书授权,简称为:CA。人们在网上可以根据它来识别对方身份信息。
数字证书绑定了公钥及其持有者的真实身份,它类似于现实生活中的居民身份证,所不同的是数字证书不再是纸质的证照,而是一段含有证书持有者身份信息并经过认证中心审核签发的电子数据,广泛用在电子商务和移动互联网中。
3.1.6 什么是数字签名?
数字签名是指将摘要信息使用接收者的公钥进行加密,与密文一起发送给接收者。接收者使用自己的私钥对摘要信息进行解密,然后使用 Hash 函数对收到的密文产生一个摘要信息,然后将摘要信息与发送着传输过来解密后的摘要信息对比是否一致。如果一致,则表明数据信息没有被篡改。
也就是说,数字签名能够验证收到的信息的完整性,避免中途信息被劫持篡改或丢失。对方可以根据数字签名来判断获取到的数据信息时候是最原始的数据。
3.2 报文格式
请求报文
请求报文包括请求行、首部行和实体。
-
请求行包括方法、URL 和 HTTP 版本。方法包括了 GET、POST、HEAD、PUT 和 DELETE 等。HEAD 类似于 GET,当服务器收到一个 HEAD 请求时,会用一个 HTTP 报文进行响应,但并不返回请求对象,通常使用 HEAD 进行调试;PUT 常用于上传对象到 Web 服务器;DELETE 用于删除 Web 服务器上的对象。
-
首部行可以携带信息,例如
Connection:close
可以告诉服务器不要使用持续连接;User-agent
可以指明浏览器类型,服务器可以为不同类型的用户代理发送对象的不同版本。 -
在首部行后有一个空行,后面跟着的是实体。使用 GET 时实体为空,而使用 POST 时才会使用实体。
响应报文
响应报文包括状态行、首部行和实体。
- 状态行包括协议版本、状态码和对应的状态信息。
- 首部行中,
Date
是服务器发送响应报文的时间;Server
指明了服务器类型,类似于请求报文中的User-agent
。 - 实体是报文的主要部分,即所请求的对象本身。
3.3 状态码
分类 | 分类描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
状态码 | 短语 | 含义 |
---|---|---|
200 | OK | 成功响应 |
301 | Moved Permanently | 请求对象已被永久转移,新的 URL 定义在响应报文的首部行,客户端将自动获取。 |
302 | Found | 与301类似,但资源只是临时被移动,客户端继续使用原有 URL。 |
400 | Bad Request | 通用的差错代码,请求不能被服务器理解。 |
401 | Unauthorized | 未认证,缺乏相关权限。 |
402 | Payment Required | 保留,将来使用。 |
403 | Forbidden | 服务器理解客户端的请求,但是拒绝执行。 |
404 | Not Found | 被请求的文档不在服务器上,有可能因为请求 URL 出错。 |
405 | Method Not Allowed | 客户端中请求的方法被禁止,例如限制 POST 方式但使用了 GET 访问。 |
500 | Internal Server Error | 服务器内部错误,无法完成请求。 |
501 | Not Implemented | 服务器不支持请求的功能,无法完成请求。 |
502 | Bad Gateway | 作为网关或代理工作的服务器尝试执行请求时,从远程服务器收到了一个无效响应。 |
503 | Service Unavailable | 由于超载或系统维护,服务器暂时无法处理客户端的请求。 |
504 | Gateway Timeout | 充当网关或代理的服务器,未及时从远端服务器获取请求。 |
505 | HTTP Version Not Supported | 服务器不支持请求报文使用的 HTTP 版本。 |
Http 请求中常见的请求头?
- Accept:浏览器可接受的MIME类型
- Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
- Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip
- Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言版本时要用到。可以在浏览器中进行设置。
- Host:初始URL中的主机和端口
- Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面
- Content-Type:内容类型、If-Modified-Since: Wed, 02 Feb 201112:04:56 GMT利用这个头与服务器的文件进行比对,如果一致,则从缓存中直接读取文件。
- User-Agent:浏览器类型.
- Content-Length:表示请求消息正文的长度
- Connection:表示是否需要持久连接。如果服务器看到这里的值为“Keep -Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接
- Cookie:这是最重要的请求头信息之一
- Date:Date: Mon, 22 Aug 2011 01:55:39 GMT请求时间GMT
3.4 使用 HTTP 长连接(持续连接)有哪些优点?
网络上说HTTP分为长连接和短连接,其实本质上是说的 TCP 连接。TCP 连接是一个双向的通道,它是可以保持一段时间不关闭的,因此 TCP 连接才有真正的长连接和短连接这一说。
1.区分长连接和短连接
HTTP1.1 之后默认为长连接
2.优点
-
减少握手次数
-
减少慢启动的影响
-
首先,长连接是为了复用。长连接情况下,多个 HTTP 请求可以复用同一个 TCP 连接,这就节省了很多 TCP 连接建立和断开的消耗。
比如你请求了博客园的一个网页,这个网页里肯定还包含了 CSS、JS 等等一系列资源,如果你是短连接(也就是每次都要重新建立 TCP 连接)的话,那你每打开一个网页,基本要建立几个甚至几十个 TCP 连接,这浪费了很多资源。
但如果是长连接的话,那么这么多次 HTTP 请求(这些请求包括请求网页内容,CSS 文件,JS 文件,图片等等),其实使用的都是一个 TCP 连接,很显然是可以节省很多消耗的。
3.缺点
对头阻塞。如果在一次长连接中发送多个请求,如果某次请求丢一个包,则会阻塞。
3.5 HTTP 请求幂等性
幂等性定义:指一次和多次请求某一个资源应该具有同样的副作用。
GET
方法用于获取资源,不具有副作用,所以是幂等的。DELETE
方法用于删除资源,有副作用,但它应该满足幂等性。删除一次和多次结果一样。POST
请求会在服务器端创建资源,两次相同的请求就会创建两份资源。所以不幂等。PUT
是更新资源,更新一次或多次副作用一样,所以是幂等的。
3.6 GET 和 POST 的区别
-
GET 读取一个资源,可以将 GET 数据缓存在浏览器、代理或服务端。反复 GET 不应该对访问有副作用,没有副作用被称为幂等。
POST 不是幂等的,意味着不能随意多次执行,因此不能缓存,如果尝试重新执行 POST 请求,浏览器会弹出提示框询问是否重新提交表单。
-
GET 请求由 url 触发,想携带参数就只能在 url 后附加。
POST 请求来自表单提交,表单数据被浏览器编码到 HTTP 请求报文的请求体中。主要有两种编码格式,一种是
application/..
,用来传输简单数据;另一种是multipart/form-data
格式,用来传输文件,对二进制数据传输效率高。 -
从攻击的角度说,无论 GET 还是 POST 都不安全,因为 HTTP 是明文协议。
-
GET 长度受限于 url,而 url 的长度由浏览器和服务器决定。
POST 没有大小限制,起限制作用的是服务器的处理能力。
3.7 cookie
HTTP 的无状态性简化了服务器设计,提高了性能,使其可以同时处理大量 TCP 连接,但无状态也导致服务器不能识别用户。为解决该问题, HTTP 使用 cookie 客户端会话技术对用户进行追踪。
工作流程
① 当客户通过浏览器第一次访问站点时,该站点将产生一个唯一识别码,并以此作为索引,在后端数据库中产生一个表项。
② 服务器用一个包含 Set-cookie
首部的 HTTP 响应报文对浏览器进行响应,浏览器收到后将其添加到自己管理的 cookie 文件。
③ 在下次访问该站点时,请求报文的首部行会包括这个识别码,尽管浏览器不知道客户是谁,但可以确定是同一个客户。
3.8 cookie 和 session 的区别
① cookie 只能存储 ASCII 码,而 session 可以存储任何类型的数据。
② session 存储在服务器,而 cookie 存储在客户浏览器中,容易被恶意查看。。
③ session 的运行依赖 session id,而 session id 存在 cookie 中,叫做 JSESSIONID。如果浏览器禁用了 cookie ,同时 session 也会失效(可以通过其它方式实现,比如在 url 中传递 session_id)。
3.9 输入一个 url 发生的事
- 判断 url 是否合法,如果不合法会使用默认的搜索引擎进行搜索。如果输入的是一个域名,默认会加上一个 http 前缀。
- 先检查浏览器的 DNS 缓存,没有则检查本地 hosts 文件的缓存,如果仍然没有会向 DNS 服务器发送请求,最终DNS 服务器得到域名和 IP 地址的映射关系,把结果返回给用户并进行缓存。
- 获取 IP 地址后,通过 TCP 三次握手建立连接,发送请求报文。
- 服务器收到请求报文后进行响应,主进程进行监听,创建子进程处理,先判断是否是重定向,如果是重定向则返回重定向地址。如果是静态资源则直接返回,否则通过 REST URL 在代码层面处理,最后返回响应报文。
- 浏览器收到 HTTP 响应报文后进行解析,首先查看响应报文的状态码,根据不同的状态码做不同处理。之后解析 HTML、CSS、JS 等文件,构建 DOM 树,渲染树,重绘。最后将像素发送 GPU 进行渲染,将渲染结果返回给用户并进行缓存。
- 通过 TCP 的四次挥手断开连接,如果是 HTTP1.1 则会将连接保持一小段时间(长连接)。
3.10 HTTPS 单向认证与双向认证
单向认证
单向认证:只对通信某一方的身份合法性进行认证,例如在web应用中客户端在与服务端进行通信的时候,只要求对服务端的身份进行认证(这就要求服务端必须有一个CA证书,以供检验)。
单向认证原因:用户数目广泛,且无需在通讯层对用户身份进行验证,一般都是在应用逻辑层保证用户的合法登入。
文字描述:
首先建立链接 => 验证服务端身份 => 用服务端公钥加密得到后期通信用的密钥 => 服务端用私钥解密,拿到密钥 => 双方使用密钥通信
在上面这个过程中,我们可以看到仅仅是验证了服务端的身份,如果有人冒充了客户端,那该怎么办,就是下面要说的双向认证。
双向认证
较于单向认证来说,双向认证多了验证客户端身份的这一环节
文字描述:
首先建立连接 -> 验证服务端身份->验证客户端身份->客户端发送加密方案->服务端用客户端公钥加密,选择方案->客户端拿到方案,用服务端公钥加密密文->服务端解密,拿到密文->双方使用密文通信
(这个方案指的是对称机密的方案~)
Http1、Http2、Http3 区别
HTTP1.0:
- 浏览器与服务器只保持短暂的连接,浏览器每次请求都需要与服务器建立一个TCP连接
HTTP1.1:
- 引入了持久连接(TCP 默认不关闭,可以被多个请求复用)
- 在同一个 TCP 连接里,客户端可以发送多个请求
- 多个请求按次序在服务端被处理
- 新增了一些请求方法、请求头和响应头
HTTP2.0
- 采用二进制格式而非文本格式
- 完全多路复用,而非有序并阻塞的、只需要建立一个连接即可实现并行
- 使用报头压缩,降低开销
- 服务器推送
HTTP3.0
- QUIC 基于 UDP 实现,是 HTTP/3 中的底层支撑协议,该协议基于 UDP,又取了 TCP 中的精华,实现了即快又可靠的协议。
Ping 命令
ping 命令使用什么协议
ping 命令使用 ICMP 协议,是“Internet Control Message Protocol”(Internet 控制消息协议)的缩写,该协议是 TCP/IP 协议簇的一个子协议,用于在 IP 主机、路由器之间传递控制消息,控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
ICMP 协议
ICMP 是个非常有用的协议﹐尤其是当我们要对网路连接状况进行判断的时候。
ICMP 协议是一种面向无连接的协议,用于传输出错报告控制信息。它是一个非常重要的协议,它对于网络安全具有极其重要的意义。 它属于网络层协议,主要用于在主机与路由器之间传递控制信息,包括报告错误、交换受限控制和状态信息等。当遇到 IP 数据无法访问目标、IP 路由器无法按当前的传输速率转发数据包等情况时,会自动发送 ICMP 消息。
在网络中经常会使用到 ICMP 协议。例如经常用于检查网络不通的 ping 命令,这个 ping 的过程实际上就是 ICMP 协议工作的过程。
其功能主要有:侦测远端主机是否存在,建立及维护路由资料,重导资料传送路径(ICMP 重定向),资料流量控制。ICMP 在沟通之中,主要是透过不同的类别(Type)与代码(Code) 让机器来识别不同的连线状况。
Ping 功能常见应用
- 使用 ipconfig /all,观察本地网络设置是否正确。
- Ping127.0.0.1,127.0.0.1 回送地址 Ping 回送地址是为了检查本地的 TCP/IP 协议是否设置成功。
- Ping 本机 IP 地址,是为了检查本机的 IP 地址是否设置有误。
- Ping 本网网关或本网 IP 地址,是为了检查硬件设备是否有问题,也可以检查本机与本地网络连接是否正常。(在非局域网中这一步骤可以忽略)
- Ping 本地 DNS 地址,是为了检查本地 DNS 服务器是否工作正常。
- Ping 远程 IP 地址,这主要是检查本网或本机与外部的连接是否正常。
四. IP 协议
4.1 IP 协议的功能
- 寻址和路由;(根据对方的IP地址,寻找最佳路径传输信息)
- 传递服务:① 不可靠(IP协议只是尽自己最大努力去传输数据包),可靠性由上层协议提供(TCP协议);② 无连接;(事先不建立会话)
- 数据包的分片和重组。
4.2 IP 数据包详解
-
版本号 (4位):
0100 = Version : 4(表示使用的 IPv4协议),对等层之间要使用同一种IP协议(IPv4协议);
-
首部长度 (4位)
在IP数据报中有4bit来标示首部长度,1bit=4字节,所以15bit对应60字节。普通的IP首部长为20个字节,所以这个标识符值为5即可,60是最大字节长。
数据报中有4位bit空位来交给“首位长度”,那填满就是1111,折合十进制的15;如果不填满,写的是0001,折合十进制就是1。
填满的1111,代表了首部长度是15X4=60字节;写0001,代表了首部长度是1X4=4字节…就是1bit的标示数代表了首部是4个字节长 填满时的1111对应首部最大长度60字节。
-
服务类型 (8位)
Differentiated Services Field 字段来区分服务,Delay = 1 延迟小,Throughput = 1吞吐量大,Reliability = 1 质量比较高,Cost = 1 最小代价。同一时刻只能有一位是1。
-
总长度 (16位)
2^16 - 1 = 65535 字节,是首部和数据之和的长度,单位为字节,因此数据报的最大长度为65535字节(MTU最大传送单元)
-
标识符 (16位)
是一个计数器,用来产生数据包的标识。
-
标志位 (3位)
数据包在传输的过程中,标志字段MF(More Fregment),MF = 1表示后面还有分片,MF = 0 表示最后一个分片
-
片偏移 (13位)
每个数据片不同时传输,标志着某片在原分组中的相对偏移位置,以8字节为1个偏移单位;
-
生存时间 (8位)
使用“跳数“作为TTL的单位。数据报每经历一个路由器时对应的TTL值就会减 1 。防止数据报发送在路由器中出现环路,因为数据报在传送的过程中要占用一定的带宽(TTL值为零自动丢弃)
-
协议 (8位)
指出此数据报所携带上层数据使用的TCP协议还是UDP协议,以便对等层接收到数据报交给上层相应的协议(TCP或者UDP协议)进行处理
-
首部检验和 (16位)
只校验数据报的首部,不包含数据部分;看IP数据报头部是否被破坏、被篡改和丢失等;
-
源地址 (32位)
数据向外发送,发送机器本身的IP地址,也成为逻辑地址
-
目的地址 (32位)
数据具体要发送目标及其的IP地址。
4.3 逻辑地址和物理地址解释
逻辑地址:(工作在网络层)也称为IP地址,具有特征 ① 全局唯一性;② 使用软件来实现网络中地址管理;③ 占32位,4字节;
物理地址:(工作在网络接口层)也称为硬件地址、链路地址或MAC地址,具有特征:① 本地范围唯一性;② 使用硬件实现(路由器、计算机有设置MAC地址的位置);③ 占48位,12字节,16进制表示!例如:74-E5-0B-35-60-16 :0111 0100-1110 0101-0000 1011-0011 0101-0110 0000-0001 0110
4.4 为什么有了 IP 地址,还要使用 MAC 地址
-
IP地址一般情况下容易修改和变动,具有随意性,不能在网络上固定标识一台设备;
-
MAC地址一般情况出厂时由厂家烧录到网卡中,不容易修改,在局域范围内容易唯一定位一台设备。
-
从拓扑结构和分层上分析,IP地址属于网络层,主要功能在广域网范围内路由寻址,选择最佳路由,而MAC地址在网络接口层要形成适合于网络媒体上传输的数据帧。
注意:标识一个设备的三种方式:① 域名访问(www.baidu.com,应用层);② 设备的IP地址访问(网络层);③ 设备的MAC地址(在局域网当中唯一标识该设备,实际不用其访问,在网络接口层,具有固定的特性,不易发生紊乱现象)。
4.5 子网掩码
子网掩码只有一个作用,就是将某个IP地址划分成网络地址和主机地址两部分。
ip分类:
- A类:1.0.0.0 - 126.255.255.255 (子网掩码:255.X.X.X)
- B类:128.0.0.0 - 191.255.255.255 (子网掩码:255.255.X.X)
- C类:192.0.0.0 - 233.255.255.255 (子网掩码:255.255.255.X)
- D类:224.0.0.0 - 239.255.255.255
- E类:240.0.0.0 - 254.255.255.255
IP地址 = 网络地址 + 主机地址
A类 8位 + 24位
B类 16位 + 16位
C类 24位 + 8位
详细计算:
创建vlan1:ip地址:192.168.1.1 子网掩码:255.255.255.0
创建vlan2: ip地址:192.168.2.1 子网掩码:255.255.255.0
判断它们是不是在同一个网段?
'''
将ip地址192.168.1.1转换为二进制
11000000 10101000 00000001 00000001
将子网掩码255.255.255.0转换成二进制
11111111.11111111.11111111.00000000
然后将两者相“与(and)"运算:
11000000 10101000 00000001 00000001
11111111.11111111.11111111.00000000
然后得到:
11000000 10101000 00000001 00000000
转换成网络号就是:192.168.1.0
'''
同理计算出vlan2的网络号是:192.168.2.0。所以不是一个网段。
4.6.MAC 地址
MAC地址是一个用来确认网络设备位置的位址。MAC地址用于在网络中唯一标示一个网卡,就如同身份证上的身份证号码,具有唯一性。
IP属于网络层,连接网络(网络之间通过ip互连)。
MAC属于数据链路层,连接局域网中的主机。
IP 地址和 MAC 地址相同点是它们都唯一,不同的特点主要有:
- IP地址可以根据需要改动,而MAC则是生产厂商烧录好的,不能改动
- 长度不同。IP地址为32位,MAC地址为48位
- 分配依据不同。IP地址的分配是基于网络拓扑,MAC地址的分配是基于制造商
- 寻址协议层不同。IP地址应用于网络层,而MAC地址数据链路层。数据链路层协议可以使数据从一个节点传递到相同链路的另一个节点上(通过MAC地址),而网络层协议使数据可以从一个网络传递到另一个网络上
4.7 路由最短路径算法
狄克斯特拉(Dijkstra)算法、A*算法、SPFA算法、Bellman-Ford算法和Floyd-Warshall算法
狄克斯特拉算法可分为5步:(有向加权图)
- 找出从起点出发,可以前往的、开销最小的未处理点
- 对于该节点的邻居,检查是否有前往他们的更短路径,如果有,则更新其开销
- 将该节点加入已处理队列中,后续不再处理该节点
- 重复1-4步,直到对图中除了终点的所有节点都进行了检查
- 得到最终路径
五. 网络安全
5.1 安全的计算机网络特性
-
机密性
仅有通信双方能理解传输内容,报文必须加密使截获者无法理解。
-
报文完整性
通信内容在传输过程中需要确保未被篡改。
-
端点鉴别
通信双方都能证实另一方的身份。
-
运行安全性
几乎所有机构都与互联网相连,需要通过访问控制确保安全性,防火墙位于机构和公共网络之间,控制通过网络的分组;入侵检测系统执行分组检查任务,检测可疑活动。
5.2 常见的网络攻击
5.2.1 篡改
攻击者篡改网络上传输的报文、中断报文的传送、或者把完全伪造的报文发给接收端。
5.2.2 恶意程序
- ① 计算机病毒,修改其他程序来把自身的变种复制进去。
- ② 计算机蠕虫,通过网络通信把自己从一个节点发往另一个节点,并自动启动。
- ③ 特洛伊木马,它执行的功能并非声称的功能,而是恶意程序。
- ④ 逻辑炸弹,当运行环境满足某种条件时就会执行某种功能。
- ⑤ 后门入侵,利用系统漏洞通过网络入侵。
5.2.3 拒绝服务 DoS
DoS 攻击使网络、主机不能由合法用户使用,电子邮件服务器、DNS 服务器和机构都可能成为攻击目标。
DoS 包括:
- 弱点攻击,向目标主机上运行的易受攻击的应用程序或操作系统发送精细制作的报文。
- 带宽洪泛,攻击者向目标主机发送大量分组,使其接入链路变得阻塞导致分组无法到达服务器。
- 连接洪泛,在目标主机创建大量 TCP 连接,主机因这些伪造的连接而陷入阻塞。
5.2.4 ARP 欺骗
攻击者向以太网交换机发送大量伪造的源 MAC 地址,以太网交换机把虚假的 MAC 地址填入到交换表中,导致交换机无法正常工作。
预防ARP欺骗:
-
加强路由器的密码复杂度
-
使用预防软件,杀毒软件
5.2.5 SQL 注入
sql 注入就是通过把 SQL 命令插入 web 表单或域名中,达到欺骗服务器以执行恶意的 SQL 命令。
产生的原因其实是没有对输入进行安全过滤,后台直接将用户的输入当做了 sql 语句的一部分执行。
类型:数字型注入,字符型注入,基于报错注入等。
预防 SQL 注入
-
严格检查输入参数的类型和格式
-
过滤和转义特殊字符
SQL 盲注:
数据库的执行结果不会直接显示到页面上,页面上只会显示真和假两种状态。
5.2.6 XSS(跨站脚本攻击)攻击
xss其实也算是注入的一种,只不过属于html/js注入,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。
预防 XSS 攻击:
- 所有的输入都是不可信任的。严格检查输入参数的类型和格式。
5.2.7 文件上传漏洞
文件上传漏洞通常由于网页代码中的文件上传路径变量过滤不严造成的,攻击者可通过 Web 访问的目录上传任意文件,包括网站后门文件(webshell),进而远程控制网站服务器。
预防文件上传漏洞:
-
严格限制和校验上传的文件,禁止上传恶意代码的文件。
-
校验文件后缀和类型。
5.2.8 CSRF(跨站请求伪造)攻击
-
用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
-
在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
-
用户未退出网站A之前,在同一浏览器中,打开一个TAB页访问网站B;
-
网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A;
-
浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。
CSRF 攻击必须满足两个条件:
-
登录受信任网站 A,并在本地生成 Cookie
-
在不登出 A 的情况下,访问危险网站 B
预防 CSRF 攻击:
-
验证 HTTP Referer 字段。 根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。
-
在请求地址中添加 token 并验证。token 可以在用户登陆后产生并放于 session 之中,然后在每次请求时把 token 从 session 中拿出,与请求中的 token 进行比对
-
加验证码
5.2.9 DDoS(分布式拒绝服务)攻击
Distributed Denial of Service是指处于不同位置的多个攻击者同时向一个或数个目标发动攻击,由于攻击的发出点是分布在不同地方的,所以这类攻击称为分布式拒绝服务攻击。
每一个攻击代理主机都会向目标主机发送大量的服务请求数据包,这些数据包经过伪装,无法识别它的来源,而且这些数据包所请求的服务往往要消耗大量的系统资源,造成目标主机无法为用户提供正常服务。甚至导致系统崩溃。分类:
-
SYN Flood 攻击
SYN Flood 利用了TCP协议实现上的一个缺陷。通过向网络服务所在端口发送大量的伪造源地址的攻击报文,就可能造成目标服务器中的半开连接队列被占满,从而阻止其他合法用户进行访问。
-
UDP Flood 攻击
UDP Flood是利用大量UDP小包冲击DNS服务器或Radius认证服务器、流媒体视频服务器。由于UDP协议是一种无连接的服务,在UDP Flood攻击中,攻击者可发送大量伪造源IP地址的小UDP包。
-
ICMP Flood 攻击
ICMP Flood利用大的流量给服务器带来较大的负载,影响服务器的正常服务。
-
Connection Flood 攻击
Connection Flood利用真实的IP地址向服务器发起大量的连接。并且建立连接之后很长时间不释放,占用服务器的资源,造成服务器上残余连接(WAIT状态)过多,效率降低,甚至资源耗尽,无法响应其他客户所发起的链接。
-
HTTP Get 攻击
特征是和服务器建立正常的TCP连接,并不断的向脚本程序提交查询、列表等大量耗费数据库资源的调用。
5.3 安全协议
网络层
IPsec 是能够为两个网络实体提供通信安全的协议族,没有限定用户必须使用的加密算法,许多机构都使用 IPsec 保证 VPN 的安全性。
IPsec 有两个主要协议:鉴别首部 AH 和封装安全有效载荷 ESP。AH 提供源鉴别和数据完整性服务,而 ESP 除了这两种服务外还提供机密性服务,因此使用比 AH 广泛。使用 AH 或 ESP 的 IP 数据报称为 IP 安全数据报,IP 安全数据报有两种工作方式:
- 运输方式,在整个运输层报文段的前后分别加上控制信息,再加上 IP 首部;
- 隧道方式,在原始 IP 数据报的前后分别加上控制信息,这种方式使用较多。
运输层
运输层的安全协议主要是 SSL 和 TLS ,TLS 是 SSL3.0 的修改版本。SSL 主要作用在端系统的 HTTP 和运输层之间,在 TCP 上建立起一个安全通道,为 TCP 传输数据提供安全保障。
SSL 提供的安全服务包括:
- 服务器鉴别:允许用户证实服务器的身份,支持 SSL 的客户端通过验证来自服务器的证书鉴别服务器的身份并取得服务器的公钥;
- 客户鉴别:SSL 可选的安全服务,允许服务器验证用户的身份;
- 加密的 SSL 会话:对客户和服务器发送的所有报文进行加密,检测报文是否被篡改。
5.4 安全技术
5.4.1 密码技术
密码技术使发送方可以伪装数据,入侵者不能从截获到的数据中获得有效信息。
对称加密
使用相同的加密密钥和解密密钥,运算速度快,但安全性差。使用对称密钥时,在通信信道上可以进行一对一的双向保密通信,每一方既可以用该密钥加密明文,也可以解密密文。这种保密通信仅限于持有此密钥的双方。
非对称加密
使用公钥进行加密,私钥进行解密,公钥是任何人都可以得知的,而私钥是通信双方独有的。运算速度慢,但是安全性好。最常见的公钥加密算法是 RSA,它使用两个大素数 p 和 q 生成密钥,pq 的值越大破解难度越大,但耗时也越长。使用公开密钥时,在通信信道上是多对一的单向保密通信,可以同时有很多客户利用公钥对报文加密后发送给服务器,服务器利用其私钥可以对收到的密文一一解密,但如果是反方向则行不通,例如网购时很多客户都向同一网站发送各自的信用卡信息。
5.4.2 数字签名
作用
报文鉴别:接收者可以确认报文发送方的身份。
报文完整性:接收者可以确信报文内容没有被篡改过。
不可否认:发送者事后不能抵赖对报文的签名。
实现原理
用私钥对报文进行 D 运算得到密文,接收方会利用发送方的公钥进行 E 运算还原出明文。
-
报文鉴别:除了发送方外没有人持有其私钥,无法产生发送方才能产生的密文。
-
报文完整性:如果其他人篡改过密文,解密出的明文就会不可读。
-
不可否认:如果发送方抵赖发送过报文,接收方可以把初始报文和密文发送给公证的第三者,第三者通过公钥进行验证。
公钥认证
攻击者可能会发送使用自己私钥加密的密文和自己的公钥来伪造发送方的身份,该问题通过 CA 解决,发送方在发送数据时也会发送 CA 签署的证书,接收方会利用 CA 的公钥核实发送方证书的合法性并提取发送方的公钥。
CA 即认证中心,将公钥与特定的实体绑定, 职责是使识别和发行证书合法化。CA 认证一个实体的真实身份,生成一个将其身份和实体的公钥绑定起来的证书,证书包含了这个公钥和公钥所有者全局唯一的身份标识信息(例如一个人名或一个 IP)。
5.4.3 报文鉴别
报文鉴别就是鉴别收到的报文确实是期望的发送方发送的,而不是别人伪造的。
数字签名可以实现报文鉴别,但缺点是对较长报文进行签名时需要长时间的运算。有一种相对简单的报文鉴别方式,即密码散列函数,要找到两个不同的报文,它们具有相同的密码散列函数输出,在计算上是不可行的。
使用散列函数进行报文鉴别
通信双方共享一个密钥 k ,发送方生成报文 m,用 k 级联 m 生成 m+k,并使用 SHA-1 或 MD5 这样的散列函数计算 m+k 的散列值 h,这个散列值就被称为报文鉴别码 MAC。发送方会利用 MAC 生成扩展报文并发送给接收方。接收方收到后,由于知道共享密钥 k,因此可以计算出 MAC,如果和 h 相等就可以得出一切正常的结论。
5.4.4 端点鉴别
端点鉴别主要通过鉴别协议 ap 实现,鉴别协议通常在两个通信实体运行其他协议之前运行,仅当鉴别完成后各方才继续下面的工作。
ap1.0:发送方直接发送报文说明身份,攻击者可以任意伪造。
ap2.0:接收方验证 IP 数据报的源地址和发送方常用地址是否匹配来进行鉴别。存在 IP 欺骗的可能性,攻击者可以伪造源 IP 地址。
ap3.0:接收方会要求发送方提供口令进行验证,但依旧不安全,因为攻击者能通过嗅探获得口令并不断重放。
ap4.0:重放攻击主要是由于接收方并不知道此时发送方是否活跃,ap4.0 通过不重数防止重放攻击。接收方会向发送方发送一个不重数,发送方将其加密后发回给接收方,接收方通过验证这个数字来判断发送方是否活跃。
5.4.5 防火墙和入侵检测
在计算机网络中,当通信流量进出网络时要执行安全检查、记录、丢弃或转发,这些工作由防火墙和入侵检测系统完成。
防火墙
防火墙严格控制进出网络的分组,禁止任何不必要通信,从外部到内部和从内部到外部的所有流量都必须经过防火墙。
防火墙分为三种:
- 基于分组过滤,分组过滤器独立地检查每个数据报,然后基于特定规则决定该数据报应当通过还是丢弃,过滤因素包括 IP 地址、TCP 或 UDP 的端口等。
- 基于状态过滤,利用一张连接表跟踪 TCP 连接,通过跟踪信息决定。
- 应用程序网关,一个应用程序特定的服务器,所有数据都必须通过它。
入侵检测系统 IDS
防火墙不能阻止所有入侵,入侵检测系统作为第二道防线,对网络分组进行深度分析与检测从而发现异常行为。
-
基于特征的 IDS
维护一个攻击特征数据库,每个特征是一个与入侵活动关联的规则集,基于特征的 IDS 嗅探通过它的每个分组,将分组中的数据与数据库中的特征进行比较,如果匹配将产生一个警告,缺点是无法应对新型攻击。
-
基于异常的 IDS
观察正常运行的网络流量,学习正常流量的统计特性和规律,当检测到网络中流量的某种统计规律不符合正常情况时则认为可能发生了入侵行为,区分正常流量和统计异常流量非常困难 ,大多数 IDS 都是基于特征的。
5.4.6 蜜罐技术
本质上是一种对攻击方进行欺骗的技术,通过布置一些作为诱饵的主机、网络服务或者信息,诱使攻击方对它们实施攻击,从而可以对攻击行为进行捕获和分析,了解攻击方所使用的工具与方法,推测攻击意图和动机,能够让防御方清晰地了解他们所面对的安全威胁,并通过技术和管理手段来增强实际系统的安全防护能力。
六. 缓存
当需要频繁访问用户信息等热数据时,为了加快响应速度往往会把数据缓存在内存中,这样再次访问数据时直接从内存中获取即可,降低了后端的负载。
- 处理写请求时先将数据写入数据库,然后写入缓存。
- 处理读请求时首先尝试从缓存获取,如果失败则从数据库查询并将结果缓存。
6.1 缓存更新策略
缓存数据会和真实数据有一段时间的不一致,需要利用某种策略进行更新。低一致性业务建议配置最大内存并使用算法剔除,高一致性业务可以结合超时剔除和主动更新,即使主动更新出错也能保证数据过期后删除脏数据。
1. 算法剔除
-
FIFO (先进先出)
判断存储时间,离当前时间最远的数据优先淘汰。
新数据插入队列尾部,数据在队列中顺序移动;淘汰队列头部的数据。
-
LRU (最近最少使用)
判断最近使用时间,离当前时间最远的数据优先被淘汰。
新数据插入到队列头部;每当缓存命中则将数据移到队列头部;当队列满的时候,将队列尾部的数据丢弃。
-
LFU (最不经常使用)
在一段时间内,被使用次数最少的数据优先淘汰。LFU 的每个数据块都有一个引用计数,所有数据块按照引用计数排序,具有相同引用计数的数据块按时间排序。
新数据插入到队列尾部;数据被访问后引用计数增加,队列重新排序;当需要淘汰数据时,将队列尾部数据删除。
剔除算法常用于缓存使用量超过预设最大值时对现有数据进行剔除,数据一致性最差。
2. 超时剔除
通过给缓存设置过期时间实现,例如 Redis 的 expire 命令。如果业务可以容忍一段时间内缓存数据和真实数据不一致,可以为其设置过期时间,在数据过期后再从数据源获取数据,更新缓存并设置过期时间。数据一致性较差。
3. 主动更新
在真实数据更新后立即更新缓存,可以利用消息系统实现。数据一致性强,但如果主动更新出错会导致脏数据,建议结合超时剔除使用。
6.2 缓存穿透
缓存穿透指查询不存在的数据,缓存层和存储层都不会命中。
过程:
- 缓存层不命中。
- 存储层不命中,不将空结果写回内存(出于容错考虑)。
- 返回空结果。
缓存穿透将导致不存在的数据每次请求都要到存储层查询,可能会使后端负载增大,由于很多后端存储不具备高并发性,甚至可能造成后端宕机。通常在程序中分别统计总调用数、缓存命中数、存储层命中数,如果发现大量存储层空命中,说明可能出现了缓存穿透。
产生原因:自身业务代码或数据出现问题; 一些恶意攻击、爬虫等造成大量空命中。
解决方法:
- 缓存空对象:如果一个查询返回结果为 null,仍然缓存 null 结果,但其过期时间很短,通常不超过 5 分钟。
- 布隆过滤器:将所有可能存在的数据映射到一个足够大的 Bitmap 中,在用户发起请求时首先经过布隆过滤器的拦截,一个一定不存在的数据会被拦截。
6.3 缓存击穿
对于热数据的访问量非常大,在其缓存失效的瞬间,大量请求直达存储层,导致服务崩溃。
解决:
- 加锁互斥:当一个线程访问后,缓存中数据会被重建,其他线程就可以从缓存中取值。
- 永不过期:为热点数据不设置过期时间。
6.4 缓存雪崩
如果缓存层因为某些问题不能提供服务,所有请求都会到达存储层,对数据库造成巨大压力。
解决方法:
- 保证缓存层服务的高可用性:使用集群,即使个别节点宕机仍然可以提供服务。
- 依赖隔离组件为后端限流并降级:对重要资源进行隔离,让每种资源单独运行在自己的线程池中,即使个别资源出现问题,对其他服务没有影响。降级机制在高并发系统中使用普遍,例如在推荐服务中,如果个性化推荐服务不可用,可以降级补充热点数据,避免前端页面空白。
- 构建多级缓存:增加本地缓存,在存储层前多加一层屏障,降低请求直达存储层概率。
6.5 CDN(内容分发网络)
CDN的全称是Content Delivery Network,即内容分发网络。CDN是构建在现有网络基础之上的智能虚拟网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。
关键技术:
- 内容发布:借助缓存、组播等技术,将内容发布到网络上距离用户最近的中心机房。
- 内容路由:通过内容路由器中的重定向机制,在多个中心机房的服务器上负载均衡用户的请求。
- 内容交换:根据内容可用性、服务器可用性及用户背景,在缓存服务器上利用应用层交换、流分裂等技术,平衡负载流量。
- 性能管理:通过监控系统,获取网络信息,测量内容发布的端到端性能(延时、包丢失、平均带宽等),保证网络处于最佳状态。
特点:
- 缓存加速:将用户经常访问的数据缓存在本地,提升响应速度。
- 镜像服务:消除不同运营商之间的网络差异,实现跨运营商的网络加速。
- 远程加速:利用负载均衡为用户选择高质量服务器,加快访问速度。
- 带宽优化:自动生产服务器的远程镜像缓存,分担流量,降低原站点负载。
七. HTTP 1 和 HTTP 2 的区别
HTTP/1.1 的缺陷
-
高延迟 - 导致页面加载速度的降低
网络延迟问题主要由于队头阻塞 (Head-Of-Line Blocking), 导致带宽无法被充分利用。队头阻塞是指当顺序发送的请求序列中的一个请求因为某种原因被阻塞时,在后面排队的所有请求也一并被阻塞,会导致客户端迟迟收不到数据。
-
无状态特性 - 导致巨大 HTTP 头部
由于报文 Header 一般会携带 “User Agent” “Cookie” “Accept” “Server” 等许多固定的头字段(如下图),多达几百字节甚至上千字节,但 Body 却经常只有几十字节(比如GET请求、
204/301/304 响应),成了不折不扣的 “大头儿子”。Header 里携带的内容过大,在一定程度上增加了传输的成本。更要命的是,成千上万的请求响应报文里有很多字段值都是重复的,非常浪费。 -
明文传输 - 导致的不安全性
HTTP/1.1 在传输数据时,所有传输的内容都是明文,客户端和服务器端都无法验证对方的身份,这在一定程度上无法保证数据的安全性。 -
不支持服务器推送消息
HTTP/2 新特性
-
二进制传输
HTTP/2 传输数据量的大幅减少,主要有两个原因:以二进制方式传输 和 Header 压缩。
我们先来介绍二进制传输, HTTP/2 采用二进制格式传输数据,而非 HTTP/1.x 里纯文本形式的报文 ,二进制协议解析起来更高效。 HTTP/2 将请求和响应数据分割为更小的帧,并且它们采用二进制编码。 -
Header 压缩
HTTP/2 并没有使用传统的压缩算法,而是开发了专门的 "HPACK” 算法,在客户端和服务器两端建立 “字典”,用索引号表示重复的字符串,还采用哈夫曼编码来压缩整数和字符串,可以达到 50%~90% 的高压缩率。 -
多路复用
在 HTTP/2 中引入了多路复用的技术。多路复用很好的解决了浏览器限制同一个域名下的请求数量的问题,同时也更容易实现全速传输,毕竟新开一个 TCP 连接都需要慢慢提升传输速度。 -
服务器推送(Server Push)
HTTP2 还在一定程度上改变了传统的 “请求-应答” 工作模式,服务器不再是完全被动地响应请求,也可以新建 “流” 主动向客户端发送消息。
比如,在浏览器刚请求 HTML 的时候就提前把可能会用到的 JS、CSS 文件发给客户端,减少等待的延迟,这被称为"服务器推送"( Server Push,也叫 Cache push) -
提高安全性
出于兼容的考虑,HTTP/2 延续了 HTTP/1 的“明文”特点,可以像以前一样使用明文传输数据,不强制使用加密通信,不过格式还是二进制,只是不需要解密。