网络原理-TCP/IP

news2025/4/14 20:52:42

网络原理学习笔记:TCP/IP 核心概念

本文是我在学习网络原理时整理的笔记,主要涵盖传输层、网络层和数据链路层的核心协议和概念,特别是 TCP, UDP, IP, 和以太网。

一、传输层 (Transport Layer)

传输层负责提供端到端(进程到进程)的数据传输服务。它建立在网络层之上,为应用层提供通信支持。主要协议有 UDP 和 TCP。

1.1 UDP协议 (User Datagram Protocol)

UDP 是一种简单的、面向数据报的传输层协议。

UDP 报文段格式 (UDP Segment Format):

UDP Segment Format

  • 16位源端口号 (Source Port): 标识发送方进程。
  • 16位目的端口号 (Destination Port): 标识接收方进程。
  • 16位UDP长度 (Length): 表示整个UDP报文段(UDP首部+UDP数据)的总长度(字节),最大为 65535 字节 (理论值,实际受 IP 层限制约为 64KB)。
  • 16位检验和 (Checksum): 用于检测 UDP 报文段(首部和数据)在传输中是否出错。如果出错,报文将直接被丢弃。此字段在 IPv4 中可选,但在 IPv6 中是强制的。

UDP的特点:

  • 无连接 (Connectionless): 发送数据前无需建立连接。只需知道对方的 IP 和端口号即可发送数据报。
  • 不可靠 (Unreliable): 不保证数据报一定到达,不保证顺序,不保证不重复。没有确认机制,没有重传机制。如果因网络问题无法将报文传输给对方,UDP 不会向应用层返回任何错误信息。
  • 面向数据报 (Datagram-Oriented): 应用层交给 UDP 多长的报文,UDP 就照样发送,即一次发送一个报文。接收方也一次接收一个完整的报文。它保留了消息的边界,不会发生粘包问题,但可能丢包或乱序。
  • 开销小,效率高: 头部只有 8 字节,协议处理简单快速。

1.2 TCP协议 (Transmission Control Protocol)

TCP 的全称为传输控制协议,是一种面向连接的、可靠的、基于字节流的传输层协议。它旨在对数据的传输进行精确控制,确保数据可靠、有序地到达。

TCP 报文段格式 (TCP Segment Format):

TCP Segment Format

  • 源/目的端口号 (Source/Destination Port): 各 16 位,表示数据从哪个进程来,要到哪个进程去。
  • 32位序号 (Sequence Number - seq): 由发送方填充,表示本报文段所发送数据的第一个字节在整个数据流中的字节编号
  • 32位确认序号 (Acknowledgement Number - ack): 由接收方填充,表示期望收到对方下一个报文段数据的第一个字节的序号。也就是说,序号 ack-1 为止的所有数据都已成功接收。仅当 ACK 标志位为 1 时有效。
  • 4位首部长度 (Header Length / Data Offset): 表示 TCP 首部有多少个 32位字(即多少个 4 字节)。乘以 4 即可得到首部的字节长度。最小值为 5 (20 字节),最大值为 15 (60 字节)。无选项时为 20 字节。
  • 6位保留 (Reserved): 保留给以后使用,当前必须置为 0。
  • 6位标志位 (Flags):
    • URG: 紧急指针(Urgent Pointer)有效。指示报文中有紧急数据,应优先处理。
    • ACK: 确认序号(Acknowledgement Number)字段有效。建立连接后,所有传送的报文段都必须将 ACK 置为 1。
    • PSH: 推送(Push)功能。接收方接到 PSH=1 的报文时,应尽快将数据交付给应用层,而不是等待缓冲区填满。
    • RST: 重置连接(Reset)。用于异常中断连接(如连接请求到不存在的端口、连接异常)。
    • SYN: 同步序号(Synchronize)。用于发起连接请求。SYN=1, ACK=0 表示连接请求;SYN=1, ACK=1 表示同意连接。
    • FIN: 结束连接(Finish)。表示发送方数据已发送完毕,请求断开连接。
  • 16位窗口大小 (Window Size): 用于流量控制。表示接收方当前可用的接收缓冲区的大小(单位是字节)。告知发送方还能发送多少数据。
  • 16位检验和 (Checksum): 用于差错检测。覆盖 TCP 首部和数据部分。发送方计算并填充,接收方验证。
  • 16位紧急指针 (Urgent Pointer): 只有当 URG 标志位为 1 时,该字段才有效。它是一个偏移量,指出紧急数据在数据部分的结束位置。
  • 选项 (Options): 长度可变,最大为 40 字节。用于协商 MSS (Maximum Segment Size)、窗口扩大因子、时间戳等。
  • 数据 (Data / Payload): 有效载荷,包含应用层的数据。长度可变。

1.2.1 TCP 核心机制

