网络:
可以用来:数据传输、数据共享
1. 网络协议模型:
1. OSI协议模型:
应用层 | 实际收发的数据 |
表示层 | 发送的数据是否加密 |
会话层 | 是否建立会话连接 |
传输层 | 数据传输的方式(数据包,流式) |
网络层 | 数据的路由(如何从一个局域网到达另一个局域网) |
数据链路层 | 局域网下如何通信 |
物理层 | 物理介质的连接 |
2. TCP/IP协议模型:
应用层 | 传输的数据 |
传输层 | 传输的方式 |
网络层 | 数据如何从一个台主机到达另一台主机 |
网络接口层 | 物理介质的连接 |
1. 应用层:
例如有:HTTP 超文本传输协议
HTTPS
FTP 文件传输协议
TFTP 简单文本传输协议
SMTP 邮件传输协议
MQTT
TELNET
...
2. 传输层:
UDP:用户数据报协议
特点:1. 实现机制简单
2. 资源开销小
3. 不安全不可靠
TCP:传输控制协议
特点:1. 实现机制复杂
2. 资源开销大
3. 安全可靠
3. 网络层:
IPv4
IP地址:唯一网络中一台主机的标号
IP地址:网络位 + 主机位
子网掩码:用来标识IP地址的网络位和主机位
子网掩码是1的部分表示IP地址的网络位
子网掩码是0的部分表示IP地址的主机位
网段号:网络位不变,主机位全位0,表示网段号
广播地址:网络位不变,主机位全为1,表示广播地址
IP地址类型:
A类:
1.0.0.0 - 126.255.255.255
子网掩码:255.0.0.0
管理超大规模网络
私有IP地址:10.0.0.0 - 10.255.255.255
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.0.0.0
用于组播
E类:
240.0.0.0 - 255.255.255.255
用于实验
4. UDP编程:
socket套接字编程:
1. 发端
1. socket:
int socket(int domain, int type, int protocol);
功能:创建一个用来通信的文件描述符
参数:
domain:使用的协议族 AF_INET(IPv4协议族)
type:套接字类型
SOCK_STREAM:流式套接字
SOCK_DGRAM:数据报套接字
SOCK_RAW:原始套接字
protocol:协议
默认为0;
返回值:
成功返回文件描述符
失败返回-1
2. sendto:
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:目的地址信息存放的空间首地址
addrlen:目的地址的长度
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 */
};/* Internet address. */
struct in_addr {uint32_t s_addr; /* address in network byte order */
};
返回值:
成功返回实际发送字节数
失败返回-1
3. inet_addr:
in_addr_t inet_addr(const char *cp);
功能:将字符串IP地址转换为内存中的IP地址
4. htons:
uint16_t htons(uint16_t hostshort);
功能:将本地字节序转换为网络的大端字节序
练习:
1. 编写程序实现从终端接收字符串发送给windows软件调试助手,并接收软件助手的回复,显示在终端屏幕上
#include "head.h"int main(void)
{int sockfd = 0;ssize_t nsize = 0;char tmpbuff[1024] = {0};struct sockaddr_in recvaddr;sockfd = socket(AF_INET, SOCK_DGRAM, 0);if(sockfd == -1){perror("fail to socket");return -1;}gets(tmpbuff);recvaddr.sin_family = AF_INET;recvaddr.sin_port = htons(50000);recvaddr.sin_addr.s_addr = inet_addr("192.168.1.162");bind(sockfd, (struct sockaddr *)&recvaddr, sizeof(&recvaddr));nsize = sendto(sockfd, tmpbuff, strlen(tmpbuff), 0, (struct sockaddr *)&recvaddr, sizeof(recvaddr));if(nsize == -1){perror("fail to sendto");return -1;}printf("成功发送 %ld 字节!\n", nsize);memset(tmpbuff, 0, sizeof(tmpbuff));nsize = recvfrom(sockfd, tmpbuff, sizeof(tmpbuff), 0, (struct sockaddr *)&recvaddr, (socklen_t *)sizeof(&recvaddr));printf("%s\n",tmpbuff);close(sockfd);return 0;
}