计算机网络学习笔记

文章目录


image-20211026213606606

一、网络设备

1. 计算机之间的连接方式-网线直连

两台计算机在传输数据包时不知道目的IP的MAC地址,会广播(目的MAC-全F)发送ARP数据报,请求目的IP的MAC地址;目的主机接收到该请求时,会将自己的MAC地址以ARP数据报响应出去。

然后源主机发送ICMP报文到目的主机(这时已经把目的IP和MAC地址封装到ICMP帧中),目的主机收到后响应该报文,代表链路连通可达。

image-20211025213812629

2.计算机之间的连接方式-同轴电缆

image-20211025215628633

3.计算机之间的连接方式-集线器(Hub)

image-20211025215706363
  • 集线器会将数据包转发到其所有接口上(除源接口)

4.计算机之间的连接方式-网桥(Bridge)

image-20211025224618922
  • 解决集线器无脑转发的问题
  • 通过自学习得知每个接口两侧的MAC地址
    • 每次对经过的数据包记录源MAC地址

5.计算机之间的连接方式-交换机(Switch)

image-20211025225135472
  • 接口更多的网桥
  • 全双工通信
  • 自学习接口MAC地址

6.计算机之间的连接方式-路由器(Router)

image-20211026082757495
  • 跨网段(依赖于每个接口的网关)通信
  • 路由器接口IP为相连一端网段的计算机的网关(Gateway)
  • 不同的路由器的接口不同
    • FastEthernet 高速以太网口(100M)
    • GigabitEthernet 千兆以太网口
    • Serial 串行接口
路由器&路由器
image-20211026192015340 image-20211026192054576 image-20211026192343837 image-20211026192721070

二、网络概念

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地址
image-20211026092322681
  • 计算机和其他计算机通信前,会判断目标主机和自己是否在同一网段
    • 同一网段:不需要由路由器进行转发
    • 不同网段:交由路由器进行转发
五类地址 A B C D E
image-20211026093224101 image-20211026093620810 image-20211026093744214 image-20211026093859704

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
子网划分
为什么要进行子网划分?
image-20211026102743425

借用主机位,划分出多个子网

  • 等长子网划分:将一个网段等分成多个子网,每个子网的可用IP地址数量是一样的
  • 变长子网划分:每个子网的可用IP地址数量可以是不一样的
等长子网划分

划分为2个子网,下图两个子网的网段是 192.168.0.0 / 192.168.0.127

image-20211026104651843

划分为4个子网,下图四个子网的网段是 192.168.0.0 / 192.168.0.64 / 192.168.0.128 / 192.168.0.192

image-20211026104836713
变长子网划分
20151117195849426

https://www.cnblogs.com/hark0623/p/6547432.html

划分超网

跟子网反过来,它是将连续的网段合并成一个更大的网段

例:合并192.168.0.0/24、192.168.1.0/24为一个网段:192.168.0.0/23

image-20211026181448862

合并网段的规律

  • 假设 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.数据包的传输过程

image-20211026205635302

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. 代理

正向代理 & 反向代理
image-20211101105903256
  • 正向代理:代理的对象是客户端
    • 隐藏客户端信息
    • 绕过防火墙(突破访问限制)
    • Internet 访问控制
    • 数据过滤
  • 反向代理:代理的对象是服务器
    • 隐藏服务器信息
    • 负载均衡
代理服务器 - 相关头部字段
  • Via:追加经过的每一台服务器的主机名(或域名)
  • X-Forwarded-For:追加请求方的IP地址
  • X-Real-IP:客户端的真实IP地址
CDN

内容分发网络(Content Delivery Network,简称CDN)是建立并覆盖在承载网之上,由分布在不同区域的边缘节点服务器群组成的分布式网络。

CDN应用广泛,支持多种行业、多种场景内容加速,例如:图片小文件、大文件下载、视音频点播、直播流媒体、全站加速、安全加速。

image-20211101112256529

使用CDN之前

image-20211101142628979

使用CDN之后

image-20211101113613734 image-20211101113523654
示例
v2-5ba76e77f05b030b5879177bd336928f_1440w

