1. 目的
不同主机,进程间通信。
2. 解决的问题
-
主机与主机之间物理层面必须互联互通。
-
进程与进程在软件层面必须互联互通。
-
IP地址:计算机的软件地址,用来标识计算机设备
-
MAC地址:计算机的硬件地址(固定)
-
网络的端口号:标记同一主机上的不同网络进程
-
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地址分类
-
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
-
-
B类地址
-
范围:128.0.0.0 - 191.255.255.255
-
子网掩码:255.255.0.0
-
管理大中规模网络
-
私有IP:172.16.0.0 - 172.31.255.255
-
-
C类地址
-
范围:192.0.0.0 - 223.255.255.255
-
子网掩码:255.255.255.0
-
管理中小规模网络
-
私有IP: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.254
-
用来进行实验
-
公有IP:由电信公司分配,可直接访问Internet
-
私有IP:不能直接访问Internet,可节省IP地址
-
-
5. 网络端口号
16位整形数据(0-65535),标记同一主机上的不同网络进程
分类:
-
1-1023:知名端口
-
HTTP:80
-
FTP:20/21
-
TFTP:69
-
HTTPS:443
-
-
1024-49151:注册端口(IANA指定特殊服务使用)
- MQTT:1883/8883
-
49152-65535:动态或私有端口
6. 网络配置
-
ping IP/域名
:检测网络连通性- 示例:
ping www.baidu.com
- 示例:
-
查看当前主机IP
-
Linux:
ifconfig
-
Windows:
ipconfig
-
-
虚拟机网络配置
-
桥接模式
-
编辑虚拟网络编辑器 → VMnet0 桥接至当前上网网卡
-
-
修改网络配置文件
/etc/network/interfaces
auto lo
iface lo inet loopbackauto ens33
iface ens33 inet dhcp -
重启网络服务
sudo /etc/init.d/networking restart
-
测试网络
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