TCP 通过多种机制来保证可靠性和效率:

  • 1. 确认应答 (Acknowledgement - 可靠性):

    • 目的: 保证数据的可靠传输,发送方需要知道接收方是否成功收到了数据。
    • 机制: 发送方发送数据(携带 seq),接收方收到后回复一个 ACK 报文(携带 ack),ack 值为 seq + 数据长度,表示期望收到的下一个字节序号。
  • 2. 超时重传 (Timeout Retransmission - 可靠性):

    • 目的: 处理数据包或确认包在网络中丢失的情况。
    • 机制:
      • 发送丢包: 发送方发送数据后启动一个计时器。如果在计时器到期前未收到对应的 ACK,则认为数据包丢失,重新发送该数据包。
      • 应答丢包: 接收方发送了 ACK,但在网络中丢失。发送方未收到 ACK,同样会触发超时重传。接收方收到重复的数据包时,根据序号可以识别并丢弃。
    • 超时时间: TCP 动态计算 RTO (Retransmission Timeout),基于 RTT (Round-Trip Time) 的测量。
    • 快速重传: 作为优化,如果发送方收到三个或以上的重复 ACK(指示同一个丢失的包),它会不等超时计时器到期就立即重传该数据包。
  • 3. 连接管理 (Connection Management - 可靠性):

    • 目的: 安全地建立和终止 TCP 连接,确保双方都准备好收发数据,并且所有数据都传输完毕。
    • 三次握手 (Three-Way Handshake - 建立连接):
      1. 客户端 -> 服务器: 发送 SYN 包 (标志位 SYN=1, seq=x) 请求建立连接。客户端进入 SYN_SENT 状态。
      2. 服务器 -> 客户端: 收到请求后,如果同意连接,则回复 SYN-ACK 包 (标志位 SYN=1, ACK=1, seq=y, ack=x+1)。服务器进入 SYN_RCVD 状态。
      3. 客户端 -> 服务器: 收到 SYN-ACK 包后,回复 ACK 包 (标志位 ACK=1, seq=x+1, ack=y+1)。客户端进入 ESTABLISHED 状态。服务器收到此 ACK 后也进入 ESTABLISHED 状态。连接建立完成。
      • 目的: 确认双方的发送和接收能力都正常。
    • 四次挥手 (Four-Way Handshake - 断开连接):
      1. 主动方 -> 被动方: 数据发送完毕后,发送 FIN 包 (标志位 FIN=1, seq=u) 请求关闭连接。主动方进入 FIN_WAIT_1 状态。
      2. 被动方 -> 主动方: 收到 FIN 后,回复 ACK 包 (标志位 ACK=1, ack=u+1, seq=v)。被动方进入 CLOSE_WAIT 状态。主动方收到此 ACK 后进入 FIN_WAIT_2 状态。(此时被动方可能还有数据要发送)
      3. 被动方 -> 主动方: 当被动方也准备好关闭连接(应用层调用 close),发送 FIN 包 (标志位 FIN=1, ACK=1, seq=w, ack=u+1)。被动方进入 LAST_ACK 状态。
      4. 主动方 -> 被动方: 收到被动方的 FIN 后,回复 ACK 包 (标志位 ACK=1, seq=u+1, ack=w+1)。主动方进入 TIME_WAIT 状态(等待 2*MSL 时间,确保最后的 ACK 到达对方)。被动方收到此 ACK 后进入 CLOSED 状态。主动方等待 TIME_WAIT 结束后也进入 CLOSED 状态。连接断开。
      • 目的: 确保双方数据都传输完毕,并各自确认连接关闭。
  • 4. 滑动窗口 (Sliding Window - 效率):

    • 目的: 提高传输效率,允许发送方在收到一个 ACK 之前连续发送多个报文段。
    • 机制:
      • 发送窗口: 发送方维护一个窗口,表示当前允许发送但尚未收到确认的数据范围。收到 ACK 后,窗口向前滑动。
      • 接收窗口: 接收方根据自己的缓冲区大小,通过 TCP 头部的 窗口大小 (Window Size) 字段告知发送方自己还能接收多少数据。
    • 窗口大小限制了在途(未确认)的数据量。
  • 5. 流量控制 (Flow Control - 效率/可靠性):

    • 目的: 防止发送方发送数据太快,导致接收方缓冲区溢出而处理不过来。
    • 机制: 接收方通过 TCP 头部的 16位窗口大小 (Window Size) 字段,告知发送方自己当前可用的接收缓冲区大小。发送方根据这个值动态调整自己的发送速率,确保发送的数据量不超过接收方的处理能力。如果窗口大小为 0,发送方暂停发送数据(除了探测报文)。
  • 6. 拥塞控制 (Congestion Control - 可靠性/效率):

    • 目的: 防止过多数据注入网络导致网络拥塞(路由器过载、丢包率增加),维护网络稳定性。
    • 机制: TCP 通过感知网络拥塞状况(如丢包、超时)来动态调整拥塞窗口 (cwnd) 的大小,从而控制发送速率。与流量控制(点对点)不同,拥塞控制是全局性的考量。主要算法包括:慢启动 (Slow Start)、拥塞避免 (Congestion Avoidance)、快速重传 (Fast Retransmit)、快速恢复 (Fast Recovery)。
  • 7. 延迟应答 (Delayed ACK - 效率):

    • 目的: 减少网络中纯 ACK 包的数量,降低协议开销。
    • 机制: TCP 接收方收到数据后,不立即发送 ACK,而是稍等片刻(比如 200ms 或等待有数据要发回时)。如果这段时间内有数据要发给对方,就可以将 ACK 捎带在数据包中一起发送。
  • 8. 捎带应答 (Piggybacking - 效率):

    • 目的: 提高传输效率,将数据回复和确认应答合并在一个 TCP 报文段中发送。
    • 机制: 当接收方既要发送确认 ACK,又有数据要发送给对方时,将 ACK 信息搭载在包含数据的 TCP 报文段中一起发送,而不是单独发送一个 ACK 包。
  • 9. 面向字节流 (Byte Stream - 特性):

    • 概念: TCP 为上层应用层提供的是一个无边界的、有序的字节流服务。TCP 不关心应用层发送的消息的边界。发送方写入多少次、每次写多少字节,与接收方读取多少次、每次读多少字节没有必然联系。
  • 10. 粘包问题 (Sticky Packets - 应用层问题):

    • 现象: 由于 TCP 是面向字节流的,接收方从缓冲区读取数据时,可能一次读到了多个应用层消息(粘在一起),或者一个消息的一部分。这被称为“粘包”或“半包”问题。
    • 原因: 这是 TCP 字节流特性在应用层数据处理上的体现,并非 TCP 协议本身的错误。
    • 解决方案 (应用层): 需要应用层协议自行解决。常见方法有:
      • 使用固定长度的消息。
      • 在消息之间使用特殊的分隔符(如 \r\n)。
      • 在每个消息头部添加一个字段来表示该消息的长度。
  • 11. 异常情况处理 (Exception Handling):

    • TCP 设计了处理各种网络异常情况的机制:
      • 丢包 (Packet Loss): 通过超时重传快速重传机制恢复。
      • 包损坏 (Packet Corruption): 通过 16位检验和 (Checksum) 检测。损坏的包会被接收方丢弃,发送方通过超时重传或快速重传机制恢复。
      • 失序包 (Out-of-Order Packets): 通过 32位序号 (Sequence Number) 识别。接收方会缓存失序的包,等待中间缺失的包到达后,按序重新组装并交给应用层。
      • 重复包 (Duplicate Packets): 通过 序号 识别并直接丢弃。
      • 连接重置 (Connection Reset): 如果收到一个指向不存在的连接的报文段,或发生严重错误,TCP 会发送一个带有 RST 标志位的报文段,强制中断连接。在 Java 等应用中,这可能表现为 SocketException: Connection reset
      • 半打开连接 (Half-Open Connection): 一方异常崩溃(如宕机),另一方不知情。当存活方尝试发送数据时,会因为收不到 ACK 而超时,或者如果崩溃方恢复并收到旧连接的数据,可能会回复 RST

