C++网络编程 1.网络编程基础
·
网络编程基础概念:从分类到核心协议
一、计算机网络的分类
计算机网络根据不同维度可分为多种类型,理解分类有助于掌握网络的应用场景和特性:
1. 按覆盖范围分类(最常用)
| 分类 | 覆盖范围 | 核心特点 | 典型例子 |
|---|---|---|---|
| 局域网(LAN) | 小范围(1km内) | 速度快(100Mbps~100Gbps)、延迟低、成本低,通常用于单一建筑或园区内互联。 | 家庭WiFi、公司内网、校园网 |
| 城域网(MAN) | 城市范围(10~100km) | 连接多个LAN,速度中等,用于城市内跨区域通信。 | 城市政务网、运营商城域骨干网 |
| 广域网(WAN) | 大范围(跨城市/国家) | 覆盖广、延迟较高(受距离影响),依赖公共通信设施(光纤、卫星)。 | 互联网(Internet)、跨国企业专网 |
| 个人局域网(PAN) | 极近距离(10m内) | 低功耗、短距离,用于个人设备互联。 | 蓝牙设备、ZigBee智能家居 |
2. 按拓扑结构分类
指网络中设备的连接方式,影响网络的可靠性和效率:
- 总线型:所有设备连在一条主干线上(如早期以太网),成本低但单点故障影响整个网络。
- 星型:所有设备通过交换机/路由器集中连接(现代主流),可靠性高(单设备故障不影响整体)。
- 环型:设备首尾相连成环(如令牌环网),数据单向传输,延迟稳定但环断则网络失效。
- 网状:多设备间多路径连接(如互联网骨干网),冗余性强、抗故障,但结构复杂。
3. 按传输介质分类
- 有线网络:通过物理线缆传输(光纤、双绞线、同轴电缆),速度快、抗干扰强(如家庭宽带、企业内网)。
- 无线网络:通过无线电波传输(WiFi、4G/5G、蓝牙),灵活性高但易受干扰(如手机热点、无线局域网)。
二、TCP/IP 分层模型
计算机网络的核心是“分层设计”,TCP/IP 模型是互联网的实际标准,将网络功能分为 4层(或简化为5层),每层专注于特定任务,层间通过接口通信。
TCP/IP 四层模型(核心)
| 分层 | 核心功能 | 核心协议/技术 | 数据单位 |
|---|---|---|---|
| 应用层 | 为用户提供具体服务(如浏览网页、文件传输),定义应用程序间的通信规则。 | HTTP、FTP、SMTP、DNS、SSH | 报文(Message) |
| 传输层 | 负责 端到端 数据传输(如从你的电脑到服务器),确保数据可靠/高效传递。 | TCP(可靠传输)、UDP(高效传输) | 段(Segment,TCP)/数据报(Datagram,UDP) |
| 网络层 | 负责 跨网络路由(如从局域网到广域网),选择数据传输的路径。 | IP(IPv4/IPv6)、ICMP(网络控制)、路由协议(OSPF/RIP) | 分组(Packet) |
| 网络接口层 | 负责 物理介质连接(如网线、WiFi),处理硬件设备的电信号/比特流传输。 | 以太网(Ethernet)、WiFi(802.11)、PPP | 帧(Frame) |
分层通信逻辑
- 数据封装:发送数据时,每层会给上层数据添加“头部”(含本层控制信息),最终通过物理层传输。例如:应用层数据 → 加TCP头部(传输层) → 加IP头部(网络层) → 加帧头部(网络接口层) → 转为比特流发送。
- 数据解封装:接收方从物理层开始,每层剥离本层头部,向上传递,最终还原应用层数据。
为什么分层?
- 模块化:每层独立开发,比如升级网络层协议(IPv4→IPv6)不影响应用层(HTTP仍可用)。
- 简化问题:将复杂的网络通信拆分为小任务,每层专注解决一个问题(如传输层管可靠,网络层管路由)。
核心概念:IP 地址与端口
- IP地址:网络层的核心标识,用于定位网络中的主机(类似 “家庭住址”)。IPv4 地址由 4 个 0-255 的数字组成(如 192.168.1.1),通过 IP 地址可确定数据要发送到哪台主机。
- 端口:传输层的核心标识,用于定位主机上的具体进程(类似 “家庭房间号”)。端口号范围 0-65535,其中 0-1023 是知名端口(如 HTTP 用 80,SSH 用 22)。
注意:通常情况下,一个端口只能对应一个进程,一个进程可占用多个端口(但一个端口同一时间只属于一个进程),通过 “IP 地址 + 端口” 可唯一确定网络中的一个通信端点(如 192.168.1.100:8080 定位某主机的 8080 端口进程)。
三、TCP 协议(Transmission Control Protocol)
TCP 是传输层的核心协议,主打 “可靠传输”,适用于对数据准确性要求高的场景(如文件传输、网页加载)。
核心特点
- 面向连接:通信前必须先建立连接(三次握手),通信结束后释放连接(四次挥手),类似“打电话”(先拨号,再通话,最后挂电话)。
- 可靠传输:通过一系列机制保证数据不丢失、不重复、按序到达(核心优势)。
- 面向字节流:数据被视为连续的字节序列,无固定大小限制(通过滑动窗口控制发送速率)。
- 拥塞控制:根据网络状况动态调整发送速率,避免网络拥堵(类似开车时根据路况减速)。
可靠传输核心机制
1. 三次握手(建立连接)
确保双方收发能力正常,步骤:
- 第一次:客户端 → 服务器:“我要连接你(SYN=1)”
- 第二次:服务器 → 客户端:“我收到了,我也准备好连接你(SYN=1, ACK=1)”
- 第三次:客户端 → 服务器:“我收到你的确认,连接建立(ACK=1)”
(为什么三次?避免“已失效的连接请求”突然到达服务器,导致错误连接)
2. 确认应答(ACK)与重传
- 发送方每发一段数据,会等待接收方回复“确认收到(ACK)”;
- 若超时未收到ACK,发送方会重传数据(解决数据丢失问题)。
3. 滑动窗口机制
- 允许发送方连续发送多段数据(无需等一个ACK再发下一个),提高传输效率;
- 窗口大小由接收方决定(告知发送方可连续发送的最大字节数),避免接收方缓冲区溢出。
4. 四次挥手(释放连接)
确保双方数据都传输完毕后再断开连接,步骤:
- 第一次:客户端 → 服务器:“我数据发完了,请求断开(FIN=1)”
- 第二次:服务器 → 客户端:“我收到断开请求,正在处理剩余数据(ACK=1)”
- 第三次:服务器 → 客户端:“我数据也发完了,可以断开(FIN=1, ACK=1)”
- 第四次:客户端 → 服务器:“收到,确认断开(ACK=1)”
(为什么四次?服务器收到断开请求后,可能还有数据未发完,需分两次确认)
适用场景
- 要求数据准确无误的场景:网页浏览(HTTP)、文件传输(FTP)、邮件发送(SMTP)、数据库交互。
常见问题
1.TCP三次握手:建立连接的“三次确认”逻辑
三次握手的过程
TCP建立连接时,客户端(Client)和服务器(Server)通过三个数据包交互完成握手,核心是确认双方的发送能力和接收能力均正常:
- 第一次握手(Client→Server):客户端发送
SYN包(同步序列编号),表示“我想和你建立连接,我的初始序号是 X”。此时客户端进入SYN_SENT状态,等待服务器回应。 - 第二次握手(Server→Client):服务器收到
SYN后,回复SYN+ACK包(同步+确认),表示“我收到你的请求了,我的初始序号是 Y,确认收到你的序号 X+1”。此时服务器进入SYN_RCVD状态,等待客户端确认。 - 第三次握手(Client→Server):客户端收到
SYN+ACK后,发送ACK包(确认),表示“我收到你的序号 Y+1 了,连接可以建立”。客户端进入ESTABLISHED状态;服务器收到ACK后,也进入ESTABLISHED状态,连接正式建立。
为什么必须是三次,不能更少(比如两次)?
核心原因:避免“无效连接请求”导致服务器资源浪费。
- 如果只进行两次握手:服务器收到客户端的
SYN后,直接进入连接状态并分配资源(如缓冲区、端口等),但无法确认客户端是否能收到自己的SYN+ACK。
举例:假设客户端发送的SYN包因网络延迟滞留,客户端超时后重新发送SYN并成功建立连接。一段时间后,延迟的SYN到达服务器,服务器会误认为是新连接请求,再次建立连接并分配资源,但客户端根本不需要这个连接,导致服务器资源被无效占用。 - 三次握手的关键:第三次
ACK让服务器确认“客户端已收到我的SYN+ACK”,确保双方都明确“对方能正常收发数据”,避免上述资源浪费问题。
2.TCP四次挥手:终止连接的“双向关闭”逻辑
四次挥手的过程
TCP终止连接时,双方需要分别关闭各自的发送通道(TCP是全双工通信,双方可独立发送数据),通过四个数据包完成:
- 第一次挥手(Client→Server):客户端发送
FIN包(结束标志),表示“我没有数据要发了,准备关闭我的发送通道”。客户端进入FIN_WAIT_1状态。 - 第二次挥手(Server→Client):服务器收到
FIN后,回复ACK包,表示“我收到你的关闭请求了,但我可能还有数据没发完,你先等一下”。服务器进入CLOSE_WAIT状态,客户端收到ACK后进入FIN_WAIT_2状态,等待服务器的剩余数据。 - 第三次挥手(Server→Client):服务器数据发送完毕后,发送
FIN包,表示“我也没有数据要发了,关闭我的发送通道”。服务器进入LAST_ACK状态。 - 第四次挥手(Client→Server):客户端收到
FIN后,回复ACK包,表示“我收到你的关闭请求了,确认关闭”。客户端进入TIME_WAIT状态(等待一段时间确保服务器收到ACK),服务器收到ACK后正式关闭连接。
为什么必须是四次,不能更少(比如三次)?
核心原因:TCP全双工通信需要“分别关闭”发送通道。
- 服务器收到客户端的
FIN后,可能还有未发送完的数据(例如服务器正在处理客户端的最后请求),因此不能立即发送FIN,必须先回复ACK确认“已收到关闭请求”,等数据发送完毕后再单独发送FIN关闭自己的通道。 - 这两个动作(确认关闭请求 + 发送自己的关闭请求)无法合并为一个包(三次挥手),因为中间存在“服务器处理剩余数据”的时间差。如果强行合并,可能导致服务器未发送完的数据丢失。
- 四次挥手本质是“双方各自关闭发送通道”的确认:客户端先关→服务器确认并处理数据→服务器再关→客户端确认,因此必须分四次完成。
总结
- 三次握手:通过“三次确认”避免无效连接占用服务器资源,确保双方收发能力正常。
- 四次挥手:因全双工特性,双方需分别关闭发送通道,服务器需先确认关闭请求再发送剩余数据,因此分成四次交互。
少一次会导致资源浪费或数据丢失,多一次则无必要(三次/四次已能完整确认状态)。这是TCP可靠性设计的核心逻辑。
四、UDP 协议(User Datagram Protocol)
UDP 是传输层的另一种核心协议,主打 “高效快速”,适用于对实时性要求高、可容忍少量数据丢失的场景。
核心特点
- 无连接:通信前无需建立连接,直接发送数据,类似“写信”(直接投递,不用提前通知)。
- 不可靠传输:不保证数据到达、不保证顺序、无重传机制(发送后不管结果)。
- 面向数据报:数据以“数据报”为单位发送,每个数据报有固定大小限制(通常 <64KB)。
- 低延迟:无握手/挥手、无确认重传,协议简单,传输效率高( overhead 小)。
适用场景
- 实时性优先,可容忍少量丢失:视频通话(如Zoom)、语音聊天(如微信电话)、直播流(RTSP);
- 广播/多播通信:如局域网内设备发现(DHCP)、实时游戏数据(位置同步);
- 简单控制指令:如物联网设备的简单命令(传感器数据上报)。
TCP vs UDP:核心区别对比
| 特性 | TCP(可靠传输) | UDP(高效传输) |
|---|---|---|
| 连接方式 | 面向连接(三次握手/四次挥手) | 无连接(直接发送) |
| 可靠性 | 保证不丢失、不重复、按序到达 | 不保证(可能丢失、乱序) |
| 速度 | 较慢(协议复杂,有确认/重传) | 较快(协议简单,无额外开销) |
| 数据单位 | 字节流(无固定大小) | 数据报(固定大小限制) |
| 适用场景 | 文件传输、网页、邮件 | 视频/语音通话、直播、游戏 |
总结
网络编程的基础离不开对网络分类、TCP/IP分层模型的理解,而TCP和UDP作为传输层的两大核心协议,分别对应“可靠”和“高效”两种需求。实际开发中,需根据业务场景选择合适的协议:追求准确选TCP,追求实时选UDP。后续网络编程实践(如Socket编程)也将围绕这些协议展开。
更多推荐

所有评论(0)