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)表示层: 表示层对网络传输的数据进行交换,使得多 ...
随机推荐
- 什么是token?token是用来干嘛的?
从事计算机行业的朋友都听说过token这么个东西,尤其是deepseek爆火后api(大家都知道什么意思吧),但是其他行业的人就很少了解到token,下面就给大家来详细介绍一下token是什么意思?t ...
- 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~
大家好,我是汤师爷! 最近,腾讯发布了一款ima产品,主打用AI来帮你搜索信息.管理知识库. 说实话,一开始用混元大模型,感觉不咋地,很鸡肋的. 不过最近腾讯把DeepSeek R1接进来了,一下子解 ...
- 服务器vps测试脚本大全,新云linux综合工具箱-linux加速脚本 一键硬盘挂载
服务器vps测试脚本大全 一键更换yum脚本 一键优化shh卡顿 一键更换软件源 各种linux加速 BBR原版 bbrplus 魔改plus 锐速 脚本linux加速脚本 一键硬盘挂载 一键cc防御 ...
- php服务器如何验证令牌
在PHP中,令牌通常用于防止跨站请求伪造(CSRF)攻击.以下是一个简单的例子,展示了如何生成和验证令牌: 生成令牌: function generateToken($length = 32) { / ...
- Easyexcel(3-文件导出)
响应头设置 通过设置文件导出的响应头,可以自定义文件导出的名字信息等 //编码格式为UTF-8 response.setCharacterEncoding("UTF-8"); // ...
- canvas 获取图片中某个坐标的颜色
同步发布:https://blog.jijian.link/2020-04-05/canvas-get-color/ 由于功能受限,此处不能放 iframe 嵌入链接,如需看到实时效果,请移步 htt ...
- Laravel11 从0开发 Swoole-Reverb 扩展包(一) - 扩展包开发
前言 大家好呀,我是yangyang.好久没更新了,最近新项目在使用laravel11(截止目前发文,laravel12也发布了)做开发,自己也是利用有些空闲时间做些除开业务以外的深入学习,因此也就萌 ...
- Django实战项目-学习任务系统-发送短信通知
接着上期代码内容,继续完善优化系统功能. 本次增加发送短信通知功能,学习任务系统发布的任务,为了更加及时通知到学生用户,再原有发送邮件通知基础上,再加上手机短信通知功能. 第一步:开通短信通知服务 目 ...
- VMware ESXi系统
esxi全称"VMware ESXi",是可直接安装在物理服务器上的强大的裸机管理系统,是一款虚拟软件,不需安装其他操作系统,是VMware服务器虚拟化的基础.通过直接访问并控制底 ...
- Docker镜像介绍
一.Docker镜像介绍 镜像是Docker的三大核心概念之一. Docker运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会尝试先从默认的镜像仓库下载(默认使用Docker Hu ...