1.3 TCP 和 UDP 的对比

特性TCP (Transmission Control Protocol)UDP (User Datagram Protocol)
连接性面向连接 (Connection-Oriented)无连接 (Connectionless)
可靠性可靠传输不可靠 (尽力而为 - Best Effort)
传输单元字节流 (Byte Stream)数据报 (Datagram)
头部开销较大 (至少 20 字节)小 (固定 8 字节)
传输效率相对较低 (因确认、重传等机制)相对较高
流量控制有 (滑动窗口)
拥塞控制
应用场景文件传输 (HTTP, FTP), 邮件 (SMTP), 远程登录 (Telnet, SSH) 等要求高可靠性的场景实时音视频传输 (RTP), DNS 查询, SNMP, 直播, 游戏等对实时性要求高、能容忍少量丢包的场景, 以及广播/多播
应用层问题可能出现粘包问题 (需应用层解决)可能出现丢包、乱序 (需应用层处理)

总结: TCP 和 UDP 没有绝对的优劣之分。它们是程序员可以根据具体应用场景和需求选择的工具。需要可靠性时选 TCP,需要速度和实时性或广播时选 UDP。

二、网络层 (Network Layer)

网络层位于传输层之下,数据链路层之上。

  • 核心功能: 实现数据包(Packet/Datagram)在不同网络之间的路由和转发。它负责将数据从源主机传送到目的主机,即使它们位于不同的网络(局域网)中。
  • 关键任务:
    • 逻辑寻址 (Logical Addressing): 使用 IP 地址 (IP Address) 来唯一标识网络中的主机和设备。
    • 路由 (Routing): 根据目的 IP 地址,查找路由表,决定数据包的下一跳转发路径。路由器 (Router) 是执行此功能的关键设备。
    • 转发 (Forwarding): 将数据包从路由器的输入端口移动到合适的输出端口。

2.1 IP 协议 (Internet Protocol)

IP 协议是网络层的核心协议,是 TCP/IP 协议栈的基石。目前主要有两个版本:IPv4 和 IPv6。这里主要讨论更常用的 IPv4。

  • 特点:
    • 无连接 (Connectionless): 发送 IP 数据报前不需要建立连接。每个数据报都独立寻址和路由,可能走不同的路径到达目的地。
    • 不可靠 / “尽力而为” (Best Effort Delivery): IP 协议不保证数据报一定能到达目的地,不保证按序到达,也不保证数据报在传输过程中不损坏、不丢失或不重复。可靠性由上层协议(如 TCP)负责。

