zoukankan      html  css  js  c++  java
  • 网络基础协议之UDP(上篇)

    UDP 协议的简单描述

    • UDP 是一个无连接协议,也就是传输数据之前源端口和目的端口不能建立连接。当它想传输数据时,就简单的区抓取来自应用程序的数据,并尽可能快的把它扔到网络上。在发送端,UDP传输数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽限制。在接收端,UDP 把每个消息段放在队列中,应用程序每次从队列中读取一个消息段。
    • 由于传输数据不建立连接,因此也就不需要维护连接状态。因此,一台服务器可以同时向多个客户机传输相同的消息。
    • UDP 信息报的标题很短,只有8个字节,相对于TCP的20个字节信息包的额外开销很小。
    • 吞吐量不受拥挤控制算法的调节,只受应用程序生成数据的速率、传输带宽、源端和目的端主机性能的限制。
    • UDP 使用尽最大努力交付,即不保证可靠交付,因此主机不需要维护复杂的链路状况表。
    • UDP是面向报文的。发送方的UDP 对应用程序传输下来的报文,添加首部后就向下传送给IP 层。既不拆分,也不合并,而是保留这些报文的边界。因此,应用程序需要选择合适的报文大小。
    • 虽然UDP 是一个不可靠的协议,但是它是分发消息的一个理想协议。例如:QQ、屏幕上面的股票报告、航空信息、视频、网络电话、迅雷等等。
    • UDP每个数据包最大是64K

    UDP的首部格式

    UDP数据报分为首部和用户数据部分,整个UDP数据报作为IP数据报的数据部分封装在IP数据报中,UDP数据报文结构如图所示

    UDP首部有8个字节,由4个字段构成,每个字段都是两个字节,

    • 源端口: 源端口号,需要对方回信时选用,不需要时全部置0.
    • 目的端口:目的端口号,在终点交付报文的时候需要用到。
    • 长度:UDP的数据报的长度(包括首部和数据)其最小值为8(只有首部)
    • 校验和:检测UDP数据报在传输中是否有错,有错则丢弃。

    UDP校验

    在计算校验和的时候,需要在UDP数据报之前增加12字节的伪首部,伪首部并不是UDP真正的首部。只是在计算校验和,临时添加在UDP数据报的前面,得到一个临时的UDP数据报。校验和就是按照这个临时的UDP数据报计算的。伪首部既不向下传送也不向上递交,而仅仅是为了计算校验和。这样的校验和,既检查了UDP数据报,又对IP数据报的源IP地址和目的IP地址进行了检验。

    UDP校验和的计算方法和IP数据报首部校验和的计算方法相似,都使用二进制反码运算求和再取反,但不同的是:IP数据报的校验和之检验IP数据报和首部,但UDP的校验和是把首部和数据部分一起校验。

    发送方,首先是把全零放入校验和字段并且添加伪首部,然后把UDP数据报看成是由许多16位的子串连接起来,若UDP数据报的数据部分不是偶数个字节,则要在数据部分末尾增加一个全零字节(此字节不发送),接下来就按照二进制反码计算出这些16位字的和。将此和的二进制反码写入校验和字段。在接收方,把收到得UDP数据报加上伪首部(如果不为偶数个字节,还需要补上全零字节)后,按二进制反码计算出这些16位字的和。当无差错时其结果全为1,。否则就表明有差错出现,接收方应该丢弃这个UDP数据报。

    注意:
    1.校验时,若UDP数据报部分的长度不是偶数个字节,则需要填入一个全0字节,但是次字节和伪首部一样,是不发送的。
    2.如果UDP校验和校验出UDP数据报是错误的,可以丢弃,也可以交付上层,但是要附上错误报告,告诉上层这是错误的数据报。
    3.通过伪首部,不仅可以检查源端口号,目的端口号和UDP用户数据报的数据部分,还可以检查IP数据报的源IP地址和目的地址。
    这种差错检验的检错能力不强,但是简单,速度快

    转载文档:https://blog.csdn.net/aa1928992772/article/details/85240358 

    心若向阳,无谓悲伤!
  • 相关阅读:
    VS2013使用scanf、gets及字符串函数编译报错error C4996: 'scanf': This function or variable may be unsafe. 原因及解决方案
    关于vs2013与office系列软件一起安装出现bug的情况描述以及解决办法——打开vs2013鼠标不动/动不了
    武汉华师驾校学车笔记_纪实
    vs2013由修改模式改为输入模式。
    解析:求最大公约数的“辗转相除法原理”
    关于scanf与scanf_s的区别,以及用scanf编译出错并且提示找不到可执行文件.exe的解决办法。
    [C编译器]在VS中编译调试C程序
    使用vs编译程序选择新建”空项目“与”win32控制台应用程序“的区别。
    AngularJS+Ionic开发-1.搭建开发环境
    PetaPoco源代码学习--3.Sql类
  • 原文地址:https://www.cnblogs.com/guge-94/p/14553130.html
Copyright © 2011-2022 走看看