一、计算机网络发展历程

  • 独立模式: 计算机相互独立,数据不共享,效率极低,需人工传递数据。

  • 网络互联: 多台计算机直接相连,实现基础数据共享,解决了单机数据孤岛问题。

  • 局域网(LAN): 同一区域内的计算机通过交换机、路由器互联,支持多设备高效通信,实现了本地资源共享。

  • 广域网(WAN): 通过路由器连接多个局域网,跨越地域限制,实现全球范围的数据通信。局域网和广域网是相对概念,规模不同而已。

二、初识网络协议

  • 协议的本质: 双方约定的通信规则。计算机间通过光电信号的频率 / 强弱表示 0 和 1,必须约定统一的数据格式才能正常通信。

  • 为什么需要标准网络协议: 不同厂商的硬件、操作系统、设备要顺畅通信,必须遵守统一标准,这就是网络协议。

  • 主要标准制定组织:

    • IEEE:制定局域网标准(如 802 系列)
    • ISO:定义 OSI 七层模型
    • IETF:制定 TCP/IP 协议族(通过 RFC 发布)
    • ITU:制定电信领域国际标准

三、协议分层

  • 协议本质是软件,采用分层结构设计,实现模块化与解耦,降低维护成本。

以两层协议为例:
语言层: 约定沟通的语言(如汉语 / 英语),只关心内容表达。
通信设备层: 约定传输方式(如电话 / 无线电),只关心信号传输。

分层的核心优势:

  • 层与层之间独立修改互不影响(比如只换设备,不影响语言沟通;或只换语言,不影响电话传输)。
  • 让复杂的网络通信拆解为多个独立、简单的模块,更易维护和扩展。

四、OSI 七层模型

  • 定义: OSI(开放系统互连)七层模型是网络通信的理论框架,将通信逻辑分为七层,每层分工明确。
  • 核心特点: 清晰区分服务、接口和协议,理论完整,但设计复杂,实际不直接使用。
  • 工程实践: 落地中常用 TCP/IP 四层模型(或五层模型,将会话层、表示层并入应用层)。

模型各层核心职责(关键三层):

层级 核心作用
物理层 定义网线、连接器等硬件规格,把比特流转为光电信号传输
数据链路层 负责设备间帧传输、差错校验,实现分段转发
网络层 管理 IP 地址、路由选择,决定数据传输路径

五、 TCP/IP 五层(四层)模型

层级 核心职责 典型协议 / 设备
应用层 应用程序间的通信,如网页、邮件、文件传输 HTTP/FTP/SMTP,网络编程主要针对这一层
传输层 主机间的端到端数据传输,保证可靠性 TCP(可靠)、UDP(高效)
网络层 IP 地址管理、路由选择,规划传输路径 IP/ICMP,路由器工作在此层
数据链路层 设备间数据帧传输、差错校验、冲突检测 以太网协议,交换机工作在此层
物理层 光 / 电信号的传输介质,定义网线、无线等硬件标准 双绞线、光纤、Wi-Fi,集线器工作在此层

物理层常被忽略,因此也常称为TCP/IP 四层模型

四、再识网络协议

  • 为什么需要 TCP/IP?
    主机间通信距离变远,出现路由寻址、数据丢失、应用识别等新问题,需要一套分层解决方案,这就是 TCP/IP 协议。

  • 协议本质是什么?
    通信双方约定的结构化数据格式,就像主机 A/B 都认识同一个struct protocol,才能正确解析数据。分层后,每层都有自己的协议,只处理对应问题。
    在这里插入图片描述

  • TCP/IP 与操作系统的关系

    • 不同系统(Windows/Linux)可共存,但协议栈实现必须统一,才能互相通信。
    • 网络层、传输层(IP/TCP)由操作系统内核实现;应用层由用户程序实现。
      在这里插入图片描述

五、网络传输基本流程

局域网通信原理

  • 同一局域网内的主机可直接通信,通过MAC 地址(48 位硬件地址)标识唯一节点。
  • 数据发送时,所有主机都会收到报文,通过目标 MAC 地址判断是否接收,非目标主机直接丢弃。
  • 早期以太网无交换机时属于 “碰撞域”,多主机同时发送会产生数据冲突,需碰撞检测避免干扰。
    在这里插入图片描述

封装与解包
主机 A 发送数据到主机 B 时,会经历自上而下的封装自下而上的解包:

