OSI模型

TCP/IP协议族
TCP/IP协议族体系结构

TCP/IP与OSI对比
| OSI七层模型 | TCP/IP四层模型 | 核心功能 | 典型协议/技术 |
|---|---|---|---|
| 应用层 | 应用层 | 直接面向用户,提供网络服务 | HTTP, FTP, SMTP, DNS |
| 表示层 | (合并至应用层) | 数据格式转换、加密/压缩 | JPEG, SSL/TLS, ASCII |
| 会话层 | (合并至应用层) | 建立/维护/终止会话连接 | NetBIOS, RPC |
| 传输层 | 传输层 | 端到端可靠传输、流量控制 | TCP(可靠)、UDP(高效) |
| 网络层 | 网络层 | 路由选择、IP寻址 | IP, ICMP, ARP |
| 数据链路层 | 网络接口层 | 相邻节点帧传输、错误检测 | Ethernet, Wi-Fi, MAC地址 |
| 物理层 | (合并至网络接口层) | 物理介质传输比特流 | 光纤、网线、无线电波 |
TCP协议
TCP三大核心特性
①面向连接
三次握手:建立连接像打电话
客户端:喂,听得到吗?(SYN)
服务端:嗯,听得到,你听得到我吗?(SYN-ACK)
客户端:我也听得到!(ACK)
四次挥手:告别要礼貌
A:我说完了,准备挂啦(FIN)B:好的,等我再说最后一句...(ACK)
B:我也说完了(FIN)
A:拜拜!(ACK)
②可靠传输
丢包重传:发快递时,快递员会电话确认你是否收到
数据排序:把乱序的拼图重新排好
③流量控制
滑动窗口:根据接收方能力动态调整发送速度(别把对方"噎死")
IP/端口/MAC地址
IP/端口/MAC地址IP地址(IPV4/IPV6)
定义:逻辑地址(例:192.168.1.1)
作用:网络层寻址,定位设备在网络中的位置
端口
定义:0~65535的整数(例:HTTP用80端口)
作用:区分同一设备上的不同应用
MAC地址
定义:物理地址(例:00-1A-2B-3C-4D-5E)
作用:数据链路层唯一标识网卡
物理层与MAC地址
物理层
传输介质
负责通过电缆、光纤、无线电波等物理媒介传输原始比特流(0和1)
信号处理
将数字信号转换为适合传输的模拟信号(的QAM调制)如Wi-Fi
定义比特与电/光信号的映射规则(如曼彻斯特编码)
关键特性
物理层仅关注信号传输质量,不识别设备地址
依赖网卡、交换机端口、光纤收发器等设实现物理层功能备
MAC层
MAC子层(介质访问控制层)
核心职责:
•控制设备如何访问共享物理介质(如以太网、Wi-Fi)
•定义帧(Frame)的封装格式,包括源/目标MAC地址
•实现冲突检测与避免(如CSMA/CD用于以太网,CSMA/CA用于Wi-Fi)
LLC子层(逻辑链路控制层)
核心职责:
•提供逻辑链路标识(通过SAP服务访问点)
•实现流量控制与错误恢复(如滑动窗口协议)
物理层与MAC层的协作

MAC地址
MAC地址的结构与特性
•格式:48位(6字节),十六进制表示(如00:1A:2B:3C:4D:5E)
•全球唯一性:由IEEE分配给厂商(前24位为OUI),确保无重复
•不可路由性:仅在局域网内有效,无法跨网络直接寻址
MAC地址的作用场景核心职责:
•局域网通信:交换机通过MAC地址表转发帧
•ARP协议:将目标IP地址解析为MAC地址(局域网内)
•安全过滤:网络接入控制(如MAC地址白名单)
局域网内主机A向主机B发送数据:

数据链路层(MAC子层)
•主机A封装帧,目标MAC为主机B的地址
物理层•将帧转换为电信号,通过网线传输
交换机处理•物理层接收电信号,还原为帧
•交换机检查目标MAC地址,查表确定转发端口
主机B接收•物理层接收信号,还原为帧
•MAC子层校验MAC地址,若匹配则传递给上层
网络层与IP协议
常用网络层协议
| 协议 | 全称 | 功能 | 应用场景 |
|---|---|---|---|
| IP | Internet Protocol | 数据包路由与寻址 | 所有互联网通信的基础 |
| ICMP | Internet Control Message Protocol | 网络诊断与错误报告 | ping命令检测连通性 |
| ARP | Address Resolution Protocol | 将IP地址解析为MAC地址 | 局域网内设备通信 |
| RARP | Reverse Address Resolution Protocol | 将MAC地址解析为IP地址 | 无盘工作站启动 |
| IGMP | Internet Group Management Protocol | 管理组播组成员 | 视频会议、直播 |
| OSPF | Open Shortest Path First | 动态路由协议(链路状态算法,内部网关协议) | 企业内网 |
| BGP | Border Gateway Protocol | 自治系统(AS)间路由交换(外部网关协议) | 互联网骨干路由 |
ARP协议(地址解析协议)的工作流程如下:
-
检查缓存:主机A要发送数据给主机B(已知B的IP地址),先查看本机ARP缓存中是否有B的IP对应的MAC地址。
-
发送广播请求:若无,主机A广播一个ARP请求包,包含自己的IP和MAC,以及目标IP(B的IP),询问"谁的IP是xx?请告诉你的MAC地址"。
-
目标响应:同一网络中的所有设备收到广播,只有目标主机B识别出自己的IP,会单播回复一个ARP应答包,包含自己的MAC地址。
-
更新缓存:主机A收到应答后,将B的IP与MAC映射存入ARP缓存,然后利用该MAC地址封装数据帧进行通信。
协议详解与协作关系
IP协议
功能:
•寻址:通过IP地址唯一标识设备(IPv4:32位,IPv6:128位)
•路由:基于路由表选择最佳传输路径
•分片与重组:当数据包超过链路MTU时进行分片,接收端重组
关键特性:
•无连接:发送前不建立专用通道
•不可靠:依赖上层协议(如TCP)保证可靠性
ICMP协议
功能:
•错误报告:当IP数据包传输失败时,向源端发送错误消息(如目标不可达、超时)
•网络探测:通过ping测试连通性,traceroute追踪路径
ARP协议(IP->MAC)
工作流程:
•主机A广播ARP请求:"谁的IP是192.168.1.2?请告诉MAC地址"
•主机B单播回复:"我是192.168.1.2,我的MAC是00:1A:2B:3C:4D:5E"
ARP缓存表:临时存储IP-MAC映射,减少重复查询
RARP协议(MAC->IP)
应用场景:无盘工作站从服务器获取IP地址(现多被DHCP取代)、
IGMP协议
功能:
•成员管理:主机加入或离开组播组(如239.255.255.250)
•组播路由:路由器通过IGMP报文维护组播组成员信息
应用场景:
•IPTV直播(同时向多个用户发送相同视频流)
•在线会议(一对多音视频传输

IP数据包结构
|-----|------|-----------|-----|-----|
| 版本号 | 首部长度 | 服务类型(TOS) | 总长度 ||
| 标识 ||| 标志位 | 片偏移 |
| 生存时间(TTL) || 协议 | 首部检验和 ||
| 源IP地址 |||||
| 目的IP地址 |||||
| 选项字段(长度可变) ||| 填充 ||
| 数据 |||||
|----------------------|---------------------|--------------------------------------------------------------------|-----|------------------------------|
| 版本号(4bit): IPV4/IPV6 | 首部长度(4bit): 数据包头的长度 | 服务类型(TOS)(8bit): 最初用于定义优先级、延迟、吞吐量等服务质量,现在多用于区分服务,标记流量类别(如视频、语音优先级) | 总长度(16bit): 整个IP数据包的总长度(头部+数据)(16bit)最大长度为2^16 --1 = 65535字节,超过下层数据链路协议MTU时需要分片 ||
| 标识(16bit): 唯一标识一个数据包,同一个数据包的不同分片共享相同标识,便于重组 标志(3bit): •第一位bit未启用,保留始终为0 •第二位bit表示禁止分片,若为1则不需要分片,则当数据包超过MTU时会被丢弃,0则需要分片 •第三位bit表示更多分片,1表示后续还有分片,0表示最后一个分片 ||| 标志位 | 片偏移(13bit): 指示当前分片在原始数据包中的位置 |
| 生存时间(TTL)(8bit ): 防止数据包无限循环。每经过一个路由器减1,当TTL=0时,丢弃数据包并发送ICMP超时消息 || 协议(8bit): •6:TCP •17:UDP •1:ICMP | 头部校验和(16bit): 仅校验头部数据完整性,不包括数据部分。接收方重新计算校验和以验证是否出错 ||
| 源地址(32bit ): 发送方的IPV4地址 |||||
| 目的地址(32bit): 接收方的IPV4地址 |||||
| 选项(可变,最多40字节): 扩展功能(如记录路由、时间戳等),比较少用,存在时,头部长度需要相应的增加 ||| 填充 ||
| 数据 |||||
网络层与IP协议
IP地址解析(以IPV4为例)
点分十进制形式:192.168.1.1
二进制视角:32位二进制数,分为4个8位组(如11000000.10101000.00000001.00000001 →192.168.1.1)
主机号:1
网络号:192.168.1.0
IPV4地址分类

私有地址
| 类别 | 地址范围 | 应用场景 |
|---|---|---|
| A 类 | 10.0.0.0 ~ 10.255.255.255 | 大型企业内网 |
| B 类 | 172.16.0.0 ~ 172.31.255.255 | 中型机构 |
| C 类 | 192.168.0.0 ~ 192.168.255.255 | 家庭 / 小型办公室 |
子网掩码
子网掩码:
A类默认子网掩码:255.0.0.0
B类默认子网掩码:255.255.0.0
C类默认子网掩码:255.255.255.0
核心功能
定义网络边界:明确IP地址中哪部分是网络号,哪部分是主机号
二进制特性:由连续的1和连续的0组成(如11111111.11111111.11111111.00000000 → 255.255.255.0)
子网掩码表示方式
点分十进制:255.255.255.0
CIDR表示法(废除传统分类,允许灵活划分):/24表示前24位为网络号
子网掩码的运作逻辑
按位与运算:将IP地址和它的子网掩码进行与运算得到网络地址
IP地址:192.168.1.100 → 11000000.10101000.00000001.01100100
子网掩码:255.255.255.0 → 11111111.11111111.11111111.00000000
网络号:11000000.10101000.00000001.00000000 → 192.168.1.0
划分子网的方法
以C类地址192.168.1.0/24为例
•首先确定需求子网数目,例如需要4个子网
•计算所需主机位数2^n >=子网数,此时n=2(2^2 = 4)
•新子网掩码=原掩码+ n,/24->/26 (255.255.255.192)
•计算子网地址范围,子网1:192.168.1.0/26
子网划分详细计算
•每个子网的主机数量:2(^32−新掩码位数) −2(减2是排除网络地址和广播地址)
•/26→2^6−2=62台主机/子网
| 子网 | 网络地址 | 可用IP范围 | 广播地址 |
|---|---|---|---|
| 子网1 | 192.168.1.0 | 192.168.1.1 ~ 192.168.1.62 | 192.168.1.63 |
| 子网2 | 192.168.1.64 | 192.168.1.65 ~ 192.168.1.126 | 192.168.1.127 |
| 子网3 | 192.168.1.128 | 192.168.1.129 ~ 192.168.1.190 | 192.168.1.191 |
| 子网4 | 192.168.1.192 | 192.168.1.193 ~ 192.168.1.254 | 192.168.1.255 |
IPV6
•地址长度:128位→ 理论地址数量≈3.4×10383.4×1038(地球每平方米6.5×10236.5×1023个地址)
•简化头部:固定40字节,取消校验和(交由上层协议处理)
•地址类型:单播、组播、任播
•示例:简化写法(十六进制分段):2001:0db8:85a3::8a2e:0370:7334(::表示连续0的缩写)
路由
核心功能:

路由过程示例:

传输层与端口
传输层的核心使命:
功能定位
•端到端通信:为不同主机上的应用进程提供逻辑通信(网络层负责主机到主机)
•两大核心服务:
•可靠传输(TCP)
•高效传输(UDP)
端口的本质
•定义:16位整数(0~65535),与IP地址共同组成套接字(Socket),唯一标识通信端点
•示例:192.168.1.100:8080 表示IP为192.168.1.100的设备上运行在8080端口的应用
端口的核心作用
•服务标识:客户端通过端口号访问特定服务(如HTTP默认80端口)
•并发支持:服务端通过不同端口同时处理多个请求
传输层与端口
端口分类与规则:
1、端口号范围
| 类别 | 范围 | 说明 |
|---|---|---|
| 公认端口 | 0~1023 | 系统级服务(需要管理员权限) |
| 注册端口 | 1024~49151 | 用户级应用(需要向 IANA 注册) |
| 动态端口 | 49152~65535 | 客户端临时使用(操作系统自动分配) |
2、常见端口示例
| 端口 | 协议/服务 | 用途 |
|---|---|---|
| 22 | SSH | 安全远程登录 |
| 80 | HTTP | 网页传输 |
| 443 | HTTPS | 加密网页传输 |
| 3306 | MySQL | 数据库服务 |
| 53 | DNS | 域名解析 |
传输层协议与端口的协作
TCP协议
端口使用场景:
服务端:绑定固定端口(如Web服务器监听80端口)
客户端:使用动态端口发起连接(如手机APP随机使用50000端口访问服务器)
三次握手中的端口交互:
•客户端:SYN(源端口=50000,目标端口=80)
•服务端:SYN-ACK(源端口=80,目标端口=50000)
•客户端:ACK(源端口=50000,目标端口=80)
UDP协议端口使用特点:
•无需预先建立连接,直接通过端口发送数据包
•客户端和服务端端口的使用方式与TCP类似,但无连接状态
典型应用:
•DNS查询:客户端从53端口获取域名解析结果
•实时音视频:Zoom使用UDP端口传输媒体流
多路复用/解复用
发送方(复用):将不同应用的数据封装到不同端口的报文段
接收方(解复用):根据目标端口号将数据分发给正确的应用进程
传输层与网络层的协作流程:

Socket = IP地址+ 端口号+ 协议类型
示例:TCP 192.168.1.100:8080 表示一个TCP通信端点
应用层与架构模式
应用层
功能定位
•服务提供:为终端用户提供具体网络服务(如网页浏览、文件传输、邮件收发)
•协议实现:定义数据格式和交互规则(如HTTP、FTP、SMTP)
•核心特性:
•用户可见:直接面向用户操作(如浏览器输入URL)
•协议多样性:不同服务对应不同协议(DNS用于域名解析,WebSocket用于实时通信)
| 协议 | 全称 | 用途 | 默认端口 |
|---|---|---|---|
| HTTP | HyperText Transfer Protocol | 网页数据传输 | 80/TCP |
| HTTPS | HTTP Secure | 加密网页传输 | 443/TCP |
| FTP | File Transfer Protocol | 文件上传下载 | 21/TCP |
| SMTP | Simple Mail Transfer Protocol | 邮件发送 | 25/TCP |
| DNS | Domain Name System | 域名解析(域名→IP) | 53/UDP |
架构模式
C/S架构(Client-Server)
核心思想:
•客户端:发起请求(如微信桌面端)
•服务器:集中处理请求并响应(如腾讯聊天服务器)
典型协议:SMTP(邮件客户端与邮件服务器通信)
优缺点:
优点:
•高性能:客户端可分担计算压力(如游戏本地渲染)
•功能定制化:客户端可深度优化用户体验
缺点:
•维护成本高:需为不同平台开发客户端(Windows、macOS、Android等)
•升级困难:用户需手动更新客户端版本
B/S架构(Browser-Server)
核心思想:
•浏览器:统一客户端(如Chrome、Firefox)
•服务器:提供Web服务(如Nginx、Apache)
典型协议:HTTP/HTTPS
优缺点:
优点:
•跨平台:任何设备通过浏览器即可访问
•易维护:服务端更新即全网生效
缺点:
•性能受限:复杂计算依赖服务端(如在线视频编辑)
•功能限制:浏览器沙箱环境限制硬件访问(如摄像头需授权)
套接字与字节序
套接字
为应用程序提供统一的网络通信能力(如同电话插孔标准化连接方式)
抽象底层协议细节(TCP/UDP),开发者聚焦业务逻辑
套接字编程流程:

套接字类型:
| 类型 | 协议 | 特性 | 应用场景 |
|---|---|---|---|
| 流式套接字 (SOCK_STREAM) | TCP | 可靠、面向连接、双向字节流 | 网页、文件传输 |
| 数据报套接字 (SOCK_DGRAM) | UDP | 不可靠、无连接、数据包独立 | 实时音视频、DNS查询 |
| 原始套接字 (SOCK_RAW) | 自定义 (如 ICMP) | 直接访问底层协议 | 网络诊断工具 (ping) |
网络字节序与主机字节序
字节序的本质
定义:多字节数据(如int、float)在内存中的存储顺序
两种类型:
•大端序(网络字节序):高位字节在前(人类书写习惯,数据的高字节保存在内存的低地址中,而数据的低字节,保存在内存的高地址中),比如0x1234存储为12 34
•小端序(主机字节序):低位字节在前(x86/ARM架构,数据的高字节保存在内存的高地址中,而数据的低字节,保存在内存的低地址中),比如0x1234存储为34 12

大小端转换:
头文件:#include <arpa/inet.h>
1、htonl()函数
作用:主机→ 网络序(32位,如IPv4地址)
函数原型:uint32_t htonl(uint32_t hostlong)
参数:hostlong表示主机字节顺序的32位数
返回值:32位的网络字节顺序
2、htons()函数
作用:主机→ 网络序(16位,如端口号)
函数原型:uint16_t htons(uint16_t hostlong)
参数:hostlong表示主机字节顺序的16位数
返回值:16位的网络字节顺序
3、ntohl()函数
作用:网络→ 主机序(32位)
函数原型:uint32_t ntohl(uint32_t hostlong)
参数:hostlong表示网络字节顺序的32位数
返回值:32位的主机字节顺序
4、ntohs()函数
作用:网络→ 主机序(16位)
函数原型:uint16_t ntohs(uint16_t hostlong)
参数:hostlong表示网络字节序顺序的16位数
返回值:16位的主机字节顺序
inet_addr()函数
作用:将点分十进制字符串转换成网络字节序的无符号四字节整型
函数原型:uint32_t inet_addr(const char *cp);
参数:cp是一个指向以null结尾的字符串的指针,该字符串表示一个点分十进制的IPv4地址(例如"192.168.1.1")
返回值:32位的无符号长整型值(IPV4地址)
inet_ntoa()函数
作用:将网络字节序的无符号四字节整型转换成点分十进制字符串
函数原型:char *inet_ntoa(struct in_addrin);参数:in一个in_addr结构体,其中包含要转换的网络字节序IPv4地址
返回值:指向静态分配的字符串的指针,该字符串包含点分十进制的IP地址