假设通过CDN加速的域名为www.a.com,接入CDN网络,开始使用加速服务后,当终端用户(北京)发起HTTP请求时,处理流程如下:

  1. 当终端用户(北京)向www.a.com下的指定资源发起请求时,首先向LDNS(本地DNS)发起域名解析请求。
  2. LDNS检查缓存中是否有www.a.com的IP地址记录。如果有,则直接返回给终端用户;如果没有,则向授权DNS查询。
  3. 当授权DNS解析www.a.com时,返回域名CNAME www.a.tbcdn.com对应IP地址。
  4. 域名解析请求发送至阿里云DNS调度系统,并为请求分配最佳节点IP地址。
  5. LDNS获取DNS返回的解析IP地址。
  6. 用户获取解析IP地址。
  7. 用户向获取的IP地址发起对该资源的访问请求。
  • 如果该IP地址对应的节点已缓存该资源,则会将数据直接返回给用户,例如,图中步骤7和8,请求结束。
  • 如果该IP地址对应的节点未缓存该资源,则节点向源站发起对该资源的请求。获取资源后,结合用户自定义配置的缓存策略,将资源缓存至节点,例如,图中的北京节点,并返回给用户,请求结束。

从这个例子可以了解到:

(1)CDN的加速资源是跟域名绑定的。
(2)通过域名访问资源,首先是通过DNS分查找离用户最近的CDN节点(边缘服务器)的IP
(3)通过IP访问实际资源时,如果CDN上并没有缓存资源,则会到源站请求资源,并缓存到CDN节点上,这样,用户下一次访问时,该CDN节点就会有对应资源的缓存了。

三、自底向上-五层

image-20211027082829372 image-20211027083228519

1.物理层(Physical Layer)

  • 物理层定义了接口标准、线缆标准、传输速率、传输方式等
数字信号、模拟信号
image-20211027083635709
数据通信模型
image-20211027083846147
信道(Channel)
image-20211027084033068

2.数据链路层(Data Link)

  • 链路:从一个节点到相邻节点的一段物理线路(有线或无线),中间没有其他交换节点
image-20211027084532270
  • 数据链路:在一条链路上传输数据时,需要有对应的通信协议来控制数据的传输
    • 广播信道:CSMA/CD协议(比如同轴电缆、集线器)
    • 点对点信道:PPP协议(比如两个路由器之间的信道)
  • 三个基本问题
    • 封装成帧
    • 透明传输
    • 差错检测
数据链路层 - 封装成帧
image-20211027085032482
  • 帧(Frame)的数据部分
    • 就是网络层传递下来的数据报(IP数据包,Packet)
  • 最大传输单元MTU(Maximum Transfer Unit)
    • 每一种数据链路层协议都规定了所能够传送的**帧的数据长度(上层-网络层数据报)**上限
    • 以太网的MTU为1500个字节
数据链路层 - 透明传输
image-20211027085245023
数据链路层 - 差错检验
image-20211027085426683
  • 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帧格式
image-20211027091342722
  • 当数据部分的长度小于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的核心。它的实现目标是:在包含物理环路的网络中,构建出一个能够连同全网各节点的树形无环逻辑拓扑

生成树算法的三个步骤
image-20211104175542525
  1. 选举根交换机
  • 网桥ID(BID)最小者当选

  • 网桥ID(BID)由以下两部分构成:

    • 优先级
      • 范围:0-61440
      • 步长:4096
      • 默认值:32768
    • 交换机的基本MAC地址
  • 网桥ID(BID)的比较方法:

    • 优先级越小,则网桥ID(BID)越小
    • 若优先级相同,则比较MAC地址,从MAC地址的左侧依次开始比较,数值小的,则网桥ID(BID)就小
image-20211104175858401
  1. 选举根端口
  • 在每一个非根交换机上选出一个根端口RP(Root Port)

  • 根端口RP用于接收根交换机发来的BPDU,也用来转发普通流量

  • 根端口RP的选举条件:

    • BPDU接收端口到根交换机的路径成本最小

    image-20211107140706293

    • 对端的网桥ID(BID)最小
    • 对端的端口ID(PID)最小
      • 优先级
        • 范围:0-240
        • 步长:16
        • 默认值:128
      • 端口号
image-20211105081929337
  1. 选举指定端口并阻塞备用端口
  • 在每一个网段上选出一个指定端口DP(Designated Port)
  • 指定端口DP用于转发根交换机发来的BPDU,也用来转发流量
  • 指定端口DP的选举条件:
    1. 根交换机的所有端口都是指定端口DP
    2. 根端口的对端端口一定是指定端口DP
    3. BPDU转发端口到根交换机的路径成本最小
    4. 本端的网桥ID(BID)最小
  • 剩余端口成为备用端口AP(Alternate Port),将他们阻塞
