linux下的网络编程

一、网络编程

Linux 下的网络编程,核心是基于 TCP/IP 协议栈,通过操作系统提供的 Socket(套接字)API 实现网络通信,支持客户端与服务器间的数据传输,广泛用于开发服务器、客户端、网络工具等应用。

1.目的

不同主机,进程间通信;

2.问题

(1)主机与主机之间物理层面必须互联互通;

(2)进程与进程在软件层面必须互联互通;

广域网与局域网

广域网:覆盖范围广(如城市、国家、全球),依赖运营商专线、卫星等长途传输技术,连接多个局域网,传输速度相对较慢、延迟较高,典型代表是互联网,用于跨区域的数据交互;

局域网:覆盖范围小(如家庭、办公室、校园),采用交换机、路由器等设备连接,传输速度快、延迟低、安全性较高,常用于局部区域内设备(电脑、打印机等)的互联。

交换机与互联网

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

MAC地址:计算机的硬件地址;

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

3.网络协议

网络通信标准

1) 0SI七层模型:开放系统互联模型(open system interconnect)【理论模型】

不同设备间的网络通信的通信标准;

|-------|
| 应用层 |
| 表示层 |
| 会话层 |
| 传输层 |
| 网络层 |
| 数据链路层 |
| 物理层 |

(1)应用层:要传输的数据信息,如文件传输,电子邮件;

(2)表示层:数据加密,解密,压缩,解压缩;

(3)会话层:建立数据传输通道----->会话;

(4)传输层:传输的方式 UDP TCP 端口号;

(5)网络层:实现数据路由 路径规划 路由器 ip;

(6)数据链路层:封装成帧,点对点通信(居于网内通信),差错检测 交换机 ARP;

(7)物理层:定义物理设备标准,电气特性,比如网线、光纤等传输介质 比特流: bit 0、1

2)TCP/IP模型:【应用模型】

五层:

<1>应用层:

HTTP:超文本传输协议

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

FTP:文件传输协议(TCP)

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

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

DNS:域名解析服务,域名转为成IP地址

<2>传输层:

TCP:传输控制协议(确定唯一路径)

UDP:用户数据报协议(数据丢失)

<3>网络层:

IP协议

192.168.1.128

IPV4:32位

IPV6:128位

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

IP地址 = 网络位 + 主机位

子网掩码:

如:255.255.255.0

11111111.11111111.11111111.00000000

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

子网掩码是1的部分对应IP地址的网络位

子网掩码是0的部分对应IP地址的主机位

网段号:

ip地址网络位不变,主机位全为0,则该IP地址的网段号

广播号

192.168.1.255

ip地址网络位不变,主机位全为1,则该IP地址的广播号

网关地址 : 192.168.1.1

IP地址划分:(A)同于管理大规模网络;

(B)用于管理中大规模网络;

(C)用于管理中小规模网络;

(D)组播与广播;

(E)用来实验;

<4>数据链路层:

ARP:地址解析协议

<5>物理层:设备特征等

四层:

应用层:同上;

传输层:同上;

网络层:同上;

网络接口层:合并数据链路层和物理层;

5.网络端口号

端口号:16位的整型数据(unsigned short)0--65535

端口号功能:标记同一主机的不同网络进程

分类:

(1)任何TCP/IP实现所提供的服务都用1-1023之间的端口号;

http:80;

FTP:20/21

TFTP:69

HTTPS:443

(2)端口号从1024-49151是被注册的端口号,被LANA指定为特殊服务使用;

MQTT:1883/8883

6.网络配置

(1)ping ip地址/域名

查看当前主机和ip地址是否联通

(2)ifconfig

在linux下查看当前主机IP地址

在windows下查看当前主机IP地址

7.用户数据协议--UDP

UDP:传输层

用户数据报协议

1)网络编程模型

B/S:browser/server(浏览器/服务器)

1.客户端是一个通用的客户端;

2.只做服务器的开发;

3.客户端要加载的数据均来自服务器;

C/S:client/server(客户端/服务端)

1.客户端是一个专用的客户端;

2.服务器和客户端都需开发;

3.客户端可保存资源,本地加载,无需所有数据都请求服务器;

2)UDP编程

套接字:文件描述符

网络通信时,应用层可操作的端口

客户端 :sendto()--->recvfrom()----->close()

服务端 : bind()----->recvform----> sendto----->close()

UDP特点:UDP:无连接、不可靠、数据报协议(如 DNS、视频流),无需建立连接,传输效率高,但可能丢包或乱序。

UDP函数:

#include <sys/types.h> /* See NOTES */

#include <sys/socket.h>

i(1)nt socket(int domain, int type, int protocol);

功能·:创建通信的套接字;

参数:

domain:网络层使用什么协议族

AF_INET IPv4 Internet protocols

AF_INET6 IPv6 Internet protocols

type:规定传输层的协议

SOCK_DGRAM :UDP协议;

SOCK_STREAM:TCP协议;

SOCK_RAW:原始套接字

protocol:0 按照默认协议创建;

返回值:

成功:套接字

失败:-1

(2)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:按照默认方式发送;

deat_addr:接收方的地址信息(IP+端口号);

addrlen:接收方地址的大小;

返回值:

成功:实际发送的字节数;

失败:-1;

下列函数是Linux 网络编程中核心的字节序转换函数,主要用于解决不同主机间数据传输的 "字节序不一致" 问题,确保数据在网络中正确解析:host:主机 network:网络

uint32_t htonl(uint32_t hostlong); 主机转网络 host ----->network 4

uint16_t htons(uint16_t hostshort); 主机转网络 host ----->network 2

uint32_t ntohl(uint32_t netlong); 网络转主机 network----->host 4

uint16_t ntohs(uint16_t netshort); 网络转主机 network----->host 2

其中

网络字节序:大端 network

主机字节序:小端 50000 host

(3)in_addr_t inet_addr(const char *cp);

功能:

将字符串IP地址转换成二进制IP地址形式

char *inet_ntoa(struct in_addr in);

功能:

将二进制ip转换成字符串

#include <sys/types.h> /* See NOTES */

#include <sys/socket.h>

(4) int bind(int sockfd, const struct sockaddr *addr,

socklen_t addrlen);

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

参数:

sockfd:套接字;

addr:需要绑定的地址;

addrlen:绑定地址的大小;

返回值:

成功:0;

失败:-1

(5) 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:发送发地址的指针;

返回值:

成功:接受的字节数;

失败:-1