TCP/IP之UDP

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/freestyle4568/article/details/50635811

一.UDP基本概念

UDP是一个面向数据报的运输层协议,全名为用户数据报协议。

UDP提供的是一种不可靠的数据传输,注意是不可靠哦,这个与TCP不一样。我们可以通过下面的图看出来;



















tcp在发送报文时,如果没有到达目的主机,那么将获得通知并重新发送数据。

而udp在发送数据报时,不管数据有没有到达目的主机,只要将数据通过接口发送出去就ok了!有点小不负责任的行为,这个就是不可靠的。

同时,还有一个与tcp协议不一样的地方,是进程的每个输出操作都正好产生一个udp数据报,这个与面向流字符的协议(tcp)不一样。这句话是什么意思呢?就是应用层要传输的数据都是一口气全部打包到udp数据报中的。当然这也有前提,提交给udp的数据量必须小于2^16字节,有人问如果大于怎么办?那就必须要进行数据分组了,但是这个分组是上层的事情,也就是应用层所需要考虑的,udp并不需要考虑。下面我们来看那一下udp数据报的格式:


















从图中可以看出,udp首部有端口号,有数据报长度值,有检验和,没有任何可选选项,简单明了!

为什么要将源端口号和目的端口号放在首位呢,这个是因为在ICMP差错控制报中,默认将IP首部和它的后8字节(即为端口号等)加到数据中重传给源主机。

不管怎么样,我们必须知道udp数据报的格式。

这里需要了解一个知识点,那就是socket的概念,什么叫socket呢,中文翻译叫套接字/插口,这是由ip地址和端口号组成的。通信双方要想进行信息传输,必须知道一组插口对,由4个元素组成(源ip地址,源端口号,目的ip地址,目的端口号)。这个不管在理论知识中还是在编程应用中,都相当重要。

我们再来看udp首部元素,长度字段有16位表示,这也限制了udp数据报的总长度不能超过2^16字节。而udp检验和是可选字段,这不是必选的,与tcp不一样。当然最好还是打开,这个能在一定程度上确保接受端数据的准确性。当然我们不能依赖检验和来判断数据的百分百正确率,实际上,检验和正确数据不正确的例子太多了。




二.IP分片

正如我们所了解的,物理网络层一般要限制每次发送的数据桢的最大长度(MTU)。IP把mtu与数据报长度进行比较,如果需要则进行分片,这个分片可以发生在发送主机上,也可以发生在中间路由上面。一份ip数据报分片以后,只有到达目的地(下一站,非最终ip目的地)才进行重新组装,分片有可能不是按照顺序到的,但是在ip数据报中,有足够的信息可以完成重组。如果在传输过程中,有分片缺失,那么要重传整个数据报文。为什么呢?因为ip层是不可靠的,没有超时重传的功能,需要上一层来完成超时重传。如果是tcp报文中的一片丢失,由于无法确定分片的具体数据位,可能分片发生在本地,也可能发生在中间路由上,所以必须重传整个报文段。对于udp而言,没有超时重传功能。因为这个低效的重传原因,所以我们必须尽可能的避免分片。这个tcp做的很好。

值得注意的是,任何传输层的首部在分片中只存在于第一片数据中,因为分片是在ip层进行的,不需要考虑端口,进程等问题。




三.UDP与ARP的交互过程

当发送主机的arp缓存为空时,我们发送一个大数据量的udp报文,比如数据量为10000字节的udp报文,我们可以用wiresharp/tcpdump来观察结果。

一般我们会发现这个大数据报文在ip层被分片处理,每个ip分片都分别发送一个arp请求。但是当第一个arp请求回应后只会将最后一个ip分片发生出去,并且不会接受到来自下一站的ICMP组装超时差错报文。

为什么没有差错报文呢?因为接受到的ip分片中不能保证一定有udp首部,而端口号在udp首部中,ICMP报文接受者无法确定是哪个进程的数据报被丢弃了。所以一般在tcp/ip的实现中,都是丢弃不完整的ip数据报,由上层去超时重传确保数据的完整性。 




四.udp服务器的设计














当多个udp客户机访问时,我们可以在udp服务端做出一系列的设置,比如限制本地ip地址,限制远端ip地址等。

udp服务器可以创建的三类地址绑定:

本地地址    远端地址     描述

localip.port    foreignip.port    只限于一个客户

localip.port    *.*        限于到达一个本地接口的数据报

*.port          *.*        接受发送到port的所有数据报


每个端口都可以有多个接受者,大多数的系统在某一时刻只允许一个进程与某个本地ip及udp端口号相关联。当目的地为ip地址及端口号的udp数据报到达主机时,就复制一份传给该端点。当udp数据报到达的目的ip地址为广播地址或多播地址时,而且目的ip地址和端口号处有多个端点时,就向每个端点传送一份数据报的复制。但是,如果udp数据报到达的是一个单播地址,那么只向其中一个端点传送一份数据报的复制。(具体哪个进程端点由具体操作系统实现)

OK!关于UDP协议就写到这里啦!大笑

猜你喜欢

转载自blog.csdn.net/freestyle4568/article/details/50635811