image-20211105082604763
PPP协议(Point to Point Protocol)
image-20211027091849311 image-20211027092308738
网卡
image-20211027093513961

3.网络层(Network)

网络层数据报(IP数据报,Packet)由首部、数据两部分组成

image-20211027112634142
  • 版本(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最后一片
  • 片偏移(Fragment Offset)
    • 占13位,每一片的长度一定是8的整数倍
    • 较长的分组在分片后,某片在原分组中的相对位置
    • 片偏移 * 8 = 字节偏移
    • ping 相关命令如下
      • -l size:发送数据报大小
      • -f:不允许分片
      • -i TTL:设置TTL 值
image-20211027160002668
  • 生存时间(Tim To Live)
    • 占8位,每个路由器在转发之前会将 TTL 减一,一旦发现TTL为0,路由器会返回错误报告
    • 根据 traceroute 命令显示的 TTL 可以看出经过了多少个路由器
image-20211027164929181
  • 协议(Protocol)
    • 占8位,表名所封装的数据是使用了什么协议
image-20211027160116613
  • 首部校验和(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值过期、目标不可达

ICMP报文格式

v2-4f259c166221946c2ef40960d360053c_r

preview

IPv6

网际协议第六版(Internet Protocol version 6)

主要是为了解决IPv4地址枯竭问题

  • IPv6位128bit,每16bit一组,共8组
  • fe80::c472:fdff:fe9d:d6e4( :: 中间省略了 3组 0000)
  • ::1是本地环回地址
首部格式
image-20211104082351911
  • 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)
image-20211104083207470

4.传输层(Transport)

传输层有两个协议:

TCP(Transmission Control Protocol)- 传输控制协议
UDP(User Datagram Protocol)- 用户数据报协议

image-20211027165715303
UDP-数据格式
image-20211027170622997
  • 首部只有8个字节

检验和

  • 检验和的计算内容 = 伪首部 + 首部 + 数据
image-20211027170941489

端口

  • UDP首部中端口号占用2字节
  • 客户端源端口是临时开启的随机端口
  • 防火墙可以设置开启/关闭某些端口
  • 常用命令
    • netstat -an:查看被占用的端口
    • netstat -anb:查看被占用的端口、占用端口的应用进程
    • telnet host port:查看是否可以访问主机的某个端口
image-20211027172645472
TCP-数据格式
image-20211027191108004
  • 数据偏移
    • 占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,表明数据以发送完毕,要求释放连接
  • 序号(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),自动重传请求

image-20211027200310168 image-20211027200450268
连续ARQ协议 + 滑动窗口协议
image-20211027200910787
  • 若有个包重传了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)

image-20211027203047300
流量控制
  • 用以控制发送方的发送速率,让接收方来得及处理
  • 原理是接收方返回的 ACK 中会包含自己的接收窗口的大小,并且利用大小来控制发送方的数据发送
  • 这是一个点对点的过程
image-2021102808293730124
拥塞控制
  • 拥塞控制是一个全局性的过程

  • 防止过多的数据注入到网络中,避免网络中的路由器或链路过载

  • MSS(Maximum Segment Size):每个段最大的数据部分大小,在连接建立时确定

  • cwnd(congestion window):拥塞窗口

  • rwnd(receive window):接收窗口

  • swnd(send window):发送窗口

    • swnd = min(cwnd, rwnd)
  • 慢开始(slow start,慢启动)

image-20211028085624145

注意上图的确认并不严谨,仅做概念演示

  • 拥塞避免(congestion avoidance)
image-20211028085932019 698840-20200617173345073-2059012831

注意第二段慢开始是旧方法,新标准见下

  • 快重传(fast restransmit)
image-20211028090801049
  • 接收方
    • 每收到一个失序的分组后就立即发出重复确认
    • 使发送方即使知道有分组没有到达
    • 而不是等待自己发送数据时才进行确认
  • 发送方
    • 只要连续收到三个重复确认(总共4个相同的确认),就应当立即重传对方尚未收到的报文段
    • 而不必等待重传计时器到期后再重传
  • 快恢复(fast recovery)
