linux网络中UDP协议概念和包的组成详解

**

因为本人之前一直写的是云笔记,对自己学会的东西作一个总结,所以基本都是文字,本来想全发成博客的形式,发现全发成博客比较花费时间,而且一直发博客质量不是很好,而且通过发博客学到的东西也会变少,所以准备先把笔记发出来,后续再将它们改成博客的形式,争取2天至少改一篇博客,觉得我总结的还行的可以先关注我,后续会发成博客形式,内容也会更加完善

**

UDP:
UDP是传输层一种传输数据包的协议,它在传输数据包时,是面向无连接的,所以它是不可靠的传输数据包的协议,而且它传输数据包的方式也很简单,就应用层将要发送的数据包发送过来后,它基本不作任何处理,就直接将数据包转发出去,它这种发送数据包的方式叫以数据报的形式传输数据包,因为UDP只是简单的转发数据包,所以它没有那么复杂的控制机制,所以它传输数据包时是非常快的,但是正因为它没有这些复杂的机制,所以它发送的数据包是不可靠的,说它不可靠的主要原因是,因为它是面向无连接的,也就是说不需要建立连接就可以发送数据包,所以如果接收端因为网络环境不好,或者在传输数据包途中丢包,UDP都不会进行重发,甚至当数据包到达接收端后,数据包的顺序可能是乱着的,这时UDP也不会去纠正它(因为它也没有这个功能),所以说UDP是一个不可靠的协议,不过它的优点显而易见,它传输数据包时会很快,而且UDP更倾向于让用户完成那些复杂的机制,它只负责听从用户的安排,所以这对用户的要求比较高,而且如果使用得当,能做好UDP传输的准备(自己可以加入自己想加入的机制,一般在使用UDP协议时要实现拥塞控制机制,因为在刚开始就发送大量的数据包,可能因为网络环境的不好造成严重的丢包问题,而UDP是不负责重发数据包的,所以尽量要实现拥塞控制机制,这个机制和TCP中的拥塞窗口机制的设计意图相同,实现的机制也是相似的,如果不知道TCP的拥塞窗口机制,可以看看我之前总结的TCP协议),对用户来说也是非常方便的,所以经常用UDP来传输一些对安全性要求不高的数据包,例如在进行视频传送时,用的就是UDP协议,还有广播也用的是UDP协议(因为广播本身就是要面向无连接的用户)
UDP包:
UDP包由以下几个部分组成,1、源端口号(16位),表示自己主机要发送数据包的进程是哪个;2、目标端口号(16位),表示发送要将自己的数据包,发送给目标主机的哪个进程;3、包长度(16位),这个部分表示发送端要发送的UDP数据包的大小是多少,它的大小是指首部长度加上数据长度,并且它在计算包长度时,是以字节为单位的,也就是如果在表示时如果是0000 0000 0000 0001,就代表发送了王字节的数据,而不是一个位;4、校验和(16位),它的校验方式和TCP包的校验方式相同(如果不知道TCP是如何进行校验的,可以看我之前总结的TCP校验的方法,并且也有自己的伪首部,伪首部包含以下几个信息,第一个是源IP地址(32位),表示发送UDP包的主机IP地址,第二个是目标IP地址(32位),表示接收此数据包主机的IP地址,第三个是填充(8位),在进行校验时长度必须是16的整数倍,如果不够就用这个位置补0,凑够16位,第四个是协议号(8位),表示传输数据包时所用的协议是哪个,第五个是UDP包长度(16),表示整个TCP包多大(包含首部大小),它和TCP一样是用来判断UDP数据包在到达接收端后,是否被损坏,并且因为UDP包首部只有,源端口号和目标端口号,而在进行通信时是由源端口号和目标端口号,源IP地址 和目的IP地址,协议号五部分来确定一个通信的,所以如果其它三部分损坏了,但UDP包是不能察觉的,所以就有了伪首部(伪首部是在UDP包首部前面放着),来进行校验,判断此UDP包是否被损坏;5、数据部分(32位),这个部分虽然有32位,但它的长度是不确定的,因为在加上UDP包的首部后,不能超过UDP包限制的总大小

linux网络中UDP协议概念和包的组成详解