2.1.1 基本概念 (Basic Concepts)

  • IP 地址 (IP Address): 一个 32 位(IPv4)或 128 位(IPv6)的数字标识符,用于在网络中唯一标记一台主机或网络接口。IPv4 地址通常写成点分十进制形式(如 192.168.1.1)。
  • 数据报/包 (Datagram/Packet): 网络层传输数据的基本单元,包含 IP 头部 (Header) 和数据载荷 (Payload)。载荷通常是来自上层(如 TCP 或 UDP)的报文段。
  • 路由 (Routing): 路由器根据其内部维护的路由表 (Routing Table),查找 IP 数据报中的目的 IP 地址,决定将该数据报转发给哪个下一跳 (Next Hop) 路由器或直接发送给目标主机(如果目标在本地网络)。
  • 分片与重组 (Fragmentation & Reassembly): 当一个 IP 数据报的大小超过了下一跳链路的最大传输单元 (Maximum Transmission Unit - MTU) 时,发送方(或中间路由器,仅限 IPv4)可以将其分割成多个更小的片段(分片)进行传输。每个分片都有自己的 IP 头部。目标主机的 IP 层负责将接收到的所有分片根据标识信息重新组装成原始的数据报。

2.1.2 IP 协议头格式 (IPv4 Header Format)

IPv4 数据报由头部和数据部分组成。头部通常为 20 字节(无选项字段时),包含以下关键信息:

  • 版本 (Version): 4 位。指明 IP 协议版本,IPv4 为 4。
  • 首部长度 (IHL - Internet Header Length): 4 位。表示 IP 头部有多少个 32位字(4字节)。最小值为 5(即 20 字节),最大为 15(60 字节)。
  • 服务类型 (Type of Service - TOS / Differentiated Services - DS): 8 位。用于指示期望的服务质量(如低延迟、高吞吐量)。现多被 DSCP/ECN 字段使用。
  • 总长度 (Total Length): 16 位。整个 IP 数据报(头部+数据)的总字节数。最大为 65535 字节。
  • 标识 (Identification): 16 位。唯一标识一个数据报。当数据报被分片时,所有分片具有相同的标识号,用于重组。
  • 标志 (Flags): 3 位。
    • 第 0 位:保留,必须为 0。
    • 第 1 位:DF (Don’t Fragment) - DF=1 表示禁止分片;DF=0 允许分片。
    • 第 2 位:MF (More Fragments) - MF=1 表示后面还有分片;MF=0 表示这是最后一个分片(或未分片)。
  • 片偏移 (Fragment Offset): 13 位。表示该分片的数据部分相对于原始数据报数据部分的偏移量(以 8 字节为单位)。第一个分片的偏移量为 0。
  • 生存时间 (Time To Live - TTL): 8 位。数据报在网络中允许经过的最大路由器跳数。每经过一个路由器,TTL 值减 1。当 TTL 减到 0 时,数据报被丢弃,并通常会向源主机发送一个 ICMP 超时消息。防止数据包在网络中无限循环。
  • 协议 (Protocol): 8 位。指示 IP 包数据部分承载的是哪个上层协议。常用值:1 (ICMP), 6 (TCP), 17 (UDP)。
  • 首部检验和 (Header Checksum): 16 位。用于校验 IP 头部的完整性(注意:仅校验头部,不校验数据部分)。每经过一个路由器,由于 TTL 等字段会改变,需要重新计算校验和。
  • 源 IP 地址 (Source IP Address): 32 位。发送方主机的 IP 地址。
  • 目的 IP 地址 (Destination IP Address): 32 位。接收方主机的 IP 地址。
  • 选项 (Options): 可变长度 (0 到 40 字节)。用于扩展功能,如记录路由、时间戳等。实际中较少使用,且会增加处理开销。
  • 填充 (Padding): 如果选项字段存在且长度不是 4 字节的整数倍,则添加 0 比特进行填充,以确保 IP 头部总长度是 4 字节的整数倍。

2.2 地址管理 (Address Management)

如何有效地分配、组织和使用 IP 地址。

