网络协议与通讯

网络基础,局域网,TCP/IP,IPv4,子网掩码。

1byte = 8bit

1KB = 1024B

1MB = 1024KB

1GB = 1024MB

1TB = 1024GB

image-20241108162601865

image-20241109140830967

ss 命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# t:tcp
# u: udp
# l:listen
# n:显示端口和地址的数值形式,不进行 DNS 反向解析,以提高显示速度。
# e:estab 已建立的连接
# p:显示相关的进程信息(PID/进程名),需要 root 权限才能看到所有进程。
# a:all

ss -tln

ss -tenp

ss -tna

ss -tnulp

网络基础

作用范围分类

广域网 WAN

城域网 MAN

局域网 LAN

带宽(速度)

bps(或 b/s):bits per second(比特/秒)

Mbps:兆比特每秒

拓扑

image-20241108092838825

  • 总线拓扑

    • 由一条线缆进行连接。
    • 末端必须采用终结端。
  • 环形拓扑

    • 环的形式连接
    • “令牌”沿环移动,并在每台设备处停止。如果一 台设备希望传输数据,则会在令牌中添加数据和目标地址。
  • 单环拓扑

    • 共用一条线缆,数据单向传输
  • 双环拓扑

    • 两个环形允许双向传输数据。
  • 星形拓扑

    • 一个中央连接点,该点是集线器、交换机或路由器等设备
  • 扩展星形拓扑

    • 一组独立连接设备之外的冗余连接

      image-20241108092339066

  • 全网状拓扑

    • 成本高、难度大。
    • n(n-1)/2
  • 部分网状拓扑

    image-20241108092819573

OSI 七层结构

每一层实现各自的功能和协议,并完成与相邻层的接口通信。

每一层扮演固定的角色,互不打扰。

序号 名称 英文 协议数据单元 PDU
7 应用层 application 报文
6 表示层 presentation 报文
5 会话层 session 报文
4 传输层 transport 数据段
3 网络层 network 数据包
2 数据链路层 data link 数据帧
1 物理层 physical 比特流

image-20241108140553799

应用层

提供用户接口

应用程序之间的通信服务。

表示层

数据编码和转换:

  • 编解码
  • 加密解密
  • 压缩解压缩

以确保数据在不同系统之间的交换是有效的和安全的。

会话层

管理(建立,维护,重连,终止)应用程序之间的会话。

传输层

  • 为应用程序提供 端到端 的数据传输服务,
  • 负责数据的分段、流量控制、错误检测和纠正。

网络层

  • 负责数据包的路由和转发,

  • 逻辑地址管理。

数据链路层

  • 提供 点对点 的数据传输服务,
  • 负责将原始比特流转换为数据帧,
  • 检测传输中出现的错误。

物理层

  • 在物理媒介上传输原始比特流

  • 定义了连接主机的硬件设备和传输媒介的规范。

其他

三种通讯模式

单播

广播

组播

image-20241108140726981

冲突域和广播域

冲突域

冲突域属于 OSI 第一层:物理层

同一时间内只能有一台设备发送信息的范围。

广播域

广播域属于 OSI 第二层:数据链路层

如果站点发出一个广播信号,所有能接收收到这个信号的设备范围称为一个广播域。

单双工

image-20241108144237035

局域网 LAN

局域网是在一个局部的地理范围内(如一个学校、工厂、机关或家庭 内),将各种计算机、外部设备和数据库等互相联接起来组成的计算机通信网。

解决数据链路层和物理层之间的主机通信,通过以太网和 vlan 来实现通信。

组网设备

router:路由器

网络层 根据路由协议和转发表自动转发数据包,实现不同网络或子网之间转发数据包。

使用静态或动态路由协议来生成和维护一张路由表。 根据数据包的目标 IP 地址,将数据包从源网络转发到目标网络。 路由器可以执行 NAT,将私有网络内的 IP 地址转换为公共 IP 地址,允许多个内部设备通过单个公共 IP 地址访问互联网。

动态路由协议 动态路由器使用路由协议与其他路由器交换路由信息。常见的协议包括: RIP(路由信息协议):一种距离向量协议,基于跃点数选择路径。 OSPF(开放最短路径优先):一种链路状态协议,根据链路状态来计算最优路径,适合较大的网络。 BGP(边界网关协议):主要用于互联网骨干网中,负责在不同自治系统之间交换路由信息。

路由器具有 MAC 地址 路由通过ARP协议缓存MAC地址

功能 三层交换机 路由器
子网和 VLAN 间通信 支持 支持
局域网(LAN)适用性 非常适合 适合
广域网(WAN)连接 不适合 非常适合
安全性 基础 ACL 支持 高级防火墙和 VPN 支持
NAT 不支持 支持
动态路由协议 基本协议(OSPF、RIP) 全面支持(包括 BGP)
高级流量管理 基础 QoS 支持 详细 QoS 和流量管理功能

