计算机⽹络背景
⽹络发展
独⽴模式 : 计算机之间相互独⽴;

⽹络互联:多台计算机连接在⼀起,完成数据共享;

局域⽹LAN:计算机数量更多了,通过交换机和路由器连接在⼀起;

⼴域⽹WAN:将远隔千⾥的计算机都连在⼀起;

所谓"局域⽹"和"⼴域⽹"只是⼀个相对的概念.⽐如,我们有"天朝特⾊"的⼴域⽹,也可以看做⼀个⽐ 较⼤的局域⽹。
计算机是⼈的⼯具,⼈要协同⼯作,注定了⽹络的产⽣是必然的.。
初识协议
• "协议"是⼀种约定.
• 打电话约定电话铃响的次数的约定

计算机之间的传输媒介是光信号和电信号.通过"频率"和"强弱"来表⽰0和1这样的信息.要想传递各 种不同的信息,就需要约定好双⽅的数据格式。
简单来说,网络协议就是计算机网络中各类设备传输数据所要共同遵守的规则、约定与标准。就像异地两人沟通需要约定共用的语种,计算机、交换机、路由器等硬件在交互报文时,也需要遵循统一协议,才能够正常发送、接收、解读数据。
核心要素
一份网络协议一般包含三个关键组成:
- 语法:规定数据的编码、排版与整体结构。例如 TCP 报文按照固定顺序:源端口、目的端口、首部长度、数据载荷依次排布。
- 语义:定义每个数据片段的实际含义和对应动作。比如报文内 ACK 字段代表确认收到数据,RST 字段代表强制断开连接。
- 时序:约束消息收发的先后顺序和传输速率。比如建立 TCP 连接必须按三次握手顺序交互,网络拥堵时发送方主动放缓发送速度。
一个生活中的比喻
想象日常寄快递的全过程:
- 语法:快递面单有固定填写格式,必须依次填写寄件人、收件人、货品内容,书写格式不能混乱。
- 语义:面单备注 "保价" 代表破损可赔付、"禁运品" 无法走空运,不同备注对应不同处理方案。
- 时序:先要打包贴单、快递员上门揽收,之后中转运输,最后上门配送,无法跳过揽收直接派送。
网络协议就是网络设备之间收发 "数字快递" 需要遵守的全套规则。
OSI七层模型
• OSI(OpenSystemInterconnection,开放系统互连)七层⽹络模型称为开放式系统互联参考 模型,是⼀个逻辑上的定义和规范;
• 把⽹络从逻辑上分为了7层.每⼀层都有相关、相对应的物理设备,⽐如路由器,交换机;
• OSI七层模型是⼀种框架性的设计⽅法,其最主要的功能使就是帮助不同类型的主机实现数据传 输;
• 它的最⼤优点是将服务、接⼝和协议这三个概念明确地区分开来,概念清楚,理论也⽐较完整. 通过七个层次化的结构模型使不同的系统不同的⽹络之间实现可靠的通讯;
• 但是,它既复杂⼜不实⽤;所以我们按照TCP/IP四层模型来讲解.


• 其实在⽹络⻆度,OSI定的协议7层模型其实⾮常完善,但是在实际操作的过程中,会话层、表⽰层 是不可能接⼊到操作系统中的,所以在⼯程实践中,最终落地的是5层协议。
• 但是要理解上⾯的话,需要我们学习完⽹络才可以理解,这⾥就知道就可以。
TCP/IP五层(或四层)模型
TCP/IP是⼀组协议的代名词,它还包括许多协议,组成了TCP/IP协议簇.
TCP/IP通讯协议采⽤了5层的层级结构,每⼀层都呼叫它的下⼀层所提供的⽹络来完成⾃⼰的需求.
| 层级 | 层级名称 | 核心职责 | 常用协议 | 寄快递类比 |
|---|---|---|---|---|
| 4 | 应用层 | 面向用户程序,提供各类网络业务服务 | HTTP、HTTPS、FTP、SMTP、DNS | 包裹里实际的货品(业务数据) |
| 3 | 传输层 | 主机间端到端连通,分可靠 / 高效两种传输 | TCP、UDP | 快递品类:普通稳妥件 (TCP)、极速快件 (UDP) |
| 2 | 网络层 | IP 寻址 + 跨网段路由,规划数据转发路径 | IP、ICMP、ARP | 快递面单收件地址(定位目标主机) |
| 1 | 网络接口层 | 依托物理介质传输原始比特数据流 | 以太网、WiFi、PPP、网卡驱动 | 运送包裹的货车、道路、航线 |

