文章目录
一、网络设备
1. 计算机之间的连接方式-网线直连
两台计算机在传输数据包时不知道目的IP的MAC地址,会广播(目的MAC-全F)发送ARP数据报,请求目的IP的MAC地址;目的主机接收到该请求时,会将自己的MAC地址以ARP数据报响应出去。
然后源主机发送ICMP报文到目的主机(这时已经把目的IP和MAC地址封装到ICMP帧中),目的主机收到后响应该报文,代表链路连通可达。
2.计算机之间的连接方式-同轴电缆
3.计算机之间的连接方式-集线器(Hub)
- 集线器会将数据包转发到其所有接口上(除源接口)
4.计算机之间的连接方式-网桥(Bridge)
- 解决集线器无脑转发的问题
- 通过自学习得知每个接口两侧的MAC地址
- 每次对经过的数据包记录源MAC地址
5.计算机之间的连接方式-交换机(Switch)
- 接口更多的网桥
- 全双工通信
- 自学习接口MAC地址
6.计算机之间的连接方式-路由器(Router)
- 跨网段(依赖于每个接口的网关)通信
- 路由器接口IP为相连一端网段的计算机的网关(Gateway)
- 不同的路由器的接口不同
- FastEthernet 高速以太网口(100M)
- GigabitEthernet 千兆以太网口
- Serial 串行接口
路由器&路由器
二、网络概念
1.MAC地址
- 每个网卡都有一个6字节(48bit)的MAC地址(Media Access Control Address)
- 全球唯一,固化在网卡的ROM中,由IEEE802标准规定
- 前3字节:OUI(ORganizationally Unique Identifier),组织唯一标识符
- 后3字节:网络接口标识符,厂商自行分配
- 全F为广播MAC地址
- 当不知道对方主机的MAC地址时,可以发送ARP广播获取对方的MAC地址
- 获取成功后,会缓存IP地址、MAC地址的映射信息,称为ARP缓存
- 通过ARP广播获取的MAC地址,属于动态(dynamic)缓存,存储时间较短(默认2min)
相关命令 arp
-a
:显示所有ARP缓存-s
:手动添加ARP缓存 arp -s IP MAC-d
:删除指定主机 arp -d IP ,可以使用通配符 *
2.IP地址
- IP(Internet Protocol Address),IPv4-32bit(4字节),IPv6-128bit(16字节)
- 组成:网络标识、主机标识
- 通过子网掩码(Subnet Mask)可以计算出网络ID:子网掩码&IP地址
- 计算机和其他计算机通信前,会判断目标主机和自己是否在同一网段
- 同一网段:不需要由路由器进行转发
- 不同网段:交由路由器进行转发
五类地址 A B C D E
3.子网掩码
子网掩码的CIDR表示方法
- CIDR(Classless Inter-Domain Routing):无类别域间路由
- 子网掩码的CIDR表示方法:
- 255.255.255.0 --> 192.168.1.100/24
- 255.255.0.0 --> 123.210.100.200/16
子网划分
为什么要进行子网划分?
借用主机位,划分出多个子网
- 等长子网划分:将一个网段等分成多个子网,每个子网的可用IP地址数量是一样的
- 变长子网划分:每个子网的可用IP地址数量可以是不一样的
等长子网划分
划分为2个子网,下图两个子网的网段是 192.168.0.0 / 192.168.0.127
划分为4个子网,下图四个子网的网段是 192.168.0.0 / 192.168.0.64 / 192.168.0.128 / 192.168.0.192
变长子网划分
https://www.cnblogs.com/hark0623/p/6547432.html
划分超网
跟子网反过来,它是将连续的网段合并成一个更大的网段
例:合并192.168.0.0/24、192.168.1.0/24为一个网段:192.168.0.0/23
合并网段的规律
- 假设 n 是2的k次幂(k>=1)
- 如果第一个网段的网络号能被 n 整除,那么由它开始的 n 个网段,能通过左移k位子网掩码进行合并
- 如
- 第一个网段的网络号以二进制0结尾,那么由它开始的连续2个网段,能通过左移1位子网掩码进行合并
- 第一个网段的网络号以二进制00结尾,那么由它开始的连续4个网段,能通过左移2位子网掩码进行合并
- 第一个网段的网络号以二进制000结尾,那么由它开始的连续8个网段,能通过左移3位子网掩码进行合并
如何判断一个网段是子网还是超网
- 首先看该网段的类型,是A类网络、B类网络、C类网络?
- 默认情况下,A类子网掩码的位数是8,B类子网掩码位数是16,C类子网掩码位数是24
- 如果网段的子网掩码位数比默认子网掩码多,就是子网
- 如果网段的子网掩码位数比默认子网掩码少,就是超网
- 比如
- 25.100.0.0/16 – A类子网
- 200.100.0.0/16 – C类超网
4.数据包的传输过程
5.网络分类
- 局域网(Local Area Network LAN)
- 局域网中使用最广泛地技术叫:以太网(Ethernet)
- 电脑、手机上经常见到的一个英文WLAN(Wireless LAN)-- 无线局域网
- 城域网(Metropolitan AreaNetwork MAN)
- 广域网(Wide Area Network WAN)
6.公网IP、私网IP
- 公网IP
Internet 上的路由器中只有到达公网的路由表,没有到达私网的路由表;由 Inter NIC 统一分配给ISP
- 私网
主要用于局域网
NAT协议转换
- NAT(Network Address Translation)
- 私网IP访问公网需要进行NAT转换为公网IP
- 这一步可以由路由器来完成
ip数据包经由路由转发的时候源ip,目的ip是否改变 - bw_0927 - 博客园 (cnblogs.com)
分类
- 静态转换
- 手动配置NAT映射表
- 一对一转换
- 动态转换
- 定义外部地址池,动态随机转换
- 一对一转换
- PAT(Port Address Translation)
- 多对一转换,最大程度节约公网IP资源
- 采用端口多路复用方式,通过端口号识别不同的数据流
- 目前应用最广泛的NAT实现方式
7. 代理
正向代理 & 反向代理
- 正向代理:代理的对象是客户端
- 隐藏客户端信息
- 绕过防火墙(突破访问限制)
- Internet 访问控制
- 数据过滤
- 反向代理:代理的对象是服务器
- 隐藏服务器信息
- 负载均衡
代理服务器 - 相关头部字段
- Via:追加经过的每一台服务器的主机名(或域名)
- X-Forwarded-For:追加请求方的IP地址
- X-Real-IP:客户端的真实IP地址
CDN
内容分发网络(Content Delivery Network,简称CDN)是建立并覆盖在承载网之上,由分布在不同区域的边缘节点服务器群组成的分布式网络。
CDN应用广泛,支持多种行业、多种场景内容加速,例如:图片小文件、大文件下载、视音频点播、直播流媒体、全站加速、安全加速。
使用CDN之前
使用CDN之后
示例
假设通过CDN加速的域名为www.a.com
,接入CDN网络,开始使用加速服务后,当终端用户(北京)发起HTTP请求时,处理流程如下:
- 当终端用户(北京)向
www.a.com
下的指定资源发起请求时,首先向LDNS(本地DNS)发起域名解析请求。 - LDNS检查缓存中是否有
www.a.com
的IP地址记录。如果有,则直接返回给终端用户;如果没有,则向授权DNS查询。 - 当授权DNS解析
www.a.com
时,返回域名CNAMEwww.a.tbcdn.com
对应IP地址。 - 域名解析请求发送至阿里云DNS调度系统,并为请求分配最佳节点IP地址。
- LDNS获取DNS返回的解析IP地址。
- 用户获取解析IP地址。
- 用户向获取的IP地址发起对该资源的访问请求。
- 如果该IP地址对应的节点已缓存该资源,则会将数据直接返回给用户,例如,图中步骤7和8,请求结束。
- 如果该IP地址对应的节点未缓存该资源,则节点向源站发起对该资源的请求。获取资源后,结合用户自定义配置的缓存策略,将资源缓存至节点,例如,图中的北京节点,并返回给用户,请求结束。
从这个例子可以了解到:
(1)CDN的加速资源是跟域名绑定的。
(2)通过域名访问资源,首先是通过DNS分查找离用户最近的CDN节点(边缘服务器)的IP
(3)通过IP访问实际资源时,如果CDN上并没有缓存资源,则会到源站请求资源,并缓存到CDN节点上,这样,用户下一次访问时,该CDN节点就会有对应资源的缓存了。
三、自底向上-五层
1.物理层(Physical Layer)
- 物理层定义了接口标准、线缆标准、传输速率、传输方式等
数字信号、模拟信号
数据通信模型
信道(Channel)
2.数据链路层(Data Link)
- 链路:从一个节点到相邻节点的一段物理线路(有线或无线),中间没有其他交换节点
- 数据链路:在一条链路上传输数据时,需要有对应的通信协议来控制数据的传输
- 广播信道:CSMA/CD协议(比如同轴电缆、集线器)
- 点对点信道:PPP协议(比如两个路由器之间的信道)
- 三个基本问题
- 封装成帧
- 透明传输
- 差错检测
数据链路层 - 封装成帧
- 帧(Frame)的数据部分
- 就是网络层传递下来的数据报(IP数据包,Packet)
- 最大传输单元MTU(Maximum Transfer Unit)
- 每一种数据链路层协议都规定了所能够传送的**帧的数据长度(上层-网络层数据报)**上限
- 以太网的MTU为1500个字节
数据链路层 - 透明传输
数据链路层 - 差错检验
- FCS是根据数据部分 + 首部计算得出的
CSMA/CD协议
- CSMA/CD(Carrier Sense Multiple Access with Collision Detectio)载波监听 多路访问/冲突检测
- 使用了CSMA/CD协议的网络被称为以太网(Ethernet),它传输的是以太网帧
- 以太网帧的标准有 Ethernet V2,IEEE802.3标准
- 使用最多的是:Ethernet V2标准
- 为了能够检测正在发送的帧是否产生了冲突,以太网帧至少要64字节
- 用交换机组建的网络,已经支持全双工通信,不需要再使用CSMA/CD协议,但他传输的帧仍然是以太网帧,所以,用交换机建立的网络,仍然可以叫做以太网
Ethernet V2帧格式
- 当数据部分的长度小于46字节时,数据链路层会在数据的后面加入一些字节填充
为什么以太网的最短长度为64字节?万一长度小于64字节呢?
以太网的最小帧长是通过争用期计算出来的。
一个站点开始发送数据后,最多经过时间 2τ(两倍的端-端时延)就可知道是否发生了碰撞
为什么最短帧的大小取决于争用期时长?因为如果最短帧的传输时间小于争用期(比如30μs),那么就会导致发送完这个帧之后,在不知道帧有没有传送成功的情况下(至少需要51.2μs来确定)又发送了下一个帧。反之,如果最短帧的传输时间大于争用期,由于碰撞信息一定可以在帧发送完之前传到,就可以保证只有在上一个帧没有发生碰撞,正确传输的情况下才会发送下一个帧。
对于最大长度为2500米的10Mbps 网络和四个中继器(来自802.3规范),在最坏的情况下,往返时间(包括通过四个中继器的传播时间)被确定为接近50微秒。因此,允许的最短帧必须至少花费这么长的时间来传输。在10Mbps时,一个比特需要100纳秒,所以500比特是保证工作的最小帧。为了增加一些安全边际,这个数字被四舍五入到512比特即64字节,相应的,以太网的争用期长度也被确定为51.2 μs
据此规定以太网帧长≥ 64 字节,长度小于64字节的帧为无效帧
STP协议
生成树议(Spanning Tree Protocol,STP)
可以在提高网络可靠性的同时又避免环路带来的各种问题
生成树算法(Spanning Tree Algorithm)是生成树协议STP的核心。它的实现目标是:在包含物理环路的网络中,构建出一个能够连同全网各节点的树形无环逻辑拓扑
生成树算法的三个步骤
- 选举根交换机
-
网桥ID(BID)最小者当选
-
网桥ID(BID)由以下两部分构成:
- 优先级
- 范围:0-61440
- 步长:4096
- 默认值:32768
- 交换机的基本MAC地址
- 优先级
-
网桥ID(BID)的比较方法:
- 优先级越小,则网桥ID(BID)越小
- 若优先级相同,则比较MAC地址,从MAC地址的左侧依次开始比较,数值小的,则网桥ID(BID)就小
- 选举根端口
-
在每一个非根交换机上选出一个根端口RP(Root Port)
-
根端口RP用于接收根交换机发来的BPDU,也用来转发普通流量
-
根端口RP的选举条件:
- BPDU接收端口到根交换机的路径成本最小
- 对端的网桥ID(BID)最小
- 对端的端口ID(PID)最小
- 优先级
- 范围:0-240
- 步长:16
- 默认值:128
- 端口号
- 优先级
- 选举指定端口并阻塞备用端口
- 在每一个网段上选出一个指定端口DP(Designated Port)
- 指定端口DP用于转发根交换机发来的BPDU,也用来转发流量
- 指定端口DP的选举条件:
- 根交换机的所有端口都是指定端口DP
- 根端口的对端端口一定是指定端口DP
- BPDU转发端口到根交换机的路径成本最小
- 本端的网桥ID(BID)最小
- 剩余端口成为备用端口AP(Alternate Port),将他们阻塞
PPP协议(Point to Point Protocol)
网卡
3.网络层(Network)
网络层数据报(IP数据报,Packet)由首部、数据两部分组成
- 版本(Version)
- 占四位:0b0100-IPv4 0b0110-IPv6
- 首部长度(Header Length)
- 占四位,对应十进制乘以4才是最终字节数
- 0b0101-20(最小值) 0b1111-60(最大值)
- 区分服务(Differentiated Service Field)
- 与路由器协作控制数据报优先级
- 总长度(Total Length)
- 首部 + 数据的长度之和,16位,最大值65535字节
- 由于帧的数据不能超过1500字节,所以过大的IP数据报,需要分成片(fragment),每一片都有自己的网络层首部
- 标识(Identification)
- 数据包的ID,占16位,当数据包过大需要进行分片时,同一个数据包的所有片的标识都是一样的
- 存在一个计数器专门管理数据包的ID,每发出一个数据包,ID加1
- 标志(Flag)
- 占3位
- 第一位(Reserved Bit):保留
- 第二位(Don’t Fragment):0允许分片,1不允许
- 第三位(More Fragments):1不是最后一片,0最后一片
- 占3位
- 片偏移(Fragment Offset)
- 占13位,每一片的长度一定是8的整数倍
- 较长的分组在分片后,某片在原分组中的相对位置
- 片偏移 * 8 = 字节偏移
- ping 相关命令如下
-l size
:发送数据报大小-f
:不允许分片-i TTL
:设置TTL 值
- 生存时间(Tim To Live)
- 占8位,每个路由器在转发之前会将 TTL 减一,一旦发现TTL为0,路由器会返回错误报告
- 根据 traceroute 命令显示的 TTL 可以看出经过了多少个路由器
- 协议(Protocol)
- 占8位,表名所封装的数据是使用了什么协议
- 首部校验和(Header Checksum)
- 用于检查首部是否有误
ARP协议
地址解析协议(Address Resolution Protocol,简称ARP)
是根据IP地址获取物理地址的一个TCP/IP协议。主机发送信息时将包含目标IP地址的ARP请求广播到局域网络上的所有主机,并接收返回消息,以此确定目标的物理地址;收到返回消息后将该IP地址和物理地址存入本机ARP缓存中并保留一定时间,下次请求时直接查询ARP缓存以节约资源。
- 通过IP地址获取MAC地址
- RARP 逆地址解析协议,相反的功能,已被DHCP取代
ICMP协议
互联网消息控制协议(Internet Control Message Protocol,简称ICMP)
关于处于哪一层的问题,国外的书倾向于传输层,而中国的书倾向于网络层。
用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。
- IPv4中的ICMP被称作ICMPv4,IPv6中的ICMP则被称作ICMPv6
- 常用于返回错误信息
- 比如TTL值过期、目标不可达
IPv6
网际协议第六版(Internet Protocol version 6)
主要是为了解决IPv4地址枯竭问题
- IPv6位128bit,每16bit一组,共8组
- 例
fe80::c472:fdff:fe9d:d6e4
( :: 中间省略了 3组 0000) ::1
是本地环回地址
首部格式
- Version(4bit,0x0110):版本号
- Traffic Class(8bit):交通类别
- 指示数据包的类别或优先级,可以帮助路由器数据包的优先级处理流量
- 如果路由器发生拥塞,则优先级最低的数据包将被丢弃
- Payload Length(16bit):有效负载长度
- 最大值65535字节
- 包括了扩展头部、上层(传输层)数据长度
- Hop Limit(8bit):跳数限制
- Source Address(128bit):源IPv6地址
- Destination Address(128bit):目的IPv6地址
- Flow Label(20bit):流标签
- 指示数据包属于哪个特定序列(流)
- 用数据包的原地址、目的地址、流标签标识一个流
- Next Header(8bit):下一个头部
- 指示扩展头部(如果存在)的类型、上层数据包的协议类型(如TCP、UDP、ICMPv6)
4.传输层(Transport)
传输层有两个协议:
TCP(Transmission Control Protocol)- 传输控制协议
UDP(User Datagram Protocol)- 用户数据报协议
UDP-数据格式
- 首部只有8个字节
检验和
- 检验和的计算内容 = 伪首部 + 首部 + 数据
端口
- UDP首部中端口号占用2字节
- 客户端源端口是临时开启的随机端口
- 防火墙可以设置开启/关闭某些端口
- 常用命令
- netstat -an:查看被占用的端口
- netstat -anb:查看被占用的端口、占用端口的应用进程
- telnet host port:查看是否可以访问主机的某个端口
TCP-数据格式
- 数据偏移
- 占4位,取值范围是0x0101~0x1111 20~60字节
- 乘以4 = 首部长度(Header Length)(其后是数据部分)
- 保留
- 占6位,目前全为0
- 检验和
- 跟UDP一样,TCP检验和计算内容为:伪首部 + 首部 + 数据
- 伪首部:占用12字节,仅在计算检验时起作用,并不会传递给网络层
- 标志位(Flag)
- URG(Urgent):当URG=1时,紧急指针字段才有效。表名当前报文段中有紧急数据,应优先尽快传送
- 窗口为0,仍然可以传送该类数据
- ACK(Acknowledgment):当ACK=1时,确认号字段才有效
- TCP有条硬性规定,当建立链接成功后所有传输的数据报文都必须把ACK置为1。
- PSH(Push)
- 占1bit,发送方把PSH置为1时 会立即发送该数据包,接收方收到PSH=1的报文会立即处理交付给应用层处理。
- RST(Reset)
- 当RST=1时,表名连接中出现严重差错,必须释放连接,然后再重新建立连接
- 遇到非法报文或者拒绝连接时也会把RST置为1.
- SYN(Synchronization)
- 表示这是一个连接请求或连接确认报文。
- 当SYN=1、ACK=0时,表明这是一个建立连接的请求
- 连接同意发送:SYN=1、ACK=1
- FIN(Finish)
- 当FIN=1,表明数据以发送完毕,要求释放连接
- URG(Urgent):当URG=1时,紧急指针字段才有效。表名当前报文段中有紧急数据,应优先尽快传送
- 序号(Sequence Number)
- 占4字节
- 首先,在传输过程的每一个字节都会有一个编号
- 在建立连接后,序号代表:这一次传给对方的TCP数据部分的第一个字节的编号
- 确认号(Acknowledgment Number)
- 占4字节
- 在建立连接后,确认号代表:期望对方下一次传过来的TCP数据部分的第一个字节的编号
- 窗口(Window)
- 占2字节
- 这个字段具有流量控制功能,用以告知对方下一次允许发送的数据大小(单位字节)
PUSH与URG
- 两者相同点:
- URG与PSH两者都使用于紧急处理的情况,用来快速传输紧急数据。
- 两者不同点
- URG置为1时,对于发送发,“带外数据”与正常情况下应该发送的消息数据一起,封装成数据报发送,省去了在队列中等待的时间。 在接收方,解析报文后,获取数据之后还是要放在缓存区中,等待满了之后在向上往应用层交付。
- PSH置为1时,对于发送方,表明这些数据不需要等向下发送的缓存区满,立刻封装成报文,发送,省去了等待发送缓存区到达满的状态的时间。 在接收方,也不需要等接受缓存区满,直接向上交付给应用层。
TCP数据偏移与UDP长度
- UDP首部中有个16位的字段记录了整个UDP报文段的长度(首部 + 数据)
- TCP首部中仅仅有4位的字段记录了TCP报文段首部的长度,并没有记录整个TCP报文段的数据长度
- UDP首部中16位的长度字段是冗余的,纯粹是为了保证首部是32bit对齐
- TCP/UDP的数据长度,完全可以由IP数据包的首部推测出来
- 传输层的数据长度 = 网络层的总长度 - 网络层的首部长度 - 传输层的首部长度
可靠传输
停止等待ARQ协议
ARQ(Automatic Repeat-reQuest),自动重传请求
连续ARQ协议 + 滑动窗口协议
- 若有个包重传了N次后还是失败,是否会重传取决于操作系统的设置,比如有些系统,重传5次还未成功就会发送reset报文(RST)断开TCP连接
- 如果接收窗口最多能接受4个包,但发送方只发送了2个包,接收方会在等待一段时间后,就会返回确认收到2个包给发送方
- **为什么优先选择在传输层分段?**这里分段可以保证一旦出现数据丢失,只需重传丢失的那些段,否则重传整个数据
SACK(选择性确认)
-
TCP通信过程中,如果发送序列中间某个数据包丢失(比如1、2、3、4、5中的3丢失了)
-
TCP会通过重传最后确认的分组后续的分组(最后确认的是2,会重传3、4、5)
-
这样原先已经正确传输的分组也可能重复发送(比如4、5)
-
为了改善以上情况,发展出了SACK(Selective Acknowledgment)选择性确认
-
告诉发送方哪些数据已经丢失,哪些数据已经提前收到
-
使TCP值重新发送丢失的包(比如3),不用发送后续所有的分组(比如4、5)
流量控制
- 用以控制发送方的发送速率,让接收方来得及处理
- 原理是接收方返回的 ACK 中会包含自己的接收窗口的大小,并且利用大小来控制发送方的数据发送
- 这是一个点对点的过程
拥塞控制
-
拥塞控制是一个全局性的过程
-
防止过多的数据注入到网络中,避免网络中的路由器或链路过载
-
MSS(Maximum Segment Size):每个段最大的数据部分大小,在连接建立时确定
-
cwnd(congestion window):拥塞窗口
-
rwnd(receive window):接收窗口
-
swnd(send window):发送窗口
- swnd = min(cwnd, rwnd)
-
慢开始(slow start,慢启动)
注意上图的确认并不严谨,仅做概念演示
- 拥塞避免(congestion avoidance)
注意第二段慢开始是旧方法,新标准见下
- 快重传(fast restransmit)
- 接收方
- 每收到一个失序的分组后就立即发出重复确认
- 使发送方即使知道有分组没有到达
- 而不是等待自己发送数据时才进行确认
- 发送方
- 只要连续收到三个重复确认(总共4个相同的确认),就应当立即重传对方尚未收到的报文段
- 而不必等待重传计时器到期后再重传
- 快恢复(fast recovery)
- 当发送方连续收到三个重复确认,就执行“乘法减小”算法,把 ssthresh(慢开始阈值) 减半
- 与慢开始不同之处在于现在不执行慢开始算法,即 cwnd 现在不恢复到初始值,而是把 cwnd 值设置为 ss thresh 减半后的数值,然后再执行拥塞避免算法(加法增大),使拥塞窗口线程增大
三次握手
前两次握手的特点
- SYN 都为 1,数据部分长度都为 0
- TCP头部的长度一般是32字节(固定首部20 + 选项部分12)
- 双方会交换确认一些信息,比如MSS、是否支持SACK、Window scale 等(选项部分)
为什么是三次握手?
两次的话,会出现这种情况,A发出的第一次连接请求报文段没有丢失,而是在某些网络节点长时间滞留,本来是早已失效的报文段,但B收到后误以为A发送的一次新的请求,如果是三次握手则会向A确认报文段,同意建立连接,两次握手则直接建立连接,这样就会导致新的连接建立,B的许多资源白白浪费。
失败处理
-
第一次:C端发送报文之后会启动一个定时器,在超时之后未收到S端的确认,会再次发送SYN请求,每次尝试的时间会是第一次的二倍,如果总的总尝试时间为75秒,此次建立链接失败。
-
第二次:在发送完ACK+SYN报文后会启动一个定时器,超时没有收到ACK确认,会再次发送,会进行多次重试。超时时间依旧每次翻倍,重试次数可设置。
修改
/proc/sys/net/ipv4/tcp_synack_retries
的值- 为什么这次要连带SYN标志?
- TCP是全双工通信,协议规定当收到建立连接请求后必须返回序列号,同时建立本端到对端的通信链接。这也叫做捎带应答机制。
-
第三次:S端在发出ACK+SYN报文后会启动一个定时器,在超时触发还没收到ACK就确认是丢失了,会重试一次发送。如果多次发送SYN+ACK包都没有回应,就会发送RST包,强制关闭连接
- SYN攻击发生在第二次握手之后,服务端为SYN_RCVD状态之后
SYN攻击就是客户端(Client)在短时间内伪造大量不存在的IP地址,并向服务端(Server)不断地发送SYN包,Server回复确认包,并等待Client的确认,由于源地址是不存在的,因此,Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击。
- SYN攻击发生在第二次握手之后,服务端为SYN_RCVD状态之后
四次挥手
TCP是全双工模式,每个方向必须单独进行关闭。
第一次挥手,客户端发出FIN+ACK报文,表示客户端已经没有数据要发送了,但是客户端此时仍可以接收来自服务器的数据
第二次挥手,服务器发出ACK报文,表示服务器已经知道客户端没有数据发送了,但服务器仍然可以发送数据到客户端
第三次挥手,服务器发出FIN+ACK报文,表示服务器也没有数据要发送了。在收到客户端的确认报文后,服务器断开连接。
第四次挥手,客户端发出ACK报文,表示客户端已经知道服务器没有数据发送了。等待一段时间后随后断开客户端连接
状态 | 描述 |
---|---|
CLOSED | 阻塞或关闭状态,表示主机当前没有正在传输或者建立的链接 |
LISTEN | 监听状态,表示服务器做好准备,等待建立传输链接 |
SYN-RECV | 收到第一次的传输请求,还未进行确认 |
SYN-SENT | 发送完第一个SYN报文,等待收到确认 |
ESTABLISHED | 链接正常建立之后进入数据传输阶段 |
FIN-WAIT-1 | 主动发送第一个FIN报文之后进入该状态 |
FIN-WAIT-2 | 已经收到第一个FIN的确认信号,等待对方发送关闭请求(等待对方发送未发完的数据) |
TIMED-WAIT | 完成双向链接关闭,等待分组消失 |
CLOSING | 双方同时关闭请求,等待对方确认时 |
CLOSE-WAIT | 收到对方的关闭请求并进行确认进入该状态 |
LAST-ACK | 等待最后一次确认关闭的报文 |
为什么有TIME-WAIT状态?
TIME-WAIT = 2MSL MSL(Maximum Segment Lifetime)最大分段生存期,官方建议是2分钟。
如果client发送ACK后马上释放了,然后又因为网络原因,server没有收到client的ACK,server就会重发FIN:
- client 没有任何响应,服务器那边会干等,甚至多次重发FIN,浪费资源
- client 又建立了一次连接而且是同一个端口号,然而新的应用程序收到FIN后马上开始执行断开连接的操作
- 这个阶段就是防止上述情况。如果收到服务器的又一次FIN+ACK,客户端会再次发出ACK且TIME-WAIT时间重置
TCP如何保证可靠传输
TCP主要提供了检验和、序列号/确认应答、超时重传、最大消息长度、滑动窗口、拥塞控制等方法实现了可靠性传输。
检验和
通过检验和的方式,接收端可以检测出来数据是否有差错和异常,假如有差错就会直接丢弃TCP段,重新发送。TCP在计算检验和时,会在TCP首部加上一个12字节的伪首部。检验和总共计算3部分:TCP首部、TCP数据、TCP伪首部
序列号/确认应答
这个机制类似于问答的形式。比如在课堂上老师会问你“明白了吗?”,假如你没有隔一段时间没有回应或者你说不明白,那么老师就会重新讲一遍。其实计算机的确认应答机制也是一样的,发送端发送信息给接收端,接收端会回应一个包,这个包就是应答包。
超时重传
超时重传是指发送出去的数据包到接收到确认包之间的时间,如果超过了这个时间会被认为是丢包了,需要重传。那么我们该如何确认这个时间值呢?
我们知道,一来一回的时间总是差不多的,都会有一个类似于平均值的概念。比如发送一个包到接收端收到这个包一共是0.5s,然后接收端回发一个确认包给发送端也要0.5s,这样的两个时间就是RTT(往返时间)。然后可能由于网络原因的问题,时间会有偏差,称为抖动(方差)。
从上面的介绍来看,超时重传的时间大概是比往返时间+抖动值还要稍大的时间。
但是在重发的过程中,假如一个包经过多次的重发也没有收到对端的确认包,那么就会认为接收端异常,强制关闭连接。并且通知应用通信异常强行终止。
最大消息长度
在建立TCP连接的时候,双方约定一个最大的长度(MSS)作为发送的单位,重传的时候也是以这个单位来进行重传。理想的情况下是该长度的数据刚好不被网络层分块。
滑动窗口控制
我们上面提到的超时重传的机制存在效率低下的问题,发送一个包到发送下一个包要经过一段时间才可以。所以我们就想着能不能不用等待确认包就发送下一个数据包呢?这就提出了一个滑动窗口的概念。
窗口的大小就是在无需等待确认包的情况下,发送端还能发送的最大数据量。这个机制的实现就是使用了大量的缓冲区,通过对多个段进行确认应答的功能。通过下一次的确认包可以判断接收端是否已经接收到了数据,如果已经接收了就从缓冲区里面删除数据。
在窗口之外的数据就是还未发送的和对端已经收到的数据。那么发送端是怎么样判断接收端有没有接收到数据呢?或者怎么知道需要重发的数据有哪些呢?通过下面这个图就知道了。
如上图,接收端在没有收到自己所期望的序列号数据之前,会对之前的数据进行重复确认。发送端在收到某个应答包之后,又连续3次收到同样的应答包,则数据已经丢失了,需要重发。
拥塞控制
窗口控制解决了 两台主机之间因传送速率而可能引起的丢包问题,在一方面保证了TCP数据传送的可靠性。然而如果网络非常拥堵,此时再发送数据就会加重网络负担,那么发送的数据段很可能超过了最大生存时间也没有到达接收方,就会产生丢包问题。为此TCP引入慢启动机制,先发出少量数据,就像探路一样,先摸清当前的网络拥堵状态后,再决定按照多大的速度传送数据。
此处引入一个拥塞窗口:
发送开始时定义拥塞窗口大小为1;每次收到一个ACK应答,拥塞窗口加1;而在每次发送数据时,发送窗口取拥塞窗口与接送段接收窗口最小者。
慢启动:在启动初期以指数增长方式增长;设置一个慢启动的阈值,当以指数增长达到阈值时就停止指数增长,按照线性增长方式增加至拥塞窗口;线性增长达到网络拥塞时立即把拥塞窗口置回1,进行新一轮的“慢启动”,同时新一轮的阈值变为原来的一半。
5.应用层(Application)
DNS
- 域名系统 Domain Name System
- 将域名解析成对应的IP地址
- DNS可以基于TCP或UDO协议,占用53端口
检索流程
- 客户端会首先访问最近的一台DNS服务器,也就是客户端自己配置的DNS服务器
- 所有的DNS服务器都记录了根域名服务器的IP地址
- 上级DNS服务器记录了下一级DNS服务器的IP地址
- 全球一共13台IPv4域名服务器
常用命令(Windows)
- ipconfig /displaydns:查看DNS缓存记录
- ipconfig /flushdns:清空DNS缓存记录
- nslookup 域名
DHCP
动态主机配置协议(Dynamic Host Configuration Protocol)
- 基于UDP协议,客户端是68端口,服务器是67端口
- DHCP服务器会从IP地址池中,挑选一个IP地址“出租”给客户端一段时间,时间到期就回收它们
分配IP地址的4个阶段
-
DISCOVER:发现服务器
- 发广播包(源IP 0.0.0.0,目标IP 255.255.255.255 目标MAC FF:FF:FF:FF)
-
OFFER:提供租约
- 服务器返回可以租用的IP地址,以及租用期限、子网掩码、网关、DNS等信息
-
REQUEST:选择IP地址
- 客户端选择一个OFFER,发送广播包进行回应
-
ACKNOWLEDGE:确认
- 被选中的服务器发送ACK数据包给客户端
-
客户端会在租期不足的时候,自动向DHCP服务器发送REQUEST信息申请续约(直接是第三阶段)
常用命令(Windows)
- ipconfig /all:显示DHCP相关详细信息,比如DHCP租约过期时间、DHCP服务器地址等
- ipconfig /release:释放租约
- ipconfig /renew:重新申请IP地址、申请续约
HTTP
超文本传输协议(Hyper Text Transfer Protocol)
可能会搞砸你的面试:你知道一个TCP连接上能发起多少个HTTP请求吗? - 知乎 (zhihu.com)
① History
-
1991年,HTTP/0.9
- 只支持GET请求方法获取文本数据(比如HTML文档),且不支持请求头、响应头等,无法向服务器传递太多信息
-
1996年,HTTP/1.0
- 支持POST、HEAD等请求方法,支持请求头、响应头等,支持更多种数据类型
- 浏览器的每次请求都需要与服务器建立一个TCP连接,完成后断开
-
1997年,HTTP/1.1(最经典、使用最广泛的版本)
- 长连接
- Host请求头
- 缓存优化
-
2015年,HTTP/2.0
- 二进制格式
- 多路复用
- 头部压缩
- 服务端推送
-
2018年,HTTP/3.0
② ABNF
一种格式规范
- telnet host port:模拟向服务器发送请求
③ 请求方式
-
GET:常用于读取操作的请求,请求参数直接拼接在URL的后面(浏览器对URL的长度是有限制的)
-
POST:常用于添加、修改、删除操作,请求参数可以放到请求体中(没有大小限制)
-
HEAD:请求得到与GET请求相同的响应,但没有响应体
- 使用场景:在下载一个大文件前,先获取其大小,再决定是否要下载。以此节约带宽
-
OPTIONS:用于获取目标资源所支持的通信选项,比如服务器支持的请求方法
-
OPTIONS * HTTP/1.1 Host: localhost:8080
-
-
PUT:用于对已存在的资源进行整体覆盖
-
PATCH:用于对资源进行部分修改(资源部存在,会创建新资源)
-
DELETE:用于删除指定的资源
-
TRACE:请求服务器回显其收到的请求信息,主要用于HTTP请求的测试或诊断
-
CONNECT:可以开启一个客户端与所请求资源之间的双向沟通的通道,它可以用来创建隧道
- 可以用来访问采用了SSL(HTTPS)协议的站点
④ 头部字段
请求头字段
头字段名 | 说明 |
---|---|
User-Agent | 浏览器的身份标识符 |
Host | 服务器的域名、端口号 |
Date | 发送该消息的日期和时间 |
Referer | 表示浏览器所访问的前一个页面 |
Content-Type | 请求体的类型 |
Content-Length | 请求体的长度(字节) |
Accept | 能够接受的响应内容类型(Content-Types) |
Accept-Charset | 能够接受的字符集 |
Accept-Encoding | 能够接受的编码方式列表 |
Accept-Language | 能够接受的响应内容的自然语言列表 |
Range | 仅请求某个实体的一部分。字节偏移从0开始 |
Origin | 发起一个针对跨域资源共享的请求 |
Cookie | 之前由服务器通过Set-Cookie发送的Cookie |
Connection | 该浏览器想要优先使用的连接类型 |
Cache-Control | 用来指定在这次的请求/响应链中的所有缓存机制都必须遵守的指令 |
If-None-Match | 如果上一次的响应头中有ETag,就会将ETag的值作为请求头的值,服务器发现该值与最新值匹配,返回304,否则返回新资源 |
If-Modified-Since | 如果上一次的响应头中没有ETag,有Last-Modified,就会将Last-Modified的值作为请求头的值;如果服务器发现资源的最后一次修改时间晚于If-Modified-Sice,就会返回新的资源 |
关于 Cache
- 通常会缓存的情况是:GET + 静态资源
- Ctrl + F5 强制刷新
响应头字段
头字段名 | 说明 |
---|---|
Date | 发送时间 |
Last-Modified | 所请求的对象的最后修改日期 |
Server | 服务器的名字 |
Expires | 指定一个时间(GMT格式),超过该时间则认为此响应已经过期 |
Content-Type | 响应体类型 |
Content-Encoding | 内容所使用的编码类型 |
Content-Length | 响应体的长度(字节) |
Content-Disposition | 一个可以让客户端下载文件并建议文件名的头部 |
Accept-Ranges | 服务器支持哪些种类的部分内容范围 |
Content-Range | 这条部分消息是属于完整消息的哪部分 |
Cache-Concrol | 缓存策略 no-storage:不缓存数据到本地;public:允许用户、代理服务器缓存数据到本地;private:只允许用户缓存数据到本地;max-age:缓存的有效时间(秒) |
Pragma | 作用类似于Cache-Control,HTTP/1.1的产物 |
Last-Modified | 资源最后修改时间 |
ETag | 资源唯一标识(计算出来的摘要值) |
优先级:Pragma > Cache-Control > Expires
注:
- Last-Modified的缺陷
- 只能精确到秒级别,如果资源在1s内被修改了,客户端将无法获取最新的资源数据
- 所以就有了ETag的必要
⑤ 状态码
- 信息响应:100~199
- 成功响应:200~299
- 重定向:300~399
- 客户端错误:400~499
- 服务器错误:500~599
常见状态码
- 100 Continue
请求的初始部分已经被服务器收到,并且没有被服务器拒绝。客户端应该继续发送剩余的请求,如果请求已经完成,就忽略这个响应
允许客户端发送带请求体的请求前,判断服务器是否愿意接收请求(通过请求头判断)
在某些情况下,如果服务器在不看请求体就拒绝请求时,客户端就发送请求体是不恰当的或低效的
- 200 OK
- 302 Found:请求的资源被暂时移动到了由Location头部指定的URL上
- 304 Not Modified:说明无需再次传输请求的内容,也就是说可以使用缓存的内容
- 400 Bad Request:由于语法无效,服务器无法解析请求
- 401 Unauthorized:由于缺乏目标资源要求的身份验证
- 403 Forbidden:服务器端有能力处理该请求,但是拒绝授权访问
- 404 Not Found:服务器端无法找到所请求的资源
- 405 Method Not Allowed:服务器禁止了使用当前HTTP方法的请求
- 406 Not Acceptable:服务器端无法提供与Accept-Charset以及Accept-Language指定的值相匹配的响应
- 408 Request Timeout:服务器想要将没有使用的连接关闭
- 一些服务器会在空闲连接上发送此信息,即便是在客户端没有发送任何请求的情况下
- 500 Internal Server Error:所请求的服务器遇到意外的情况并阻止其执行请求
- 501 Not Implementd:请求的方法不被服务器支持,因此无法被处理
- 502 Bad Gateway:作为网关或代理角色的服务器,从上游服务器(如tomcat)中接收到的响应是无效的
- 503 Service Unavailable:服务器尚未处于可以接受请求的状态
- 通常造成这种状态的原因是由于服务器停机维护或已经超载
⑥ form 提交 - 常用属性
- action:请求URI
- method:请求方法(Get、POST)
- enctype:POST请求时,请求体编码方式
- application/x-www-form-urlencoded(默认值)
- 用&风格参数,用=分隔键值,字符用URL编码方式进行编码
- multipart/form-data
- 文件上传时必须使用这种方式
- application/x-www-form-urlencoded(默认值)
⑦ 跨域资源共享
同源策略
- 默认情况下,AJAX请求只能发送给同源的URL
- 同源是指:协议、域名(IP)、端口相同
- img、script、link、iframe、video、audio等标签不受同源策略的约束
解决方法
设置相关的响应头:Access-Control-Allow-Origin
⑧ Cookie & Session
- session 在服务器端,cookie在客户端(浏览器)
- session 存储无限制,cookie 大小限制4kb
- session 默认被存在服务器的一个文件里(不是内存)
- session 运行依赖 session id,而session id 是存在与 cookie中的,也就是说,如果浏览器禁用 cookie,同时 session 也会失效(但是也可以通过其他方法实现,比如 url 中传递 session_id)
- session 可以放在文件、数据库、内UC那种都可以
因此,维持一个会话的核心就是客户端的唯一标识,即 session id
https://zhuanlan.zhihu.com/p/27669892
⑨ HTTP协议的不足(HTTP/1.1)& 扩展
- 同一时间,一个连接只能对应一个请求
- 针对同一个域名,大多数浏览器允许同时最多6个并发连接
- 只允许客户端主动发起请求
- 一个请求只能对应一个响应
- 同一个会话的多次请求中,头信息会被重复传输
- 通常会给每个传输增加500~800字节的开销
- 如果使用Cookie,增加的开销有时会达到上千字节
SPDY
SPDY(speedy缩写)谷歌研发,是基于TCP的应用层协议,它强制要求使用SSL/TLS
- SPDY并不用于取代HTTP,它只是修改了HTTP请求与响应的传输方式
- 只需增加一个SPDY层,现有的所有服务器端应用均不用做任何修改
- SPDY是HTTP/2的前身
HTTP/2
HTTP /2在底层传输做了很多的改进和优化,但在语义上完全与HTTP/1.1兼容
特性
- 二进制格式
- 多路复用
- 在此之前,降低请求次数的方式有
- image sprites
- 合并CSS/JS
- 内嵌CSS/JS/Base64图片
- 域名分片
- 在此之前,降低请求次数的方式有
- 优先级
- 允许每个数据流都有一个关联的权重和依赖关系
- 头部压缩
- 服务器推送
- 服务器可以对一个客户端请求发送多个响应
- 除了对最初请求的响应,服务器还可以向客户端推送额外资源,而无需客户端主动请求
一些基本概念
- 数据流:已建立的连接内的双向字节流,可以承载一条或多条消息
- 所有通信都是在一个TCP连接上完成,此连接可以承载任意数量的双向数据流
- 消息:与逻辑HTTP请求或相应消息对应,由一系列帧组成
- 帧:HTTP/2通信的最小单元,每个帧都包含帧头(会标识出当前帧所属的数据流)
- 来自不同数据流的帧可以交错发送,然后再根据每个帧头的数据流标识符重新组装
存在的问题
- 队头阻塞
- 传输层有序传输导致
- 握手延迟
HTTP/3
Google觉得HTTP/2仍然不够快,于是就有了HTTP/3
基于UDP协议的QUID协议实现
快速UDP网络连接 - QUIC(Quick UDP Internet Connections)
如何保证可靠传输?
由QUIC协议保证
特性
- 连接迁移
- TCP基于四要素:源IP、源端口、目标IP、目标端口
- 切换网络时有任意一个要素发生变化,连接就会发生变化,可能导致失败
- QUIC连接不受以上四要素影响,因为其使用的是一组 Connection ID 来标识一个连接
存在的问题
- 高负荷CPU使用
- Linux 内核UDP部分没有像TCP那样优化
- TCP和TLS有硬件加速,而UDP很罕见
- 处在实验阶段,缺乏实际应用
⑩ HTTPDNS
HTTPDNS是基于HTTP协议向DNS服务器发送域名解析请求
- 替代了基于DNS协议向运营商Local DNS发起解析请求的传统方式
- 可以避免Local DNS造成的域名劫持和跨网访问问题
- 常用在移动互联网中
使用
- 市面上已有现成的解决方案,如阿里云、腾讯云等
- 移动端集成相关的SDK即可使用
HTTPS
超文本传输安全协议(Hyper Text Protocol Secure,简称HTTP)
SSL/TLS
传输层安全性协议(Transport Layer Security,简称TLS
前身是 安全套接层(Secure Sockets Layer,简称SSL)
- HTTPS是在HTTP的基础上使用SSL/TLS来加密报文,对窃听和中间人攻击提供合理的防护
- SSL/TLS 也可以用在其他协议上,比如FTP -> FTPS
OpenSSL
OpenSSL 是 SSL/TLS协议的开源实现,始于1998年,支持三大主流平台
- 生成私钥:openssl genrsa -out mj.key
- 生成公钥:openssl rsa -in mj.key -pubout -out mj.pem
HTTPS通信过程
- TCP的3次握手
- TLS连接
- HTTP请求和响应
TLS 1.2的连接过程
图中省略了一些ACK确认过程
⑥ Client Key Exchange
- 用以实现ECDHE算法的另一个参数(Client Params)
- 目前为止,客户端和服务器拥有了ECDHE算法需要的两个参数:Server Params、Client Params
- 客户端、服务器都可以
- 使用ECDHE算法根据Server Params、Client Params计算出一个新的随机密钥串:Pre-master secret
- 然后结合三者生成一个主密钥,最后利用主密钥衍生出其他密钥:客户端发送用的会话密钥、服务器发送用的会话密钥等
WebSocket
WebSocket是基于TCP的应用层协议,用于在C/S架构的应用中实现双向通信
- WebSocket 使用80(ws://)、443(wss://)端口,可以绕过大多数防火墙的限制
建立连接
WebService
一种跨编程语言和操作系统平台的远程调用技术标准
- SOAP(Simple Object Access Protocol)简单对象访问协议
- 很多时候,SOAP = HTTP + XML
- WebService 使用 SOAP 协议来封装传递数据
- WSDL(Web Services Description Language)Web服务描述语言
- 一个XML文档,用以描述WebService1接口的细节(比如参数、返回值等)
- 一般在WebService的URL后面跟上 ?wsdl 获取WSDL信息
- 事实上,WebService完全可以用普通的Web API取代
FTP
文件传输协议(File Transport Protocol,简称FTP)
URL格式:ftp://[user[:password]@]host[:port]/url-path
连接模式
FTP有两种连接模式:主动、被动,
端口号21(控制端口)、20(数据端口)
- 两种模式都需要客户端与服务器建立两个连接
- 控制连接:用于传输状态信息
- 数据连接:用于传输文件和目录信息
- 主动模式
- 被动模式
SMTP
简单邮件传输协议(Simple Mail Transfer Protocol,简称SMTP)
基于TCP,服务器默认使用25端口,SSL/TLS使用465端口
POP
邮局协议(Post Office Protocol,简称POP)
基于TCP,服务器默认使用110端口,SSL/TLS使用995端口
IMAP
因特网信息访问协议(Internet Message Access Protocol,简称IMAP)
基于TCP,服务器默认使用143端口,SSL/TLS使用993端口
四、网络安全
网络通信中面临的四种安全威胁
截获、中断、篡改、伪造
网络层 - ARP欺骗
ARP欺骗(ARP spoofing),又称为ARP毒化(ARP poisoning)、ARP病毒、ARP攻击
举例说明
- 假设主机C是攻击者,主机A、B是被攻击者
- C只要收到经过A、B发送的ARP请求,就会拥有A、B的IP、MAC地址,就可以进行欺骗活动
- C发送一个ARP响应给B,把响应包里的源IP设为A的IP地址,源MAC设为C的MAC地址
- B收到ARP响应后,更新它的ARP表,把A的MAC地址(IP_A, MAC_A)改为(IP_A, MAC_C)
- 当B要发送数据包给A时,它根据ARP表来封装数据包的头部,将目标MAC地址设为MAC_C,而非MAC_A
- 当交换机收到B发送给A的数据包时,根据此包的目标MAC地址(MAC_C)而把数据包转发给C
- C接收到数据包后,可以把它存起来后再发送给A达到窃听效果。C也可以篡改数据后才发送数据包给A
防护措施
- 静态ARP(自己手动添加ARP表)
- DHCP Snooping
- 网络设备可借由DHCP保留网络上各电脑的MAC地址,在伪造的ARP数据包发出时既可侦测到
- 利用一些软件监听ARP的不正常变动
DoS、DDos
拒绝服务攻击(Denial-of-Service attack,简称DoS)
- 使目标电脑的网络或系统资源耗尽,使服务暂是终止或停止,导致其正常用户无法访问
- 可以分为两大类
- 带宽消耗性:UDP洪水攻击、ICMP洪水攻击
- 资源消耗型:SYN洪水攻击、LAND攻击
- SYN攻击(SYN flooding attack):修改源IP地址,让目标发送SYN-ACK到伪造的IP地址,因此目标永远不可能收到ACK(第三次握手)
- LAND攻击(局域网拒绝服务攻击,Local Area Network Denial attack):通过持续发送相同源地址和目标地址的欺骗数据包,使目标试图与自己建立连接,消耗系统资源直至崩溃。这种攻击主要是因为操作系统设计有缺陷
分布式拒绝服务攻击(Distributed Denial-of-Service attack,简称DDoS)
- 黑客使用网络上两个或以上被攻陷的电脑作为“僵尸”,向特定的目标发动DoS攻击
防御手段
入侵检测、流量过滤、多重验证等等
- 防火墙
- 设置特定规则,例如允许和拒绝特定通讯协议,端口和IP地址
- 当攻击从少数不正常的IP地址发出时,可以简单的使用拒绝规则阻止一切从攻击源IP发出的通信
- 复杂攻击难以用简单规则来阻止,例如80端口遭受攻击时不可能拒绝端口所有的通信,因为同时会阻止合法流量】
- 防火墙可能处于网络架构中过后的位置,路由器可能在恶意流量达到防火墙前即被攻击影响
- 交换机
- 大多数交换机具有一定的速度限制和访问控制能力
- 路由器
- 和交换机类似,路由器也有一定的速度限制和访问控制能力
- 黑洞引导
- 将所有受攻击计算机的通信全部发送至一个“黑洞”(空接口或不存在的计算机地址)或者有足够能力处理洪流的网络设备商,以避免网络受到较大影响
- 流量清洗
- 当流量被送到DDoS防护清理中心时,通过采用抗DDoS软件处理,将正常流量和恶意流量区分开,正常的流量则回注客户网站
应用层 - DNS劫持
DNS劫持,又称为域名劫持
- 攻击者篡改了某个域名的解析结果,使得指向该域名的IP变成了另一个IP,导致对相应网络的访问被劫持到另一个不可达的或假冒的网址,从而实现非法窃取用户信息或者破坏正常网络服务的目的
HTTP劫持:对HTTP数据包进行拦截处理,比如插入JS代码
- 明显的特征就是:访问某个网站时,右下角突然多了个弹窗广告
防御手段
使用更靠谱的DNS服务器,比如:114.114.114
- 谷歌:8.8.8.8 8.8.4.4
- 微软:4.2.2.1 4.2.2.2
- 百度:180.76.76.76
- 阿里:223.5.5.5 223.6.6.6
国内其他DNS如下 https://www.114dns.com
数据加密
应用层 - HTTP协议的安全问题
HTTP协议默认是采用明文传输的,因此会有很大的安全隐患;常见的提高安全性的方法是:对通信内容进行加密后,再进行传输
- 不可逆
- 单向散列函数:MD5、SHA
- 可逆
- 对称加密:DES、3DES、AES
- 非对称加密:RSA
- 其它
- 混合密码系统
- 数字签名
- 证书
注:encrypt 加密
decrypt 解密
plaintext 明文
ciphertext 密文
单向散列函数(One-way hash function)
- 根据任意长度的数据,计算出固定长度的散列值
- 计算速度快,能快速计算出散列值
- 不可逆,不同数据散列值不同
常见散列函数
- MD4、MD5
- 产生128bit的散列值,MD就是Message Digest的缩写,目前已经不安全
- SHA-1
- 产生160bit的散列值,目前已经不安全
- SHA-2
- SHA-256、SHA-384、SHA-512,散列值长度见名知意
- SHA-3
- 全新标准
散列函数之应用
- 防止数据被篡改
- 密码加密
对称加密(Symmetric encryption)
对称密码中,加密用的密钥和解密用的密钥是相同的
常见的对称加密算法
- DES(Data Encryption Standard)
- DES是一种将64bit明文加密成64bit密文的对称加密算法,密钥长度是56bit
- 规格上来说,密钥长度是64bit,但每隔7bit会设置一个用于错误检查的bit,因此实际上长度为56bit
- 由于DES每次只能加密64bit的数据,遇到比较大的数据,需要对DES加密进行迭代(反复)
- 目前已经可以在短时间内破解,所以不建议使用
- 3DES(Triple Data Encryption Algorithm)
- 3DES,将DES重复3次所得到的一种密码算法,也叫做三重DES
- 三重DES指的是 加密 -> 解密 -> 加密 这个过程
- 目前还被一些银行机构使用,但处理速度不高,安全性逐渐暴露出问题
- AES(Advanced Encryption Standard)
- 取代DES称为新标准的一种对称加密算法,又称Rijndael加密算法
- AES的密钥长度有128、192、256bit三种
- 目前AES,已经逐步取代DES、3DES,成为首选对称加密算法
密钥配送问题
有以下几种解决密钥配送的方法
- 事先共享密钥(私下共享)
- 密钥分配中心(Key Distribution Center,简称KDC)
- Diffie - Hellman 密钥交换
- 非对称加密
非对称加密(Asymmetric encryption)
在非对称加密中,密钥分为加密密钥、解密密钥两种。
公钥加密,私钥解密;私钥加密,公钥解密
- RSA(三位科学家姓氏首位组成)
- 目前使用最广泛的对称加密算法
混合密码系统(Hybrid Cryptosystem)
将对称加密和非对称加密的优势相结合的方法
- 解决了非对称加密速度慢的问题
- 并通过非对称加密解决了对称加密的密钥配送问题
- 网络上的密码通信所用的 SSL/TLS 都运用了混合密码系统
加密过程
- 首先,消息发送者要拥有接收者的公钥
- 生成会话密钥,作为对称加密的密钥,加密消息
- 用消息接收者的公钥,加密会话密钥(对称加密的密钥)
- 将前两步生成的加密结果,一并发送给消息接收者
解密过程
接收方利用自己的私钥解密会话密钥(使用的是非对称算法进行解密)
数字签名(Digital Signature)
在数字签名技术中,有以下两种行为
- 生成签名
- 由消息的发送者完成,通过“签名密钥”生成
- 验证签名
- 由消息的接收者完成,通过“验证密钥”验证
数字签名技术侧重于检查数据是否被改动,而不是为了保证机密性
加密方式总结
公钥 | 私钥 | |
---|---|---|
非对称加密 | 发送者加密时使用 | 接收者解密时使用 |
数字签名 | 验证者验证签名时使用 | 签名者生成签名时使用 |
- 加密:公钥加密,私钥解密
- 签名:私钥签名,公钥验签
证书(Certificate)
公钥合法性问题
发送者和接收者双方无法感知数据已被窃取
全称 公钥证书(Public-key Certificate,PKC)
由认证机构(Certificate Authority,CA)施加数字签名,CA就是能够认定“公钥确实属于此人”并且能够生成数字签名的个人或组织
- 各大CA的公钥,默认已经内置在浏览器和操作系统之中
五、其他
RESTful
表现层状态转移(REpresentational State Transfer)
REST是一种互联网软件架构设计风格,定义了一组用于创建Web服务器的约束,符合REST架构的Web服务,称为RESTful Web服务
实践建议
- URL中使用名次(建议复数),不使用动词
- 使用HTTP的方法表达动作
- 一个资源连接到其他资源,使用子资源的形式
- API版本化
- 返回JSON格式数据
- 发生错误不要返回 200
VPN
虚拟私人网络(Virtual Private Network,简称VPN)
它可以在公共网络上建立专用网络,进行加密通讯
- 可以提高上网的安全性
- 隐藏上网者的身份
- 突破网站的地域限制
- 因为GFW的限制
跟代理的区别
- 软件
- VPN一般需要安装对应的VPN客户端软件
- 代理不需要安装额外软件
- 安全性
- VPN默认会对数据加密
- 代理默认不会加密(数据最终是否加密取决于使用的协议本身)
- 费用
- 一般情况下,VPN比代理贵
实现原理
VPN的实现原理是:隧道协议(Tunneling Protocol)
常见的VPN隧道协议有
- PPTP(Point to Point Tunneling Protocol):点对点隧道协议
- L2TP(Layer Two Tunneling Protocol):第二层隧道协议
- IPsec(Internet Protocol Security):互联网安全协议
- SSL VPN(如OpenVPN)
网络爬虫
网络爬虫(Web Crawler),也叫做网络蜘蛛(Web Spider)
模拟人类使用浏览器操作页面的行为,对页面进行相关的操作
- 搜索引擎是爬虫的一种应用
- Java中可以用Jsoup爬一些简单的数据
robots.txt
用来告诉爬虫:哪些内容是不应该爬取的,哪些是可以被爬取的
robots.txt存放于网站根目录下的文本文件,比如 www.baidu.com/robots.txt
它并不是一个规范,而只是约定俗成的,所以并不能保证网站的隐私
无线网络
无线AP(Access Point):无线接入点
流媒体
流媒体(Streaming Media),又叫流式媒体,是指将一连串的多媒体数据压缩后经过互联网分段发送数据,在互联网上即时传输影音以供观赏的一种技术。此技术使得资料数据包得以像流水一样发送,而不是直接下载整个媒体文件
常见协议
- 实时传输协议(Real-Time Transport Protocol,RTP)
- 实时传输控制协议(Real-Time Trasport Control Protocol,RTCP)
- 实时流协议(Real-Time Streaming Protocol,PTSP)
- 实时消息传输协议(Real-Time Messaging Protocol,RMTP)
- 基于HTTP的流媒体网络传输协议(HTTP Live Streaming,HLS)