switch:交换机

属于数据链路层 交换式以太网协议 根据MAC地址转发数据包,实现局域网内部设备之间的快速通信。

维护了一张MAC地址表,记录端口号和主机MAC地址的对应关系,而且这个表的数据是交换机不断学习来维护各端口对应主机信息的结果。如果A没有很长时间没发消息到这个1号端口,那这条记录就会过期并被删除。 所有发到交换机的数据,都会先进入交换机的缓存区。接着消息再被转发到对应机器上。

MAC 地址的目标端口和这个包的源端口,是同一个端口,交换机会直接丢弃这个包。

MAC表内无目标地址,会转发除源端口的所有端口。目标地址接收到包后会返回响应包。交换机记录MAC。

通过 以太网2 和 vlan来实现多主机的访问隔离能力。

特性 一层交换机 二层交换机 三层交换机
更多操作工作层次 物理层(第 1 层) 数据链路层(第 2 层) 网络层(第 3 层)
转发依据 无地址转发 MAC 地址 MAC 地址 + IP 地址
冲突域 所有端口共享一个冲突域 每个端口独立冲突域 每个端口独立冲突域
广播域 所有端口共享一个广播域 所有端口共享一个广播域 可隔离广播域,实现 VLAN 间通信
路由功能 支持三层路由协议,支持跨子网通信
应用场景 简单信号中继 小型到中型局域网 中型到大型局域网,VLAN 间路由
功能 三层交换机 路由器
子网和 VLAN 间通信 支持 支持
局域网(LAN)适用性 非常适合 适合
广域网(WAN)连接 不适合 非常适合
安全性 基础 ACL 支持 高级防火墙和 VPN 支持
NAT 不支持 支持
动态路由协议 基本协议(OSPF、RIP) 全面支持(包括 BGP)
高级流量管理 基础 QoS 支持 详细 QoS 和流量管理功能

hub:集线器

1
2
3
4
5
6
工作在物理层的设备
共享式以太网协议,CSMA/CD

把数据包发送到与集线器相连的所有节点。发现数据不是给自己的, 则直接丢弃。

如果机器越来越多,每台机器发一条消息,都会被广播,整个网络就有点顶不住了。

中继器

对数据信号的重新发送或转发, 来扩大网络传输的距离。

modem:调制解调器(光猫)

用于光电信号转换的设备

以太网(Ethernet)

有线网络协议

物理层(第 1 层)和数据链路层(第 2 层) 技术

随着交换式以太网的引入,冲突减少,因为交换机为设备提供了独立的通信路径,CSMA/CD 机制逐渐被淘汰。

共享式以太网使用 CSMA/CD 协议用于集线器。

交换式以太网用于交换机。

采用带碰撞检测的载波侦听多址访问(CSMA/CD)方法进行介质访问控制。

CSMA(载波监听多路访问):在设备发送数据前,首先监听信道是否空闲,只有在没有其他设备传输的情况下,设备才开始发送数据。

CD(冲突检测):如果多个设备同时监听到信道空闲并开始发送,数据帧会在传输介质上发生冲突。以太网会检测冲突,停止发送,等待一段随机时间后重新发送。

MAC

由 48 位二进制数字组成的地址

00:0c:29:b1:f4:54

以 6 个十六进制数字

虚拟局域网 VLAN

网络分段技术

在数据帧中增加一个 VLAN 标记 字段,以便交换机可以识别和管理不同 VLAN 的数据帧。

跨 VLAN 通信要通过 三层设备(如路由器或三层交换机)来实现。

VLAN 通过配置交换机端口或 IP 地址,将局域网划分成多个独立的虚拟子网,使得不同 VLAN 的设备即便物理连接在一起,也不能直接通信,除非通过路由器或三层交换机。

端口 VLAN:也称为基于端口的 VLAN。将交换机的每个端口分配到不同的 VLAN,通过指定端口来控制 VLAN 成员。

协议 VLAN:基于网络协议(如 IP、IPX)划分的 VLAN,通常用于管理多种协议环境的网络。

MAC VLAN:基于设备 MAC 地址划分的 VLAN,可以将特定设备划分到指定 VLAN。

动态 VLAN:由网络管理员通过 VLAN 管理服务器(如 VMPS)动态分配设备到不同的 VLAN 中。

网络架构

示例

一个企业网络可能采用以下设计:

  • 核心层:两个高性能核心交换机,连接到数据中心的主干网络。
  • 汇聚层:每层楼的交换机通过汇聚交换机连接到核心层,并在此处配置 VLAN 间路由、ACL 等安全策略。
  • 接入层:每个办公室和会议室的二层交换机负责连接终端设备,并配置 VLAN,将不同部门分配到不同 VLAN 中以实现隔离。

这种三层结构可以有效提升网络的稳定性、可管理性和扩展性,适用于大中型企业的复杂网络需求。

核心层