关键结构:沙漏模型💡
TCP/IP 整体是沙漏形状:中间网络层仅有 IP 协议(沙漏收窄的腰部),上层应用协议、下层物理链路协议种类繁多;所有软硬件都依靠 IP 协议实现互联互通,这也是互联网兼容性极强的根本原因。
补充:与 OSI 七层对应
- 应用层 = OSI 应用层 + 表示层 + 会话层
- 传输层 = OSI 传输层
- 网络层 = OSI 网络层
- 网络接口层 = OSI 数据链路层 + 物理层
网络传输基本流程
MAC 地址
每台主机在局域⽹上,要有唯⼀的标识来保证主机的唯⼀性:mac地址;相当于上网硬件的物理身份证,依靠它在局域网内定位目标设备。
1. 作用
用来唯一标识电脑网卡、手机无线网卡这类网络接口,在同一局域网里依靠 MAC 寻址找到目标主机,类比房屋独一无二的门牌号。
2. 格式规范
总长48bit(6 字节) ,日常书写采用十六进制 + 冒号分隔,示例:08:00:27:03:fb:19。
3. 出厂与修改特性
原生 MAC 在网卡出厂时固化写入硬件,默认不可修改;特例:虚拟机 MAC 为软件虚拟生成,容易出现地址冲突;部分实体网卡支持软件手动伪装修改 MAC。
生活化类比
MAC 地址 = 设备硬件门牌号,仅限小区(局域网)内部串门寻址使用。
局域网 通信原理
简单来说,局域网是由终端、交换设备、传输介质组成的本地内网,依托MAC 地址实现同网段设备通信,链路同一时刻仅单台设备发送数据,规避数据冲突。

一、局域网组成要素
- 终端设备:电脑、手机、打印机等,全部配备唯一 MAC 硬件地址;
- 网络交换设备:主流使用交换机,老式集线器基本淘汰;家用无线路由是交换机 + 路由器 + 无线 AP 的集成产品,它的 LAN 接口模块本质就是交换机;
- 传输介质:有线网线、无线 Wi-Fi。
二、两条核心通信规则
- 数据碰撞约束:同一条局域网链路任意时刻只允许一台设备向外发送数据,多设备并发发包会造成信号干扰,也就是数据碰撞;
- 报文筛选规则 :主机收到数据帧后,依靠目标 MAC 地址做校验,只有目标 MAC 和本机网卡 MAC 匹配,才收下报文,不匹配则直接丢弃数据包。
生活化类比(教室模型)
整个局域网等同于一间教室,交换机充当教室空间,所有联网设备是教室里的学生。同一时间只能一名学生开口说话,多人同时讲话就会嘈杂混乱(对应数据碰撞);点名喊话时全班都能收到声音,但只有名字被点到的学生(MAC 匹配)接收信息,其余学生忽略本次消息。
数据报头
简单来说,数据报头等同于包裹外层粘贴的快递面单,报文里的原始数据就是包裹内部货品;TCP/IP 传输时,数据每向下走一层就新增一层报头(封装),接收设备反向逐层拆除报头(解封装)。
一、报头核心作用
报头内置关键管控信息:源地址、目的地址、协议类型、分片序号、校验和;依靠这些信息定位收发设备、重组拆分数据、校验报文是否损坏,去掉报头后的原始内容称为数据载荷。
二、封装 & 解封装逻辑
- 封装(发送,自上而下):数据从应用层往底层传输,每层在数据前端拼接自身协议报头。
- 解封装(接收,自下而上):数据从物理比特流往上递交,每层剥离自身对应的报头,剩余内容交给上一层。
三、分层封装实例(原始数据:Hello)
- 应用层 :原生有效数据
Hello; - 传输层:拆分数据,附加 TCP/UDP 头部,生成传输段;
- 网络层:将传输段作为载荷,附加 IP 头部,生成 IP 数据包;
- 网络接口层:将 IP 包作为载荷,附加以太网 MAC 头部,最终转换成比特流完成物理传输。

