UDP协议及编程

UDP协议

UDP是无连接的,即发送数据之前不需要连接,因此减少了开销和发送数据之间的时延。

UDP使用尽最大努力交付,即不保证可靠交付,因此主机不需要维持复杂的连接状态表

UDP是面向报文的,发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付IP层。

也就是说UDP的报文长度是由应用进程来决定的,若报文太长,UDP把它交给IP层后,IP层在传送时可能要进行分片,这会降低IP层的效率;反之,若报文太短,UDP把它交给IP层后,会使IP数据报的首部的相对长度太长,这也会降低IP层的效率,所以,应用程序必须选择合适大小的报文,使UDP能一次交付一个完整的报文。

UDP没有网络拥塞控制,因此网络出现的拥塞不会使源主机的发送效率降低。

UDP支持一对一、一对多、多对一和多对多的交互通信。

UDP的首部开销小,只有8个字节,比TCP的20个字节的首部要短。

虽然某些实时应用需要使用没有网络拥塞的UDP,但当很多的源主机同时都向网络发送高速率的实时视频时,网络就有可能发生拥塞,结果大家都无法正常接收。因此,不适用拥塞控制功能的UDP可能会引起网络产生严重的拥塞问题。

UDP的首部格式

用户数据报UDP有两个字段:数据字段和首部字段。首部字段很简单,只有8个字节,由4个字段组成,每个字段的长度都是两个字节。各字段意义如下:

源端口:源端口号在需要对方回信时选用,不需要时可用全0。

目的端口:目的端口号,这在终点交付时必须使用。

长度:UDP用户数据报的长度,其最小值是8(仅有首部)。

检验和:检测UDP用户数据报在传输中是否有错。有错就丢弃

图解:

 

 

 这里的伪首部主要是在计算检验和时,临时添加在UDP数据报前面。得到一个临时的用户数据报,伪首部的存在仅仅是为了计算检验和,既不向下传送也不向上递交。仔细看图就会发现,UDP的首部不包括伪首部。

 当运输层从IP层收到UDP数据报时,就根据首部中的目的端口,把UDP数据报通过相应的端口,上交至最后的应用进程,如图:

 如果接收方UDP发现收到的报文段中的目的端口不正确(即不存在对应于改端口号的应用进程),就丢弃该报文。请注意:虽然在UDP之间的通信要用到其端口号,但由于UDP的通信是无连接的,,因此不需要使用套接字。

UDP编程

UDP的编程流程

 服务器端的代码:

 客户端代码:

运行结果:

 

由运行结果我们可以看出,UDP服务器端支持同时连接多个客户端,每个客户端都有自己的端口号 ,服务器根据这个端口号判断是哪个客户端发送来的数据。

我们之前说过,UDP的传输是不可靠的,那么它不可靠在哪里呢?

我们改动一下代码,让服务器端一次只收一个字符

 

 运行结果:

 由图我们可以看出,虽然客户端每次都传一个完整的字符串,但是服务器端只收一个字符的话。后边的就直接丢失了,找不到了。

UDP数据报服务特点:发送端应用程序每执行一次写操作,UDP模块就将其封装成一个UDP数据报发送。接受端必须及时针对一个每一个UDP数据报执行写操作,否则就会丢包。并且,如果用户没有指定足够的应用程序缓冲区来读取UDP数据,则UDP数据将被截断

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值