Linux 网络编程 学习笔记

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协议(地址解析协议)的工作流程如下:

  1. 检查缓存:主机A要发送数据给主机B(已知B的IP地址),先查看本机ARP缓存中是否有B的IP对应的MAC地址。

  2. 发送广播请求:若无,主机A广播一个ARP请求包,包含自己的IP和MAC,以及目标IP(B的IP),询问"谁的IP是xx?请告诉你的MAC地址"。

  3. 目标响应:同一网络中的所有设备收到广播,只有目标主机B识别出自己的IP,会单播回复一个ARP应答包,包含自己的MAC地址。

  4. 更新缓存:主机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地址

相关推荐
一尘之中5 小时前
从C语言底层设计到系统架构评估:软件架构知识体系全景
学习·系统架构·ai写作
为思念酝酿的痛5 小时前
POSIX信号量
linux·运维·服务器·后端
ylscode5 小时前
PureLogs 信息窃取恶意软件惊现高危变种:借道 MsBuild.exe 进程空心化实施无痕攻击
网络·安全·安全威胁分析
IPHWT 零软网络5 小时前
MX60E-A信创级智能语音网关技术实现与架构分析
网络·网络安全·国产自研·技术实现·智能语音网关·政企通信·信创技术
IT大白鼠6 小时前
RSTP协议原理与配置详解:快速生成树技术的深度解析
网络·网络协议
星夜夏空996 小时前
FreeRTOS学习(4)——内存映射
数据库·学习·mongodb
人还是要有梦想的6 小时前
linux下用搜狗输入法,中英文切换
linux·运维·服务器
不羁的木木7 小时前
ArkWeb实战学习笔记05-综合实战:构建混合应用
笔记·学习·harmonyos
橙橙笔记7 小时前
Python的学习第一部分
python·学习
bush47 小时前
嵌入式linux学习记录二
linux·运维·学习