UDP协议浅析

传输层:负责应用程序之间的数据传输; 典型协议 UDP / TCP
UDP:
udp全名用户数据报协议是无连接,不可靠,面向数据包的传输协议。

  • 无连接:知道对方的地址就可以发送数据,不需要建立连接;

  • 不可靠:udp并不保证数据可靠的到达对端,只管数据发送出去,不关心会不会丢失。

  • 面向数据包:无连接的,不可靠,有最大长度限制的数据传输。(小于64k)

协议格式
在这里插入图片描述

  • 16位源端口 / 16位目的端口:
    负责应用程序之间的数据传输 - 因为端口在一台主机上唯一标识一个进程。
  • 16位校验和:
    校验数据一致性(发送的数据和接收的数据是否一致) – 二进制反码求和算法发送数据的时候,将校验和设置为0,然后从报文第0个字节开始,每个字节进行取反相加超出16位的部分(求和进位部分)取出来再次与低16位进行相加,最后得到的数据填充到校验和中。
    接收方同样对接收到的数据进行二进制反码求和,得出的数据若为0则标识一致。
  • 16位数据报长度:
    包含有udp报头在内的一个完整数据包的长度;udp报头是8个字节,然而因为数据报长度只是用2个字节存储,因此能够表示的长度最多为65535,因此udp在使用sendto发送数据的时候给予的数据的最大长度限制是64k - 8;
    16位能够保存的最大数字:65535,也意味着一个udp报文的长度小于64k,因此udp传输的数据
    大小不能超过64k-8。

协议实现 / 特性对于上层代码编写的影响:

  1. 若在发送大文件的时候,文件数据大于64k-8,则不能一次性发送,需要用户在应用层进
    行分包操作,将一个大数据截断为多个小数据进行发送;
  2. 但是udp并不保证数据有序到达,因此需要用户在应用层进行包序管理。

udp的数据传输是整条收发:
发送方:udp使用sendto发送数据的时候,将数据放到sendto发送缓冲区中,socket会直接为这个数据封装udp包头然后发送出去;
接收方:udp使用recvfrom接收数据的时候,对方发送了100个字节,那么这个数据就不能分成两个50字节进行多次接收,应用层接收数据的时候,udp在传输层一次只会交付一条完整的数据,不会交付半条或者多条;
因此使用udp接收数据的时候,接收缓冲区要定义的足够大,否则若发送的数据比较大,缓冲区不够,则会recvfrom失败。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值