当前位置: 首页 > ai >正文

Day33 网络编程:OSI/TCP/IP模型、协议族与UDP编程

day33 网络编程:OSI/TCP/IP模型、协议族与UDP编程

OSI 模型

开放系统互联模型(Open System Interconnect)分为7层,作为理想模型尚未完全实现。各层功能及示例如下:

  • 应用层
    为网络用户提供各种服务(如电子邮件、文件传输)。
    示例:TFTP(简单文件传输协议)用于基础文件操作:
    tftp server get /etc/passwd(二进制模式传输文件)
    tftp server get /etc/123(ASCII模式传输文件)

  • 表示层
    提供统一的数据表示形式,处理加密解密、gzip压缩等数据格式转换。

  • 会话层
    管理进程会话过程(如网络断开时的连接状态维护),通过keep-close/keep-alive机制协调信息传输。

  • 传输层
    管理网络通信两端的数据传输,提供可靠(TCP)或不可靠(UDP)传输服务,适用于文件、视频、音频等数据传输。

  • 网络层
    负责数据传输的路由选择和网际互连,核心协议为IP,支持NAT(网络地址转换)。

  • 数据链路层
    负责物理相邻主机间的数据传输,实现物理地址寻址、数据帧封装和差错控制。该层分为逻辑链路控制子层(LLC)和介质访问控制子层(MAC)。交换机在此层工作,数据以帧格式传输并校验。

  • 物理层
    将主机数据转换成电信号通过网络介质传输,描述通信设备的机械、电气特性。
    示例参数:传输速率(100 Mb/s, 1 Gb/s)、介质类型(双绞线、光纤)、无线频段(2.4 GHz, 5 GHz)。


TCP/IP 模型

网际互联模型分为4层,作为工业标准的实用模型(TCP/IP协议栈):

  • 应用层
    对应应用程序,提供HTTP、FTP等高层服务。
  • 传输层
    涉及端口号,核心协议为TCP(传输控制协议)和UDP(用户数据包)。
  • 网络层
    处理IP地址,核心协议为IP。
  • 接口层
    涉及网卡、驱动,传输速率如1 GB/s;支持pcap(packet capture)技术用于网络数据包捕获分析。

TCP/IP 协议族

包含覆盖网络通信各层的多种协议:

  • 应用层协议
    HTTP、TFTP、FTP、SNMP、DNS等。
    示例:DNS域名解析(www.taobao.com192.168.0.19)。
  • 传输层协议
    TCP、UDP;历史设备示例:56k猫(调制解调器)。
  • 网络层协议
    IP、ICMP(用于ping命令)、RIP、OSPF、IGMP等。
  • 接口层协议
    ARP、RARP等,实现IP地址到MAC地址的映射(ip--->mac)。
ARP 命令示例
arp -a
  • 注释:显示本地ARP缓存表,列出所有IP地址与MAC地址的映射关系。
  • 理想运行结果
    Interface: 192.168.0.100 --- 0x2Internet Address      Physical Address      Type192.168.0.1           00-11-22-33-44-55     dynamic192.160.0.112         aa-bb-cc-dd-ee-ff     dynamic
    
    (注:结果中 192.160.0.112 为示例IP地址,MAC地址为模拟值;实际输出因网络环境而异。)

TCP 编程基础知识

IP 地址分类

IP地址由网络位 + 主机位组成(IPv4点分十进制表示),根据规模分为五类:

类别IP地址范围默认子网掩码私有地址范围主机数量典型用途
A类1.0.0.0 - 126.255.255.255255.0.0.010.0.0.0 - 10.255.255.25516,777,214超大规模网络
B类128.0.0.0 - 191.255.255.255255.255.0.0172.16.0.0 - 172.31.255.25565,534大中规模网络
C类192.0.0.0 - 223.255.255.255255.255.255.0192.168.0.0 - 192.168.255.255254中小规模网络
D类224.0.0.0 - 239.255.255.255N/A组播/广播
E类240.0.0.0 - 255.255.255.255N/A实验用途

关键细节

  • C类网络特性
    • 二进制最高位 110xxxxx
    • 前三组网络地址,第四组主机地址
    • 主机数量 = 254(2^8 - 2,扣除网关和广播地址)
    • 局域网常用私有地址:192.168.x.x
  • 特殊地址
    • 127.0.0.1:本地环回地址(A类保留)
    • 192.168.0.0:网络标识
    • 192.168.0.1:典型网关地址
    • 192.168.0.255:广播地址
  • 单机上网配置流程
    ifconfig ens33 192.168.0.13/24 up  # 设置IP和子网掩码(255.255.255.0)
    route add default gw 192.168.0.1    # 配置默认网关
    echo "nameserver 8.8.8.8" > /etc/resolv.conf  # 设置DNS
    ping www.baidu.com                  # 验证连通性(理想结果:收到ICMP响应)
    netstat -anp                        # 查看网络状态(显示活动连接和端口)
    

