网络基础

网络模型

OSI七层网络模型 TCP/IP四层概念模型 对应网络协议
应用层(Application) 应用层 HTTP、TFTP、FTP、NFS、WAIS、SMTP
表示层(Presentation) 应用层 Telnet、Rlogin、SNMP、Gopher
会话层(Session) 应用层 SMTP、DNS
传输层(Transport) 传输层 TCP、UDP
网络层(Network) 网络层 IP、ICMP、ARP、RARP、AKP、UUCP
数据链路层(Data Link) 数据链路层 FDDI、Ethernet、Arpanet、PDN、SLIP、PPP
物理层(Physical) 数据链路层 IEEE 802.1A、IEEE 802.2到IEEE 802.11

OSI 七层网络模型功能说明:

  • 7 应用层:为应用程序提供网络服务
  • 6 表示层:数据格式化,加密、解密
  • 5 会话层:建立、维护、管理会话连接
  • 4 传输层:建立、维护、管理端到端连接
  • 3 网络层:IP寻址和路由选择
  • 2 数据链路层:控制网络层与物理层之间通信
  • 1 物理层:比特流传输

物理层

  1. 传输介质:通过双绞线(网线)、光纤、无线电波(Wi-Fi/移动通信)等物理介质将设备连接起来组网。
  2. 跨网通信:两个不同网络或运营商(如中国移动、中国电信)之间的通信,需要依靠 ISP(互联网服务供应商)提供的物理骨干线路与基础设施进行连接。
  3. 核心作用:负责将上层数据转换为电信号、光信号或无线电波,在物理介质中传送原始比特流(0 和 1)。
  4. 典型设备与接口:中继器、集线器(Hub)、网线接口(RJ-45)、光纤接口等。

数据链路层

  1. 作用
    • 根据以太网(Ethernet)等协议,将物理层的电信号组装成“数据帧(Frame)”并控制其传输。
    • 数据帧结构:包含帧头(Head)(标明发送者 MAC、接收者 MAC、上层协议类型)、数据(Data)以及帧尾(Tail/FCS)(用于差错校验)。 (补齐:以太网帧包含帧尾校验码)
  2. MAC 地址(物理地址)
    • 作用:在局域网(同一网段)内唯一标识一台物理设备,实现设备间的直接通信(不涉及跨网段路由路径)。
    • 格式:即网卡物理地址,每个网卡出厂时具有唯一性,长度为 48 位(6 个字节),通常表示为 12 个十六进制数(例如 00:1A:2B:3C:4D:5E)。
    • 结构:前 6 个十六进制数(前 3 字节)为厂商代码(OUI),后 6 个十六进制数(后 3 字节)为网卡序列号/流水号。
  3. 传输方式
    • 广播(Broadcast):发送者将数据帧发送给局域网内所有设备(目标 MAC 地址为 FF:FF:FF:FF:FF:FF),每台设备收到后对比自己的 MAC 地址,匹配则接收,不匹配则丢弃(例如 ARP 查询请求)。
    • 单播(Unicast,日常通信主流):在已知目标 MAC 地址时,数据帧仅点对点发送给指定的目标网卡。 (局域网大部分流量是单播)
  4. 网络交换机(Network Switch)
    • 定义:工作在数据链路层的核心设备(L2 交换机),用于组建和扩展局域网。
    • 作用与工作原理:为子网提供更多网线接口以连接更多 PC;通过自动学习设备的 MAC 地址并维护 MAC 地址表,实现数据的精准单播转发,避免网络拥堵。

