网络通信:不同主机,进程间通信。
网络协议
1. OSI七层模型
应用层: 要传输的数据信息,如文件传输,电子邮件等
表示层: 数据加密,解密操作,压缩,解压缩
会话层: 建立数据传输通道
传输层: 传输的方式 UDP TCP 端口号
网络层: 实现数据路由,路径规划 路由器 ip
数据链路层: 封装成帧,点对点通信(局域网内通信),差错检测 交换机 ARP
物理层: 定义物理设备标准,比如网线,光纤等传输介质、传输比特流 bit 0 1
2. TCP/IP模型(有四层,也有五层,根据不同情况定义)
四层模型
应用层: 应用层、表示层、会话层
传输层: 传输层
网络层: 网络层
网络接口层: 数据链路层、物理层
五层模型中
1.应用层
http :超文本传输协议
https:超文本传输协议(SSL加密)
FTP: 文件传输协议
TFTP:简单文件传输协议
DNS服务:域名解析服务 www。baidu-----》ip地址
MQTT协议:消息队列遥感传输协议;
2.传输层(IP协议)
TCP :传输控制协议
UDP:用户数据报协议
3.网络层
IPv4 :IP协议
IPv6 : IP协议
4.数据链路层
ARP:地址解析协议 MAC地址转为IP地址(转换到其他局域网内的路由器后,转化mac地址寻找对应主机)
RARP: 逆地址解析协议
5.物理层
3. IP协议
IP协议
192.168.1.128这就是一个ip地址
IPv4 有 32位
IPv6 有 128位
IP地址 = 网络位 + 主机位
网络位: 该IP地址位于哪个网段(局域网)内
主机位: 这个网段(局域网)第几台主机
而我们如何区分网络位和主机位就要借助我们的子网掩码了
255.255.255.0 二进制全部是1的情况下说明是网络位
子网掩码:
如:255.255.255.0
11111111.11111111.11111111.00000000
用来区分IP地址的网络位和主机位,搭配IP地址使用。
子网掩码是1的部分对应IP地址的网络位
子网掩码是0的部分对应IP地址的主机位
在一段局域网内的时候,我们也有网段号,跟网关的两种情况。
192.168.1.0
网段号:
IP地址网络位不变,主机位全为0,则为该IP地址的网段号
192.168.1.3
255.255.0.0
192.168.0.0
网关地址:
192.168.1.1(也就是每一段局域网内的第一台主机)
IP地址的划分
(1)A类地址:
范围:1.0.0.0 - 126.255.255.255
子网掩码:255.0.0.0 126*2^24
用于管理大规模网络
私有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 2^16
管理大中规模网络
私有IP地址:172.16.0.0 - 172.31.255.255
(3)C类地址:
范围:192.0.0.0 - 223.255.255.255
子网掩码:255.255.255.0 2^8
管理中小规模网络
私有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:由电信公司直接分配,并需要付费的IP地址, 可以直接访问internet
私有IP:不能直接访问internet的ip地址
节省ip地址
4.网络协议栈
端口号: 16位的数值 0-65535 unsigned short
作用:唯一的标识一个网络进程
每一个应用进程都有一个端口号;
通讯时用来区分数据包属于哪一个进程。
分类:
1)任何TCP/IP实现所提供的服务都用1-1023之间的端口号。
http : 80
FTP: 20/21
TFPT: 69
HTTPS: 443
MQTT协议:1883
2)端口号从1024-49151是被注册的端口号,被IANA指定为特殊服务使用。
3)从49152-65535是动态或私有端口号。(但是依然有部分端口号被注册所以我们可以使用五万的进程端口号进行操作)
1.数据包的封装和解封过程

2. 网络配置
桥接模式
虚拟机---》设置---》网络适配器----》桥接模式----》确定
编辑---》虚拟网络编辑器---》更改设置---》Vmnet0---》桥接模式---》桥接到:Windows正在上网
的网卡--》应用---》确定
- 修改网络配置文件
sudo vim /etc/network/interfaces
需要我们去配置这两段网卡,之后我们就可以连接到本地网络进行数据传输了。
1.我们同样也可以使用ifconfig去查看我们自己虚拟机的网络。
2.之后可以使用ping www.baidu进行检查网络是否连接成功。
3.UDP协议
UDP协议发生在我们的传输层,用于我们在不同主机端的通信的方式之一
- 网络通信模型
B/S :Browser/Server : 浏览器/服务器(这种只需要开发服务端就可以进行操作了)
C/S :Client / Server :客户端/服务端

socket函数接口接口使用
int socket(int domain,int type,int protocol)

他的返回值为 成功 文件描述符;
失败 -1;
sendto函数接口
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);



其中包含的两个结构体 man 7 ip 进行查询
上面的两个结构体 两个都是<netinet/in.h>里面的 IPv4 地址结构体,嵌套关系:sockaddr_in里面包含一个struct in_addr类型的成员。
cs
struct sockaddr_in
{
sa_family_t sin_family; // 协议族 AF_INET
in_port_t sin_port; // 端口号,网络字节序
struct in_addr sin_addr; // IP地址结构体(重点!)
unsigned char sin_zero[8]; // 填充对齐,不用管,memset清零
};
// 专门存IPv4的IP地址(32位整数)
struct in_addr
{
uint32_t s_addr; // 网络字节序的ipv4地址,无符号32位整数
};
struct in_addr只做一件事,存放 IPv4 地址(192.168.x.x)的二进制数字。
定义方法:
cs
struct in_addr ip;
ip.s_addr = inet_addr("192.168.0.152");
储存方式
网络字节序:大端 (高地址存低字节位,低地址存高字节位)
主机字节序:小端 (高地址存高字节位,低地址存低字节位)
host 主机字节序(主机序)(为什么要使用)
htons :2字节数据,主机字节序转网络字节序//主机存50000,使用htons转为网络序发送
htonl :4字节数据,主机字节序转网络字节序
ntohs :2字节数据,网络字节序转主机字节序
ntohl :4字节数据,网络字节序转主机字节序
举个例子,端口号 50000 在你电脑内存 (host 主机序,小端) 存放:0x 38 0x 9C 网络传输必须用大端,调用htons(50000)之后变成:0x9C 0x38,发给网卡。
容易混淆两点
inet_addr()输出直接网络序,不要再 htonl;INADDR_ANY只是一个数字常量(0),属于 host 序,所以要写htonl(INADDR_ANY)
bind()
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:绑定当前套接字和IP地址及端口号
参数:
sockfd:套接字
addr:要绑定的地址信息指针
addrlen:地址信息的长度
返回值:
成功:0
失败:-1
recvfrom(
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
功能:接收UDP数据报文
参数:
sockfd:套接字
buf:存储网络接收到的数据
len :期望接收到的字节数
flags:0 默认方式接收
src_addr:保存发送发地址信息的指针
addrlen:地址长度的指针
返回值:
成功:实际接收到的字节数
失败:-1
0 :当对方发送0字节数据包
char *inet_ntoa(struct in_addr in);
功能:将结构体类型的IP地址转换成字符串的IP地址
4.网络抓包工具
sudo apt-get install wireshar//下载
启动wireshark : sudo wiresha
选择抓取的网卡:any
- 选择抓取数据包的过滤条件并触发:udp.port == 5000