文章目录
- 1.UDP特点
- 2.UDP客户/服务基本模型
- 3.UDP回射客户/服务器
- 4.UDP注意点
1.UDP特点
- 无连接
不需要经过三次握手 - 基于消息的数据传输服务
TCP是基于流的传输服务,消息之间没有边界,UDP数据包之间有边界 - 不可靠
数据包丢失,重复,乱序,以及缺乏流控 - 一般情况下UDP更加高效
2.UDP客户/服务基本模型
3.UDP回射客户/服务器
- 红色竖线:表示客户端和服务端的边界
- eg:服务端:NetworkProgramming-master (1)\LinuxNetworkProgramming\P19udpechosrc.c
- eg:客户端:NetworkProgramming-master (1)\LinuxNetworkProgramming\P19udpechocli.c
- 测试结果:
4.UDP注意点
- UDP报文可能会丢失、重复
(1)丢失:需要客户端和服务端得有超时机制
(2)重复:需要维护数据报的序号 - UDP报文可能会乱序(需要维护数据报的序号)
- UDP缺乏流量控制
- UDP协议数据报文截断
(1)若缓冲区满了,会将缓冲区的数据覆盖掉,也可以在应用层模拟TCP的滑动窗口协议来实现流控
(2)若接收到的数据报大于接收缓冲区,报文就会截断,下一次接收就不能接收数据了,那些数据会被丢弃
(3)eg:NetworkProgramming-master (1)\LinuxNetworkProgramming\P19trunc.c
(4)测试
- recvfrom返回0,不代表连接关闭,因为udp是无连接的
- ICMP异步错误
(1)如何解决ICMP异步错误?
UDP也使用connet
(2)测试代码:NetworkProgramming-master (1)\LinuxNetworkProgramming\P19udpechocli.c - UDP connect
(1)代码:NetworkProgramming-master (1)\LinuxNetworkProgramming\P19udpechocli.c
(2)测试:操作:只运行客户端,
异步错误返还给已连接的套接字 - UDP外出接口的确定
(1)假定客户端有多个ip
客户端 服务端
192.168.1.100 192.168.1.33
192.168.2.100 192.168.2.33
(2)若客户端sendto(sock, 192.168.1.33),则客户端udp的sock会自动选择与192.168.1.100进行绑定,则外出接口地址就会选择192.168.1.100,若没有connect,则发送给谁由sendto决定;
(3)若客户端connect(sock, 192.168.1.33),则客户端udp的sock会自动选择与192.168.1.100进行绑定,则外出接口地址就会选择192.168.1.100,这里仅仅绑定外出接口地址,而端口的绑定是第一次调用sendto时绑定的 - Makefile
下面的可执行文件的编译结果,是由编译器自动推导得到的