2.2.1 网段划分 (Subnetting)

  • 目的: 将一个大的 IP 网络(如 ISP 分配的地址块)划分成多个更小的、逻辑上独立的子网络(Subnet)。这有助于:
    • 网络管理: 更方便地管理不同部门或区域的网络。
    • 提高效率: 限制广播域,减少网络流量。
    • 增强安全性: 在子网间设置访问控制。
  • 机制: 通过子网掩码 (Subnet Mask) 来实现。子网掩码是一个 32 位的值,结构与 IP 地址类似,用于区分 IP 地址中的网络部分主机部分
    • 将 IP 地址和子网掩码进行按位与 (AND) 运算,可以得到该 IP 地址所在的网络地址 (Network Address)
    • 子网掩码中,值为 1 的位对应 IP 地址的网络部分,值为 0 的位对应 IP 地址的主机部分。
  • 示例:
    • IP 地址: 192.168.1.100
    • 子网掩码: 255.255.255.0 (二进制 11111111.11111111.11111111.00000000)
    • 网络地址 = 192.168.1.100 AND 255.255.255.0 = 192.168.1.0
    • 在这个例子中,前 24 位 (192.168.1) 是网络部分,后 8 位是主机部分。
    • 该子网可容纳的主机数 = 2^(主机位数) - 2 = 2^8 - 2 = 254 台。(减去全 0 的网络地址和全 1 的广播地址)。
  • CIDR (Classless Inter-Domain Routing - 无类别域间路由):
    • 使用更灵活的表示法:在 IP 地址后面加上 / 和网络部分的位数(即子网掩码中 1 的个数)。
    • 例如,192.168.1.0/24 表示网络部分是前 24 位,等同于子网掩码 255.255.255.0
    • CIDR 取代了过去 A/B/C 类地址的划分方式,使得 IP 地址分配更加高效。

2.2.2 特殊的 IP 地址 (Special IP Addresses)

这些地址具有特殊含义,不能分配给普通主机接口:

  • 网络地址 (Network Address): 主机部分全为 0 的地址(如 192.168.1.0/24)。它代表整个子网,不能分配给单个主机。
  • 广播地址 (Broadcast Address): 主机部分全为 1 的地址(如 192.168.1.255/24)。向该地址发送数据包,会到达该子网内的所有主机。
  • 回环地址 (Loopback Address): 127.0.0.1 是最常用的回环地址,整个 127.0.0.0/8 网段都属于回环地址范围。它代表本机。发送到回环地址的数据包会直接被本机的 IP 栈接收,常用于网络软件测试或本地进程间通信。域名 localhost 通常解析为此地址。
  • 全零地址 (Zero Address): 0.0.0.0。通常表示 “任意” 或 “未知” 地址。
    • 在服务器绑定监听时,0.0.0.0 表示监听本机所有可用的网络接口。
    • 在 DHCP 客户端请求 IP 地址的初始阶段,源 IP 地址可能使用 0.0.0.0
  • 受限广播地址 (Limited Broadcast Address): 255.255.255.255。发往此地址的数据包只会广播到发送者所在的物理网段 (广播域)不会被路由器转发到其他网络。

2.2.3 IP 地址的数量限制 (IP Address Quantity Limits)

  • IPv4: 使用 32 位地址,理论上最多有 2^32 ≈ 43 亿个地址。然而,由于地址分配方式、保留的特殊地址段(如私有地址、回环地址)、网络和广播地址的开销等原因,可用的全球唯一(公网)地址远少于此数,并且已基本耗尽。
  • IPv6: 使用 128 位地址,提供 2^128 ≈ 3.4 x 10^38 个地址。这是一个极其庞大的数字,足以满足可预见的未来全球所有设备和应用的需求,是解决 IPv4 地址耗尽问题的根本方案。

2.2.4 私有 IP 地址和公网 IP 地址 (Private and Public IP Addresses)

为了缓解 IPv4 地址耗尽问题,并允许组织内部网络使用 IP 地址而无需向互联网管理机构申请,RFC 1918 定义了以下三段私有 IP 地址 (Private IP Addresses)

  • 范围 1: 10.0.0.0 - 10.255.255.255 (CIDR: 10.0.0.0/8)
  • 范围 2: 172.16.0.0 - 172.31.255.255 (CIDR: 172.16.0.0/12)
  • 范围 3: 192.168.0.0 - 192.168.255.255 (CIDR: 192.168.0.0/16)

特点:

  • 私有地址: 可以在任何组织内部(如家庭、学校、公司局域网)自由使用和重复使用,无需注册。这些地址不能在公共互联网 (Internet) 上进行路由
  • 公网 IP 地址 (Public IP Addresses): 指除了私有地址、特殊地址(回环、广播等)之外的所有 IP 地址。这些地址需要向互联网注册机构(通常通过 ISP)申请获得,是全球唯一的,可以在互联网上直接访问。

NAT (Network Address Translation - 网络地址转换):

  • 目的: 允许使用私有 IP 地址的内部网络设备能够访问公共互联网。
  • 机制: 通常在连接内部网络和外部互联网的路由器(NAT 网关)上实现。当内部主机(使用私有 IP)访问外部服务器(使用公网 IP)时,NAT 网关将数据包的源 IP 地址私有 IP 替换为网关的公网 IP(通常还需要转换端口号,称为 NAPT 或 PAT)。当外部服务器的响应返回到网关时,网关再根据记录将目的 IP 地址公网 IP 换回原来的私有 IP,并将数据包转发给内部主机。
  • 优点: 极大地节约了 IPv4 公网地址;提供了一定程度的内部网络安全(内部主机不易被外部直接访问)。
  • 缺点: 破坏了端到端的地址透明性;某些依赖端到端连接的应用(如一些 P2P 应用、VoIP)可能需要特殊处理(如 NAT 穿透)。

三、数据链路层 (Data Link Layer)