四、收发流程总结
✅ 发送:应用数据 → TCP 报头 → IP 报头 → 以太网报头 → 二进制比特流
✅ 接收:比特流 → 去除以太网报头 → 去除 IP 报头 → 去除 TCP 报头 → 原始应用数据
生活化类比:每经过一层协议就多贴一张快递中转标签,收件时依次撕掉全部标签,取出最内侧货物。
Socket编程预备
理解源IP地址和⽬的IP地址
IP 在⽹络中,⽤来标识主机的唯⼀性。
简单来说,MAC 地址与 IP 地址是网络两套寻址标识,分工层级、作用范围完全不同,二者配合完成全网数据投递。
一、MAC 与 IP 地址对比
| 分类 | MAC 地址 | IP 地址 |
|---|---|---|
| 生活化类比 | 设备硬件身份证,出厂固定、终身不变 | 设备临时居住地址,切换 WiFi / 网络就会变更 |
| 工作层级 | OSI 数据链路层(第 2 层) | OSI 网络层(第 3 层) |
| 寻址范围 | 仅限同一局域网内部寻址(同小区上门派送) | 跨不同网段、全网路由寻址(跨省 / 跨国寄送) |
二、IP 的两个主流版本
- IPv4
- 格式:4 组十进制数字,小数点分隔,示例
192.168.1.1 - 缺陷:整体可用地址仅约 43 亿,受智能设备爆发影响,公网 IP 早已资源枯竭。
- IPv6
- 格式:多段十六进制字符,冒号分隔,示例
2001:0db8:85a3:0000:0000:8a2e:0370:7334 - 优势:地址空间近乎无限,彻底解决 IPv4 地址耗尽问题。
核心总结💡
IP 负责找到目标所在 "城市(网段)",MAC 负责在目标城市里精准找到 "具体住户(终端设备)"。
认识端⼝号
端⼝号( port )是传输层协议的内容.
• 端⼝号是⼀个 2 字节 16 位的整数;
• 端⼝号⽤来标识⼀个进程, 告诉操作系统, 当前的这个数据要交给哪⼀个进程来处理;
• IP地址 + 端⼝号能够标识⽹络上的某⼀台主机的某⼀个进程;
• ⼀个端⼝号只能被⼀个进程占⽤.
一、端口三段划分
| 端口分类 | 取值范围 | 使用说明 |
|---|---|---|
| 系统知名端口 | 0~1023 | 绑定系统服务、标准网络协议,启用一般需要管理员权限 |
| 注册端口 | 1024~49151 | 第三方软件、数据库、游戏等应用程序固定选用 |
| 动态私有端口 | 49152~65535 | 操作系统临时自动分配给客户端程序,用于临时通信 |
生活化类比:IP = 小区地址,端口 = 房间门牌号,数据依靠门牌号投递到对应 APP(微信 / 浏览器 / 数据库)。
二、常用服务默认端口汇总
| 端口 | 对应服务 | 作用 |
|---|---|---|
| 80 | HTTP | 明文网页访问 |
| 443 | HTTPS | 加密网页访问 |
| 21 | FTP | 文件传输 |
| 22 | SSH | 远程安全登录服务器 |
| 25 | SMTP | 发送邮件 |
| 110 | POP3 | 接收邮件 |
| 143 | IMAP | 云端同步收邮件 |
| 53 | DNS | 域名解析 |
| 3306 | MySQL | 数据库服务 |
| 5432 | PostgreSQL | 数据库服务 |
| 6379 | Redis | 缓存数据库 |
| 27017 | MongoDB | 文档数据库 |
| 8080 | 备用 HTTP 端口 | 项目测试、反向代理 |
总结💡
MAC→局域网找设备;IP→跨网段找主机;端口→主机内找软件,三层地址配合完成完整数据投递。
源端口 vs 目标端口
在通信中,每个数据包都包含两个端口:
目标端口:接收方服务的端口(如访问百度时,目标端口是80或443)。
源端口:发送方临时随机生成的端口(通常大于1024,由操作系统分配)。
为什么需要源端口?
为了让接收方回复数据时,知道应该发回到你设备上的哪个"房间"。例如,你的浏览器可能使用 49152 作为源端口发起请求,百度服务器回复时,目标端口就是 49152,你的操作系统就知道这是属于那个浏览器标签页的数据。
理解socket
•IP 地址⽤来标识互联⽹中唯⼀的⼀台主机, port ⽤来标识该主机上唯⼀的⼀个⽹络进程。
• IP+Port 就能表⽰互联⽹中唯⼀的⼀个进程
• 所以,通信的时候,本质是两个互联⽹进程代表⼈来进⾏通信,{srcIp,srcPort,dstIp,dstPort} 这样的4元组就能标识互联⽹中唯⼆的两个进程
• 所以,⽹络通信的本质,也是进程间通信
套接字socket=ip+port
为什么要引入 Socket?
IP + 端口 只是逻辑上的定位,但应用程序如何实际发送和接收数据?需要一套函数(API)来创建连接、读写数据、关闭连接。
Socket 就是这样一套标准的网络编程接口。它封装了底层的TCP/UDP协议细节,让开发者可以像操作文件一样(打开->读写->关闭)进行网络通信。
传输层的典型代表
认识TCP协议
TCP(传输控制协议)的设计目标是可靠、不丢失数据,宁可牺牲一部分传输速度和运行效率。
-
工作方式:面向连接。在正式传输数据之前,通信双方需要通过 "三次握手" 建立虚拟连接,就好比打电话需要先拨号、等待对方接通才能讲话;数据全部传输完毕后,还要通过 "四次挥手的流程断开连接。
-
核心机制:
- 确认与重传:发送端发出数据后,必须等待接收方返回收到数据的确认报文;如果超时没有收到确认,就判定数据包丢失,自动重新发送报文。
- 数据有序性:每个数据包都会携带序号,即便报文在网络中乱序抵达,TCP 也会在接收端重新整理排序,再把规整好的数据交给上层应用。
- 流量控制:发送端参考接收端剩余处理能力动态调节发包速率,避免接收方缓冲区满载、数据溢出被压垮。
- 拥塞控制:当探测到整条链路出现拥堵、丢包变多时,发送方主动放慢发送速度,减少网络负载,为其他通信链路让出带宽。
-
优点与缺点:
- 优点:传输可靠、数据有序、差错可控,发送什么内容,接收方就能完整收到一模一样的内容,报文顺序不会错乱。
- 缺点:传输速度偏慢、资源开销高,建立连接、应答确认、丢包重传、报文排序都会带来额外耗时,整体传输延迟更高。
-
典型应用:数据不允许出错、丢包的业务场景
- 网页浏览 (HTTP/HTTPS):网页代码、图片资源缺失任意字节,都会出现页面错乱、资源加载失败。
- 文件传输 (FTP):下载的文件一旦数据损坏,就无法正常打开使用。
- 电子邮件 (SMTP/POP3):邮件正文、附件内容不能出现缺失错乱。
- 数据库连接:业务读写的数据必须保证两边完全一致,不允许丢包篡改。
认识UDP协议
UDP(用户数据报协议)的设计目标是高效、快速,把可靠性保证交给上层的应用程序自己处理。
-
工作方式:无连接。发送方不管对方是否在线、是否准备好,也不管网络状况如何,直接把数据包发出去,就像在邮局寄出一封明信片,不确认对方是否收到。
-
核心机制:极简设计。它几乎什么可靠机制都没有,没有确认、没有重传、没有排序、没有流量和拥塞控制。UDP 唯一做的事就是:给数据包加上端口号,然后扔到网络里。
-
优点与缺点:
- 优点:速度快、开销小、延迟低。不需要握手、确认等冗余流程,代码简单,占用主机系统资源极少。
- 缺点 :传输不可靠。数据可能丢失、重复、乱序,发送方无法感知数据异常,收到什么数据全由应用自行处理容错。
-
典型应用:适配高实时、可少量丢包的业务场景
- 实时音视频通话 (VoIP, 视频会议):偶尔花屏或卡顿一下可以接受,但如果为了等待丢包重传而产生延迟,对话体验会严重变差。
- 在线游戏:游戏里角色位置、动作的数据频繁更新,丢掉一两个最新的状态包影响不大,但用 TCP 等待重传会出现明显操作卡顿。
- 直播流媒体:直播偶尔出现马赛克或跳帧可以忍受,TCP 重传带来的持续缓冲等待会严重影响观看体验。
- 域名系统 (DNS):查询域名对应 IP 属于简短一问一答,单次 UDP 报文即可完成交互,传输效率最高。
⽹络字节序
我们知道内存、磁盘里的多字节数据分大端、小端存储,网络数据流同样存在字节序差异,TCP/IP 协议就规定了统一的网络字节序规范。
-
定义规则 网络字节序固定为大端序 ,简单来讲:多字节数据的高位字节保存在内存低地址处,网络传输时优先发送高位字节。例如十六进制
0x12345678,在网络中发送顺序为12 34 56 78,最高位12最先发出。 -
引入网络字节序的原因 不同 CPU 架构默认主机字节序各不相同:大端架构包含 PowerPC、68k、默认工作在大端模式的 ARM;小端架构包含 x86、x86_64、常态运行在小端模式的 ARM。若没有统一标准,两端设备直接传输原生内存数据,接收端解析出来的数字会完全错乱,比如
0x12345678在小端主机上会被解析成0x78563412。因此程序中所有多字节整型数据(uint16_t、uint32_t),在填入发送缓冲区之前,都要通过系统函数转换成标准网络字节序。 -
四类字节序转换标准函数
cppuint32_t htonl(uint32_t hostlong); // 32 位主机长整型 → 网络字节序 uint16_t htons(uint16_t hostshort); // 16 位主机短整型 → 网络字节序 uint32_t ntohl(uint32_t netlong); // 32 位网络字节序 → 本机主机序 uint16_t ntohs(uint16_t netshort); // 16 位网络字节序 → 本机主机序