核心层 是整个网络架构的顶层,负责提供高速的数据交换和流量转发,是整个网络的“骨干”。核心层通常由高性能的核心路由器或交换机构成,设计时应考虑最小化延迟和高吞吐量,确保网络高可用性和快速数据传输。

  • 主要功能
    • 提供高速、低延迟的数据传输。
    • 处理跨汇聚层的流量,将不同网络区域互联。
    • 确保高可靠性和冗余,避免单点故障(如通过双核心交换机实现冗余)。
  • 特性
    • 高性能和高可靠性。
    • 简化的路由设计,专注于快速数据转发。
    • 支持大容量流量的快速传输,不进行任何不必要的数据过滤或安全检查。
  • 设备:通常使用大型、模块化的三层交换机或路由器,具有高带宽、低延迟的特点。

汇聚层

汇聚层 位于核心层和接入层之间,主要负责流量聚合和策略控制,将不同的接入层网络汇聚后再与核心层连接。汇聚层是网络策略控制的主要位置,用于执行网络策略和管理功能,如路由控制、流量过滤和安全性检查等。

  • 主要功能:
    • 汇聚来自接入层的流量并转发至核心层。
    • 实现访问控制列表(ACL)、防火墙和 QoS(服务质量)等策略,确保安全性。
    • 实现 VLAN 间的路由,使不同 VLAN 之间可以进行通信。
  • 特性:
    • 控制和管理网络流量。
    • 提供基于策略的流量过滤和安全措施。
    • 支持 VLAN 间路由,实现不同网络段的流量隔离和路由。
  • 设备:通常使用三层交换机,支持高级网络策略(如 ACL、VLAN 路由等),并具备一定的冗余功能,确保高可用性。

接入层

接入层 是网络的最底层,直接与终端设备(如计算机、打印机、IP 电话、无线接入点等)相连,负责将这些终端设备连接到网络中。接入层是用户和设备接入网络的入口点,主要关注接入控制和用户管理。

  • 主要功能:
    • 提供用户和设备接入网络的途径。
    • 配置端口安全、VLAN 等,确保网络的访问控制。
    • 提供 PoE(以太网供电)功能,为无线接入点、IP 电话等设备供电。
  • 特性:
    • 设备连接点,通常是用户终端设备的直接接入层。
    • 提供 VLAN 配置和端口安全,支持基本访问控制。
    • 设备性能一般较核心层和汇聚层低,但具备灵活性和扩展性。
  • 设备:通常使用二层交换机,支持 VLAN 和端口安全管理,适用于大规模连接终端设备的环境。某些接入层设备还支持 PoE,以便为终端设备供电。

image-20241109135915085

TCP/IP 协议栈

传输层协议

传输控制协议/因特网互联协议

TCP/IP 其实是一个 Protocol Stack 协议族,包括 TCP、IP、UDP、ICMP、RIP、 TELNET、FTP、SMTP、ARP 等许多协议。

image-20241109141159786

1
准确来说数据链路层的MAC头部包括两部分LLD子层+MAC子层形成数据帧
TCP UDP
是否连接 面向连接 无连接
是否是可靠传 输 可靠传输 不可靠传输
连接目标个数 一对一 支持一对一,一对多,多对一,多对多传 输
是否有序 有序传输 无序传输
首部大小 首部最少 20 字节,最大 60 字节 首部 8 字节
传输方式 面向字节流 面向报文

TCP

TCP 是一种面向连接的、可靠的、基于字节流 的传输层通信协议。

TCP 适用于需要高可靠性、顺序性和完整性传输的应用,如网页浏览器、电子邮件客户端和文件传输工具等。

  • 面向连接:

    三次握手(Three-way Handshake)过程建立连接

  • 可靠性:

    使用序列号来确保数据的顺序性,

    使用确 认应答(ACK)来确保数据已被接收

    使用超时重传机制来处理数据丢失的问题

  • 流量控制

    滑动窗口协议(Sliding Window Protocol)来实现流量控制

  • 拥塞控制

    慢启动(Slow Start)、拥塞避免(Congestion Avoidance)、快速重传(Fast Retransmit)和快速恢复(Fast Recovery)等算法来动态调整数据传输速率。

  • 全双工通信

  • 字节流服务:

    不对数据进行分块或组装,只是简单地将数据从一端传输 到另一端。