image-20211028091328296
  • 当发送方连续收到三个重复确认,就执行“乘法减小”算法,把 ssthresh(慢开始阈值) 减半
  • 与慢开始不同之处在于现在不执行慢开始算法,即 cwnd 现在不恢复到初始值,而是把 cwnd 值设置为 ss thresh 减半后的数值,然后再执行拥塞避免算法(加法增大),使拥塞窗口线程增大
image-20211028174043403
三次握手
image-20211028203012391 image-20211028201226413 image-20211028201737102 image-20211028202619110 image-20211028212049541

前两次握手的特点

  • 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攻击。
四次挥手
image-20211029090932007

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)作为发送的单位,重传的时候也是以这个单位来进行重传。理想的情况下是该长度的数据刚好不被网络层分块。

滑动窗口控制

我们上面提到的超时重传的机制存在效率低下的问题,发送一个包到发送下一个包要经过一段时间才可以。所以我们就想着能不能不用等待确认包就发送下一个数据包呢?这就提出了一个滑动窗口的概念。

img

窗口的大小就是在无需等待确认包的情况下,发送端还能发送的最大数据量。这个机制的实现就是使用了大量的缓冲区,通过对多个段进行确认应答的功能。通过下一次的确认包可以判断接收端是否已经接收到了数据,如果已经接收了就从缓冲区里面删除数据。

在窗口之外的数据就是还未发送的和对端已经收到的数据。那么发送端是怎么样判断接收端有没有接收到数据呢?或者怎么知道需要重发的数据有哪些呢?通过下面这个图就知道了。

img

如上图,接收端在没有收到自己所期望的序列号数据之前,会对之前的数据进行重复确认。发送端在收到某个应答包之后,又连续3次收到同样的应答包,则数据已经丢失了,需要重发。

拥塞控制

窗口控制解决了 两台主机之间因传送速率而可能引起的丢包问题,在一方面保证了TCP数据传送的可靠性。然而如果网络非常拥堵,此时再发送数据就会加重网络负担,那么发送的数据段很可能超过了最大生存时间也没有到达接收方,就会产生丢包问题。为此TCP引入慢启动机制,先发出少量数据,就像探路一样,先摸清当前的网络拥堵状态后,再决定按照多大的速度传送数据。

此处引入一个拥塞窗口:

发送开始时定义拥塞窗口大小为1;每次收到一个ACK应答,拥塞窗口加1;而在每次发送数据时,发送窗口取拥塞窗口与接送段接收窗口最小者。

慢启动:在启动初期以指数增长方式增长;设置一个慢启动的阈值,当以指数增长达到阈值时就停止指数增长,按照线性增长方式增加至拥塞窗口;线性增长达到网络拥塞时立即把拥塞窗口置回1,进行新一轮的“慢启动”,同时新一轮的阈值变为原来的一半。

img

5.应用层(Application)

DNS
  • 域名系统 Domain Name System
  • 将域名解析成对应的IP地址
  • DNS可以基于TCP或UDO协议,占用53端口

检索流程

  • 客户端会首先访问最近的一台DNS服务器,也就是客户端自己配置的DNS服务器
  • 所有的DNS服务器都记录了根域名服务器的IP地址
  • 上级DNS服务器记录了下一级DNS服务器的IP地址
  • 全球一共13台IPv4域名服务器
image-20211030104700498

image-20211220141907799

常用命令(Windows)

  • ipconfig /displaydns:查看DNS缓存记录
  • ipconfig /flushdns:清空DNS缓存记录
  • nslookup 域名
DHCP

动态主机配置协议(Dynamic Host Configuration Protocol)

  • 基于UDP协议,客户端是68端口,服务器是67端口
  • DHCP服务器会从IP地址池中,挑选一个IP地址“出租”给客户端一段时间,时间到期就回收它们

分配IP地址的4个阶段

image-20211030143715610
  • 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

11

② ABNF

一种格式规范

image-20211030215407525 image-20211030205945266 image-20211030215507331 image-20211030220924752
  • 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 强制刷新
image-20211104081242899

响应头字段

头字段名说明
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
      • 文件上传时必须使用这种方式
⑦ 跨域资源共享

同源策略

  • 默认情况下,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的前身
image-20211102194114631
HTTP/2

HTTP /2在底层传输做了很多的改进和优化,但在语义上完全与HTTP/1.1兼容

特性

  • 二进制格式