数据链路层位于物理层之上,网络层之下。

  • 主要作用: 负责在同一个局域网 (LAN) 内的相邻节点之间,或者在两个直接相连的节点之间(点对点链路),可靠地传输数据帧 (Frame)。它处理的是节点到节点 (Node-to-Node / Hop-to-Hop) 的通信。
  • 核心功能:
    • 组帧 (Framing): 将网络层递交下来的数据包(如 IP 数据报)封装成帧,添加数据链路层特定的头部 (Header)尾部 (Trailer) 信息。
    • 物理寻址 (Physical Addressing): 使用 MAC 地址 (Media Access Control Address) 来标识源和目的设备的网络接口卡 (NIC)。
    • 流量控制 (Flow Control): (在某些链路类型上)控制发送速率,防止快的发送方淹没慢的接收方。
    • 差错控制 (Error Control): 检测(有时也纠正)在物理线路上传输时可能发生的比特错误。通常通过在帧尾部添加帧检验序列 (Frame Check Sequence - FCS) 来实现检测(如 CRC 校验)。出错的帧通常会被丢弃。
    • 介质访问控制 (Media Access Control - MAC): 当多个设备共享同一个传输介质时(如早期的总线型以太网或现在的 Wi-Fi 无线网络),需要一套规则来协调谁可以在何时使用介质发送数据,以避免或解决冲突。常见协议有 CSMA/CD (用于传统以太网) 和 CSMA/CA (用于 Wi-Fi)。

3.1 认识以太网 (Understanding Ethernet)

  • 定义: 以太网(Ethernet)是目前应用最广泛的一种局域网 (LAN) 技术标准(IEEE 802.3 系列标准)。它定义了物理层(如线缆类型、接口、信号编码)和数据链路层(如帧格式、MAC 地址、访问控制方法)的规范。
  • 特点: 技术成熟、成本低廉、速率多样(从 10 Mbps 到 10 Gbps、40 Gbps、100 Gbps 甚至更高)、易于部署和管理。
  • 演进:
    • 早期: 使用同轴电缆的总线型结构或集线器 (Hub) 连接,所有设备共享带宽,采用 CSMA/CD 协议避免冲突,工作在半双工模式。
    • 现代: 普遍使用交换机 (Switch) 连接设备(通常使用双绞线或光纤)。每个设备连接到交换机的一个独立端口,交换机基于 MAC 地址进行帧转发。这使得设备通常可以工作在全双工模式(同时收发数据),冲突域被大大缩小(每个端口一个冲突域),极大地提高了网络性能和效率。

3.1.1 以太网帧格式 (Ethernet Frame Format)

以太网传输的基本数据单元是帧 (Frame)。最常用的是 Ethernet II (也称 DIX Ethernet V2) 帧格式:

字段大小 (Bytes)描述
目的 MAC 地址6接收方网络接口卡 (NIC) 的物理地址。可以是单播、多播或广播地址。
源 MAC 地址6发送方网络接口卡 (NIC) 的物理地址。
类型 (Type)2指示帧的数据部分(Payload)承载的是哪种上层协议(网络层协议)。例如:0x0800 表示 IPv4,0x0806 表示 ARP,0x86DD 表示 IPv6。
数据 (Data Payload)46 - 1500包含来自上层(网络层)的数据,如 IP 数据报。如果上层数据不足 46 字节,数据链路层会进行填充 (Padding) 以满足最小帧长要求 (64 字节,不含前导码)。
帧检验序列 (FCS)4对整个帧(从目的 MAC 地址到数据部分结束)进行 CRC (Cyclic Redundancy Check) 循环冗余校验。接收方用它来检测帧在传输过程中是否出现比特错误。

注意:

  • 最小/最大帧长: 以太网帧(从目的 MAC 到 FCS)的最小长度为 64 字节,最大长度为 1518 字节。
  • 前导码 (Preamble) & 帧起始定界符 (SFD): 在物理传输时,每个以太网帧前面还有 7 字节的前导码(用于时钟同步)和 1 字节的帧起始定界符 (Start Frame Delimiter)(标记帧的开始)。这两个字段共 8 字节,有时不计入帧的正式长度。
  • IEEE 802.3 格式: 还有一种稍有不同的 IEEE 802.3 格式,它使用相同的 2 字节字段来表示长度 (Length)(如果值 ≤ 1500 或 1536,取决于具体标准),而不是类型。需要配合 LLC 子层来标识上层协议。现代网络中,Ethernet II 格式更为普遍。

