复习——网络编程基础

网络编程

一、网络模型

1. OSI 模型(开放系统互联模型)- 7层理想模型

层级 名称 功能 示例/设备
7 应用层 为网络用户提供各种服务 HTTP、FTP、TFTP
6 表示层 数据格式转换、加密解密 gzip、SSL
5 会话层 建立、管理、终止会话 keep-alive、keep-close
4 传输层 端到端数据传输,可靠/不可靠传输 TCP、UDP
3 网络层 路由选择、网际互连 IP、ICMP、路由器
2 数据链路层 物理相邻主机间数据传输,帧封装 交换机、MAC地址
1 物理层 比特流传输、物理介质 网线、光纤、无线

2. TCP/IP 模型 - 4层实用模型(工业标准)

层级 对应协议/功能 说明
应用层 HTTP、TFTP、FTP、DNS、DHCP、SNMP 应用程序
传输层 TCP、UDP 端口号管理
网络层 IP、ICMP、RIP、OSPF、IGMP IP地址路由
接口层 ARP、RARP 网卡驱动、物理传输

3. TCP/IP 协议族

  • DNS : 域名解析(www.taobao.com → 192.168.0.19)

  • DHCP: 动态主机配置协议

  • ICMP: 网络控制消息协议(ping命令)

  • ARP: IP地址 → MAC地址解析

  • RARP: MAC地址 → IP地址解析

二、TCP/IP 基础知识

1. IP地址分类(IPv4)

类别 地址范围 默认掩码 私有地址 用途
A类 1.0.0.0 - 126.255.255.255 255.0.0.0 10.0.0.0 - 10.255.255.255 超大规模网络
B类 128.0.0.0 - 191.255.255.255 255.255.0.0 172.16.0.0 - 172.31.255.255 大中规模网络
C类 192.0.0.0 - 223.255.255.255 255.255.255.0 192.168.0.0 - 192.168.255.255 中小规模网络
D类 224.0.0.0 - 239.255.255.255 - - 组播
E类 240.0.0.0 - 255.255.255.255 - - 实验用途

特殊地址:

  • 127.0.0.1: 本地回环地址

  • 192.168.x.1: 通常为网关地址

  • 192.168.x.255: 广播地址

2. C类网络详解

  • 前3组: 网络地址

  • 第4组: 主机地址(2^8=256个,实际可用254个)

  • 网络个数: 2^24 ≈ 209万个

  • 私有地址: 192.168.x.x

3. 网络配置(Linux)

复制代码
# 配置IP地址
ifconfig ens33 192.168.0.13/24 up

# 添加网关
route add default gw 192.168.0.1

# 配置DNS
echo "nameserver 8.8.8.8" > /etc/resolv.conf

# 重启网络
sudo /etc/init.d/networking restart

# 查看网络状态
netstat -anp

三、Socket 编程基础

1. 核心概念

  • Socket套接字: 网络通信的API接口

  • IP + Port:

    • IP地址识别主机

    • 端口号识别应用程序(1-65535)

    • 系统端口: <1000

2. 字节序转换

复制代码
#include <arpa/inet.h>

// 主机字节序 → 网络字节序
uint32_t htonl(uint32_t hostlong);    // 32位
uint16_t htons(uint16_t hostshort);   // 16位

// 网络字节序 → 主机字节序
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(uint16_t netshort);

// 字符串IP地址转换
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

in_addr_t inet_addr(const char *cp);      // "192.168.1.1" → 网络字节序
char *inet_ntoa(struct in_addr in);        // 网络字节序 → 字符串

四、TCP 编程

1. TCP C/S 模型框架

复制代码
服务器: socket() → bind() → listen() → accept() → recv()/send() → close()
客户端: socket() → connect() → send() → recv() → close()

2. 服务器端函数详解

复制代码
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

// 1. 创建套接字
int socket(int domain, int type, int protocol);
// domain: PF_INET/AF_INET (IPv4)
// type: SOCK_STREAM (TCP), SOCK_DGRAM (UDP)
// protocol: 0 (自动适应)

// 2. 绑定地址
int bind(int sockfd, struct sockaddr *my_addr, socklen_t addrlen);
struct sockaddr_in {
    u_short    sin_family;     // AF_INET
    u_short    sin_port;       // 端口号(网络字节序)
    struct in_addr sin_addr;   // IP地址
    char       sin_zero[8];    // 填充
};

// 3. 监听连接
int listen(int sockfd, int backlog);
// backlog: 允许的最大连接数

// 4. 接受连接
int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
// 返回新的套接字用于通信

// 5. 设置端口重用
int on = 1;
setsockopt(listfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on));

3. 数据传输函数

复制代码
// TCP专用
ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t send(int sockfd, const void *buf, size_t len, int flags);

// 通用(TCP/UDP都可用)
ssize_t read(int fd, void *buf, size_t count);
ssize_t write(int fd, const void *buf, size_t count);

五、UDP 编程

1. UDP 特性

  • 无连接、不可靠

  • 支持大数据传输

  • 效率高,速度快

2. UDP C/S 模型框架

复制代码
服务器: socket() → bind() → recvfrom() → sendto() → close()
客户端: socket() → bind()(可选)→ sendto() → recvfrom() → close()

3. UDP 专用函数

复制代码
// 创建UDP套接字
int sockfd = socket(PF_INET, SOCK_DGRAM, 0);

// 发送数据
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
               const struct sockaddr *dest_addr, socklen_t addrlen);

// 接收数据
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                 struct sockaddr *src_addr, socklen_t *addrlen);

六、常用端口号

端口 协议 服务
21 FTP 文件传输
22 SSH 安全Shell
23 Telnet 远程登录
25 SMTP 邮件发送
53 DNS 域名解析
80 HTTP 网页浏览
110 POP3 邮件接收
143 IMAP 邮件访问
443 HTTPS 安全网页
3306 MySQL 数据库
3389 RDP 远程桌面

七、网络模式

  1. C/S模式: 客户端/服务器模式(如HTTP、FTP)

  2. B/S模式: 浏览器/服务器模式(Web应用)

  3. P2P模式: 点对点模式(如BT下载)

八、编程注意事项

  1. 错误处理:检查每个系统调用的返回值

  2. 资源管理:及时关闭socket,释放资源

  3. 并发处理:服务器需支持多客户端连接

  4. 超时设置:避免程序永久阻塞

  5. 缓冲区管理:防止缓冲区溢出

相关推荐
霜!!2 小时前
openssh升级
linux·运维·服务器
Vect__2 小时前
25.12.27 理解文件本质+文件系统调用接口+fd+重定向
linux
草莓熊Lotso2 小时前
2025年12月远程协作平台全景评测:智能连接时代的效率革命
运维·服务器·数据库
lucky-billy2 小时前
使用 VS Code 通过 SSH 编译 Linux C++ 程序
linux·ssh·vs code·远程编译
week_泽2 小时前
4、OpenCV SIFT特征检测笔记
人工智能·笔记·opencv
阿洛学长2 小时前
解决服务器 4000端口占用方案
运维·服务器
同聘云2 小时前
阿里云国际站服务器防御怎么做?服务器能做什么用途?
服务器·安全·阿里云·云计算
stella·2 小时前
服务器割接,我所学习到的内容。
linux·运维·服务器·学习·shell·割接
胡萝卜3.02 小时前
Linux包管理器:高效安装软件的秘诀
linux·运维·服务器·人工智能·linux包管理·yum教程·apt入门