嵌入式学习Day32
网络编程:
网络编程基础概念
网络编程指通过计算机网络实现程序间通信的技术,涉及协议、套接字、数据传输等核心概念。常见的应用场景包括客户端-服务器模型、分布式系统、实时通信等。
OSI模型概述
OSI(Open Systems Interconnection)模型是一种用于描述网络通信过程的标准化框架,由国际标准化组织(ISO)于1984年提出。它将网络通信划分为7个层次,每一层负责特定的功能,并通过接口与相邻层交互。
OSI七层结构及功能
1. 物理层(Physical Layer)
负责传输原始比特流,定义物理介质(如电缆、光纤)的电气、机械特性。典型协议包括以太网、USB。
2. 数据链路层(Data Link Layer)
将比特流组织为帧(Frame),提供物理地址(MAC地址)和错误检测。交换机在此层操作,协议如PPP、HDLC。
3. 网络层(Network Layer)
负责路由选择和数据包转发,使用逻辑地址(如IP地址)。核心设备是路由器,协议包括IP、ICMP。
4. 传输层(Transport Layer)
确保端到端的可靠传输,提供流量控制和错误恢复。主要协议有TCP(可靠)和UDP(不可靠)。
5. 会话层(Session Layer)
管理通信会话的建立、维护和终止,例如NetBIOS。
6. 表示层(Presentation Layer)
处理数据格式转换(如加密、压缩),确保应用层可理解数据。例如SSL/TLS加密。
7. 应用层(Application Layer)
直接为用户应用提供服务,协议包括HTTP、FTP、SMTP。
TCP/IP模型概述
TCP/IP模型是互联网通信的核心框架,由四层组成:网络接口层、网络层、传输层和应用层。它比OSI七层模型更简洁,实际应用更广泛。
四层结构详解
网络接口层(Link Layer) 负责物理传输,包括以太网、Wi-Fi等协议。数据以帧为单位传输,处理MAC地址和硬件交互。
网络层(Internet Layer) 核心协议为IP(Internet Protocol),负责路由和逻辑寻址。关键协议包括:
- IP:无连接的数据包传输
- ICMP:错误报告和诊断(如ping)
- ARP:IP地址到MAC地址的映射
传输层(Transport Layer) 提供端到端通信,主要协议:
- TCP:可靠连接,三次握手建立连接
- 握手流程:SYN → SYN-ACK → ACK
- UDP:无连接,低延迟
应用层(Application Layer) 包含高层协议如HTTP、FTP、DNS等。数据单位为消息。
数据封装过程
发送端自上而下封装:
- 应用数据添加应用层头(如HTTP头)
- 传输层添加TCP/UDP头
- 网络层添加IP头
- 网络接口层添加帧头和尾
接收端自下而上解封装。
与OSI模型对比
TCP/IP层 | OSI层 |
---|---|
应用层 | 应用层+表示层+会话层 |
传输层 | 传输层 |
网络层 | 网络层 |
网络接口层 | 数据链路层+物理层 |
实际应用要点
- IP地址分为IPv4(32位)和IPv6(128位)
- 端口号范围:0-65535(系统端口:0-1023)
- MTU(最大传输单元)影响数据分片
- 路由选择通过路由表实现
该模型的设计强调端到端原则,将复杂性放在网络边缘,核心网络保持简单高效。
DNS域名解析原理
DNS(Domain Name System)将人类可读的域名(如example.com
)转换为机器可读的IP地址(如93.184.216.34
)。解析过程遵循分层查询机制:
- 递归查询:用户设备向递归DNS服务器(如ISP提供的服务器)发起请求,由递归服务器完成后续查询并返回最终结果。
- 迭代查询:递归服务器依次向根域名服务器、顶级域(TLD)服务器和权威域名服务器查询,最终获取目标IP。
DHCP 概述
DHCP(Dynamic Host Configuration Protocol)是一种网络协议,用于自动分配 IP 地址、子网掩码、默认网关和其他网络配置参数给客户端设备。它简化了网络管理,避免了手动配置 IP 地址的繁琐和错误。
DHCP 工作原理
DHCP 使用客户端-服务器模型,工作流程分为四个阶段(DHCPDISCOVER、DHCPOFFER、DHCPREQUEST、DHCPACK):
- DHCPDISCOVER:客户端广播请求 IP 地址配置。
- DHCPOFFER:服务器响应并提供可用 IP 地址。
- DHCPREQUEST:客户端确认选择服务器提供的配置。
- DHCPACK:服务器最终确认分配 IP 地址。
IPv4地址分类
IPv4地址通常分为A、B、C、D、E五类,主要依据网络号和主机号的划分方式:
-
A类地址
- 范围:
1.0.0.0
到126.255.255.255
- 第一字节为网络号,后三个字节为主机号。
- 子网掩码:
255.0.0.0
- 适用于大型网络,如国际组织或大型企业。
- 范围:
-
B类地址
- 范围:
128.0.0.0
到191.255.255.255
- 前两个字节为网络号,后两个字节为主机号。
- 子网掩码:
255.255.0.0
- 适用于中型网络,如大学或中型企业。
- 范围:
-
C类地址
- 范围:
192.0.0.0
到223.255.255.255
- 前三个字节为网络号,最后一个字节为主机号。
- 子网掩码:
255.255.255.0
- 适用于小型网络,如家庭或小型办公室。
- 范围:
-
D类地址
- 范围:
224.0.0.0
到239.255.255.255(网络号+最大主机号)
- 用于组播(Multicast)通信,不划分网络号和主机号。
- 主要用于视频流、在线会议等一对多的通信场景。
- 范围:
-
E类地址
- 范围:
240.0.0.0
到255.255.255.255
- 保留用于实验和研究,不用于常规网络通信。
- 范围:
私有IP地址和公有IP地址
-
私有IP地址
- 用于局域网内部通信,不直接暴露在互联网上。
- 范围包括:
- 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类:
- 通常通过NAT(网络地址转换)与公网通信。
-
公有IP地址
- 用于互联网通信,全球唯一。
- 除私有IP和特殊保留地址外的其他IPv4地址。
单机上网配置
1、有网络接口并插入网线。
2、有ip地址
3、配置网络设置
示意图:
ip: ifconfig ethX X.X.X.X/24 up ifconfig ens33 192.168.0.13/24 up 255.255.255.0
网关: route add default gw x.x.x.x
DNS: vi /etc/resolv.conf ==>nameserver 8.8.8.8
测试:ping www.baidu.com
netstat -anp:查看网络连接状态。
网络接口:
1、socket 套接字 ==》BSD socket ==》用于网络通信的一组接口函数。socket api application interface
2、ip+port 地址+端口===》地址用来识别主机、端口用来识别应用程序。
port分为TCP port / UDP port 范围都是: 1-65535,约定1000 以内的端口为系统使用。
网络字节序 :大端存储
用htons函数 把端号转为大端。
用inet addr 函数把IP地址转为大端。
Socket函数概述
Socket函数是Linux系统中用于网络通信的核心API,属于套接字编程接口。它允许进程在不同主机或同一主机上进行数据交换,支持TCP、UDP等多种协议。Socket函数通常通过系统调用实现,是网络编程的基础。
主要Socket函数
socket()
创建套接字,返回文件描述符。
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
- domain:协议族(如
AF_INET
IPv4,AF_INET6
IPv6)。
参数:PF_INET == AF_INET ==>互联网程序
PF_UNIX == AF_UNIX ==>单机程序
- type:套接字类型(如
SOCK_STREAM
TCP,SOCK_DGRAM
UDP)。
type 套接字类型:
SOCK_STREAM 流式套接字 ===》TCP
SOCK_DGRAM 用户数据报套接字===>UDP
SOCK_RAW 原始套接字 ===》IP
protocol 协议 ==》0 表示自动适应应用层协议。
- protocol:通常为0,自动匹配。
bind函数概述
在Linux网络编程中,bind
函数用于将一个本地协议地址(IP地址和端口号)与套接字(socket)关联。它通常用于服务器端程序,将服务绑定到特定端口等待客户端连接。
bind()
将套接字绑定到特定IP和端口。
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
- sockfd:socket()返回的文件描述符。
- addr:指向
sockaddr
结构的指针(需转换为struct sockaddr_in
或sockaddr_in6
)。
struct sockaddr 通用地址结构
{
u_short sa_family; 地址族
char sa_data[14]; 地址信息
};
转换成网络地址结构如下:
struct _sockaddr_in ///网络地址结构
{
u_short sin_family; 地址族
u_short sin_port; ///地址端口
struct in_addr sin_addr; ///地址IP
char sin_zero[8]; 占位
};
- addrlen:地址结构长度。
注意:如果是客户端,则该函数可以省略,由默认接口发送数据。
recvfrom函数概述
recvfrom
是Linux/Unix系统中用于从套接字接收数据的系统调用,常用于无连接协议(如UDP)。与recv
不同,recvfrom
可以获取发送端的地址信息。
函数原型
#include <sys/socket.h>ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
参数说明
- sockfd: 套接字描述符
- buf: 接收数据的缓冲区指针
- len: 缓冲区长度
- flags: 控制标志(常用值如
MSG_WAITALL
、MSG_DONTWAIT
) - src_addr: 发送方地址结构体指针(可为NULL)
- addrlen: 地址结构体长度指针(输入输出参数)
返回值
- 成功时返回接收的字节数
- 失败返回-1并设置
errno
- 连接关闭时返回0
sendto函数概述
sendto
是Linux系统中用于发送数据的系统调用,常用于无连接协议(如UDP)或需要指定目标地址的场景。它允许直接向特定目标发送数据而不需要预先建立连接。
函数原型
#include <sys/types.h>
#include <sys/socket.h>ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
参数说明
sockfd
: 已创建的套接字文件描述符buf
: 指向包含待发送数据的缓冲区len
: 要发送的数据长度(字节数)flags
: 控制发送行为的标志位(通常为0)dest_addr
: 指向目标地址结构体的指针addrlen
: 目标地址结构体的长度
返回值
成功时返回发送的字节数,失败返回-1并设置errno
UDP 概述
UDP(User Datagram Protocol,用户数据报协议)是一种无连接的传输层协议,提供简单的、不可靠的数据传输服务。与 TCP 不同,UDP 不保证数据包的顺序、可靠性或流量控制,但具有低延迟和高效率的特点。
UDP 特点
- 无连接:通信前无需建立连接,直接发送数据。
- 不可靠:不保证数据包是否到达目的地,也不保证顺序。
- 高效:头部开销小(仅 8 字节),适合对延迟敏感的应用。
- 支持广播和多播:可以同时向多个目标发送数据。
UDP 头部结构
UDP 头部包含 4 个字段,每个字段 2 字节:
- 源端口(Source Port):发送方端口号(可选,可设为 0)。
- 目标端口(Destination Port):接收方端口号。
- 长度(Length):UDP 头部加数据的总长度(最小为 8)。
- 校验和(Checksum):用于错误检测(可选,IPv6 必须校验)。
0 7 8 15 16 23 24 31
+--------+--------+--------+--------+
| Source | Destination |
| Port | Port |
+--------+--------+--------+--------+
| Length | Checksum |
+--------+--------+--------+--------+
| Data (if any) |
+-----------------------------------+
UDP 适用场景
- 实时应用:如视频流、语音通话(VoIP)、在线游戏。
- DNS 查询:快速响应比可靠性更重要。
- 广播/多播:如 DHCP、网络发现协议。
- 简单请求-响应:如 SNMP、TFTP。
UDP 与 TCP 对比
特性 | UDP | TCP |
---|---|---|
连接方式 | 无连接 | 面向连接 |
可靠性 | 不可靠 | 可靠(重传、确认机制) |
流量控制 | 无 | 有(滑动窗口) |
顺序保障 | 不保证 | 保证 |
头部大小 | 8 字节 | 20 字节 |
适用场景 | 实时、低延迟应用 | 文件传输、网页浏览 |
UDP 的局限性
- 无拥塞控制:可能引发网络拥塞。
- 数据包丢失:不适合需要高可靠性的场景。
- 安全性:容易受到 DDOS 攻击(如 UDP 洪水攻击)。