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协议有点类似渣男,秉承着不主动,不拒绝,不负责原则:
- 无连接
不预先建立建立,直接发送数据包(Packet)。 - 不可靠
不保证数据一定到达,不检查错误,不重传丢失的数据
它来鹅城只做三件事:
- 编址与标识(寻址)
每个连接到网络的设备,都会有一个IP地址。IP协议使用这个地址来表示源地址与目标地址。 - 路由与转发
每个数据包携带源IP与目IP,路由器根据"路由表"选择最佳转发路径。
路由表通过静态配置或动态协议(如 BGP、OSPF)生成,核心依据是 “最长前缀匹配” 原则 - 分片与重组(仅接收端)
当数据包超过链路层的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的分类
- IPv4
最早和最常用的IP协议版本,使用32位地址,范围从0.0.0.0到255.255.255.255。约为43亿个,由于互联网的增长,已经快枯竭了。 - 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地址可以分为两种
- 私有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 - 公有IP地址
有互联网服务商分配,可以在全球互联网中识别。
根据是否可以更改
- 静态IP地址
手动分配,不会改变。适合用于长期保持相同IP的设备,比如服务器。 - 动态IP地址
由DHCP服务器给你自动分配,每次连接网络或者超过一定时间都会改变。
ICMP
ICMP(Internet Control Message Protocol),用于IP层的错误报告和网络诊断,是一种面向无连接的协议。当IP数据无法访问目标IP,目标路由器时,会自动发送ICMP消息。
我们常用的Ping命令就是基于ICMP
链路层协议
数据链路层是 物理层(硬件连接)与 网络层(IP 寻址)的桥梁,负责在相邻节点之间传输数据帧,处理物理寻址、接入控制和错误检测。
MAC
数据链路层分为两个子层:
- 逻辑链路控制子层(Logical Link Control,LLC)
为网络层提供统一接口(支持多协议如 IP、IPX),处理流量控制和链路管理(IEEE 802.2 标准,现代网络中功能多集成到 MAC 子层)。
LLC层常被简化,属于被抛弃的小孩
- 媒体访问控制(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 表示组播地址,全 1(FF: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 地址。
- ARP请求
主机 A 构造一个 ARP 请求数据包,包含自身 IP 和 MAC 地址,以及目标 IP(192.168.1.4)。
该请求以广播形式发送到局域网(所有主机都会收到)。 - ARP响应
所有主机收到广播后,检查目标 IP 是否为自身。
只有目标设备会响应,并发送一个包含其MAC地址的ARP响应帧。 - 地址缓存
发送方收到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 未知,填全 0(6 字节全 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呢?
- 解决的问题不同
MAC地址作用于链路层,是区分硬件的物理地址,MAC 地址负责每个网段内的微观传输。
IP地址作用于网路层,是区分主机的逻辑地址,IP地址指导跨网段的宏观路由。
如果只用MAC地址进行网络寻址的话,MAC地址长度48位。2^48=256TB内存。这将会是你负担不起的路由器价格。
ARP的变种与扩展
反向地址解析协议(RARP)
功能与 ARP 相反:已知 MAC 地址,解析对应的 IP 地址。
现已很少使用,被 DHCP 等协议替代。免费 ARP(Gratuitous ARP)
主机主动发送 ARP 广播(即使无通信需求),属于ARP reply帧,但请求的目标是自己。
用于是告诉广播域中其它主机自己的存在,更新其他主机的 ARP 缓存(如虚拟机迁移后,负载均衡的主备切换)。
判断广播域中是否存在IP冲突无状态 ARP(Stateless ARP)
主机不维护 ARP 缓存,每次通信前都发送 ARP 请求(适用于低功耗设备或动态网络)。
眼见为实
ARP

ICMP

C#网络编程(二)----网络层/链路层的更多相关文章
- Linux网络编程(二)
Linux网络编程(二) 使用多进程实现服务器并发访问. 采用多进程的方式实现服务器的并发访问的经典范例. 程序实现功能: 1.客户端从标准输入读入一行文字,发送到服务器. 2.服务器接收到客户端发来 ...
- C#网络编程二:Socket编程
一:什么是SOCKET socket的英文原义是"孔"或"插座".作为进程通信机制,取后一种意思.通常也称作"套接字",用于描述IP地址和端 ...
- linux2.6.24内核源代码分析(2)——扒一扒网络数据包在链路层的流向路径之一
在2.6.24内核中链路层接收网络数据包出现了两种方法,第一种是传统方法,利用中断来接收网络数据包,适用于低速设备:第二种是New Api(简称NAPI)方法,利用了中断+轮询的方法来接收网络数据包, ...
- 18 网络编程-TCP/IP各层介绍(5层模型讲解)
1.TCP/IP五层协议讲解 物理层--数据链路层--网络层--传输层--应用层 我们将应用层,表示层,会话层并作应用层,从tcp/ip五层协议的角度来阐述每层的由来与功能,搞清楚了每层的主要协议 就 ...
- Java网络编程二:Socket详解
Socket又称套接字,是连接运行在网络上两个程序间的双向通讯的端点. 一.使用Socket进行网络通信的过程 服务端:服务器程序将一个套接字绑定到一个特定的端口,并通过此套接字等待和监听客户端的连接 ...
- 网络编程-TCP/IP各层介绍(5层模型讲解)
1.TCP/IP五层协议讲解 物理层--数据链路层--网络层--传输层--应用层 我们将应用层,表示层,会话层并作应用层,从tcp/ip五层协议的角度来阐述每层的由来与功能,搞清楚了每层的主要协议 就 ...
- 网络编程、OSI七层协议
目录 软件开发架构 1.什么是软件开发架构 2.软件开发架构 3.架构优劣势 4.架构发展趋势 网络编程简介 1.如何理解网络编程 2.网络编程的目的 3.网络编程的意义 4.网络编程的起源 5.网络 ...
- Linux 网络编程二(Socket创建)
TCP通信 一个程序使用套接字需要执行4个步骤. --分配套接口和初始化 --连接 --发送或接收数据 --关闭套接字 涉及到的调用包括socket.bind.listen.connect(阻塞线程) ...
- IOS研究之网络编程(二)-Cocoa Streams使用具体解释
本文以及相关的系列文章是我总结的iOS网络开发方面的知识点,本文是第二篇,主要分析了Cocoa Streams中的几个重要类 Cocoa Streams实际上是Objective-C对CFNet ...
- 【Linux 网络编程】OSI七层模型
OSI(Open System Interconnection)开放系统互联模型(1)应用层: 应用层与应用程序界面沟通,以达到展示给用户的目的.(2)表示层: 表示层对网络传输的数据进行交换,使得多 ...
随机推荐
- .NET最佳实践:webapi返回IAsyncEnumerable提升性能
什么是IAsyncEnumerable IAsyncEnumerable<T> 是 .NET 中用于表示异步数据流的接口. 它允许你逐个异步地获取数据项,而不是将所有数据一次性加载到内存中 ...
- P6108 [Ynoi2009] rprsvq 积分题解
给 EI 题解写注 qwq.. 化简方差: \[\frac{1}{n}\sum(a_i-\overline a)^2\\ =\frac{1}{n}(\sum a_i^2-2\overline {a}\ ...
- Flink同步mysql到iceberg
一.如何做一致性保障 1.全量数据分片读取,增量数据单并发读取,保证增量阶段不会乱序2.全量阶段写入失败会清空表后重新写入,避免重复数据.3.全量阶段多task并行读取,把每个task开始结束时间提交 ...
- DeepSeek模型量化
技术背景 大语言模型(Large Language Model,LLM),可以通过量化(Quantization)操作来节约内存/显存的使用,并且降低了通讯开销,进而达到加速模型推理的效果.常见的就是 ...
- elementUI中如何在Tabs标签页的标题文字后面添加文字或图标
1.效果如下: 实现代码如下:<el-tab-pane name="first"> <span slot="label"> <sp ...
- Data Warehouse - [00] 参考文献
浪尖大数据:什么是数据仓库的架构?企业数据仓库架构如何建设? 浪尖大数据:元数据管理在数据仓库的实践应用 - 要养成终生学习的习惯 -
- 【渗透测试】Vulnhub DarkHole
渗透环境 攻击机: IP: 192.168.216.129(Kali) 靶机: IP:192.168.216.130 靶机下载地址:https://www.vulnhub.com/entr ...
- 阿里巴巴开源ETL(数据的抽取、转换、加载)工具-----DataX
一个比Sqoop好用的数据传输工具 下载maven的时候,加一个 -P让下载的压缩包到指定目录 而要让档案自动储存到指令的目录下,则需要借用-P这个参数wget -p 目录 网址wget -P /ro ...
- vim使用技巧记录
1.查找 '/' + 要找的字符串(正则表达式) + Enter # 查找偏移 'n': 查找下一个 'N': 查找上一个 大小写敏感性:字符串尾接\c不敏感,\C敏感 可以~/.vimrc在配置中配 ...
- vuepress-reco搭建与部署指南
个人博客:槿苏的知识铺 一.前言 在技术飞速发展的今天,高效地编写.维护和呈现文档已成为开发者不可或缺的能力.无论是开源项目.团队协作还是个人知识沉淀,一套结构清晰.体验优雅的文档系统都能显著提升 ...