网络层(Network Layer)

  1. 核心作用
    • 实现主机到主机(Host-to-Host)的数据包端到端逻辑传输(IP 协议本身是无连接、尽力而为的)。
  2. 寻址机制
    • 引入逻辑地址模式(IP 地址/网络地址),用于标识网络设备并区分哪些 PC 处于同一子网(局域网)内。
  3. IP 地址分类
    • IPv4:32 位二进制,共 4 个字节(每个字节 8 位,以点分十进制表示,如 192.168.1.1)。
      • 网络位与主机位:具体由子网掩码决定(例如 CIDR 为 /24 时,前 24 位为网络号,同一子网内必须相同;后 8 位为主机号)。
    • IPv6:128 位二进制,共 16 个字节(通常分为 8 组十六进制数表示)。
  4. 子网掩码(Subnet Mask)
    • 工作原理:将 IP 地址与子网掩码进行按位与(AND)运算,计算出网络号,以此判断两台设备是否处于同一子网。
      • 示例:IP AND 255.255.255.0 即可提取出前 24 位的网络地址。
  5. 路由(Routing)
    • 作用:通过网络将数据包从源 IP 地址引导传送至目标 IP 地址,经过中间节点(路由器)逐跳转发到达目的地。
    • 实现方法:路由算法与路由表定义下一跳路径,通过网关逐级转发数据包。
    • 路由器(Router):连接两个或多个不同子网并实现路由转发的核心网络设备(配有多个网卡/接口,各接入不同网段)。
    • 网关(Gateway):局域网连接外部网络的出口(通常即为局域网内部路由器的 LAN 口 IP 地址)。
    • 数据传输流程(以 A 发送数据给 B 为例):
      • 同一局域网:A 通过 ARP 广播获取 B 的 MAC 地址,直接通过交换机单播将数据帧发送给 B。
      • 不同局域网:
        • A 判断 B 与自己不在同一网段,将数据包的目标 IP 设为 B,但目标 MAC 设为网关(路由器)的 MAC 地址,发送给网关。
        • 路由器收到后查看路由表,重新封装数据帧(源/目的 IP 保持不变,源/目的 MAC 地址替换为下一跳设备),转发给下一跳,最终到达目标主机 B 的所在网段。
  6. ARP 协议(地址解析协议)
    • 作用:建立并维护局域网内 IP 地址到 MAC 地址的映射关系。
    • 工作层级:工作于数据链路层(L2)与网络层(L3)之间,直接封装在以太网帧(Ethernet Frame)中。
    • 适用范围:仅适用于 IPv4;在 IPv6 中已被 NDP(邻居发现协议,Neighbor Discovery Protocol) 替代。

传输层(Transport Layer)

  1. 核心作用
    • 提供应用进程到进程(Process-to-Process)的端到端逻辑通信(网络层只负责主机到主机)。 (修正:明确为进程间通信,非端口建立连接)
  2. 端口号(Port)
    • 取值范围与划分(0 - 65535)
    • 0 - 1023(知名端口 / 公认端口):由系统或标准协议占用(如 HTTP 80、HTTPS 443、SSH 22 等)。 (修正:规范端口分类名)
    • 1024 - 49151(注册端口):分配给特定应用程序或服务(如 Mysql 3306、Redis 6379、代理服务 8080 等)。 (补齐:规范划分)
    • 49152 - 65535(动态 / 临时端口):客户端发起请求时,由操作系统自动分配的随机端口。 (修正:明确随机选取端口的范围)
    • 作用:
      • 标识网络数据包具体归属于哪一个应用进程(多路复用与多路分解)。
      • 一个应用进程可以建立多个网络连接(例如浏览器打开多个标签页),通过分配不同的动态端口号或 Socket 句柄进行区分。
  3. Socket(套接字)
    • 进程间网络通信基础:通信必须指定“五元组”——源 IP 地址、源端口号、目的 IP 地址、目的端口号、传输层协议(TCP/UDP)。
    • 数据结构/形式:在操作系统层面上是一个抽象的文件描述符 / 句柄(File Descriptor / Handle),并非单纯的数值变量。
    • 本质:是应用层与传输层之间的编程 API 抽象接口,是对 TCP/IP 协议栈调用的封装。
  4. TCP 与 UDP 协议
    • 传输层头部:在应用层数据前加上传输层头部,主要包含源端口号与目的端口号。
    • TCP 协议(传输控制协议):
      • 特性:面向连接(需经过三次握手与四次挥手)、可靠传输(提供超时重传、确认应答、滑动窗口、流量控制与拥塞控制)。
      • 特点:结构复杂、开销较大,能确保数据不丢失、不乱序。
    • UDP 协议(用户数据报协议):
      • 特性:无连接、不可靠/尽力而为传输(不保证数据包是否成功到达、不进行重传与排序)。
      • 特点:头部开销极小(仅 8 字节)、传输效率高、实时性强,适合实时音视频通信、DNS 查询等场景。