PDU(协议数据单元,Protocol Data Unit)

  1. 源端口(Source Port)和 目标端口(Destination Port):各 16 位
  • 端口号范围为 0-65535,常见的应用端口有 HTTP(80)、HTTPS(443)等。
  1. 序列号(Sequence Number):32 位
  • 用于标识从发送端发出的数据字节流中的位置。在首次建立连接时,会随机生成初始序列号(ISN),然后随着每个数据包的发送而增加,以确保数据顺序不乱。
  1. 确认号(Acknowledgment Number):32 位
  • 表示接收端期望收到的下一个字节序列号。确认号等于接收到的数据的最后一个字节序列号加 1,用于确认数据的接收,确保传输的可靠性。
  1. 数据偏移(Data Offset):4 位
  • 表示 TCP 报文头的长度,以 32 位(4 字节)为单位。由于 TCP 头的最小长度为 20 字节,因此数据偏移的最小值为 5,最大值为 15(即 60 字节)。
  1. 保留字段(Reserved):4 位
  • 当前未使用,保留用于未来扩展,通常置 0。
  1. 控制位(Flags):9 位

    控制位用于指定报文的类型和用途,常见的标志有以下几种:

    • URG(紧急标志):表示报文中存在紧急数据。

    • ACK(确认标志):确认接收到的数据,若置 1 表示确认字段有效。

    • PSH(推送标志):要求接收端立即交付数据,应用于实时通信。

    • RST(重置标志):终止连接。

    • SYN(同步标志):用于建立连接。

    • FIN(结束标志):用于释放连接。

  2. 窗口大小(Window Size):16 位

  • 表示接收端的缓冲区剩余空间大小,用于流量控制。发送端会根据接收端的窗口大小调节数据的发送速率,以避免数据溢出。
  1. 校验和(Checksum):16 位
  • 用于检验数据在传输过程中的完整性,包括 TCP 头和数据部分。发送端在计算校验和时,会包含源地址、目标地址、协议、TCP 报文长度等内容,以便在接收端进行校验。
  1. 紧急指针(Urgent Pointer):16 位
  • 仅在 URG 标志置位时有效,表示紧急数据在报文中的偏移量,用于通知接收端在处理数据时应优先处理该紧急数据。
  1. 选项(Options):可变长度
  • TCP 报文中可以包含一些可选字段,用于设置不同的选项,例如 MSS(最大报文段长度)、窗口缩放、时间戳等。
    • MSS: MAX Segment Size
      • 定义:仅指 TCP 承载数据,不包含 TCP 头部的大小
      • 尽量每个 Segment 报文段携带更多的数据,以减少头部空间占用比率
      • 防止 IP 基于 MTU 拆分, ip 层拆分报文很低效,如果出现报文丢失,所有报文都要重传
  1. 数据(Data):可变长度
  • 这是实际传输的数据内容,数据的长度不固定,由 TCP 头的数据偏移字段和 IP 数据报的总长度来确定。

应用端口

0 到 1023 般固定分配给一些常见的服务。

HTTP 服务通常使用 80 端口,FTP 服务使用 20 和 21 端口(20 端口用于数据传输,21 端口用于命令控制),SMTP 服务使用 25 端口等。

从 1024 到 65535,由操作系统动态分配给需要网络通 信的进程。

1024-49151 端口范围:

​ 用户端口或注册端口,但要求并不严格,分配给程序注册为某应用使用,常见的有:

​ 1433/tcp(SqlServer), 1521/tcp(oracle), 3306/tcp(mysql), 11211/tcp/udp (memcached)

49152-65535 端口范围:

​ 动态或私有端口,客户端随机使用端口

1
2
# 常用服务及端口对应关系
cat /etc/services

三次握手

image-20241109180126485

SYN,ACK(确认位):报头 Flags 标志位中

seq,ack(确认号):报头中

  1. 第一次握手:SYN 标志开始连接;seq 是自身发包的序列号

    SYN = 1 的报文段不能携带数据,但要消耗一个序号

    1
    2
    3
    
    C->S:
        SYN=1
        seq=x(随机)
    
  2. 第二次握手:SYN 标志开始连接;ACK 是对方发来包的序列号,表示确认受到;seq 是自身发包的序列号;ack 是想收到包的序列号。

    1
    2
    3
    4
    5
    
    S->C:
        SYN=1
        ACK=1
        seq=y随机
        ack=x+1
    
  3. 第三次握手:

    1
    2
    3
    4
    
    C->S:
        ACK=1
        seq=x+1
        ack=y+1
    

四次挥手

image-20241109180143536

FIN,ACK(确认位):报头 Flags 标志位中

seq,ack(确认号):报头中

FIN = 1:表示不再发送数据

  1. 第一次挥手:FIN 标志开始断开

    m 为 C 前面正常发送数据的字节序号加 1

    1
    2
    3
    
    C->S:
        FIN=1
        seq=m
    
  2. 第二次挥手:ACK 确认受到断开请求,之后将可能剩余的数据包传完。

    n 为 S 前面正常发送数据的字节序号加 1

    1
    2
    3
    4
    
    S->C:
        ACK=1
        seq=n
        ack=m+1
    
  3. 第三次挥手:传完可能剩余数据包,发送 FIN 表示数据包发完,开始断开

    k 为 S 前面正常发送数据的字节序号加 1

    1
    2
    3
    4
    5
    
    S->C:
        FIN=1
        ACK=1
        seq=k
        ack=m+1
    
  4. 第四次挥手:ACK 表示收到断开请求

    1
    2
    3
    4
    5
    6
    7
    
    C->S:
         ACK=1
         seq=m+1
         ack=k+1
    
    	C等待2MSL没有收到S的重传请求则表明S收到了自己的确认
    	S没收到最后的确认会重复发送FIN
    
    • 服务端收到断开请求后才关闭连接

    MSL:TCP 报文段的最大生存时间。