image-20211102194320439
  • 多路复用
    • 在此之前,降低请求次数的方式有
      • image sprites
      • 合并CSS/JS
      • 内嵌CSS/JS/Base64图片
      • 域名分片
image-20211102195642370
  • 优先级
    • 允许每个数据流都有一个关联的权重和依赖关系
  • 头部压缩
image-20211102201210895 image-20211102204140520
  • 服务器推送
    • 服务器可以对一个客户端请求发送多个响应
    • 除了对最初请求的响应,服务器还可以向客户端推送额外资源,而无需客户端主动请求

一些基本概念

  • 数据流:已建立的连接内的双向字节流,可以承载一条或多条消息
    • 所有通信都是在一个TCP连接上完成,此连接可以承载任意数量的双向数据流
  • 消息:与逻辑HTTP请求或相应消息对应,由一系列帧组成
  • 帧:HTTP/2通信的最小单元,每个帧都包含帧头(会标识出当前帧所属的数据流)
    • 来自不同数据流的帧可以交错发送,然后再根据每个帧头的数据流标识符重新组装
image-20211102195559545

存在的问题

  • 队头阻塞
    • 传输层有序传输导致
image-20211102201849854
  • 握手延迟
image-20211102202108510
HTTP/3

Google觉得HTTP/2仍然不够快,于是就有了HTTP/3

基于UDP协议的QUID协议实现

快速UDP网络连接 - QUIC(Quick UDP Internet Connections)

image-20211102202447188

如何保证可靠传输?

由QUIC协议保证

特性

  • 连接迁移
    • TCP基于四要素:源IP、源端口、目标IP、目标端口
    • 切换网络时有任意一个要素发生变化,连接就会发生变化,可能导致失败
    • QUIC连接不受以上四要素影响,因为其使用的是一组 Connection ID 来标识一个连接

存在的问题

  • 高负荷CPU使用
    • Linux 内核UDP部分没有像TCP那样优化
    • TCP和TLS有硬件加速,而UDP很罕见
  • 处在实验阶段,缺乏实际应用
⑩ HTTPDNS

HTTPDNS是基于HTTP协议向DNS服务器发送域名解析请求

  • 替代了基于DNS协议向运营商Local DNS发起解析请求的传统方式
  • 可以避免Local DNS造成的域名劫持和跨网访问问题
  • 常用在移动互联网
image-20211103142341328

使用

  • 市面上已有现成的解决方案,如阿里云、腾讯云等
  • 移动端集成相关的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通信过程
  1. TCP的3次握手
  2. TLS连接
  3. HTTP请求和响应

TLS 1.2的连接过程

image-20211224114502634 image-202111021426215222235

图中省略了一些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架构的应用中实现双向通信

image-20211103101018016
  • WebSocket 使用80(ws://)、443(wss://)端口,可以绕过大多数防火墙的限制

建立连接

image-20211103101337702 image-20211103102141946

WebService

一种跨编程语言和操作系统平台的远程调用技术标准

  • SOAP(Simple Object Access Protocol)简单对象访问协议
    • 很多时候,SOAP = HTTP + XML
    • WebService 使用 SOAP 协议来封装传递数据
image-20211103140226552
  • 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(数据端口)

  • 两种模式都需要客户端与服务器建立两个连接
    • 控制连接:用于传输状态信息
    • 数据连接:用于传输文件和目录信息
  • 主动模式
iShot2021-11-03 14.34.57
  • 被动模式
iShot2021-11-03 14.38.21
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端口

image-20211103144509875 iShot2021-11-03 14.48.04

四、网络安全

网络通信中面临的四种安全威胁

截获、中断、篡改、伪造

image-20211101144930210

网络层 - ARP欺骗

ARP欺骗(ARP spoofing),又称为ARP毒化(ARP poisoning)、ARP病毒、ARP攻击

举例说明
  1. 假设主机C是攻击者,主机A、B是被攻击者
  2. C只要收到经过A、B发送的ARP请求,就会拥有A、B的IP、MAC地址,就可以进行欺骗活动
  3. C发送一个ARP响应给B,把响应包里的源IP设为A的IP地址,源MAC设为C的MAC地址
  4. B收到ARP响应后,更新它的ARP表,把A的MAC地址(IP_A, MAC_A)改为(IP_A, MAC_C)
  5. 当B要发送数据包给A时,它根据ARP表来封装数据包的头部,将目标MAC地址设为MAC_C,而非MAC_A
  6. 当交换机收到B发送给A的数据包时,根据此包的目标MAC地址(MAC_C)而把数据包转发给C
  7. 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)

  • 根据任意长度的数据,计算出固定长度的散列值
  • 计算速度快,能快速计算出散列值
  • 不可逆,不同数据散列值不同