层级 发送端(封装) 接收端(解包) 数据名称
应用层 添加应用层报头 解析应用层报头,交付给对应程序 数据
传输层 添加 TCP/UDP 报头 解析传输层报头,根据端口号交付 段(Segment)
网络层 添加 IP 报头 解析 IP 报头,判断目标主机 数据报(Datagram)
数据链路层 添加 MAC 帧头 解析 MAC 帧头,校验并交付上层 帧(Frame)

在这里插入图片描述

关键概念

  • 报文组成: 报文 = 报头(协议控制信息) + 有效载荷(上层数据)
  • 封装: 每层为数据添加对应协议报头,形成新的报文。
  • 解包 / 分用: 接收端逐层剥离报头,根据报头信息将数据交付给上层协议。
  • 同层通信: 每层都认为自己在和对方主机的同层协议直接通信,实际是通过下层协议传递。

数据包封装与分用

  1. 封装过程(发送端)
    用户数据从应用层向下传递,每层协议都会在数据前添加自己的协议报头,层层包裹:
  • 应用数据 → 加 TCP/UDP 报头(传输层) → TCP 段
  • TCP 段 → 加 IP 报头(网络层) → IP 数据报
  • IP 数据报 → 加以太网帧头 / 尾(数据链路层) → 以太网帧
  1. 分用过程(接收端)
    数据帧到达后,自下而上逐层解析、剥离报头,再交付给上层:
  • 以太网驱动根据帧类型,交付给 IP/ARP/RARP 协议
  • IP 层根据协议号,交付给 TCP/UDP/ICMP 等上层协议
  • TCP/UDP 根据端口号,交付给对应的应用程序

认识 IP 地址

  • IP 地址基础: IPv4 地址是 32 位整数,用点分十进制(如192.168.0.1)表示,用于标识网络中的主机。
  • 跨网段传输: 不同网段的主机通信必须经过路由器转发。
  • IP 层核心作用: 屏蔽以太网、令牌环等底层网络差异,为上层(TCP/FTP)提供统一通信接口,实现跨网络端到端传输。

为什么先找路由器: 主机判断目标 IP 不在本地网段,无法直接通信,必须把数据发给网关(路由器)转发。
目的 IP 的意义: 标识通信的最终目标主机,全程不变,是路由器选路、跨网段找到目标的核心依据。

  • 路由器的核心操作: 收到数据后,解包到网络层读取目的 IP,查路由表确定转发路径;再重新封装 MAC 帧,更新源 / 目的 MAC 地址后转发。

  • 本质: IP 决定最终去哪,MAC 决定当前网段下一跳发给谁。
    在这里插入图片描述

  • IP 地址 vs MAC 地址

    • IP 地址: 全程不变,标识最终的源 / 目标主机,是路由选路的 “长远目标”。
    • MAC 地址: 每经过一跳路由器就会重新封装更新,仅标识当前局域网的下一跳设备,是局域网转发的 “阶段目标”。
  • IP 网络层的意义: 提供统一的虚拟网络层,屏蔽以太网、令牌环等底层物理网络的差异,让上层协议无需关心底层细节,实现跨网络通信。

六、Socket 编程预备

1、IP 地址

  • IP 地址的作用: IP 地址(比如图里的 192.168.2.3)的作用,是在整个网络中唯一标识一台主机。它负责把数据报文从发送方主机,一路路由到目标主机。

  • 数据传输的 “最终目的”: 数据到达主机,并不是传输的终点。因为最终使用数据的,是主机里运行的进程

    • 聊天数据要交给 QQ 进程
    • 下载数据要交给迅雷进程
    • 网页数据要交给浏览器进程
  • 新的问题:主机里怎么区分不同进程?

    • 一台主机上同时运行着大量进程,当数据到达主机后,系统需要一个机制,把数据精准转发给对应的进程。
    • 所以,我们除了用 IP 标识主机,还需要一个标识来区分主机内的进程,这个标识就是端口号(Port)
    • IP + 端口号,就构成了网络中进程的唯一标识,也就是我们 Socket 编程的核心基础。

2、端口号(Port)

端口号是什么?
:端口号(Port)是传输层的概念,是一个 16 位整数(范围 0-65535),作用是唯一标识主机内的一个进程
它解决了 “数据到了主机,该交给哪个进程” 的问题。

