1. UDP
UDP:用户数据报协议(User Datagram Protocol),传输层协议之一(UDP,TCP)
2. 特性
- 发送数据时不需要建立链接,节省资源开销
- 不安全不可靠的协议 //一般用在实时性比较高的广播,组播//VNC
- 面向报文。
- 资源开销小
3.框架
3.1 C/S模式
有一个专用的客户端 client----server
传输方式:用户主机1--->服务器---->用户主机2
框架设计
- server:socket() ===>bind()===>recvfrom()===>close()
- client:socket() ===>(bind())===>sendto() ===>close()
3.2 B/S模式
有一个通用的客户端浏览器
browser----server
client:socket() ===>sendto() ===>close()
4. API接口
4.1 socket函数
套接字:通信对象的抽象, 网络通信的端口,一个通信链的句柄。
int socket(int domain, int type, int protocol);
功能:
创建一个用来通信的接口(文件描述符)
参数:
domain:通信的协议族(AF_INET:IPv4协议族)
type:
SOCK_DGRAM:数据报套接字 (UDP使用此类型)
SOCK_STEAM:流式套接字 (TCP使用此类型)
SOCK_RAW:原始套接字
protocol:
默认传0 按照协议的默认属性创建
返回值:
成功返回用来进行通信的文件描述符
失败返回-1
IPv4地址形式:
struct sockaddr_in {
sa_family_t sin_family; /* AF_INET */
in_port_t sin_port; /* 端口 */
struct in_addr sin_addr; /* IP地址 */
};
/* Internet address. */
struct in_addr {
uint32_t s_addr; /* address in network byte order */
};
端口转换:htons函数
地址转换:inet_addr函数
4.2 sendto函数
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
功能:
向一个IP地址和端口发送数据信息
端口号:区分一台主机不同的应用程序(0 - 65535)
参数:
sockfd:套接字文件描述符
buf:发送数据空间首地址
len:发送数据的长度
flags:发送数据属性(默认为0)
dest_addr:目的IP地址和端口
addrlen:目的IP地址和端口的长度
返回值:
成功返回实际发送字节数
失败返回-1
4.3 htons函数
主机转网络字节序
- 主机:小端 host
- 网络:大端 network
四种不同的转化函数
- uint32_t htonl(uint32_t hostlong); 主机转网络
- uint16_t htons(uint16_t hostshort); 主机转网络
- uint32_t ntohl(uint32_t netlong); 网络转主机
- uint16_t ntohs(uint16_t netshort); 网络转主机
h:host n:net l:long s:short
4.4 inet_addr函数
in_addr_t inet_addr(const char *cp);
功能:
将字符串IP地址转换成二进制IP地址形式
char *inet_ntoa(struct in_addr in);
功能:
将二进制ip转换成字符串
4.5 bind
int bind(int sockfd, const struct sockaddr *addr,
socklen_t addrlen);
功能:将一个套接字与IP地址和端口号绑定(只能绑定自己的IP地址)
参数:
sockfd:套接字文件描述符
addr:IP地址和端口号结构体首地址
addrlen:长度
返回值:
成功返回0
失败返回-1
4.6 recvfrom
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:存放发送端IP地址信息的空间首地址
addrlen:想要接收的数据长度的空间首地址
返回值:
成功返回实际接收字节数
失败返回-1
具有阻塞功能(直到接收到数据,才会继续向下执行)
5. UDP报文头
UDP首部有8个字节,由4个字段构成,每个字段都是两个字节
- 源端口: 源主机的应用程序使用的端口号
- 目的端口:目的主机的应用程序使用的端口号
- 长度:是指UDP头部和UDP数据的字节长度。因为UDP头 部长度为8字节,所以该字段的最小值为8
- 差错检测,检测UDP数据报在传输中是否有错,有错则丢弃
总结
- 无连接
- 尽最大努力交付(不安全,不可靠(丢包、乱序))
- 面向数据报
- 机制简单,传输效率高
应用场景:要求实时性高,但是允许数据丢失的场合(直播,VNC)