ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【网络】UDP协议 [打印本页]

作者: 杀鸡焉用牛刀    时间: 6 天前
标题: 【网络】UDP协议
一. 初识UDP

1. UDP简介

UDP(User Datagram Protocol)是一种无毗连的传输层协议,它提供了一种简朴的、不可靠的数据传输服务。
UDP 提供了不面向毗连的通信,且不对传送的数据报进行可靠的保证,实用于一次传送少量的数据,不实用于传输大量的数据。
UDP属于网络协议栈中的传输层协议,直接负责数据的传输和接收:

2. UDP协议的特点

特点一:无毗连

两台主机在使用UDP进行数据传输时,不需要建立毗连,只需知道对端的IP和端标语即可把数据发送过去。
特点二:不可靠

UDP协议没有没有确认重传机制,如果由于网络故障导致报文无法发到对方,大概对方收到了报文,但是传输过程中乱序了,对方校验失败后把乱序的包丢了,UDP协议层也不会给应用层任何错误反馈信息。
PS:在网络中,“不可靠”是个中性词,由于可靠就意味着要付出更多的代价去维护可靠,实现起来会复杂许多;而“不可靠”的话,实现起来会更简朴。
特点三:面向数据报

UDP传输数据时,是以数据报文为单位一个个地发出去,然后一个个地接收的,这导致上面应用层无法机动控制数据数据的读写次数和数量。

好比用UDP传输100个字节的数据,如果发送端调用一次sendto,发送100个字节,那么接收端也必须调用对应的一次recvfrom去全部接收这100个字节,而不能循环调用10次recvfrom,每次接收10个字节。
3. UDP报文的格式

具体每个字段的细节会在下文中介绍

   理解报头
  UDP协议属于内核协议栈,而内核是用C语言写的,在底层UDP的报头是一个位段类型的布局体

4. UDP的缓冲区


5. 基于UDP实现的用户层协议


二. UDP报文中各个字段

1. 原端标语与目标端标语(16位)

1.1 熟悉端标语


在TCP/IP协议中,用 “源IP”, “源端标语”, “目标IP”, “目标端标语”, “协议号” 这样一个五元组来标识一个通信

   netstat命令介绍
  功能:查看当前主机下的网络状态
语法:netstat[选项]
常用选项

示例

   端标语和进程的关系
  
现实需要:通过端标语来找进程,以是要确保端标语到进程的唯一性;而现实中不会有通过进程来找端标语的情况,以是不关心进程绑定了多少个端标语
1.2 端标语范围划分

端标语一共有 2^16 = 65536 个,此中前面的端标语被分配给了一些常用的协议。

   熟悉着名端标语
  在网络中,有些服务器是经常被各人都用到的,这时为了使用方便,人们给这些服务器约定俗成地绑定了一些特定的端口,之后各人使用这些服务时,通过端标语就能直接知道你所使用的服务类型是什么。
下面是一些着名端口及其所对应的服务类型,我们本身写程序需要设置端标语时,注意避开这些着名端标语:

我们可以通过命令:less /etc/services 来查看所有着名端口和它们对应的服务:

1.3 UDP中端标语字段的作用

有了目标端标语,就能找到对应的服务器进程,然后在这个进程上获取服务,此外还可以把本身的端标语(源端标语)告诉服务器,服务器得到后也可以向源客户端进程发送数据,这样双方就能全双工的通信了。

   问题:UDP如何决定,将本身的有效载荷交付给上层的那个进程呢?
   2. UDP长度(16位)

UDP协报头中有一个16位的最大长度的字段,也就是说一个UDP报文能传输的数据最大长度是64K(包罗UDP首部)
然而64K在当今的互联网环境下,是一个非常小的数字。如果我们需要传输的数据超过64K,就需要在应用层手动的分包,多次发送,并在接收端手动拼装。

   UDP把数据包交给应用层后,应用层如何让报头和有效载荷分离?
  先读取8字节的定长报头,在读取里面的16位UDP长度字段,减去8字节后得到的就是有效载荷的长度,知道了报头和有效载荷的巨细就能把二者明显地区分开了。
3. UDP校验和(16位)

报文在进行网络传输时,会经过各种传输线、路由器、信号放大器等传输介质,且随着网络的状态差别,每个包具体选择的路径也不一样。在网络传输中,受到外界干扰,数据大概会堕落,好比某几个位置的数据发生了乱序,0酿成1,1酿成0;因此,在接收方收到数据后,就需要先确认一下,这个报文数据是否在传输过程中发送了乱序。校验和就是简朴有效的方式。

现实的校验和,不光仅是一个”长度“,而是根据数据的内容来天生的。当内容发生改变的时间,就能感知堕落误。
UDP的校验和具体是怎么实现的呢?使用了一种简朴粗暴的循环冗余校验(Cyclic Redundancy Check, CRC)算法:

加着加着,大概就溢出了~~溢出也无所谓。所有字节都加了一遍,终极就得到了校验和。传输数据的时间,就会把原始数据和校验和一起通报过去。接收方收到数据,同时也收到了发送端送过来的校验和(旧的校验和)。接收方按照同样的方式再算一遍,得到新的校验和。如果旧的校验和和新的校验和相同,就可以以为数据传输过程中是精确的。如果差别,则视为传输过程中数据堕落了。
但是,有时间会出现,校验和相同,但是传输的数据和发送时间的数据差别,也就是数据发生了乱序,但校验和是对的。
好比:好巧不巧,某个字节,多了1。某个字节,少了1。二者相加,恰好抵消。
此校验和方法并不是那么严谨,但在工程上,也是够用的。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4