C#网络编程(二)----网络层/链路层

网络层协议

网络层(Network Layer) 的主要功能是实现主机之间的逻辑寻址、路由选择和分组转发,确保数据在不同网络(如局域网、广域网)之间的传输

协议类别 核心协议 路由协议 辅助协议 扩展协议
功能 逻辑寻址、分组转发 路径计算与路由表维护 地址解析、错误控制、组播管理 安全、NAT、QoS等
典型协议 IPv4/IPv6、IPSec OSPF、BGP、RIP ARP、ICMP、IGMP NAT、GRE、DiffServ

IP

IP(Internet Protocol),是分配给连接到计算机网络的每个设备唯一标识符,用于在网络中通信。IP地址使数据包能够在网络上找到其位置,将数据从源主机路送到目的主机,跨越多个中间网络设备(路由器),屏蔽底层网络差异(如以太网、Wi-Fi、广域网)。

但IP协议有点类似渣男,秉承着不主动,不拒绝,不负责原则:

  1. 无连接
    不预先建立建立,直接发送数据包(Packet)。
  2. 不可靠
    不保证数据一定到达,不检查错误,不重传丢失的数据

它来鹅城只做三件事:

  1. 编址与标识(寻址)
    每个连接到网络的设备,都会有一个IP地址。IP协议使用这个地址来表示源地址与目标地址。
  2. 路由与转发
    每个数据包携带源IP与目IP ,路由器根据"路由表"选择最佳转发路径。
    路由表通过静态配置或动态协议(如 BGP、OSPF)生成,核心依据是 "最长前缀匹配" 原则
  3. 分片与重组(仅接收端)
    当数据包超过链路层的MTU时(如以太网MTU为1500字节),IP层将数据包拆分为多个分片(Fragment),每个分片包含独立的IP头。
    接收端会根据分布信息将这些片段重新组装成完整的数据包。

IP数据包格式

字段 长度 说明
版本 4位 IPv4(值为4)或IPv6(值为6)
首部长度 4位 以32位字为单位,最小5(20字节),最大60字节(含可选字段)
区分服务 8位 旧称TOS(服务类型),用于QoS(服务质量),如优先级、延迟、吞吐量配置
总长度 16位 数据报总字节数(首部+数据),最大65535字节
标识 16位 唯一标识同一原始数据报的分片,用于重组
标志 3位 包括"保留位"、"不分片(DF)"、"更多分片(MF)"标志
片偏移 13位 分片数据在原始数据报中的偏移量(以8字节为单位)
生存时间(TTL) 8位 数据报最大跳数(每经一个路由器减1,为0时丢弃,防止环路)
协议 8位 上层协议类型(如TCP=6,UDP=17,ICMP=1)
首部校验和 16位 仅校验IP首部,不校验数据(提高效率,可靠性由上层协议处理)
源IP地址 32位 发送方IP
目的IP地址 32位 接收方IP
可选字段 0-40字节 用于调试、安全等(如记录路由、时间戳),较少使用

IP的分类

  1. IPv4
    最早和最常用的IP协议版本,使用32位地址,范围从0.0.0.0到255.255.255.255。约为43亿个,由于互联网的增长,已经快枯竭了。
  2. Ipv6
    为了解决IPv4地址枯竭,而设计的新一代IP协议。使用128位地址,提供海量的IP池。比如:fe80::a00e:9ff2:c15f:e833%21

IPv4地址已经快枯竭了,但依旧是互联网的主流。因为还有DHCP,CIDR,NAT为它续命。

看过<三体>的小伙伴一定对647号小宇宙不陌生,路由器就是为IPv4构建了一个又一个的小宇宙,不至于枯竭。

特性 IPv4 IPv6
地址长度 32位(约43亿地址) 128位(足够为每粒沙子分配地址)
地址空间 分类严格(A/B/C类),浪费严重 无类别(CIDR),地址分配灵活
首部长度 可变(20~60字节),处理复杂 固定40字节,效率更高
安全性 依赖IPsec(可选) 强制支持IPsec(加密与认证)
移动性 需额外协议(如MIP) 内置移动性支持(家乡地址)
分片 源主机和路由器均可分片 仅源主机分片,路由器不处理
兼容性 与IPv6不直接兼容 支持双栈(同时运行IPv4/IPv6)