网络接口

  • Socket(套接字)
    BSD Socket是网络通信的API接口,本质是应用程序与网络协议栈的桥梁(文件描述符)。
  • IP + Port 机制
    • IP地址:标识主机在网络中的位置
    • 端口号:标识主机上的具体应用程序(范围1-65535)
    • 约定:端口号 < 1000 为系统保留端口
      HTTP: 80      | MySQL: 3306
      FTP: 21       | SSH: 22
      

网络字节序

网络传输采用大端存储(Big-Endian) 格式(高位字节在前),需通过转换函数确保数据一致性:

数字转换函数(#include <arpa/inet.h>
uint32_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位)
  • 理想运行结果
    htonl(0x12345678) 返回 0x78563412(大端格式)

UDP 编程

UDP 特性

  • 无连接
  • 不可靠(可能丢包)
  • 低延迟
  • 网络开销小
  • 适用于实时性要求高的场景(如视频直播、在线游戏)

UDP 通信框架

C/S模式通信流程:

在这里插入图片描述

客户端流程

  1. 创建套接字:fd = socket()
  2. 发送/接收数据(循环):
    • sendto(fd, buf, size, addr) 发送数据
    • recvfrom(fd, buf, size, addr) 接收应答
  3. 关闭套接字:close(fd)

服务器流程

  1. 创建套接字:fd = socket()
  2. 绑定地址:bind(fd, 服务器地址端口)
  3. 接收/发送数据(循环):
    • recvfrom(fd, buf, size, addr) 接收请求
    • sendto(connfd, buf, size, addr) 发送应答

关键函数说明

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,const struct sockaddr *dest_addr, socklen_t addrlen);
  • 功能:UDP协议中向对方发送数据
  • 参数
    • sockfd:本地套接字ID
    • buf:发送数据缓冲区
    • len:数据长度
    • flags:发送方式(0=阻塞)
    • dest_addr:目标主机地址结构体(必选)
    • addrlen:目标地址长度
  • 返回值:成功返回发送字节数,失败返回-1
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,struct sockaddr *src_addr, socklen_t *addrlen);
  • 功能:UDP协议中接收对方数据
  • 参数
    • sockfd:本地套接字ID
    • buf:接收数据缓冲区
    • len:缓冲区大小
    • flags:接收方式(0=阻塞)
    • src_addr:对方地址结构体(可选,NULL表示不关心)
    • addrlen:对方地址长度指针
  • 返回值:成功返回接收字节数,失败返回-1

注意

  • socket(PF_INET, SOCK_DGRAM, 0) 创建UDP套接字
  • bind() 服务器端必须调用,客户端可选

UDP 服务器代码示例

#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <time.h>typedef struct sockaddr * (SA);  // 定义sockaddr指针别名
int main(int argc, char **argv)
{// 创建UDP套接字int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd){perror("socket");  // 打印错误信息return 1;}// 配置服务器地址结构struct sockaddr_in ser, cli;ser.sin_family = AF_INET;       // IPv4协议族ser.sin_port = htons(50000);    // 主机转网络字节序端口ser.sin_addr.s_addr = inet_addr("192.168.14.128");  // 设置IP地址// 绑定套接字到指定地址int ret = bind(sockfd, (SA) &ser, sizeof(ser));if (-1 == ret){perror("bind");  // 绑定失败处理return 1;}time_t tm;socklen_t len = sizeof(cli);while (1)  // 持续服务循环{char buf[512] = {0};  // 接收缓冲区time(&tm);  // 获取当前时间// 接收客户端数据(阻塞等待)recvfrom(sockfd, buf, sizeof(buf), 0, (SA)&cli, &len);// 附加时间戳到消息sprintf(buf, "%s %s", buf, ctime(&tm));// 将处理后的消息回传客户端sendto(sockfd, buf, strlen(buf), 0, (SA)&cli, len);}return 0;  // 理想结果:持续运行并处理客户端请求
}

UDP 客户端代码示例