应用层(Application Layer - TCP/IP 架构)

  1. 核心作用(会话层、表示层、应用层合并的TCP/IP的应用层)
    • 应用服务接口(原 OSI 应用层):直接面向最终用户与应用程序,提供各种网络应用服务(如网页浏览、文件传输、电子邮件等)。
    • 数据表示与编码(原 OSI 表示层):规定应用程序通信的数据格式,负责数据的序列化/反序列化、数据压缩/解压、加密/解密(如 TLS/SSL 加密、JSON/XML 语法解析)。
    • 会话控制与管理(原 OSI 会话层):建立、维护与管理不同应用程序进程之间的会话连接(如 Keep-Alive 保持连接、会话状态同步)。
  2. 架构特点
    • 是对 OSI 七层模型中最高三层(应用层、表示层、会话层)的抽象合并,结构更简洁,直接面向用户与开发者的业务逻辑。
  3. 常见应用层协议(补齐抓包必看)
    • HTTP / HTTPS(80 / 443):超文本传输协议,Web 网站与 API 接口通信的基础(HTTPS 增加了 TLS 加密层)。
    • DNS(53):域名解析协议,将人类可读的域名转换成机器识别的 IP 地址(基于 UDP/TCP)。
    • FTP / SFTP(21 / 22):文件传输协议。
    • SMTP / IMAP / POP3:电子邮件收发协议。
    • WebSocket:基于 HTTP 握手的全双工实时通信协议。
  4. 常见数据格式与载体(1.2 实例化延伸)
    • 文本与结构化数据:JSON、XML、HTML、Plain Text、Form-data。
    • 二进制数据:Protobuf(高吞吐微服务常用)、Gzip 压缩数据、图片/音视频流。

数据包

  1. 应用层:[ 应用层头部 | 业务数据 Payload ]
  2. 传输层:[ TCP/UDP 头部 | 应用层全部数据 ]
  3. 网络层:[ IP 头部 | TCP/UDP 全部数据 ]
  4. 数据链路层:[ 以太网头部 | IP 全部数据 | 以太网尾部(FCS) ]

头部信息:

  1. 数据链路层头部与尾部(以太网帧 / Ethernet II)
    • 工作在局域网内,主要负责硬件网卡到网卡之间的“下一跳”点对点传输。
    • 以太网头部(Header,共 14 字节):
    • 目的 MAC 地址(6 字节): 接收方网卡的物理地址。
    • 源 MAC 地址(6 字节): 发送方网卡的物理地址。
    • 类型代码(Type,2 字节): 标识上层封装的是什么协议(例如 0x0800 代表 IPv4,0x0806 代表 ARP)。
    • 以太网尾部(Trailer,共 4 字节):
      • FCS(帧校验序列): 包含 32 位 CRC 校验码,网卡硬件用它来检测数据在物理传输过程中是否损坏。
  2. 网络层头部(IPv4 Header)
    • 工作在广域网/局域网,负责在复杂的网络中进行逻辑寻址与路由选择,实现“主机到主机”的传输。
    • IPv4 头部(标准长度 20 字节):
    • 版本(Version): 标识 IP 协议版本(如 IPv4 为 4)。
    • 源 IP 地址(4 字节): 发送端主机的逻辑 IP 地址。
    • 目的 IP 地址(4 字节): 接收端主机的逻辑 IP 地址。
    • 协议字段(Protocol): 标识上层传输层使用的是什么协议(例如 6 代表 TCP,17 代表 UDP)。
    • TTL(生存时间 / Time to Live): 防环路机制。数据包每经过一个路由器该值减 1,减至 0 则直接丢弃。
    • 首部检验和(Header Checksum): 用于校验 IP 头部数据在传输过程中是否出错。
    • 分片相关字段(标识符、标志位、片偏移): 当数据包大小超过链路 MTU(如 1500 字节)时,用于指导路由器将数据包切碎和重组。
  3. 传输层头部(TCP / UDP Header)
    • 工作在端到端系统,负责将数据准确交付给操作系统中的特定应用程序,实现“进程到进程”的通信。
    • TCP 头部(标准长度 20 字节,面向连接/可靠):
      • 源端口号(2 字节)与目的端口号(2 字节): 标识本机发送进程与目标接收进程(如 80、443)。
      • 序号(Sequence Number,4 字节): 给发送的数据字节编号,用于接收端按顺序重组数据及去重。
      • 确认号(Acknowledgment Number,4 字节): 期望收到对方下一个字节的序号,TCP 实现“可靠传输(ACK应答)”的核心。
      • 标志位(Flags): 控制 TCP 状态机,例如 SYN(发起连接/握手)、ACK(确认)、FIN(释放连接/挥手)、RST(强制重置)。
      • 窗口大小(Window Size): 告知对方自己当前的接收缓冲区余量,用于“流量控制”。
    • UDP 头部(仅 8 字节,无连接/高效):
      • 源端口与目的端口(共 4 字节): 标识通信进程。
      • UDP 长度(2 字节): 包含 UDP 头部和数据的总字节数。
      • UDP 校验和(2 字节): 检验 UDP 头部及数据是否出错。
  4. 应用层头部(以 HTTP / TLS 为例)
    • 直接为用户的应用程序提供服务。虽然不同协议的格式千差万别,但本质都是定义“业务沟通的规则”。
    • HTTP 头部(基于文本格式):
      • 请求头(Request Header): 包含请求方法(GET/POST)、请求路径(/index.html)、域名(Host)、客户端信息(User-Agent)、身份凭证(Cookie/Authorization)等。
      • 响应头(Response Header): 包含 HTTP 状态码(200 OK/404 Not Found)、内容类型(Content-Type: application/json)、内容长度(Content-Length)等。
    • TLS/SSL 加密层头部(HTTPS 场景):
      • 包含记录类型(Record Type)、密钥交换信息、加密证书等,用于在应用层建立安全加密通道。

