网络
一、国际网络通信协议
(1)OSI协议
应用层 发送的数据内容
表示层 数据是否加密
会话层 是否建立会话连接
传输层 数据传输的方式
网络层 数据的路由
数据链路层 局域网内部通信
物理层 物理介质的连接
(2)TCP/IP协议
应用层:发送的数据内容
FTP 文件传输协议
TFTP 简单文件传输协议
HTTP 超文本传输协议
HTTPS 安全超文本传输协议
SMTP 简单邮件传输协议
TELNET 网络终端登录协议
DNS 域名系统
传输层:数据传输的方式
TCP 传输控制协议
UDP 用户数据报协议
UDP:不安全、不可靠的传输方式
UDP机制简单
UDP占用的资源开销比较小
TCP:安全、可靠的传输方式
TCP机制复杂
TCP占用的资源开销比较大
三次握手建立连接,确认双方能够通信
通信过程中保障数据传输的完整性
四次挥手断开连接,确保数据传输的完整
网络层:数据由一台主机到达另一台主机(IPV4协议)
IP地址 = 网络位 + 主机位
网络位:IP地址所属的网段(局域网的编号)
主机位:局域网中的第几台主机
网段号:网络位不变,主机位全为0
广播号:网络位不变, 主机位全为1
子网掩码:每个IP地址都会搭配一个子网掩码,用来区分IP地址的网络位及主机位
子网掩码展开成二进制,1对应的部分就是IP地址的网络位,0对应的部分就是IP地址的主机位
IP地址的划分:(公有地址,私有地址)
网络接口层:物理介质连接
二、UDP编程
(1)发送端
int main(void)
{
int sockfd = 0;
ssize_t nsize = 0;
int ret = 0;
struct sockaddr_in recvaddr;
struct sockaddr_in sendaddr;
//1.创建用来通信的套接字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (-1 == sockfd)
{
perror("fail to socket");
return -1;
}
//2.将发送端套接字与IP地址和端口号绑定
sendaddr.sin_family = AF_INET;
sendaddr.sin_port = htons(20000);
sendaddr.sin_addr.s_addr = inet_addr("192.168.0.171");
ret = bind(sockfd, (struct sockaddr *)&sendaddr, sizeof(sendaddr));
if (-1 == ret)
{
perror("fail to bind");
return -1;
}
//3.为目的地址赋值
recvaddr.sin_family = AF_INET; //协议族
recvaddr.sin_port = htons(30000); //端口号(将本地字节序转换为网络字节序)
recvaddr.sin_addr.s_addr = inet_addr("192.168.0.171"); //IP地址(将字符串类型转换为二进制地址类型)
//4.向目的地址发送数据
nsize = sendto(sockfd, "hello world", 12, 0, (struct sockaddr *)&recvaddr, sizeof(recvaddr));
if (-1 == nsize)
{
perror("fail to sendto");
return -1;
}
printf("发送成功!\n");
//5.关闭套接字
close(sockfd);
return 0;
}
(2)接收端
int main(void)
{
int ret = 0;
int sockfd = 0;
struct sockaddr_in recvaddr;
char tmpbuff[4096] = {0};
ssize_t nsize = 0;
//1.创建套接字
sockfd = socket(AF_INET, SOCK_DGRAM, 0);
if (-1 == sockfd)
{
perror("fail to socket");
return -1;
}
//2.绑定IP和Port
recvaddr.sin_family = AF_INET;
recvaddr.sin_port = htons(30000);
recvaddr.sin_addr.s_addr = inet_addr("192.168.0.171");
ret = bind(sockfd, (struct sockaddr *)&recvaddr, sizeof(recvaddr));
if (-1 == ret)
{
perror("fail to bind");
return -1;
}
//3.接收数据
nsize = recvfrom(sockfd, tmpbuff, sizeof(tmpbuff), 0, NULL, NULL);
if (-1 == nsize)
{
perror("fail to recvfrom");
return -1;
}
printf("接收内容: %s\n", tmpbuff);
close(sockfd);
return 0;
}