Linux网络编程—UDP
OSI模型
OSI七层分层 | 范围 |
---|---|
应用层 | 面向应用 |
表示层 | 面向服务 |
会话层 | 面向服务 |
传输层 | 面向通信 |
网络层 | 通信子网 |
数据链路层 | 通信子网 |
物理层 | 通信之网 |
TCP/IP
TCP/IP协议 | 相关工具 |
---|---|
应用层 | Telnet、WWW、FTP |
传输层 | TCP与UDP |
网络层 | IP、ICMP和IGMP |
网络接口与物理层 | 网卡驱动、物理接口 |
TCP:传输控制协议(可靠)
UDP:用户数据报协议(不可靠)
不同点
* TCP:有连接,可靠(打电话)*
数据无误、数据无丢失、数据无失序、数据无重复到达
UDP:无连接,不保证可靠(发短信)
不需要进行连接,所以可以进行高效率的数据传输
IP子网划分
- A类IP地址 网络地址(1位)+主机地址(3位)
- IP段:1.0.0.0 ~ 126.255.255.255
- 默认子网掩码:255.0.0.0
- 1xxx xxxx.xxxx xxxx.xxxx xxxx.xxxx xxxx
- B类IP地址 网络地址(2位)+主机地址(2位)
- IP段:128.0.0.0 ~ 191.255.255.255
- 默认子网掩码:255.255.0.0
- 10xx xxxx.xxxx xxxx.xxxx xxxx.xxxx xxxx
- C类IP地址 网络地址(3位)+主机地址(1位)
- IP段:192.0.0.0 ~ 126.255.255.255
- 默认子网掩码:255.255.255.0
- 110x xxxx.xxxx xxxx.xxxx xxxx.xxxx xxxx
- D类IP地址
- IP段:244.0.0.0 ~ 239.255.255.255
- 1110 xxxx.xxxx xxxx.xxxx xxxx.xxxx xxxx
- E类IP地址
- IP段:240.0.0.0 ~ 254.255.255.255
- 1111 0xxx.xxxx xxxx.xxxx xxxx.xxxx xxxx
- 所以类型地址其他位置 全0 或 全1 时代表网络号和广播地址。
* 子网掩码:*是由连续的1和连续的构成。
* 子网掩码 & 主机号 :*得到主机号的网段;
* 子网掩码 & ~网络号 :*得到子网掩码最多容纳的电脑。
DoS:(拒绝式服务攻击)
DDoS:(分布式拒绝式服务攻击)
DHCP:动态分配地址
DNS:域名解析服务器
字节序(大端 于 小端)
- X86: 小端
- ARM: 大端或者小端(硬件可选择)
- mips: 大端
- powerpc: 大端
- 网络:绝对是大端
地址由低到高
0x 12 34 56 78
先读到 0x78 小端 0x78 56 34 12
先读到 0x12 大端 0x 12 34 56 78
判读大小端序
union a
{
int a;
char b;
}
int main(int argc, char const *argv[]) {
union a x;
x.a = 0x12345678;
printf("%x\n",x.b);
return 0;
}
端口号
- 1 —— tcpmux
- 7 —— echo
- 21 —— ftp
- 23 —— telent
- 1024-50000 —— 系统分配的端口
- 50001-65536 —— 自己分配的端口
Socket:网络应用编程接口
- DNS:8.8.8.8 114.114.114.114 ——域名解析服务
- mac: 地址 - 出厂信息 - 12个16进制值
- ip 地址:192.168.1.1 –点分十进制– 192.168.X.X c类的局域网地址
nc 工具(可以模仿TCP 和 UDP 客户端和服务端)
nc -u IP地址 端口号
UDP:用户数据报协议
bind(sockfd,(struct sockaddr *)&addr,&len);
//bind(1.套接字 2.地址结构体指针 3.结构体长度)
struct sockaddr_in
{
sa_family_t sin_family;
in_port_t sin_port;
sturct in_addr sin_addr;
};
struct in_addr
{
uint32 s_addr;
}
//为了让套接字绑定本机地址和指定端口号
//sockaddr为通用地址结构体,实际使用sockaddr_in
//实际使用sockaddr_in
//传参需要强制转换,为了避免编译错误
2.初始化struct sockaddr_in
addr.sin_family = AF_INET; //填充ipv4域
addr.sin_port = htons(50000); //填充端口号,需要转换大小端
//htons host to network short 主机转网络字节序 短类型
addr.sin_addr.s_addr = inet_addr("0.0.0.0"); //填充地址
4.接收数据recvfrom
recvform(sockfd,buf,size(buf),0,(struct sockaddr *)&addr,&len);
//1. 套接字,2. 用来作为存储接收的缓存,3.大小,4.flag 默认为零
//5. 用来放置发送端的地址结构体指针,6.指定此结构体长度
5.打印数据
printf("%s:%d,%s"inet_toa(addr.sin_addr.s_addr),ntons(addr.ssin_port),buf);
//inet_ntoa network to ascii 网络地址转换成字符串
//ntohs network to host short 网络字节序转换成 本机字节序 短
//buf 打印输出
- UDP发送端
1.定义socket,获取sockid标识符
tcp_socket = socket(AF_INET,SOCK_STREAM,0)
udp_socket = socket(AF_INET,SOCK_DGRAM,0);
raw_socket = socket(AF_INET,SOCK_RAM,protocol);//ipv4域,数据报,协议
2.初始化struct sockaddr_in
addr.sin_family = AF_INET; //填充ipv4域
addr.sin_port = htons(50000); //填充端口号,需要转换大小端
//htons host to network short 主机转网络字节序 短类型
addr.sin_addr.s_addr = inet_addr("0.0.0.0"); //填充地址
3.发送数据sendto
sendto(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&addr,sizeof(addr);