三次握手少一次

防止重复的连接请求

确保双方的接收和发送能力

同步初始序列号,确保数据的有序性和完整性

四次挥手少一次

连接关闭不彻底

数据丢失

资源未及时释放。

image-20241111113204371

image-20241111190657047

有限状态机

image-20241111093815023

11 个状态

第二,三次挥手可合并位一次挥手

FIN 与 ACK 同时在第二次挥手时发送。

服务端的 FIN 和 ACK 一同发出是一种优化行为,表示服务端在确认客户端的 FIN 请求时,服务端没有待处理的数据,自己也准备好关闭连接,因而将 ACK 和 FIN 合并为一个数据包。这在 TCP 四次挥手中较为常见,有助于提高关闭连接的效率。

CLOSING 状态表示连接关闭过程中出现了一个特殊情况:双方几乎同时发起关闭请求。也就是说,客户端和服务端几乎同时发送了 FIN 包,导致双方都需要等待对方的 ACK 来完成连接关闭。

Fast Open 降低时延

image-20241112092230613

第一次握手建立连接时。服务端生成 cookie 与 SYN+ACK 一起发送给客户端。之后的建立连接只需要将 cookie 与请求发送,就会得到逍遥的数据。减少握手带来的 RTT 时延。

注意:某些网络设备或防火墙可能不支持 TFO,此外,在某些情况下,TFO 可能会引入安全隐患,因此需 要根据具体情况谨慎使用

PAWS (Protect Against Wrapped Sequence number) 防止序列号回绕:timestamp

使用 timestamp 时间戳

timestamp 也可以更加精确的 RTO(重传时间)计算

滑动窗口:流量控制

发送端:

  • 发送窗口:与接收端的接送窗口大小一样
    • 可用发送窗口:还可以发送数据的大小,发送窗口的大小 - 未确认的数据的大小
      • 可用发送窗口大小会变为返回的 ACK 中的窗口大小

接收端:

  • 接收窗口:大小与内存缓冲区有关,表示接收方在当前时刻还能接收的数据量。
    • 接收到多少缩多少
    • 处理完多少恢复多少
  • 可用缓冲区大小:ACK 报文中包含一个 窗口大小(Window Size)

Linux 中对 TCP 缓冲区的调整方式

  • net.ipv4.tcp_rmem = 4096 87380 6291456
    • 读缓存最小值,默认值,最大值,单位字节,覆盖 net.core.remem_max
  • net.ipv4.tcp_wmem = 4096 16384 4194304
    • 写缓存最小值,默认值,最大值,单位字节,覆盖 net.core.wmem_max
  • net.ipv4.tcp_mem = 1541646 2055528 3083292
    • 系统无内存压力,启动压力模式阈值,最大值,单位为页的数量
  • net.ipv4.tcp_moderate_rcvbuf = 1
    • 开启自动调整缓存模式

SWS(Silly Window syndrome)糊涂窗口综合征;场景:Server 当前非常繁忙

服务器很忙,导致没来得及处理缓冲区中接收的内容。

服务端的接收窗口会越来越少,整个网络中的效率会越来越低。

  • 解决方法:等服务器处理完再发

SWS 避免算法

  • 接收端:
    • David D Clark 算法:窗口边界移动值小于 min(MSS, 缓存/2)时,通知窗口为 0
  • 发送端:
    • Nagle 算法:TCP_NODELAY 用于关闭 Nagle 算法
      • 没有已发送未确认报文段时,立刻发送数据
      • 存在未确认报文段时,直到:没有已发送未确认报文段,或数据长度达到 MSS 时再发送

TCP delayed acknowledgment 延迟确认

没有携带数据的 ACK 使网络效率也很低

将 ACK 与要发送的数据包合并,提高效率

  • 当有响应数据要发送时,ack 会随着响应数据立即发送给对方

  • 如果没有响应数据,ack 的发送将会有一个延迟,以等待看是否有响应数据可以一起发送

  • 如果在等待发送 ack 期间,对方的第二个数据段又到达了,这时要立即发送 ack

Nagle 与 delay 合用,会导致更大的延迟

image-20241112112334501

Nagle 算法和 Delay 之间会出现问题,因为我们一开始发送一个小数据包,客户端等不到 ACK 包就不会发 送下一个包,而服务端等不到对方第二个数据段,就会有会延迟产生 如何解决 Nagle 算法下,一定会有一个小报文在网络中发送,后续的报文都在等这个小报文的 ACK,才能 继续发送,而延迟确认又会导致 ACK Delay 一定会发生