IP地址分类

根据作用范围,IP地址可以分为两种

  1. 私有IP地址
    用于局域网内部(LAN),不能在互联网中传输
    10.0.0.0-10.255.255.255
    172.16.0.0-172.31.255.255
    192.168.0.0-192.168.255.255
  2. 公有IP地址
    有互联网服务商分配,可以在全球互联网中识别。

根据是否可以更改

  1. 静态IP地址
    手动分配,不会改变。适合用于长期保持相同IP的设备,比如服务器。
  2. 动态IP地址
    由DHCP服务器给你自动分配,每次连接网络或者超过一定时间都会改变。

ICMP

ICMP(Internet Control Message Protocol),用于IP层的错误报告和网络诊断,是一种面向无连接的协议。当IP数据无法访问目标IP,目标路由器时,会自动发送ICMP消息。

我们常用的Ping命令就是基于ICMP

链路层协议

数据链路层是 物理层(硬件连接)与 网络层(IP 寻址)的桥梁,负责在相邻节点之间传输数据帧,处理物理寻址、接入控制和错误检测。

MAC

数据链路层分为两个子层:

  1. 逻辑链路控制子层(Logical Link Control,LLC)
    为网络层提供统一接口(支持多协议如 IP、IPX),处理流量控制和链路管理(IEEE 802.2 标准,现代网络中功能多集成到 MAC 子层)。

LLC层常被简化,属于被抛弃的小孩

  1. 媒体访问控制(Media Access Control,MAC)
    负责物理寻址(MAC地址),接入控制(CSMA/CD)和数据帧的传输

MAC地址:Media Access Contril Addres,是网络设备的硬件地址,用于在局域网中标识设备。MAC工作在链路层,用于设备间通信。

MAC帧格式

字段 长度(字节) 功能描述
前导码(Preamble) 7 1010...10 交替的二进制位组成,用于接收端同步时钟,使物理层设备调整接收速率。
帧开始定界符(SFD) 1 固定为 10101011,标识MAC帧的开始,通知接收端后续为有效数据帧。
目的MAC地址(DMAC) 6 接收方网卡的物理地址(48位),最高位为 0 表示单播地址,1 表示组播地址,全 1FF:FF:FF:FF:FF:FF)为广播地址。
源MAC地址(SMAC) 6 发送方网卡的物理地址(48位),无组播/广播标识,始终为单播地址。
类型字段(Type) 2 标识上层协议类型: - 0x0800:IP协议 - 0x0806:ARP协议 - 0x86DD:IPv6协议 该字段区分帧承载的是哪种网络层数据。
数据字段(Data) 46~1500 封装上层(网络层)的数据包(如IP数据报、ARP报文)。 - 最小长度46字节:若上层数据不足,需填充(Pad)至46字节,确保CSMA/CD机制正常工作(最小帧长64字节,减去14字节头部和4字节FCS,剩余46字节)。 - 最大长度1500字节:即MTU(最大传输单元),超过则需在网络层分片。
帧校验序列(FCS) 4 基于CRC(循环冗余校验)算法生成的校验码,用于检测帧在传输过程中是否发生错误,校验范围包括DMAC、SMAC、Type、Data和Pad字段(不包括前导码和SFD)。

网络层与链路层的桥梁,ARP

Address Resolution Protocol(ARP,地址解析协议) 是计算机网络中用于将 IP 地址(网络层地址)解析为 MAC 地址(数据链路层地址) 的关键协议。它是局域网(LAN)通信的基础,主要解决 "已知 IP 地址,如何获取对应物理地址" 的问题。其帧直接封装在数据链路层(如以太网)的帧中

