网络原理-TCP/IP
网络原理学习笔记:TCP/IP 核心概念
本文是我在学习网络原理时整理的笔记,主要涵盖传输层、网络层和数据链路层的核心协议和概念,特别是 TCP, UDP, IP, 和以太网。
一、传输层 (Transport Layer)
传输层负责提供端到端(进程到进程)的数据传输服务。它建立在网络层之上,为应用层提供通信支持。主要协议有 UDP 和 TCP。
1.1 UDP协议 (User Datagram Protocol)
UDP 是一种简单的、面向数据报的传输层协议。
UDP 报文段格式 (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):
- 源/目的端口号 (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 - 建立连接):
- 客户端 -> 服务器: 发送
SYN
包 (标志位SYN=1
,seq=x
) 请求建立连接。客户端进入SYN_SENT
状态。 - 服务器 -> 客户端: 收到请求后,如果同意连接,则回复
SYN-ACK
包 (标志位SYN=1, ACK=1
,seq=y
,ack=x+1
)。服务器进入SYN_RCVD
状态。 - 客户端 -> 服务器: 收到
SYN-ACK
包后,回复ACK
包 (标志位ACK=1
,seq=x+1
,ack=y+1
)。客户端进入ESTABLISHED
状态。服务器收到此ACK
后也进入ESTABLISHED
状态。连接建立完成。
- 目的: 确认双方的发送和接收能力都正常。
- 客户端 -> 服务器: 发送
- 四次挥手 (Four-Way Handshake - 断开连接):
- 主动方 -> 被动方: 数据发送完毕后,发送
FIN
包 (标志位FIN=1
,seq=u
) 请求关闭连接。主动方进入FIN_WAIT_1
状态。 - 被动方 -> 主动方: 收到
FIN
后,回复ACK
包 (标志位ACK=1
,ack=u+1
,seq=v
)。被动方进入CLOSE_WAIT
状态。主动方收到此ACK
后进入FIN_WAIT_2
状态。(此时被动方可能还有数据要发送) - 被动方 -> 主动方: 当被动方也准备好关闭连接(应用层调用
close
),发送FIN
包 (标志位FIN=1, ACK=1
,seq=w
,ack=u+1
)。被动方进入LAST_ACK
状态。 - 主动方 -> 被动方: 收到被动方的
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
。
- TCP 设计了处理各种网络异常情况的机制:
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): 将数据包从路由器的输入端口移动到合适的输出端口。
- 逻辑寻址 (Logical Addressing): 使用 IP 地址 (
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
AND255.255.255.0
=192.168.1.0
- 在这个例子中,前 24 位 (
192.168.1
) 是网络部分,后 8 位是主机部分。 - 该子网可容纳的主机数 = 2^(主机位数) - 2 = 2^8 - 2 = 254 台。(减去全 0 的网络地址和全 1 的广播地址)。
- IP 地址:
- CIDR (Classless Inter-Domain Routing - 无类别域间路由):
- 使用更灵活的表示法:在 IP 地址后面加上
/
和网络部分的位数(即子网掩码中1
的个数)。 - 例如,
192.168.1.0/24
表示网络部分是前 24 位,等同于子网掩码255.255.255.0
。 - CIDR 取代了过去 A/B/C 类地址的划分方式,使得 IP 地址分配更加高效。
- 使用更灵活的表示法:在 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:A5
或08-00-27-7D-99-A5
或0800.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 地址 就像你的 身份证号码 或者你家门口的 门牌号。当快递员(相当于数据帧)到达你所在的小区或楼栋(相当于本地网络/子网)时,他需要根据这个更具体的本地标识(门牌号/身份证)找到你本人(具体的网卡)。在一个小区内部(局域网内)找人,可能直接看门牌号就够了,不需要写完整的家庭住址。
相关文章:
网络原理-TCP/IP
网络原理学习笔记:TCP/IP 核心概念 本文是我在学习网络原理时整理的笔记,主要涵盖传输层、网络层和数据链路层的核心协议和概念,特别是 TCP, UDP, IP, 和以太网。 一、传输层 (Transport Layer) 传输层负责提供端到端(进程到进…...
【银河麒麟高级服务器操作系统 】虚拟机运行数据库存储异常现象分析及处理全流程
更多银河麒麟操作系统产品及技术讨论,欢迎加入银河麒麟操作系统官方论坛 https://forum.kylinos.cn 了解更多银河麒麟操作系统全新产品,请点击访问 麒麟软件产品专区:https://product.kylinos.cn 开发者专区:https://developer…...
AI-Sphere-Butler之如何使用腾讯云ASR语音识别服务
环境: AI-Sphere-Butler WSL2 英伟达4070ti 12G Win10 Ubuntu22.04 腾讯云ASR 问题描述: AI-Sphere-Butler之如何使用腾讯云ASR语音识别服务,本地硬件配置不高的情况,建议使用云服务商的ASR 解决方案: 1.登…...
Dify 0.15.3版本 本地部署指南
目录 背景 一、单机部署机器配置最低要求 二、系统Python环境安装 安装需要的python依赖 使用pyenv官方安装脚本 安装poetry 三、中间件部署 PostgreSQL本地部署 添加PG官方仓库 安装pg 16 检查pg版本 修改密码为dify默认 创建数据库dify 安装pg vector插件 修改…...
全书测试:《C++性能优化指南》
以下20道多选题和10道设计题, 用于本书的测试。 以下哪些是C性能优化的核心策略?(多选) A) 优先优化所有代码段 B) 使用更高效的算法 C) 减少内存分配次数 D) 将所有循环展开 关于字符串优化,正确的措施包括ÿ…...
Oracle数据库数据编程SQL<递归函数详解>
递归函数是一种在函数体内直接或间接调用自身的函数。这种函数通过将复杂问题分解为更小的相同问题来解决特定类型的编程任务。 目录 一、递归函数基本概念 1. 递归定义 2. 递归工作原理 二、递归函数示例 1. 经典阶乘函数 2. 斐波那契数列 3. 计算数字位数 三、递归查…...
Burp Suite从入门到实战之配置启动
目录 1.Burp Suite配置启动 1.1安装Burp Suite jar包 1.2JDK,JDK包含JRE(Java运行时环境) 1.2.1配置JDK11环境变量配置 1.2.2系统变量里添加JAVA_HOME编辑 1.2.3找到Path变量进行编辑添加bin 1.2.4命令行查看是否配置成功 1.3激活j…...
【力扣hot100题】(016)缺失的第一个正数
题目里这么多条条框框……先不按条条框框做了两下。 第一个思路:你不仁我不义,先排序后遍历(时间不符题意) class Solution { public:int firstMissingPositive(vector<int>& nums) {sort(nums.begin(),nums.end());i…...
(undone) MIT6.824 Lecture 02 - RPC and Threads
知乎专栏:https://zhuanlan.zhihu.com/p/641105196 原视频:https://www.bilibili.com/video/BV16f4y1z7kn?spm_id_from333.788.videopod.episodes&vd_source7a1a0bc74158c6993c7355c5490fc600&p2 看知乎专栏 一、Why we choose go?…...
红宝书第二十一讲:详解JavaScript的模块化(CommonJS与ES Modules)
红宝书第二十一讲:详解JavaScript的模块化(CommonJS与ES Modules) 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 一、模块化的意义:分而治之 模块化解决代码依赖混…...
输入百分比校验(数字非负数保留2位不四舍五入)
场景用于输入百分比,限制只能输入非负数,保留2位小数,且不四舍五入 以下举例环境 vue2 element-ui 请自行根据实际场景使用 html部分 <el-inputv-model"item.percentage"placeholder"请输入"maxlength"5"…...
Python----机器学习(KNN:决策边界,决策边界计算,交叉验证步骤)
一、KNN算法简介 1.1、定义 KNN(K-Nearest Neighbor)算法是一种基于实例的学习方法,通过测量数据点之间的距离进行分类或回归分析。它是一种简单易懂的多分类技术,依赖于距离最近的邻居来推断数据点的类别或数值,为许…...
SpringBoot 3+ Lombok日志框架从logback改为Log4j2
r要将Spring Boot 3项目中的日志框架从Logback切换到Log4j2,并配置按日期滚动文件和控制台输出,请按照以下步骤操作: 步骤 1:排除Logback并添加Log4j2依赖 在pom.xml中修改依赖: <dependencies><!-- 排除默…...
实战篇Redis
黑马程序员的Redis的笔记(后面补一下图片) 【黑马程序员Redis入门到实战教程,深度透析redis底层原理redis分布式锁企业解决方案黑马点评实战项目】https://www.bilibili.com/video/BV1cr4y1671t?p72&vd_source001f1c33a895eb5ed820b9a4…...
c++-函数增强
一、编译器对函数名的处理 1. C与C的差异 C编译器:保留原始函数名,无额外处理。例如: int add(int a, int b) { return a b; } 在汇编代码中仍为add。 C编译器:通过name mangling(名称修饰)生成唯一函数…...
BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测(Matlab)
BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测(Matlab) 目录 BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测(Matlab)预测效果基本介绍程序设计参考资料 预测效果 基本介绍 BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多…...
css基础之浮动相关学习
一、浮动基本介绍 在最初,浮动是用来实现文字环绕图片效果的,现在浮动是主流的页面布局方式之一。 效果/代码 图片环绕 代码 div {width: 600px;height: 400px;background-color: skyblue;}img {width: 200px;float: right;margin-right: 0.5em;}<…...
告别分库分表,时序数据库 TDengine 解锁燃气监控新可能
达成效果: 从 MySQL 迁移至 TDengine 后,设备数据自动分片,运维更简单。 列式存储可减少 50% 的存储占用,单服务器即可支撑全量业务。 毫秒级漏气报警响应时间控制在 500ms 以内,提升应急管理效率。 新架构支持未来…...
1.3 斐波那契数列模型:LeetCode 746. 使用最小花费爬楼梯
动态规划解最小花费爬楼梯问题:LeetCode 746. 使用最小花费爬楼梯 1. 题目链接 LeetCode 746. 使用最小花费爬楼梯 题目要求:给定一个整数数组 cost,其中 cost[i] 是从楼梯第 i 阶向上爬所需支付的费用。你可以从下标 0 或 1 的台阶开始爬&a…...
8.4考研408简单选择排序与堆排序知识点深度解析
考研408「简单选择排序与堆排序」知识点全解析 一、简单选择排序 1.1 定义与核心思想 简单选择排序(Selection Sort)是一种选择排序算法,其核心思想是: 每趟选择:从待排序序列中选择最小(或最大&#x…...
【个人笔记】用户注册登录思路及实现 springboot+mybatis+redis
基本思路 获取验证码接口 验证码操作用了com.pig4cloud.plugin的captcha-core这个库。 AccountControl的"/checkCode"接口代码,通过ArithmeticCaptcha生成一张验证码图片,通过text()函数得到验证码的答案保存到变量code,然后把图…...
LiteDB 数据存储与检索效率优化的最佳实践指导
一、引言 在当今数字化时代,数据处理和存储变得至关重要。对于小型项目或者嵌入式系统而言,需要一种轻量级、高效且易于使用的数据库解决方案。LiteDB 作为一款嵌入式的 NoSQL 数据库,因其零配置、易于集成等特点,受到了开发者的青睐。然而,若要充分发挥其性能优势,就需…...
WEB安全--RCE--RCE的绕过
一、回调函数的绕过(PHP) 1.1、回调函数 1.1.1、原理: 回调函数(Callback Function)指的是将函数名或匿名函数作为参数传递给另一个函数,从而在特定条件下调用该函数。 以一个常见的回调函数为例&#…...
uni-app:指引蒙层
组件说明 指引蒙层组件: 通过id标签,突出对应id中的模块; 可以自定义提示词。 点击任意位置关闭蒙层 效果展示和使用示例 切换id之后的效果: 代码实现 <template><view class="guide-mask" v-if="showMask" @click="hideMask"&g…...
什么是CMS?常用CMS有哪些?
一、内容管理系统(Content Management System) 什么是CMS:位于 Web 前端(服务器)和后端办公系统之间的软件系统,用于内容创建、编辑、审批和发布。支持文本、图片、视频、数据库等各类数字内容的管理…...
【Es】基础入门:开启全文搜索的大门
文章目录 一、Elasticsearch 是什么二、核心概念解读索引(Index)文档(Document)映射(Mapping)分片(Shard)副本(Replica) 三、基本操作入门安…...
74. Linux设备树详解
一、什么是设备树 1、uboot启动内核用到zImage,imx6ull-alientek-emmc.dtb。bootz 80800000 – 83000000. 80800000 —zImage 83000000—dtb 2、设备树:设备和树。 设备树(Device Tree),将这个词分开就是“设备”和“树”,描述设…...
从责任链模式聊到aware接口
从责任链模式聊到aware接口 责任链是什么? 责任链模式是一种行为型设计模式,将多个对象连接成一条链,并且沿着这条链传递请求,让多个对象都有机会处理这个请求,请求会顺着链传递,直到某个对象处理它为止。…...
在win11 环境下 新安装 WSL ubuntu + 换国内镜像源 + ssh + 桌面环境 + Pyhton 环境 + vim 设置插件安装
在win11 环境下 新安装 WSL ubuntu ssh gnome 桌面环境 Pyhton 环境 vim 设置插件安装 简单介绍详细流程换国内镜像源安装 ssh 桌面环境python 环境vim 设置插件安装 简单介绍 内容有点长,这里就先简单描述内容了。主要是快速在 Win11 搭建一个 wsl 的 linux 环…...
考研408-数据结构完整代码 线性表的链式存储结构 - 单链表
单链表操作详解(C实现) 目录 单链表尾插法创建单链表头插法创建删除指定节点按值查找按序号查找插入节点完整代码示例注意事项总结 尾插法创建 #include<bits/stdc.h> using namespace std;typedef struct LNode {int data;struct LNode* next;…...
使用Python爬虫获取淘宝App商品详情
在电商领域,获取商品详情数据对于市场分析、竞品研究和用户体验优化至关重要。淘宝作为国内领先的电商平台,提供了丰富的商品资源。虽然淘宝App的数据获取相对复杂,但通过Python爬虫技术,我们可以高效地获取淘宝App商品的详细信息…...
在 VMware Workstation 17 中安装的 Ubuntu 虚拟机无法使用桥接模式
在 VMware Workstation 17 中安装的 Ubuntu 虚拟机无法使用桥接模式时,通常是由于 网络配置错误、桥接适配器选择不当或主机网络环境限制 导致。以下是详细的排查和解决方法:我采用第一步就解决了问题 1. 检查 VMware 桥接模式配置 步骤 1:…...
2025前端八股文终极指南:从高频考点到降维打击的面试突围战
2025前端八股文终极指南:从高频考点到降维打击的面试突围战 一、2025前端八股文核心考点重构 1.1 新型响应式系统三连问 Vue3信号式响应性: // 信号式响应性底层实现 const [count, setCount] createSignal(0) effect(() > {console.log("当…...
MIPS-32架构(寄存器堆,指令系统,运算器)
文章目录 0 Preview:寄存器32通用0 $zero1 $at2—3 \$v0-$v14—7 \$a0-$a38—15 \$t0-$t716—23 \$s0-$s724—25 \$t8-$t926—27 \$k0-$k128 $gp29 $sp30 $fp 指令系统运算存储器 0 Preview: MIPS架构有32位版本和64位版本,本文介绍32位版本 寄存器 正如笔者曾说…...
MySQL数据库和表的操作之SQL语句
🎯 本文专栏:MySQL深入浅出 🚀 作者主页:小度爱学习 MySQL数据库和表的操作 关系型数据库,都是遵循SQL语法进行数据查询和管理的。 SQL语句 什么是sql SQL:结构化查询语言(Structured Query Language)&…...
Ubuntu在VMware中无法全屏
Ubuntu在VMware中无法全屏 方法:安装open-vm-tools 在Ubuntu打开终端: 1.输入: sudo apt-get install open-vm-tools2.安装依赖: sudo apt-get install open-vm*3.重启Ubuntu reboot...
[C++面试] 智能指针面试点(重点)续3
[C面试] RAII资源获取即初始化(重点)-CSDN博客 [C面试] 智能指针面试点(重点)-CSDN博客 [C面试] 智能指针面试点(重点)续1-CSDN博客 [C面试] 智能指针面试点(重点)续2-CSDN博客 …...
借助FastAdmin和uniapp,高效搭建AI智能平台
在数字化办公时代,效率与协作是企业发展的核心竞争力。传统的办公工具虽然功能丰富,但在面对复杂多变的团队协作需求时,往往显得力不从心。为了解决这一痛点,我们推出了一款全新的办公AI平台,它不仅能够满足文字和语音…...
【弹性计算】异构计算云服务和 AI 加速器(四):FPGA 虚拟化技术
《异构计算云服务和 AI 加速器》系列,共包含以下文章: 异构计算云服务和 AI 加速器(一):功能特点异构计算云服务和 AI 加速器(二):适用场景异构计算云服务和 AI 加速器(…...
Unity功能模块一对话系统(5)-完善对话流程及功能
现在我们的文本仍然是单句显示的,这还不是我们想要的效果,本期让我们完善对话流程,并使用SO(ScriptableObject)来进行一段对话序列的配置和动态加载。 最终效果功能展示 功能一:场景内可根据资源序号ID来…...
Ubuntu 系统中安装 Nginx
步骤 1:更新软件包列表 在安装前,先更新系统软件包列表: sudo apt update步骤 2:安装 Nginx 通过 apt 直接安装 Nginx: sudo apt install nginx -y步骤 3:验证安装 安装完成后,检查 Nginx …...
Elasticsearch:使用 Azure AI 文档智能解析 PDF 文本和表格数据
作者:来自 Elastic James Williams 了解如何使用 Azure AI 文档智能解析包含文本和表格数据的 PDF 文档。 Azure AI 文档智能是一个强大的工具,用于从 PDF 中提取结构化数据。它可以有效地提取文本和表格数据。提取的数据可以索引到 Elastic Cloud Serve…...
如何 编译 px4
DeepSeek-R1满血版 回答完成 深度思考完成 用时27秒,搜索全网29篇资料 以下是详细的PX4固件编译教程,综合多平台及常见问题解决方案: 一、环境准备 系统要求 Ubuntu 20.04/22.04(推荐)或 MacOS 12 Windo…...
pycharm2024.1.1版本_jihuo
目录 前置: 步骤: step one 下载软件 step two 卸载旧版本 1 卸载软件 2 清除残余 step three 下载补丁 step four 安装2024.1.1版本软件 step five 安装补丁 1 找位置放补丁 2 自动设置环境变量 step six 输入jihuo码 前置: 之…...
LLaMA Factory微调后的大模型在vLLM框架中对齐对话模版
LLaMA Factory微调后的大模型Chat对话效果,与该模型使用vLLM推理架构中的对话效果,可能会出现不一致的情况。 下图是LLaMA Factory中的Chat的对话 下图是vLLM中的对话效果。 模型回答不稳定:有一半是对的,有一半是无关的。 1、未…...
Vulnhub:Digitalword.local: FALL靶机渗透
将靶机按照图中连接方式打开,fall在virtualBox中打开 信息收集 扫描得ip arp-scan -l 扫描端口 nmap -A -T4 -sV -p- 扫描目录 gobuster dir -u http://192.168.117.160 -x php,txt,html -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt 一个一个…...
androidstudio安装完成后创建新的示例项目编译报错解决
项目场景: 提示:这里简述项目相关背景: 安装完成android studio想要编译一个自带的demo项目,没想到一直有编译报错,最后终于搞好了,记录下避免再踩坑。 androidstudio安装完成后创建新的示例项目编译报错…...
C#/.NET/.NET Core技术前沿周刊 | 第 31 期(2025年3.17-3.23)
前言 C#/.NET/.NET Core技术前沿周刊,你的每周技术指南针!记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿,助力技术成长与视野拓宽。 欢迎投稿、推荐…...
QT 跨平台发布指南
一、Windows 平台发布 1. 使用 windeployqt 工具 windeployqt --release --no-compiler-runtime your_app.exe 2. 需要包含的文件 应用程序 .exe 文件 Qt5Core.dll, Qt5Gui.dll, Qt5Widgets.dll 等 Qt 库 platforms/qwindows.dll 插件 styles/qwindowsvistastyle.dll (如果使…...
数制——FPGA
1、定点数 定点数的三种表示方式: 原码:符号位 绝对值 表示方法 反码:正数的反码表示 与原码表示一致,负数的反码表示 除符号位,其他位全都取反 补码:正数的补码表示 与原码表示一致,负数的补码…...