网络编程--UDP协议

UDP(User Datagram Protocol)协议即用户数据报协议,UDP是一个简单的面向数据报的传输层协议。

和TCP不一样, UDP不提供信息的可靠传递,主要包括:
1. TCP协议中,当数据接收方收到发送方传来的信息时,会自动向发送方发出确认消息,发送方只有在接收到该确认消息之后才继续传送其它信息,否则将一直等待直到收到确认信息为止。而UDP协议并不提供数据传送的保证机制,如果在从发送方到接收方的传递过程中出现数据报的丢失,协议本身并不能做出任何检测或提示。
2. UDP不提供拥塞控制,因此不能确保数据的发送和接收顺序
3. UDP不保证每个数据报只到达一次

UDP提供无连接服务,UDP客户端在往服务器发送数据前,无需建立连接。例如:一个UDP客户端可以创建一个套接口并发送一个数据报给一个服务器,然后立即用同一个套接口给另一个服务器发送数据。

UDP包头包括以下内容:
源端口号(2byte)
目标端口号(2byte)
数据报长度(2byte)
校验值(2byte)

源端口和目标端口用来标记发送和接受的应用进程,由于UDP不需要应答,所以来源端口是可选的。
数据报的长度是指包括报头和数据部分在内的总的字节数。因为报头的长度是固定的,所以该域主要被用来计算可变长度的数据部分。数据报的最大长度根据操作环境的不同而各异。从理论上说,包含报头在内的数据报的最大长度为65535字节。不过,一些实际应用往往会限制数据报的大小,有时会降低到8192字节。
校验值是用来对首部和数据部分一起做校验和的,这部分是可选的,但在实际应用中一般都使用这一功能。

使用UDP协议传输数据时,可以 单次发送的最大UDP数据长度取决于:
1. 不会超过65535 - 20(IP包头)- 8(UDP包头) = 65487,如果大于这个值会返回EMSGSIZE,这个值由UDP协议指定(16位UDP长度),在内核中写死。
2. 不会超过内核的socket发送缓存,如果内核的socket发送缓存不够大会返回ENOBUFS。
3. 如果UDP包不允许自动分片(可以通过setsockopt(SOL_IP,IP_MTU_DISCOVER,IP_PMTUDISC_DO)来实现,则UDP数据长度不能超过MTU-20(IP包头)- 8(UDP包头) ,大于这个值会返回EMSGSIZE。

Linux可以通过netstat -su 查看udp相关的统计信息
$ netstat -su
Udp:
    370062291 packets received (接收并被程序处理的udp包数)
    30 packets to unknown port received. (接收到的目的端口未知的包数)
    0 packet receive errors (接收错误的包数,可能性包括:UDP包由于校验和错误、头错误、由于某一个分片没有收到或者由于内核接收缓存不足)
    371447314 packets sent (成功发送的UDP包数)
一般来说,receive error是由于内核接收缓冲区不足导致,可以通过增大内核缓冲区减少丢包数。修改内核的发送和接收缓存可以针对每一个socket调用setsockopt进行调整,也可以全局调整。

UDP应用:
和TCP协议相比,UDP协议不保证可靠性,但是,UDP相比TCP协议具有巨大的速度优势。因此,在某些强调速度而不是可靠性的场合,UDP具有很大的价值,例如:网络游戏,视频聊天,语音聊天等。

reference:
UNIX网络编程,第一卷
wiki:用户数据报协议

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值