Linux下的网络编程

1. 目的

不同主机,进程间通信。

2. 解决的问题

  1. 主机与主机之间物理层面必须互联互通。

  2. 进程与进程在软件层面必须互联互通。

    1. IP地址:计算机的软件地址,用来标识计算机设备

    2. MAC地址:计算机的硬件地址(固定)

    3. 网络的端口号:标记同一主机上的不同网络进程

3. 网络协议

网络通信标准。

OSI七层模型

开放系统互联模型(Open System Interconnect)

理论模型:不同体系结构设备间,网络通信的通信标准。

功能说明
应用层 要传输的数据信息,如文件传输,电子邮件等
表示层 数据加密,解密操作,压缩,解压缩
会话层 建立数据传输通道 → 会话
传输层 传输的方式,UDP / TCP,端口号
网络层 实现数据路由,路径规划 → 路由器,IP
数据链路层 封装成帧,点对点通信(局域网内通信),差错检测 → 交换机,ARP
物理层 定义物理设备标准、电气特性,比如网线、光纤等传输介质,比特流 0/1

TCP/IP模型

五层模型

应用层

HTTP:超文本传输协议

HTTPS: 超文本传输协议(SSL加密算法)

FTP:文件传输协议(TCP)

TFTP:简单文件传输协议(UDP)

MQTT:消息队列遥测传输(物联网协议)

DNS:域名解析服务(www.baidu.com → IP地址)

传输层

TCP:传输控制协议

UDP:用户数据报协议

网络层

IP协议:IPv4 / IPv6

数据链路层

ARP:地址解析协议

物理层

四层模型

应用层

传输层

网络层

网络接口层

4. IP协议

网络层:IP协议

示例:192.168.1.128

IPv4:32位

IPv6:128位

用户表示形式:192.168.1.140(点分十进制)

计算机存储形式:11000000 10101000 00000000 01000011(32 bits)

IP地址组成

IP地址 = 网络位 + 主机位

示例:192.168.0.121/24

24:网络位的位数

网络位:该IP地址位于哪个网段(局域网)

内主机位:该网段(局域网)第几台主机

子网掩码

例如:255.255.255.0 → 11111111.11111111.11111111.00000000

用来区分IP地址的网络位和主机位,搭配IP地址使用

网段号

IP地址网络位不变,主机位全为0 → 网段号

示例:192.168.1.3 / 255.255.0.0 → 网段 192.168.0.0

网段内IP能直接通信

广播号

IP地址网络位不变,主机位全为1 → 广播号

示例:192.168.1.3 / 255.255.255.0 → 广播号 192.168.1.255

局域网内所有主机都能收到此信息

网关地址

示例:192.168.1.1

IP地址分类

  1. A类地址

    • 范围:1.0.0.0 - 126.255.255.255

    • 子网掩码:255.0.0.0

    • 用于管理大规模网络

    • 私有IP:10.0.0.0 - 10.255.255.255

    • 回环地址:127.0.0.0

  2. B类地址

    • 范围:128.0.0.0 - 191.255.255.255

    • 子网掩码:255.255.0.0

    • 管理大中规模网络

    • 私有IP:172.16.0.0 - 172.31.255.255

  3. C类地址

    • 范围:192.0.0.0 - 223.255.255.255

    • 子网掩码:255.255.255.0

    • 管理中小规模网络

    • 私有IP:192.168.0.0 - 192.168.255.255

  4. D类地址

    • 范围:224.0.0.0 - 239.255.255.255

    • 组播和广播使用

  5. E类地址

    • 范围:240.0.0.0 - 255.255.255.254

    • 用来进行实验

      • 公有IP:由电信公司分配,可直接访问Internet

      • 私有IP:不能直接访问Internet,可节省IP地址

5. 网络端口号

16位整形数据(0-65535),标记同一主机上的不同网络进程

分类:

  1. 1-1023:知名端口

    • HTTP:80

    • FTP:20/21

    • TFTP:69

    • HTTPS:443

  2. 1024-49151:注册端口(IANA指定特殊服务使用)

    • MQTT:1883/8883
  3. 49152-65535:动态或私有端口