场景:主机 A(IP: 192.168.1.1)要向主机 B(IP: 192.168.1.4)发送数据,但不知道 B 的 MAC 地址。

  1. ARP请求
    主机 A 构造一个 ARP 请求数据包,包含自身 IP 和 MAC 地址,以及目标 IP(192.168.1.4)。
    该请求以广播形式发送到局域网(所有主机都会收到)
  2. ARP响应
    所有主机收到广播后,检查目标 IP 是否为自身。
    只有目标设备会响应,并发送一个包含其MAC地址的ARP响应帧。
  3. 地址缓存
    发送方收到ARP响应后,会将目标设备的IP地址和MAC地址映射关系缓存到本地。以便下次发送数据时,无需再进行地址解析。

ARP数据帧格式

字段 长度(字节) 描述 示例值(以太网 + IPv4)
硬件类型(Hardware Type) 2 标识底层硬件类型(如以太网、令牌环等)。 以太网对应值为 0x0001 0x0001(以太网)
协议类型(Protocol Type) 2 标识上层协议类型(如 IPv4、IPv6 等)。 IPv4 对应值为 0x0800 0x0800(IPv4)
硬件地址长度(Hardware Address Length) 1 硬件地址(如 MAC 地址)的长度(单位:字节)。 以太网 MAC 地址为 6 0x06
协议地址长度(Protocol Address Length) 1 协议地址(如 IP 地址)的长度(单位:字节)。 IPv4 地址为 4 0x04
操作码(Operation Code) 2 标识 ARP 操作类型: 1 = ARP 请求(Request), 2 = ARP 响应(Reply), 3 = RARP 请求(反向解析,已过时), 4 = RARP 响应。 0x0001(请求)、0x0002(响应)
发送方硬件地址(Sender Hardware Address) 可变(依硬件地址长度) 发送方的硬件地址(如发送方 MAC 地址)。 以太网中为 6 字节。 发送方 MAC 地址(例:00-0C-29-12-34-56,二进制填充)
发送方协议地址(Sender Protocol Address) 可变(依协议地址长度) 发送方的协议地址(如发送方 IP 地址)。 IPv4 中为 4 字节。 发送方 IP 地址(例:192.168.1.100,点分十进制转换为 4 字节)
目标硬件地址(Target Hardware Address) 可变(依硬件地址长度) 目标的硬件地址: - ARP 请求时,因目标 MAC 未知,填全 06 字节全 0); - ARP 响应时,填入目标真实 MAC 地址。 请求时:00-00-00-00-00-00(全 0); 响应时:目标 MAC 地址
目标协议地址(Target Protocol Address) 可变(依协议地址长度) 目标的协议地址(如目标 IP 地址,需解析的 IP)。 目标 IP 地址(例:192.168.1.200,点分十进制转换为 4 字节)

既生瑜何生亮?

IP地址与MAC地址都能表示唯一,那为什么既有IP,又有MAC呢?

  1. 解决的问题不同
    MAC地址作用于链路层,是区分硬件的物理地址,MAC 地址负责每个网段内的微观传输
    IP地址作用于网路层,是区分主机的逻辑地址,IP地址指导跨网段的宏观路由

如果只用MAC地址进行网络寻址的话,MAC地址长度48位。2^48=256TB内存。这将会是你负担不起的路由器价格。

ARP的变种与扩展

  1. 反向地址解析协议(RARP)

    功能与 ARP 相反:已知 MAC 地址,解析对应的 IP 地址。

    现已很少使用,被 DHCP 等协议替代。

  2. 免费 ARP(Gratuitous ARP)

    主机主动发送 ARP 广播(即使无通信需求),属于ARP reply帧,但请求的目标是自己

    用于是告诉广播域中其它主机自己的存在,更新其他主机的 ARP 缓存(如虚拟机迁移后,负载均衡的主备切换)。

    判断广播域中是否存在IP冲突

  3. 无状态 ARP(Stateless ARP)

    主机不维护 ARP 缓存,每次通信前都发送 ARP 请求(适用于低功耗设备或动态网络)。

眼见为实

ARP

ICMP