解决方案:

关闭 delayed ACK: TCP_QUICKACK (接收端)

关闭 Nagle:TCP_NODELAY`(发送端)

拥塞控制

拥塞控制是计算机网络中的一种机制,用于防止网络出现拥堵(即网络中出现过多的数据包导致性能下降或数据丢失)。

在这里插入图片描述

当输入的负载到达一定程度吞吐量不会增加,即一部分网络资源会丢失掉,网络的吞吐量维持在其所能控制的最大值,转发节点的缓存不够大这造成分组的丢失是拥塞的征兆。

慢启动(slow start)、拥塞避免(congestion avoidance)、快速重传(fast retransmit)和快速恢复(fast recovery)

Linux 下 reno 算法、vegas 算法和 cubic 算法

img

img

  • 慢启动:
    • 1开始,之后接收到确认后拥塞窗口(cwnd)扩大一倍
    • 到达ssthresh时,启动拥塞避免
  • 拥塞避免:
    • 拥塞窗口,慢慢加1
  • 超时重传:
    • ssthresh变为超时拥塞窗口时的一半
    • 重新开始慢启动
  • 快重传:
    • 收到3个重复的确认,就重传相应报文
    • 启动快恢复
  • 快速恢复
    • 快重传后,更新ssthresh为当时拥塞窗口的一半
    • 拥塞窗口也变为一半(也有变一半+3的)
    • 启动拥塞避免

UDP

UDP 是一种无连接的、不可靠的、基于报文 的传输层通信协议。

UDP 适用于对实时性要求较高、对可靠性要求不高的应用,如视频流媒体、实时通信(如 VoIP)和某些在 线游戏等。

DNS 服务,动态主机配置协议(DHCP)、简单网络管理协议 (SNMP)、物联网(IoT)设备数据传输、网络时间协议(NTP)时间信息传输以及简单文件传输协议 (TFTP)文件传输基于 UDP。

伪首部的存在仅仅是为了在计算校验和时提供一些额外的信息,以确保数据包在传输中的完整性和正确性。

伪首部是校验计算会用到,伪首部不会被加入数据包中。

PDU(协议数据单元,Protocol Data Unit)

  1. 源端口(Source Port,2 字节)
  • 表示数据报的发送端端口号。
  • 可选字段。如果发送方不需要接收回应,则可以设置为 0。
  1. 目标端口(Destination Port,2 字节)
  • 表示数据报的接收端端口号。
  • 必须包含有效端口号,指定数据报要传输的服务或应用程序。
  1. 长度(Length,2 字节)
  • 表示整个 UDP 数据报的长度,包括头部和数据部分。
  • 长度最小值为 8(即没有数据的空 UDP 报文),最大为 65535 字节。
  1. 校验和(Checksum,2 字节)
  • 校验和用于确保数据的完整性。它对 UDP 报头、数据以及伪头部信息(IP 源地址、目标地址、协议等)进行校验。
  • 校验和在 UDP 中是可选的。如果校验和为 0,表示不计算校验,但在 IPv6 中必须使用校验和。

网络层协议

IP

将数据包从源地址传送到目标地址。

PDU

image-20241111192752493

  • 标识:占 16 位,它是一个计数器, 通常,每发送一个报文,该值会加 1, 也用于数据包分片,在同一 个包的若干分片中,该值是相同的;
  • 标志(flag):占 3 位,目前只有后两位有意义, DF: Don’t Fragment 中间的一位,只有当 DF = 0 时 才允许分片,MF: More Fragment 最后一位,MF = 1 表示后面还有分片,MF = 0 表示最后一个分 片 IP PDU 报头;
  • 生存时间:占 8 位, 记为 TTL (Time To Live) 数据报文在网络中可通过的路由器数的最大值,TTL 字段 是由发送端初始设置一个 8 bit 字段,推荐的初始值由分配数字 RFC 指定, 当前值为 64,发送 ICMP 回显应答时经常把 TTL 设为最大值 255;
  • 协议:占 8 位,指出此数据报携带的数据使用何种协议以便目的主机的 IP 层将数据部分上交给哪个 处理过程,1 表示为 ICMP 协议, 2 表示为 IGMP 协议, 6 表示为 TCP 协议,17 表示为 UDP 协 议;

ICMP ping

提供网络的 错误报告状态查询

错误报告:ICMP 会在网络传输过程中检测并报告错误(例如,数据包无法送达),并将信息返回给发送方,以便发送方能够及时采取措施。

状态查询:ICMP 可以向网络设备发送状态查询消息,以检查设备是否在线、路径是否畅通等。

流量控制:在网络过载时,ICMP 可以通知发送方减慢发送速度,从而帮助优化网络资源。

诊断和调试:ICMP 可用于执行网络诊断,常见的 pingtraceroute 工具都是基于 ICMP 协议的。

ICMP 的安全风险

  1. Ping Flood(Ping 泛洪)
    • 描述:攻击者向目标主机发送大量 ICMP 回显请求(Echo Request),导致目标主机处理不过来,资源耗尽,最终拒绝服务。
    • 防御:限制每秒接收的 ICMP 请求数量,或者在防火墙中对 ICMP 流量做限制。
  2. Ping of Death(死亡之 Ping)
    • 描述:通过发送超大 ICMP 包,导致目标主机缓冲区溢出,引起系统崩溃或重启(已被现代操作系统修复)。
    • 防御:现代操作系统已防范此类攻击,一般无需额外配置。
  3. Smurf 攻击
    • 描述:攻击者向网络广播地址发送伪造源地址的 ICMP 回显请求,导致所有主机同时向目标主机发送响应数据,形成流量放大,造成网络拥堵。
    • 防御:禁止网络中的广播 ICMP 请求,配置防火墙规则屏蔽来自广播地址的请求。
  4. 信息收集与侦查
    • 描述:攻击者可以通过 ICMP 进行网络探测,收集网络拓扑、主机状态等信息,为进一步攻击做准备。
    • 防御:在防火墙中限制或禁止 ICMP 流量,尤其是禁止 ICMP 回显请求和重定向消息。

防火墙中的 ICMP 管理

为了提高网络安全性,许多防火墙会对 ICMP 流量进行管理:

  • 限制 ICMP 类型:可以允许 ping 使用的 ICMP 回显请求,但禁止 ICMP 重定向消息,防止恶意路由重定向。
  • 速率限制:对 ICMP 请求进行速率限制,以避免 Ping Flood 等泛洪攻击。
  • 过滤广播地址的 ICMP 请求:避免 Smurf 攻击。

数据链路层协议

ARP

根据 IP 地址获 取物理地址的一个协议。

ARP 的安全性问题

由于 ARP 不包含认证机制,网络攻击者可能利用 ARP 的漏洞进行攻击。常见的 ARP 攻击包括:

  1. ARP 欺骗(ARP Spoofing)
    • 攻击者向局域网中的设备发送伪造的 ARP 应答,将自己的 MAC 地址伪装成目标设备的 MAC 地址。
    • 通过 ARP 欺骗,攻击者可以将自己伪装成路由器、网关等设备,从而截获网络流量,实现中间人攻击(MITM)。
  2. ARP 洪泛(ARP Flooding)
    • 攻击者向局域网广播大量伪造的 ARP 请求或应答,占用网络带宽,并使设备的 ARP 缓存超载。
    • 通过 ARP 洪泛,攻击者可以使网络性能下降或阻塞,造成拒绝服务(DoS)攻击。
ARP 攻击的防御措施
  1. 静态 ARP 表:在网络设备上手动配置静态 ARP 表,防止恶意设备伪造 MAC 地址。虽然安全性高,但管理成本大,不适合大型网络。
  2. ARP 绑定:在一些企业级路由器和交换机中,可以将 IP 地址和 MAC 地址进行绑定,防止 ARP 欺骗。
  3. 网络隔离和 VLAN:通过 VLAN 将不同类型的设备隔离开,限制 ARP 广播的范围。
  4. ARP 检测:防火墙或入侵检测系统可以实时监控 ARP 流量,识别和阻止异常的 ARP 请求和应答。
  5. 加密协议:使用加密的通信协议(如 HTTPS)可以降低中间人攻击的风险,即便遭到 ARP 欺骗也不会泄露敏感数据。

ARP 在网络中的作用与局限

  • 局域网内解析 IP 到 MAC 的桥梁:ARP 是 IP 网络中必不可少的协议,通过 IP 到 MAC 的解析,ARP 支持数据链路层的传输。
  • 仅适用于局域网:ARP 使用广播发送请求,因此仅限于局域网内的解析;跨网段的 IP 到 MAC 转换需要通过路由或代理 ARP 实现。
  • 缺乏安全性:ARP 协议没有认证机制,容易遭受伪造攻击,因此在对安全要求高的网络中需要进行额外的防护。

进程间通信:IPC

系统信号(signal)

用于通知进程某个事件已经发生。

管道(pipe)

用于具有亲缘关系进程间的数据传递。

套接字(socket)

同一台计算机上的进程间通信,

于不同计算机之间的网络通信。

TCP/UDP

1
2
3
4
5
6
客户端:
 首先创建一个Socket对象,用于与服务器端建立连接。
 然后调用connect方法来连接服务器,
 - 并通过send方法发送数据,
 - recv方法接收数据。
 通信结束后,调用close方法来关闭连接并释放资源。
1
2
3
4
5
6
7
服务器端:
 首先创建一个Socket对象,用于监听客户端的连接请求。
 然后将Socket对象绑定到一个特定的地址和端口上,以便客户端能够连接到该地址和端口。
 接着调用listen方法来开始监听客户端的连接请求。
 一旦客户端发起连接请求,服务器端会调用accept方法来接受连接,
 并创建一个新的Socket对象用于与该客户端进行通信。
 之后,服务器端就可以通过新创建的Socket对象来接收和发送数据了。

image-20241111190816373

image-20241111190832612

文件锁(file lock)

用于进程间对共享文件的同步访问。

消息队列(message queue)

允许一个或多个进程向它写入或从中读取消息。

信号灯(semaphore,有的地方也称之为信号量)

用于进程间的同步与互斥。

IPv4,子网掩码

IPv4

ABCDE 类

  • A 类:1-126.X.X.X
    • 0 开头,表示未知地址,不能用
    • 127 开头,表示回环地址,不能用
  • B 类:128-191.X.X.X
  • C 类:192-223.X.X.X
  • D 类:224-239.X.X.X(多播)
  • E 类:略(留给科学家使用)

image-20241111193749549

image-20241111201820274

  • 公共和私有 IP 地址

    • 私有 IP 地址:不直接用于互联网,通常在局域网中使用 Alt text
    • 公共 IP 地址:互联网上设备拥有的唯一地址 Alt text
    • 公共 IP 地址世界唯一,可以通过互联网访问,私有地址不能通过互联网访问
  • 特殊地址

    • 0.0.0.0
      0.0.0.0 不是一个真正意义上的 IP 地址。它表示所有不清楚的主机和目的网络
    • 255.255.255.255
      限制广播地址。对本机来说,这个地址指本网段内(同一广播域)的所有主机
    • 224.0.0.0 到 239.255.255.255
      组播地址,224.0.0.1 特指所有主机,224.0.0.2 特指所有路由器。224.0.0.5 指 OSPF 路由器,地址多用于一些特殊的程序以及多媒体程序
    • 169.254.x.x
      如果 Windows 主机使用了 DHCP 自动分配 IP 地址,而又无法从 DHCP 服务器获取地址,系统会为主机分配这样的地址

保留地址:0,255

IPv4 地址的主机位部分全为 0 时,该地址表示的是整个网络,而不是具体的某台主机。网络地址用于标识子网。

0.0.0.0 是一个特殊的 IPv4 地址,表示“任何地址”。在路由和绑定时,0.0.0.0 通常表示本地网络上的所有 IP 地址。

主机位部分全为 1(即 255)时,该地址被用作网络的广播地址。192.168.1.0/24 网络中,192.168.1.255 是广播地址,表示向 192.168.1.0/24 网络的所有主机发送数据包。

255.255.255.255 是特殊的本地广播地址,表示向当前子网中的所有设备发送消息,不会被路由到其他网络。

子网掩码

子网掩码通过一系列连续的 1 和 0(以二进制表示)将 IP 地址分成 网络位主机位,从而确定一个 IP 地址所属的网络范围和网络内的主机数量。

1
2
3
4
5
6
示例
 IP地址 172.16.0.0
    子网掩码   	           11111111.11111111.00000000.00000000
    子网掩码十进制表示      255.255.0.0
    数字表示               16
    CIDR方式               172.16.0.0/16

是否同一网段:大小网段

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#10.0.0.100/24, 10.0.1.100/16
#上述两个IP是否在同一个网段,要分情况
#10.0.0.100/24 ----> 10.0.1.100/16 时
#10.0.0.100/24 = 10.0.0.100/255.255.255.0
#00001010.00000000.00000000.01100100 IP
#11111111.11111111.11111111.00000000 netmask
#00001010.00000000.00000000.00000000 网络ID 10.0.0.0

#此处也要和前面的netmask与运算,而不是自己的
#10.0.1.100/24 = 10.0.1.100/255.255.255.0
#00001010.00000000.00000001.01100100 IP
#11111111.11111111.11111111.00000000 netmask
#00001010.00000000.00000001.00000000 网络ID 10.0.1.0

#结论:10.0.0.0 != 10.0.1.0,所以两者不在同一个网段
#10.0.1.100/16 ----> 10.0.0.100/24 时
#结论,不用算,是同一个网段

#IP A与IP B通信时,都是用IP A的netmask去算IP B的netmask,因为在通信前,IP A不知道IP B的netmask值,只能用自己IP与运算

image-20241111153250768

子网掩码的计算

计算子网数量和主机数量

  • $$ 子网数量 = 2^{\text{子网位数}} $$
  • $$ 主机数量 = 2^{\text{主机位数}} - 2 $$

    (减去 2 是因为每个子网的第一个地址是网络地址,最后一个地址是广播地址)

计算子网地址范围

要计算一个子网的范围,可以将网络地址和广播地址作为起始和结束。以 192.168.1.0/24 为例:

  • 网络地址:192.168.1.0
  • 广播地址:192.168.1.255
  • 可用地址范围:192.168.1.1192.168.1.254