6. 网络配置

  1. ping IP/域名:检测网络连通性

    • 示例:ping www.baidu.com
  2. 查看当前主机IP

    • Linux:ifconfig

    • Windows:ipconfig

  3. 虚拟机网络配置

    • 桥接模式

    • 编辑虚拟网络编辑器 → VMnet0 桥接至当前上网网卡

  4. 修改网络配置文件 /etc/network/interfaces

    auto lo
    iface lo inet loopback

    auto ens33
    iface ens33 inet dhcp

  5. 重启网络服务

    sudo /etc/init.d/networking restart

  6. 测试网络

    ping www.baidu.com

7. 网络协议------UDP

UDP:传输层用户数据报协议(User Datagram Protocol)

1)网络编程模型

B/S模型(Browser/Server)

客户端为通用浏览器

一般只做服务器开发

客户端请求服务器数据

C/S模型(Client/Server)

客户端为专用客户端

服务器和客户端都需开发

客户端可保存资源,本地加载

2)UDP编程流程

套接字:文件描述符,应用层操作端口

复制代码
#include <sys/types.h>
#include <sys/socket.h>

int socket(int domain, int type, int protocol);

功能 :创建通信套接字
参数

domain:协议族

AF_INET:IPv4

AF_INET6:IPv6

type:传输层协议

SOCK_DGRAM:UDP

SOCK_STREAM:TCP

SOCK_RAW:原始套接字

protocol:0按默认协议创建

返回值:成功 → 套接字,失败 → -1

发送数据

复制代码
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:接收方地址信息(IP+端口号)

addrlen:接收方地址大小

返回值:成功 → 实际发送字节数,失败 → -1

结构体示例

复制代码
struct sockaddr_in 
{
    sa_family_t    sin_family; /* address family: AF_INET */
    in_port_t      sin_port;   /* port in network byte order */
    struct in_addr sin_addr;   /* internet address */
};

struct in_addr 
{
    uint32_t       s_addr;     /* address in network byte order */
};

字节序

网络字节序:大端

主机字节序:小端

复制代码
uint32_t htonl(uint32_t hostlong);   // 主机转网络
uint16_t htons(uint16_t hostshort);  // 主机转网络
uint32_t ntohl(uint32_t netlong);    // 网络转主机
uint16_t ntohs(uint16_t netshort);   // 网络转主机

in_addr_t inet_addr(const char *cp); // 将字符串IP地址转换成二进制IP地址形式
char *inet_ntoa(struct in_addr in);  // 将二进制IP地址转换成字符串

int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);

功能: 绑定自己的IP地址和端口号

参数:

sockfd:套接字

addr:需要绑定的地址

addrlen:地址大小

返回值:

成功:0

失败:-1

复制代码
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                 struct sockaddr *src_addr, socklen_t *addrlen);

功能:从套接字上接收数据

参数:

sockfd:套接字

buf:存放接收数据的内存首地址

len:希望接收的字节数

flags:0,按照默认方式接收(阻塞)

src_addr:发送方的地址信息

addrlen:发送方地址的指针

返回值:

成功:实际接收到的字节数

失败:-1

相关推荐
--运维实习生--31 分钟前
shell脚本第二阶段-----选择结构
linux·运维·shell编程
Clownseven1 小时前
Linux服务器健康检查Shell脚本:一键生成自动化巡检报告
linux·服务器·自动化
时间裂缝里的猫-O-1 小时前
@Linux问题 :bash fork Cannot allocate memory 错误分析与解决方案
linux·chrome·bash
派拉软件1 小时前
微软AD国产化替换倒计时——不是选择题,而是生存题
网络·安全·microsoft·目录管理·微软ad替换·身份与访问控制管理iam
躺不平的小刘2 小时前
从YOLOv5到RKNN:零冲突转换YOLOv5模型至RK3588 NPU全指南
linux·python·嵌入式硬件·yolo·conda·pyqt·pip
果子⌂2 小时前
Git+Jenkins实战(一)
运维·git·jenkins
愚昧之山绝望之谷开悟之坡2 小时前
| `cat /etc/os-release` | 发行版详细信息(如 Ubuntu、CentOS) |
linux·ubuntu·centos
chenglin0162 小时前
Logstash——输出(Output)
运维·jenkins
mysla2 小时前
嵌入式学习day34-网络-tcp/udp
服务器·网络·学习
苦逼IT运维2 小时前
Jenkins + SonarQube 从原理到实战四:Jenkins 与 Gerrit 集成并实现自动任务
运维·git·测试工具·ci/cd·jenkins