端口号的核心规则

  • IP + 端口号: 唯一标识网络中的一个进程。
  • 唯一性: 一个端口号同一时间只能被一个进程占用;但一个进程可以绑定多个端口号。
  • 范围划分:
    • 0-1023:知名端口号(固定分配给 HTTP、FTP 等标准服务,比如 HTTP 用 80)。
    • 1024-65535:动态 / 私有端口号,客户端程序的端口由系统从这里分配。

端口号 vs 进程 ID(PID)
两者都能标识进程,但设计目的不同:

  • PID: 是操作系统层面的进程标识,和网络无关。
  • 端口号: 是网络层面的进程标识,专门为网络通信设计,解耦了系统进程管理和网络通信。

源端口号 & 目的端口号
TCP/UDP 的数据段里,都包含这两个端口号:

  • 源端口号: 标记 “数据是谁发的”。
  • 目的端口号: 标记 “数据要发给谁”。

Socket 的本质

  • 单个 IP+Port:标识网络中的一个进程
  • 通信时的四元组 {源IP, 源Port, 目的IP, 目的Port}:唯一标识网络中的一次通信(两个进程之间的连接)。
  • 网络通信的本质,就是两个进程间的通信
  • 我们把 IP+Port 叫做套接字(Socket),它是网络通信的端点。

3、传输层的典型代表

  • 网络通信的底层逻辑
    网络协议栈(尤其是传输层、网络层)是操作系统内核的功能。用户程序不能直接操作内核里的网络功能,必须通过系统调用来访问,这就是 Socket 编程的基础。

  • 传输层的两个核心协议

协议 核心特点 通俗理解
TCP 有连接、可靠传输、面向字节流 像打电话:必须先接通(建立连接),对话有序、不丢字,双方都知道对方收到了
UDP 无连接、不可靠传输、面向数据报 像发短信:直接发送,不保证对方一定收到,也不保证顺序

4、网络字节序

一、什么是大端 / 小端?
这是多字节数据在内存中的两种存储方式:

  • 大端(Big-endian):高字节存低地址,低字节存高地址(数据按 “正常阅读顺序” 存)。
  • 小端(Little-endian):低字节存低地址,高字节存高地址(数据按 “逆序” 存)。

0x1234abcd 为例(4 字节数据):

内存地址 大端存储 小端存储
0x0000 0x12 0xcd
0x0001 0x23 0xab
0x0002 0xab 0x34
0x0003 0xcd 0x12

二、网络字节序的规定
TCP/IP 协议规定,网络数据流必须采用大端字节序
这就意味着:

  • 无论主机本身是大端还是小端,发送 / 接收数据时都要遵循网络字节序(大端)。
  • 小端主机发送数据前,需要把数据转成大端;接收后再转回来。

5、字节序转换函数

1)IP转换

a)htonl 函数
b)ntohl 函数

2)Port 转换

a)htons 函数
b)ntohs 函数

七、socket 编程

1、socket 接口

1)socket 函数

2)bind 函数

3)listen 函数

4)accept 函数

5)connect 函数

2、sockaddr 结构

在这里插入图片描述

一、struct sockaddr:通用地址结构
它是 Socket API 的通用抽象类型,为了兼容不同协议的地址格式(IPv4、IPv6、UNIX 域套接字)。

  • 结构组成: 16 位地址类型 + 14 字节地址数据。
  • 核心作用: 让系统调用(如 bind/connect)不需要关心具体是哪种协议的地址,只需要根据地址类型字段解析即可。

二、struct sockaddr_in:IPv4 专用地址结构
我们实际写 IPv4 网络程序时,用的是这个结构,使用时强制转换成 struct sockaddr* 传给 API。

  • 结构组成:
    • sin_family: 地址类型,固定为 AF_INET(表示 IPv4)。
    • sin_port: 16 位端口号(网络字节序)。
    • sin_addr: 32 位 IP 地址,用 struct in_addr 表示。
    • sin_zero: 填充字段,保证和 struct sockaddr 大小一致。

三、struct in_addr:IPv4 地址存储结构

  • 本质: 就是一个 32 位无符号整数(uint32_t),专门用来存储 IPv4 的IP地址。
  • 说明: 我们熟悉的点分十进制 IP(如192.168.1.1),需要转换成网络字节序的 32 位整数后,存入这个结构。
typedef uint32_t in_addr_t;
struct in_addr
{
    in_addr_t s_addr;
};
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