IP 分片

当一个超过 MTU(如 1500 字节)的 IP 数据包在网络层被切碎时,它的真实封装形式如下:

  1. 分片 1:[以太网头] [IP头 (MF=1, Offset=0)] [TCP头 | 业务数据部分1]
  2. 分片 2:[以太网头] [IP头 (MF=1, Offset=1480)] [业务数据部分2] (没有 TCP 头!)
  3. 分片 3:[以太网头] [IP头 (MF=1, Offset=2960)] [业务数据部分3] (没有 TCP 头!)
  4. 分片 4:[以太网头] [IP头 (MF=0, Offset=4440)] [业务数据剩余部分4] (没有 TCP 头!)

说明:

  1. 每个分片包的 IP 头部并不完全一样,关键控制字段在发生变化:
    • 片偏移(Fragment Offset):各个分片不同!用来告诉接收端这块数据在原始包里的位置(比如 0、1480、2960…)。
    • 前三个分片的 MF 位是 1(代表后面还有分片),最后一个分片(DATA ④)的 MF 位是 0(代表这是最后一个分片)。
    • 总长度(Total Length):前三个分片是 1500 字节,最后一个分片明显较小,总长度字段当然不同。
    • 在实际现代网络中,TCP 协议会尽量避免让 IP 层去切片。TCP 在握手时会协商 MSS(最大报文段长度,通常是 1460 字节)。
    • TCP 在传输层就会提前把大文件切成一个个刚好不超过 1460 字节的小块,每一块都独立加上自己的 TCP 头部。这样交给 IP 层时刚好不会超过 1500 字节的限制。

TCP 分段

当应用层向传输层交付大块业务数据(例如 10MB 的文件或 JSON 数据)时,TCP 协议栈会在数据进入网络层之前,主动将其切割为符合 MSS 要求的独立报文段。

TCP 分段的控制过程:

  1. 确定切片上限(MSS 协商):
    • 在 TCP 三次握手阶段,通信双方通过客户端与服务端的 SYN 报文协商各自的 MSS(Max Segment Size,最大报文段长度)。标准以太网环境下:
    • MSS = MTU(1500) − IP头部(20) − TCP头部(20) = 1460 字节
  2. 字节流切割与 Sequence Number 分配:
    • TCP 并不是按“包”来计数,而是将应用层数据看作连续的字节流。TCP 按照协商好的 MSS 将字节流切块,并为每个分段的 TCP 头部分配唯一的 Sequence Number(Seq 序号),代表该段数据第一个字节在整个数据流中的偏置位置。
  3. 独立封装与开启 DF 标志:
    • 每个切好的小数据块都会单独套上一个完整的 TCP 头部,随后交给 IP 层。IP 层为每个 TCP 段封装 IP 头部时,会将标志位里的 DF (Don’t Fragment) 设为 1,禁止中途路由器对其再次分片。

假设应用层一次性写入了 4380 字节(1460 × 3)的业务数据,TCP 在传输层将其切割并封装后的真实形式如下:

  1. 分段 1:[以太网头] [IP头 (DF=1)] [TCP头 (Seq=1, Len=1460) | 业务数据 1~1460 字节]
  2. 分段 2:[以太网头] [IP头 (DF=1)] [TCP头 (Seq=1461, Len=1460) | 业务数据 1461~2920 字节]
  3. 分段 3:[以太网头] [IP头 (DF=1)] [TCP头 (Seq=2921, Len=1460) | 业务数据 2921~4380 字节]