3.1.2 认识 MAC 地址 (Understanding MAC Address)

  • 定义: MAC 地址(Media Access Control Address),也称为物理地址 (Physical Address)硬件地址 (Hardware Address)。它是在网络设备(主要是网卡 NIC)出厂时就被烧录在硬件中的一个唯一标识符
  • 格式: 一个 48 位 (6 字节) 的二进制数。通常表示为 12 位的十六进制数,并用冒号 (:)、破折号 (-) 或点 (.) 分隔开,每 2 位十六进制数为一组(代表 1 字节)。
    • 示例: 08:00:27:7D:99:A508-00-27-7D-99-A50800.277D.99A5
  • 唯一性: 由 IEEE(电气和电子工程师协会)负责管理和分配。
    • 前 3 个字节(24 位)是组织唯一标识符 (Organizationally Unique Identifier - OUI),由 IEEE 分配给硬件制造商。
    • 后 3 个字节(24 位)由制造商自行分配,确保在其生产的设备中唯一。
    • 理论上,全球每个网络接口的 MAC 地址都是唯一的(尽管可以通过软件手段临时修改或伪造)。
  • 作用域: MAC 地址主要用于本地局域网 (LAN) 内部的通信。它用于标识同一广播域内的具体设备接口。当数据包需要跨越路由器到达另一个网络时,源和目的 MAC 地址会逐跳改变

3.2 对比理解 MAC 地址和 IP 地址 (Comparing MAC Address and IP Address)

理解 MAC 地址和 IP 地址的区别与联系对于掌握网络通信至关重要。它们在 TCP/IP 协议栈的不同层级工作,共同完成数据从源到目的的传输。

特性MAC 地址 (物理地址)IP 地址 (逻辑地址)
层级数据链路层 (Layer 2)网络层 (Layer 3)
用途本地网络 (同一广播域) 内唯一标识一个网络接口卡 (NIC)整个互联网或跨网络环境中唯一标识一台主机或路由器接口
作用范围本地局域网 (LAN)不跨越路由器全局 (公网 IP) 或 跨网络 (私网 IP 需经 NAT)
地址类型硬件地址 (通常固化在网卡 ROM 中)逻辑地址 (软件配置,可手动设置或通过 DHCP 动态获取)
格式48 位,通常表示为 6 字节十六进制数32 位 (IPv4) 或 128 位 (IPv6),通常表示为点分十进制等
分配/管理IEEE 分配 OUI 给制造商,制造商分配后半部分IANA/RIR/ISP 分配公网地址段,网络管理员分配内部地址
变化性通常固定不变 (与硬件绑定),但可被软件修改/伪造可以改变 (主机移动到不同网络时,IP 地址通常会改变)
谁主要使用交换机 (Switch) - 根据目的 MAC 地址在本地 LAN 内转发帧路由器 (Router) - 根据目的 IP 地址在不同网络间转发数据包
数据传输中逐跳改变 (Hop-by-Hop) - 每经过一个路由器,源/目的 MAC 地址都会更新为当前跳发送者和接收者的 MAC 地址端到端不变 (End-to-End) - 源 IP 和目的 IP 地址在整个传输过程中通常保持不变 (NAT 除外)

简单类比:

  • IP 地址 就像你的 家庭住址(例如:XX 市 XX 区 XX 路 XX 号)。这个地址用于跨城市、跨区域的长途通信,标识你的最终目的地,需要邮政系统(相当于路由器)来规划路线。
  • MAC 地址 就像你的 身份证号码 或者你家门口的 门牌号。当快递员(相当于数据帧)到达你所在的小区或楼栋(相当于本地网络/子网)时,他需要根据这个更具体的本地标识(门牌号/身份证)找到你本人(具体的网卡)。在一个小区内部(局域网内)找人,可能直接看门牌号就够了,不需要写完整的家庭住址。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2325571.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第五十三章 Spring之假如让你来写Boot——环境篇

Spring源码阅读目录 第一部分——IOC篇 第一章 Spring之最熟悉的陌生人——IOC 第二章 Spring之假如让你来写IOC容器——加载资源篇 第三章 Spring之假如让你来写IOC容器——解析配置文件篇 第四章 Spring之假如让你来写IOC容器——XML配置文件篇 第五章 Spring之假如让你来写…

Router [Continuation Settings]

楼上网络CMCC-Wmew,楼下接收不到,可能因为喜好弱,再弄一台路由器中转一下 Router [Continuation Settings] 路由器中续设置 到这里这台K3的路由器设置完成了,作为转发,中续,她还需要设置上游路由器&#…

Zookeeper中的Zxid是如何设计的

想获取更多高质量的Java技术文章?欢迎访问Java技术小馆官网,持续更新优质内容,助力技术成长 Java技术小馆官网https://www.yuque.com/jtostring Zookeeper中的Zxid是如何设计的 如果你们之前学习过 ZooKeeper,你们可能已经了解…

蓝桥云客 岛屿个数

0岛屿个数 - 蓝桥云课 问题描述 小蓝得到了一副大小为 MN 的格子地图,可以将其视作一个只包含字符 0(代表海水)和 1(代表陆地)的二维数组,地图之外可以视作全部是海水,每个岛屿由在上/下/左/右…

31天Python入门——第14天:异常处理

你好,我是安然无虞。 文章目录 异常处理1. Python异常2. 异常捕获try-except语句捕获所有的异常信息获取异常对象finally块 3. raise语句4. 自定义异常5. 函数调用里面产生的异常补充练习 异常处理 1. Python异常 Python异常指的是在程序执行过程中发生的错误或异…

浅析Android Jetpack ACC之LiveData