image-20211101155811403

常见散列函数

  • MD4、MD5
    • 产生128bit的散列值,MD就是Message Digest的缩写,目前已经不安全
  • SHA-1
    • 产生160bit的散列值,目前已经不安全
  • SHA-2
    • SHA-256、SHA-384、SHA-512,散列值长度见名知意
  • SHA-3
    • 全新标准

散列函数之应用

  1. 防止数据被篡改
image-20211101172020463
  1. 密码加密
image-20211101172448771
对称加密(Symmetric encryption)

对称密码中,加密用的密钥和解密用的密钥是相同的

image-20211101204021257

常见的对称加密算法

  • 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,成为首选对称加密算法

密钥配送问题

image-20211101205630873

有以下几种解决密钥配送的方法

  • 事先共享密钥(私下共享)
  • 密钥分配中心(Key Distribution Center,简称KDC)
  • Diffie - Hellman 密钥交换
  • 非对称加密
非对称加密(Asymmetric encryption)

在非对称加密中,密钥分为加密密钥、解密密钥两种。
公钥加密,私钥解密;私钥加密,公钥解密

image-20211101204222343
  • RSA(三位科学家姓氏首位组成)
    • 目前使用最广泛的对称加密算法
混合密码系统(Hybrid Cryptosystem)

将对称加密和非对称加密的优势相结合的方法

  • 解决了非对称加密速度慢的问题
  • 并通过非对称加密解决了对称加密的密钥配送问题
  • 网络上的密码通信所用的 SSL/TLS 都运用了混合密码系统
加密过程
image-20211101212126370
  1. 首先,消息发送者要拥有接收者的公钥
  2. 生成会话密钥,作为对称加密的密钥,加密消息
  3. 用消息接收者的公钥,加密会话密钥(对称加密的密钥)
  4. 将前两步生成的加密结果,一并发送给消息接收者
解密过程

接收方利用自己的私钥解密会话密钥(使用的是非对称算法进行解密

数字签名(Digital Signature)

在数字签名技术中,有以下两种行为

  • 生成签名
    • 由消息的发送者完成,通过“签名密钥”生成
  • 验证签名
    • 由消息的接收者完成,通过“验证密钥”验证
image-20211101214034236

数字签名技术侧重于检查数据是否被改动,而不是为了保证机密性

加密方式总结

公钥私钥
非对称加密发送者加密时使用接收者解密时使用
数字签名验证者验证签名时使用签名者生成签名时使用
  • 加密:公钥加密,私钥解密
  • 签名:私钥签名,公钥验签
证书(Certificate)

公钥合法性问题

发送者和接收者双方无法感知数据已被窃取

image-20211101215310113

全称 公钥证书(Public-key Certificate,PKC)

由认证机构(Certificate Authority,CA)施加数字签名,CA就是能够认定“公钥确实属于此人”并且能够生成数字签名的个人或组织

image-20211101220036034
  • 各大CA的公钥,默认已经内置在浏览器和操作系统之中

五、其他

RESTful

表现层状态转移(REpresentational State Transfer)

REST是一种互联网软件架构设计风格,定义了一组用于创建Web服务器的约束,符合REST架构的Web服务,称为RESTful Web服务

实践建议
  • URL中使用名次(建议复数),不使用动词
image-20211103141451847
  • 使用HTTP的方法表达动作
image-20211103141542651
  • 一个资源连接到其他资源,使用子资源的形式
image-20211103141638170
  • API版本化
image-20211103141710071
  • 返回JSON格式数据
  • 发生错误不要返回 200

VPN

虚拟私人网络(Virtual Private Network,简称VPN)

它可以在公共网络上建立专用网络,进行加密通讯

image-20211103214315046
  • 可以提高上网的安全性
  • 隐藏上网者的身份
  • 突破网站的地域限制
    • 因为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

它并不是一个规范,而只是约定俗成的,所以并不能保证网站的隐私

image-20211103221000352

无线网络

无线AP(Access Point):无线接入点

image-20211103221200034

流媒体

流媒体(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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值