补充说明:

  1. 独立头部:与 IP 分片只有第 1 个包带 TCP 头不同,TCP 分段的每一个包都有完整且独立的 TCP 头部(包含端口号、Seq、Ack、Flags 等)。
  2. 独立重传:如果在传输过程中分段 2 丢包了,接收端可以通过 Ack 机制精准告知发送端“没收到 Seq=1461 的包”,发送端只需单独重传分段 2,而不需要像 IP 分片那样重传全部数据。

TCP

TCP 报文段

  1. 源端口 (Source Port) — 16 Bits (2 字节) 标识发送端的应用程序进程(如客户端随机端口,或服务端的 443 端口)。
  2. 目的端口 (Destination Port) — 16 Bits (2 字节) 标识接收端的应用程序进程(如服务端的 80、22 端口)。
  3. 序列号 (Sequence Number / SEQ) — 32 Bits (4 字节) 数据排号器(按字节编号)。标识本报文段所发送数据的第一个字节的序号。主要用于解决数据的乱序重组、去重以及按序拼接。
  4. 确认号 (Acknowledgment Number / ACK) — 32 Bits (4 字节) 期望接收的下一个字节序号。仅在标志位 ACK=1 时生效,告知对方“在此序号之前的数据均已成功接收”,是双向可靠传输的核心保障。
  5. 数据偏移 (Data Offset / Header Length) — 4 Bits 标明 TCP 首部长度。以 4 字节(32 位字)为单位,指出 TCP 首部共有多长。若无选项字段,其值为 5(即 5 × 4 = 20 字节),系统据此判断数据载荷从何处开始。
  6. 保留位 (Reserved) — 3 Bits 保留给未来协议扩展使用,目前发送方必须全部置 0。
  7. 控制标志位 (Control Bits / Flags) — 9 Bits 状态与控制开关。由 9 个独立的 1-Bit 开关组成,用于控制连接状态与传输行为:
    • NS (Nonce Sum):保护 ECN 免受恶意伪造(已废弃)。
    • CWR (Congestion Window Reduced):告知接收方已减小拥塞窗口。
    • ECE (ECN-Echo):告知发送方网络路径中遭遇了显式拥塞。
    • URG (Urgent):指示紧急指针字段有效。
    • ACK (Acknowledgment):指示确认号字段有效(除首个 SYN 包外均置 1)。
    • PSH (Push):要求接收方立即将缓冲区数据推交给应用层,无需等待填满。
    • RST (Reset):强制释放异常连接或拒绝非法请求。
    • SYN (Synchronize):同步序号,用于三次握手建立连接。
    • FIN (Finish):终止标记,用于四次挥手释放连接。
  8. 窗口大小 (Window Size) — 16 Bits (2 字节) 流量控制(滑动窗口)。接收方告知发送方“自己当前的接收缓冲区还能容纳多少字节”,防止发送方发送速度过快导致缓冲区溢出。
  9. 校验和 (Checksum) — 16 Bits (2 字节) 端到端数据完整性校验。覆盖 TCP 首部、数据载荷以及伪首部(含 IP 地址等),用于检测传输过程中是否发生比特差错。
  10. 紧急指针 (Urgent Pointer) — 16 Bits (2 字节) 当标志位 URG=1 时生效。指出紧急数据(Out-of-Band Data)在当前数据载荷中的结束位置,促使接收方优先处理。
  11. 选项与填充 (Options & Padding) — 0 到 40 字节(可选扩展字段)
    • 用于扩展 TCP 的高级性能特性,常见的选项包括:
      • MSS (Maximum Segment Size):握手时协商单包最大传输字节数(常见 1460 字节),避免 IP 层分片。
      • Window Scale (窗口扩大因子):突破 16 比特窗口限制,最高可将接收窗口扩展至 1 GB,适应高带宽长延迟网络。
      • SACK (Selective Acknowledgment):选择性确认,允许接收方告知发送方具体漏掉了哪段数据,实现精准重传。
      • Timestamps (时间戳):精确测量往返时间(RTT),同时防止高带宽下的序列号回绕(PAWS 机制)。
      • 填充位 (Padding):当选项长度不足 4 字节整数倍时自动补 0,确保首部按 32 位对齐。

网络基础
https://fu01.github.io/posts/91149a63/
作者
Fu01
发布于
2026年9月12日
许可协议