一、Android Jetpack简介 Android官网对Jetpack的介绍如下: Jetpack is a suite of libraries to help developers follow best practices, reduce boilerplate code, and write code that works consistently across Android versions and devices so that develo…

【区块链安全 | 第十五篇】类型之值类型(二)

文章目录 值类型有理数和整数字面量(Rational and Integer Literals)字符串字面量和类型(String Literals and Types)Unicode 字面量(Unicode Literals)十六进制字面量(Hexadecimal Literals&am…

Ubuntu修改用户名

修改用户名: 1.CTRL ALT T 快捷键打开终端,输入‘sudo su’ 转为root用户。 2.输入‘ gredit /etc/passwd ’,修改用户名,只修改用户名,后面的全名、目录等不修改。 3.输入 ‘ gedit /etc/shadow ’ 和 ‘ gedit /etc/…

Windows 系统下多功能免费 PDF 编辑工具详解

IceCream PDF Editor是一款极为实用且操作简便的PDF文件编辑工具,它完美适配Windows操作系统。其用户界面设计得十分直观,哪怕是初次接触的用户也能快速上手。更为重要的是,该软件具备丰富多样的强大功能,能全方位满足各类PDF编辑…

UE学习记录part11

第14节 breakable actors 147 destructible meshes a geometry collection is basically a set of static meshes that we get after we fracture a mesh. 几何体集合基本上是我们在断开网格后获得的一组静态网格。 选中要破碎的网格物品,创建集合 可以选择不同的…

Redis-07.Redis常用命令-集合操作命令

一.集合操作命令 SADD key member1 [member2]: sadd set1 a b c d sadd set1 a 0表示没有添加成功,因为集合中已经有了这个元素了,因此无法重复添加。 SMEMBERS key: smembers set1 SCARD key: scard set1 SADD key member1 …

vscode 源代码管理

https://code.visualstudio.com/updates/v1_92#_source-control 您可以通过切换 scm.showHistoryGraph 设置来禁用传入/传出更改的图形可视化。

iOS审核被拒:Missing privacy manifest 第三方库添加隐私声明文件

问题: iOS提交APP审核被拒,苹果开发者网页显示二进制错误,收到的邮件显示的详细信息如下图: 分析: 从上面信息能看出第三方SDK库必须要包含一个隐私文件,去第三方库更新版本。 几经查询资料得知,苹果在…

【LeetCode Solutions】LeetCode 101 ~ 105 题解

CONTENTS LeetCode 101. 对称二叉树(简单)LeetCode 102. 二叉树的层序遍历(中等)LeetCode 103. 二叉树的锯齿形层序遍历(中等)LeetCode 104. 二叉树的最大深度(简单)LeetCode 105. 从…

Orpheus-TTS 介绍,新一代开源文本转语音

Orpheus-TTS 是由 Canopy Labs 团队于2025年3月19日发布的开源文本转语音(TTS)模型,其技术突破集中在超低延迟、拟人化情感表达与实时流式生成三大领域。以下从技术架构、核心优势、应用场景、对比分析、开发背景及最新进展等多维度展开深入解…

Java数据结构-栈和队列

目录 1. 栈(Stack) 1.1 概念 1.2 栈的使用 1.3 栈的模拟实现 1.4 栈的应用场景 1. 改变元素的序列 2. 将递归转化为循环 3. 括号匹配 4. 逆波兰表达式求值 5. 出栈入栈次序匹配 6. 最小栈 1.5 概念区分 2. 队列(Queue) 2.1 概念 2.2 队列的使用 2.3 队列模拟实…

权重衰减-笔记

《动手学深度学习》-4.5-笔记 权重衰减就像给模型“勒紧裤腰带”,不让它太贪心、不让它学太多。 你在学英语单词,别背太多冷门单词,只背常见的就行,这样考试时更容易拿分。” —— 这其实就是在“限制你学的内容复杂度”。 在…

Hyperliquid 遇袭「拔网线」、Polymarket 遭治理攻击「不作为」,从双平台危机看去中心化治理的进化阵痛

作者:Techub 热点速递 撰文:Glendon,Techub News 继 3 月 12 日「Hyperliquid 50 倍杠杆巨鲸」引发的 Hyperliquid 清算事件之后,3 月 26 日 晚间,Hyperliquid 再次遭遇了一场针对其流动性和治理模式的「闪电狙击」。…

软考笔记6——结构化开发方法

第六章节——结构化开发方法 结构化开发方法 第六章节——结构化开发方法一、系统分析与设计概述1. 系统分析概述2. 系统设计的基本原理3. 系统总体结构设计 二、结构化分析方法1. 结构化分析方法概述2. 数据流图(DFD)3. 数据字典 三、结构化设计方法(了解&#xff…

一种C# Winform的UI处理

效果 圆角 阴影 突出按钮 说明 这是一种另类的处理,不是多层窗口 也不是WPF 。这种方式的特点是比较简单,例如圆角、阴影、按钮等特别容易修改过。其实就是html css DirectXForm。 在VS中如下 圆角和阴影 然后编辑这个窗体的Html模板&#xff0c…