一、特点
- UDP提供无连接服务
UDP客户端与UDP服务端不必存在任何长期的关系。一个UDP客户端可以发送一个数据报给一个UDP服务端,然后又立即发送另一个数据报给另一个UDP服务端。同样地,UDP服务端可以用一个UDP套接字接收多个UDP客户端数据。
- UDP是不可靠性
UDP不保证UDP数据报会到达其最终目的地,不保证各个数据报的先后顺序跨网络后保持不变,也不保证每个数据报只到达一次。
TCP会给每个分节关联一个序列号,如果接收到重复数据,可以判定数据重复并丢弃。
- 每个数据报都有一个长度,并随着数据报一并传递给接收端进程。不同于没有任何记录边界的字节流协议TCP
二、UDP客户端
1)编写步骤
- 创建UDP套接字socket:SOCK_DGRAM
- 准备UDP服务端ip和端口,bzero、inet_pton
- 使用sendto、recvfrom交互数据
- 关闭套接字
2)相关函数
1.socket 函数:int socket(int domain, int type, int protocol);
- socket函数创建一个套接字描述符。
man手册描述,socket创建一个通信端点并返回一个描述符。
- 参数domain指定通信域,使用了AF_INET,表示是IPv4 Internet protocols协议的。
- 参数type指定套接字类型,使用``,表示TCP协议的套接字(提供有序、可靠、双向、基于连接的字节流。可以支持带外数据传输机制)。
- 参数protocol指定了要与套接字一起使用的特定协议。通常,在给定的协议族中,只有一个协议支持特定的套接字类型,在这种情况下,协议可以指定为0。
2.sendto函数:ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
sendto 函数将数据发送到指定的IP地址,一般在UDP协议使用。
前面三个参数跟write函数一致,第4个参数是一个标志,最后两个参数跟connect函数的后两个参数一样,用来指定对端IP和端口。
写一个长度为0的数据报是可行的。在UDP情况下,这会形成一个只包含一个IP首部(对于IPv4通常为20个字节,对于IPv6通常为40个字节)和一个8字节UDP首部而没有数据的IP数据报。
三、UDP服务端
1)编写步骤
- 创建UDP套接字socket:SOCK_DGRAM
- 准备服务端ip和端口
- 绑定,bind
- 使用sendto、recvfrom交互数据
- 关闭套接字
2)相关函数
1.bind函数:int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
bind函数将addr指定的地址分配给文件描述符sockfd引用的套接字。
addrlen指定addr指向的地址结构的大小。
2. recvfrom 函数:ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags, struct sockaddr *src_addr, socklen_t *addrlen);
recvfrom 函数从套接字接收数据,并且将对端的IP和端口号通过src_addr变量返回。
前三个参数与read函数一样,第4个参数是一个标志,最后两个参数跟accept函数的后两个参数一样,用来获取对端IP和端口,addrlen是一个值-结果参数。
对于UDP协议,recvfrom返回0也是可接受的,表示对端发了一个长度为0的数据报。不像TCP协议那样,read返回0表示对端关闭。
四、总结
五、相关概念:多播/组播
1)概念
多播(Multicast)是指将数据包从一个源点发送到多个目的地的网络通信模式。不同于单播(Unicast)一对一通信或广播(Broadcast)一对全体通信,多播可以实现一对多或多对多的高效数据传输。
组播(Multigroup)则是多播的一种特殊形式,它是基于多播技术实现的面向特定组成员的数据传输机制。组播要求数据发送方和接收方预先加入同一个"组播组"才能进行通信。
2)工作原理
1.多播
- 发送方发送数据包时,会指定一个多播 IP 地址作为目的地址。
- 网络设备(如路由器)根据多播路由协议将数据包转发到需要接收该数据的各个网段。
- 接收方无需订阅任何特殊组,只要监听该多播 IP 地址即可收到数据。
2.组播
- 发送方发送数据包时,会指定一个组播 IP 地址作为目的地址。
- 接收方需要通过加入对应的组播组来接收数据。
- 网络设备根据组播路由协议转发数据包,只发送到已加入该组的接收方所在的网段。
3)应用场景
1.视频直播
- 视频直播通常需要将视频数据同时分发给大量观众,使用多播/组播技术可以大大提高传输效率。
- 发送方将视频数据发送到多播/组播地址,接收方加入该地址即可观看。
2.文件分发
- 在需要向大量客户端分发相同文件的场景中,使用多播/组播技术可以提高分发效率。
- 发送方将文件数据发送到多播/组播地址,接收方加入该地址即可下载。
3.游戏匹配
- 在线游戏中,玩家需要快速组建游戏房间并匹配对手。使用组播技术可以实现这一过程。
- 玩家加入对应的组播组,游戏服务器向该组发送游戏房间信息,玩家即可快速加入游戏。
4.实时监控
- 在监控系统中,摄像头需要将视频数据同时分发给多个监控终端。使用组播技术可以高效完成这一任务。
- 监控终端加入对应的组播组,即可实时接收到来自摄像头的视频数据。
5.分布式计算
- 在分布式计算环境中,任务调度中心需要将计算任务分发给多个节点。使用组播技术可以简化这一过程。
- 计算节点加入对应的组播组,调度中心向该组发送计算任务,节点即可接收并处理。
4)实现步骤
- 创建 UDP 套接字,并设置相关选项(如 multicast_ttl、add_membership 等)
- 指定多播/组播 IP 地址和端口号
- 发送/接收数据包