#include <arpa/inet.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <time.h>
#include <unistd.h>typedef struct sockaddr * (SA);  // 定义sockaddr指针别名
int main(int argc, char **argv)
{// 创建UDP套接字int sockfd = socket(AF_INET, SOCK_DGRAM, 0);if (-1 == sockfd){perror("socket");  // 错误处理return 1;}// 配置服务器地址结构struct sockaddr_in ser;ser.sin_family = AF_INET;       // IPv4协议族ser.sin_port = htons(50000);    // 主机转网络字节序端口ser.sin_addr.s_addr = inet_addr("192.168.14.128");  // 服务器IPint i = 10;while (i--)  // 发送10次请求{char buf[512] = "hello,this udp test";  // 初始化消息// 发送数据到服务器sendto(sockfd, buf, strlen(buf), 0, (SA)&ser, sizeof(ser));bzero(buf, sizeof(buf));  // 清空缓冲区// 接收服务器响应(阻塞等待)recvfrom(sockfd, buf, sizeof(buf), 0, NULL, NULL);printf("from ser:%s\n", buf);  // 打印服务器响应sleep(1);  // 间隔1秒}close(sockfd);  // 关闭套接字return 0;  // 理想结果:输出10次类似 "from ser:hello,this udp test Wed Jun 12 10:30:45 2024"
}

核心知识点整合

网络模型对比

OSI模型TCP/IP模型核心功能
应用层应用层提供用户服务(HTTP/FTP/DNS等)
表示层数据格式转换(加密/压缩)
会话层管理会话状态(keep-alive)
传输层传输层端到端通信(TCP/UDP)
网络层网络层路由选择(IP协议)
数据链路层接口层帧传输/错误控制(ARP/交换机)
物理层电信号传输

网络诊断命令

命令功能典型输出
arp -a显示ARP缓存表IP-MAC映射列表
ifconfig查看网卡配置IP地址、子网掩码、MAC地址等
ping测试网络连通性“64 bytes from 8.8.8.8: icmp_seq=1 ttl=56”
netstat -anp查看活动网络连接TCP 0.0.0.0:22 0.0.0.0:* LISTEN sshd

传输层协议对比

特性TCPUDP
连接方式面向连接(三次握手)无连接
可靠性可靠传输(确认重传机制)不可靠(可能丢包)
传输速度较慢
适用场景文件传输、网页浏览视频直播、在线游戏
典型端口HTTP(80)、SSH(22)DNS(53)、DHCP(67)
http://www.xdnf.cn/news/19613.html

相关文章:

  • 【新启航】3D 逆向抄数的三维能力架构:数据采集工具操作 × 几何处理算法应用 × 行业场景适配技能
  • 微硕WINSOK大功率MOS管 WSF3085在汽车关键系统中的创新应用
  • 【世纪龙科技】汽车专业数字化课程资源包-虚拟仿真实训资源建设
  • 2025大学生必考互联网行业证书排名​
  • Nginx 全攻略:从部署到精通的实战指南(CentOS 环境)
  • 腾讯混元世界模型Voyager开源:单图生成3D世界的“核弹级”突破,游戏、VR、自动驾驶迎来新变量
  • Nature | 克隆拷贝数多样性影响肺癌生存
  • 大模型适配国产化服务器昇腾(300I DUO)
  • 多人语音分离模型效果展示与本地部署实践
  • spring boot启动
  • CAN诊断箱调试报告
  • Kubernetes 高级健康检查与存储卷详解
  • 质量安全管控如何实现事前预防?
  • hadoop 框架 jar下载
  • Python入门教程之类型转换
  • 别被亚马逊FBA拖垮!合规入仓+高效履约,全链路痛点破解指南来了
  • 视频转文字软件哪个免费好用?2025年5款实用工具实测,助力办公效率!
  • Linux 内核定时器实验
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(24):文法+单词第8回1
  • 小迪web自用笔记24
  • Unity切换平台资源重新编译缓慢
  • 从C语言入门到精通:代码解析与实战
  • 解锁复杂工作流:Roo Code 中的「Boomerang Tasks」机制 : Orchestrator Mode 的使用
  • 2025年09月02日Github流行趋势
  • 会议签到存证系统设计与实现
  • Jenkins 拉取 Git 仓库时报错:there are still refs under ‘refs/remotes/origin/release‘
  • 在 Elasticsearch 中使用用户行为分析:使用 UBI 和 search-ui 创建一个应用程序
  • Python 实战:内网渗透中的信息收集自动化脚本(8)
  • vue飞自在酒店管理系统(代码+数据库+LW)
  • 25.9.2_NSSCTF-[HNCTF 2022 WEEK2]TTTTTTTTTea_WP