UDP

来源:互联网 发布:办公室小野 知乎 编辑:程序博客网 时间:2024/05/17 01:57

UDP是一个面向数据报的运输层协议,进程每个输出操作都直接产生一个UDP数据报,并封装成一份待发送的IP数据报,UDP传给IP的数据和应用程序递交的是一样的,因此一旦大于MTU就会产生分片。

       这与面向字节流的协议TCP,应用程序产生的全体数据真正发送的IP数据报没联系,不同应用程序像流一样把数据交到TCP,TCP自己把流弄成一个一个包传走。

应用程序必须关心IP数据报的长度。如果它超过网络的MTU,那么就要对IP数据报分片,下面讨论IP分片机制。


源端口和目的端口表示发送和接收进程。TCP端口号和UDP端口号是独立的。UDP长度字段指的是UDP首部和UDP数据的字节长度,最小值为8个字节。

       UDP检验和覆盖UDP首部和数据。IP首部的校验和只覆盖IP首部。IP计算检验和和UDP计算检验和之间存在不同的地方。首先,UDP数据包的长度可以为奇数字节,但是检验和算法是把若干个16bit字相加。解决方法是必要时在最后增加填充零。UDP数据报和TCP段都包含一个12字节的伪首部,是为了计算检验和而设置的。伪首部包含IP首部的一些字段。其目的是把UDP两次检验数据是否已经正确到达目的地。


说明UDP是没有状态化的,一口气发了四个包,没有确认和握手,TCP连接会建立三次握手,每一个包都需要确认。

UDP在发送第一份数据报之前,接收方和接收端之间没有任何通信,在收到数据时,接收端没有任何确认,在这个例子中,发送端并不知道另一端是否已经接收到数据。每次运行程序,源端UDP端口号都发生变化,第一次是1108,然后是1110,客户程序使用的端口号在1024~5000之间。

IP分片

IPMTU和数据报长度进行比较,如果需要则进行分片。分片可以发生在原始发送端主机,也可以发生在中间路由器。把一份IP数据报分片后,只有到达目的地接收方才能重新组装。(FR fragment)。重新组装由目的端的IP层完成,其目的是使分片和重装过程对于传输层(TCP,UDP)是透明的。已经分过一次片的数据有可能再次进行分片。


16位标识:一个IP报一个标识,分片后所有片的标识都是一样的,告诉接收方标识一样都是一起的,重组装在一起。MF:是否最后一个分片。

IP数据报被分片后,每一片都成为一个分组,具有自己的IP首部,选择路由时与其他分组独立,这样当数据片到达目的地可能会失序(后面的早到),但是在IP首部中有足够的信息让接收端重新组装这些分片。

尽管IP分片是透明的,但是,即使丢失一片数据也要重传整个数据报。

IP层本身没有超时重传机制,由更高层来负责超时和重传(TCP有超时和重传机制,但UDP没有。一些UDP应用程序本身也有超时和重传)。当来自TCP报文段的某一片丢失后,TCP在超时后会重发整个TCP报文段)。只有第一片有四层头部其他片没有。


UDPARP之间的交互

应用程序一下产生很多分片,每个分片发现目的IP没有相应的MAC地址,每一片都做arp解析,在接收第一个arp应答时,只发送最后一个数据片,因为后面的片没有四层信息,所以除非接收第一个数据片,否则不会发送ICMP差错。

 

最大UDP数据报长度

IP数据报最大长度为65535字节,但并不是所有操作系统都能接受这个包,第一,socket API提供了一个可供应用程序调用的函数,以设置接受和发送缓存的长度。第二,TCP/IP内核的限制,使得IP数据报长度小于65535字节。

ICMP源站抑制

连续发送1001024字节的包,中间一个路由器不能转发(他的缓存溢出),这时路由器就通过ICMP源站抑制这种包,发送给源PC减慢发送速度.

RFC建议UDP不要发送这种包,它会消耗网络带宽,像UDP一次发10个包,发完后就进程结束了,这个源站抑制包就收不到了,TCP收发确认收到源站抑制会放慢发送速度。

UDP输入队列


启用一个服务,这个服务端口号为UDP6666,缓存256字节,开启后等待30s不向应用层读数据。客户c1c2先来的来的两个包维护在256缓存里,30s后读给应用层,其他的数据都丢掉,没有发送任何信息告诉客户其数据报丢掉,UDPFIFO

限制本地IP地址


源是任何接口的任何IP的端口是7777,接收任何用户任何源端口链接。可以通过命令限制本地IP和远端IP。

大多数的系统在某一时刻只允许一个程序端点与某个本地IP地址及UDP端口号关联。当目的地为该IP地址及端口号的UDP数据报到达主机时,就复制一份传给该端点。

再次尝试打开另外一个程序本地端口9999作为服务,会发生错误,不能多个程序用本地一个IP一个端口号。




0 0
原创粉丝点击