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

相关推荐
努力学习的小廉26 分钟前
深入了解linux网络—— 基于UDP实现翻译和聊天功能
linux·网络·udp
大聪明-PLUS34 分钟前
从技术史看:Unix 从何而来
linux·嵌入式·arm·smarc
励志不掉头发的内向程序员1 小时前
【Linux系列】并发世界的基石:透彻理解 Linux 进程 — 进程概念
linux·运维·服务器·开发语言·学习
安卓开发者2 小时前
在鸿蒙NEXT中发起HTTP网络请求:从入门到精通
网络·http·harmonyos
---学无止境---2 小时前
Linux中内核堆栈跟踪函数dump_stack的实现
linux
渡我白衣2 小时前
从传输层协议到 UDP:轻量高效的传输选择
网络·网络协议·udp
早起的年轻人2 小时前
CentOS 8系统盘大文件查找方法
linux·运维·centos
心灵宝贝2 小时前
Linux CentOS 7 安装 zip-3.0-11.el7.x86_64.rpm 详细步骤(命令行教程)(附安装包)
linux·运维·centos
挺6的还2 小时前
50.Reactor反应堆模式
linux
Thexhy2 小时前
在Centos的Linux中安装Windows10系统
linux·运维·经验分享·学习·centos