《TCP/IP 卷1》笔记:UDP:用户数据报

UDP:用户数据报

引言

UDP是一个简单的面向数据报的运输层协议:进程的每个输出操作都整好产生一个UDP数据报。并组装成一份待发送的IP数据报。TCP是面向流字符的协议,应用程序产生的全体数据与真正发送的单个IP数据报没有联系。

UDP的IP格式
UDP协议不提供可靠性:把应用程序的数据传给IP层发送出去,不保证一定到达。
每个网络接口都有MTU,超过时就要把IP数据报分片。

UDP首部

UDP首部格式
各个字段的含义都很容易懂。
UDP的长度是指UDP首部和UDP数据的字节长度,最小长度是8,运行发送空数据报的UDP报文。IP数据报的长度是IP数据报的首部加数据长度。所以IP数据报的长度减去IP数据报的首部就是UDP数据报的长度

UDP校验和

UDP的校验和覆盖UDP首部和数据报。IP首部的校验和覆盖IP首部。TCP的校验和与UDP的校验和相同。但是UDP的校验和是可选的,TCP是必选的。
UDP校验和的字段
校验和的算法是把若干个16bit字的二进制反码和。所以计算时,会使用0填充UDP数据报。
UDP数据报和TCP段都包含一个12字节长的伪首部,为了计算校验和而设置的。
UDP的校验和是可选的,如果发送端没有计算校验和而接收端检测到校验和错误,就会抛弃掉UDP报文
如果你的数据很有价值,也不要完全相信UDP或TCP的检验和,因为这些都只是简单的检验和,不能检测出所有可能发生的差错。

一个简单的例子

例子
UDP没有建立连接和发送确认的过程。

IP分片

物理网络层一般限制每次发送数据帧的最大长度,每个网络接口有MTU。IP选路时,确定某个接口时,获取其MTU值,判断是否需要IP分片。IP分片也能发生在路由器传送中。

IP数据报可能被多次分片,在最终目的端组装(分片的IP数据报首部的标识符相同。标志字段用其中一个比特来表示“更多的片”。除了最后一片外,其他每个组成数据报的片都要把该比特置 1。片偏移字段指的是该片在原始数据报开始处的位置),对传输层透明。
标志字段中有一个比特称作“不分片”位。如果将这一比特置1,IP将不对数据报进行分片。相反把数据报丢弃并发送一个ICMP差错报文(“需要进行分片但设置了不分片比特”,见图6-3)给起始端

IP层本身没有超时重传机制,需要高层协议来支持。TCP在超时重传时会发送完整的TCP报文段。IP分片可能发生在路由传送途中,无法区分是哪一片。TCP试图避免分片,UDP很容易导致IP分片。

IP数据报是指IP层端到端的传输单元,分组是指IP层和链路层之间传送的数据单元。一个分组可以是一个完成IP数据报,也可以是一个分片。
UDP分片举例

ICMP不可达差错(需要分片)

ICMP不可达错误的另一种情况是IP首部设置了分片的标识,但是到达目的端的最小MTU,小于发送时封装的帧。
RFC 1191[Mogul and Deering 1990]描述了路径MTU的发现机制。
ICMP不可达报文格式之一

用traceroute确定路径MTU

使用traceroute程序可以测试与目标端的所有路由。在此基础上,设置IP首部不可分片的bit标识位。调整分组大小为出口接口的MTU,如果收到目标端口不可达差错ICMP报文,标识该路径最小MTU时出口MTU,否则会收到ICMP不可分片差错报文,如果是新的格式,有返回下一站网络的MTU,就设置该值大小的分组,不然就设置瞎猜,二分呗。RFC规定MTU的值个数是有限的。可以使用规定的值尝试,然后二分。
最终可知,广域网上大多数链路都支持512字节的分组处理,可以使用此特性测试最大的分组不分配报文大小

采用UDP的路径MTU发现

网络拓扑图
使用UDP的路径MTU发现

UDP和ARP之间的作用

在一台网上发送8192字节UDP数据报时的报文交换
在这里插入图片描述
8192字节的UDP数据报会产生几个分组?
答: 8192字节的UDP数据报预计产生6个IP分组。一般MTU是1500。5个1500字节的帧,和剩下的UDP数据报组成的帧
报文交换的流程?
答:arp高速缓存表是空的情况下,可以看到非常短的时间内IP进行分片选路,并发起了ARP请求,一共请求了6次。但是只发送最后一片数据报片(第9行)。arp应答了7次,多了一次。
为什么只发送了最后一片数据报片?
答:RFC要求防止这种类型ARP洪泛(ARP flooding),即以高速率重复发送到同一个IP地址的ARP请求。建议最高速率是每秒一次。还规定,ARP应该保留至少一个报文,必须是最后一个报文。对于同一份目标地址的ARP请求,只保留最后的分组。
为什么svr4没有返回组装超时的ICMP差错?
答:当一个个数据报片出现时,IP层必须启动一个定时器。这里的第一个是指第一个到达的数据报片。一般定时器为30s、60s。IP分片时,第一片会包含IP首部和UDP首部,其他片只包含IP首部,因此,此次发送端只发送了最后一片,接收端在超时后无法区分进程和端口号,默默的丢弃了数据报片,默认认为上层协议是会重传的。

最大UDP数据报长度

理论上,IP数据报的最大长度是65535字节,IP首部的长度16bit决定的。去掉IP首部20字节,UDP首部的8个字节,UDP最大用户数据报长度是65507字节。实际使用中但是往往比这个值小。

RFC要求主机必须能接收最短为576字节的IP数据报。往往UDP应用程序的设计中的限制成512字节或者更小。

数据报截断
IP能够发送和接收特定长度的数据报并不意味着应用程序可以读取该长度的数据。因此UDP编程接口允许应用程序制定每次返回的最大字节数。剩余字节的处理取决于编程接口和实现?

  • 丢弃多余的数据报
  • 在后续的读取中返回,不通知应用程序是从单个UDP数据报多次进行读取操作
  • 返回标志表明还可以获取更多数据
  • TCP为应用程序提供连续的字节流,没有任何信息边界。因此不会因为读取的长度不足导致的数据丢失

ICMP源站抑制差错

ICMP源站抑制差错:当一个系统(路由器或主机)接收数据报的速度比其处理速度快时,可能产生这个差错。即使一个系统已经没有缓存并丢弃数据报,也不要求它一定发送源站抑制报文。

ICMP源站抑制差错报文格式
RFC提出了路由器不应该产生源站抑制差错报文,因为这些抑制报文也将消耗网络带宽,对于拥塞来说是一种无效而不公平的抑制差错报文。
对于UDP协议而言,这个源站抑制错误往往是不生效的。
对于TCP协议而言,接收到后,会放慢在该链接上的数据传输速度

UDP服务器的设计

讨论UDP服务器的设计,比较于客户端而言较难。

客户端IP地址及端口号
来自客户的UDP数据报。IP首部包源端和目的端的IP地址,UDP首部包含了源端和目的端的UDP端口号。当操作系统接收到一份UDP数据报时,应用程序一定可以获知源端IP和端口号

目的IP地址
一些应用程序需要知道数据报是发给谁的,即目的IP地址。
但不是所有的操作系统都会把目的IP地址交给应用程序

UDP输入队列
通常程序使用的每个UDP端口都与一个有限大小的输入队列相联系。这意味着,来自不同客户的差不多同时到达的请求将由UDP自动排队。接收到的UDP数据报以其接收顺序交给应用程序。然后,排队溢出造成内核中的UDP模块丢弃数据报的可能性存在。
在这里插入图片描述
在这里插入图片描述
应用程序不知道UDP输入队列何时溢出,UDP对超出数据报进行丢弃处理。没有发回任何消息给客户。也不发出ICMP源站抑制报文。最后看来UDP输出队列是FIFO,ARP输入时LIFO。

限制本地IP地址
不同IP地址相同端口
应用程序可以使用相同的UDP端口,但是监听不同的ip地址。

限制远端IP地址
我看到netstat输出结果中远端IP地址和远端端口号都显示为*. * ,其意思是接受来自任何IP地址和任何端口号的UDP数据报。
可以限制远端IP地址
在这里插入图片描述
每个端口有多个接收者
尽管多个程序使用不同的IP地址和相同的端口,从api的角度是行得通的。但是大多数系统在某一时刻往往是只允许一个端点与某个本地ip地址及udp端口号相关联。主机收到目标端口的数据时,会复制一份数据传给目标端口。

小结

习题

11.1在11.5节中,向UDP数据报中写入1473字节用户数据时导致以太网数据报片的发生。在采用以太网IEEE802封装格式时,导致分片的最小用户数据长度为多少?
IEEE802帧格式
:IP数据报最大为1492.那么不分片的最大用户数据报的大小是1492-20-8=1464字节

11.2阅读RFC791[Postel1981a],理解为什么除最后一片外,其他片中的数据长度均要求为8字节的整数倍?
:没看过。猜测跟校验位的补0有关系吧

11.3假定有一个以太网和一份8192字节的UDP数据报,那么需要分成多少个数据报片,每个数据报片的偏移和长度为多少?
:6个数据片。假设IP数据报的内容部分最长为1500。一份8192字节的UDP数据报分为8个字节的首部和8184字节的用户数据报。那么第一份长度是20(IP首部)+8(UDP首部)+1472(用户数据)=1500。偏移是0。第二份的长度是20(IP首部)+1480(用户数据)=1500,偏移是1480。第三份的长度是20(IP首部)+1480(用户数据)=1500,偏移是2960。
第四份的长度是20(IP首部)+1480(用户数据)=1500,偏移是4460。第五份的长度是20(IP首部)+1480(用户数据)=1500,偏移是5920。最后一份第的长度是20(IP首部)+(8192-7400)(用户数据)=812,偏移是7400

11.4继续前一习题,假定这些数据报片要经过一条MTU为552的SLIP链路。必须记住每一个数据报片中的数据(除IP首部外)为8字节的整数倍。那么又将分成多少个数据报片?每个数据报片的偏移和长度为多少?
:MTU是552是相对于帧的。SLIP链路一般只增加2个字节的额外内容(暂时忽略end字符导致的长度+1)。那么链路上最大的IP数据报是550。那么6片到达该链路时,进行相应的再IP分片。遵循规则相同。注意的是只有包含IP首部的数据片分片时的第一片有UDP首部,其他都不包含。

11.5一个用UDP发送数据报的应用程序,它把数据报分成4个数据报片。假定第1片和第2片到达目的端,而第3片和第4片丢失了。应用程序在10秒钟后超时重发该UDP数据报,并且被分成相同的4片(相同的偏移和长度)。假定这一次接收主机重新组装的时间为60秒,那么当重发的第3片和第4片到达目的端时,原先收到的第1片和第2片还没有被丢弃。接收端能否把这4片数据重新组装成一份IP数据报?
:不会。因为每次IP数据报的标识位不同(不同分片具有相同的IP首部)。题目的意思是第二次发送的第3片和第4片是否会跟第一次发送的第1片和第2片组装成一份IP数据报。

11.6你是如何知道图11-15中的片实际上与图11-14中第5行和第6行相对应?
:通过IP首部的标识位

11.7主机gemini开机33天后,netstat程序显示48000000份IP数据报中由于首部检验和差错被丢弃129份,在30000000个TCP段中由于TCP检验和差错而被丢弃20个。但是,在大约18000000份UDP数据报中,因为UDP检验和差错而被丢弃的数据报一份也没有。请说明两个方面的原因(提示:参见图11-4)。
:1)UDP一般是本地连接,出错可能性少。2)UDP请求端可能没有打开校验和字段

11.8在讨论分片时没有提及任何关于IP首部中的选项——它们是否也要被复制到每个数据报片中,或者只留在第一个数据报片中?我们已经讨论过下面这些IP选项:记录路由(7.3节)、时间戳(7.4节)、严格和宽松的源站选路(8.5节)。你希望分片如何处理这些选项?对照RFC791检查你的答案。
:不同的对应不同的处理方式。没看RFC

11.9在图1-8中,我们说UDP数据报是根据目的UDP端口号进行分配的。这正确吗?
:不对的。不同的IP地址可以和同一个端口搭配使用

发布了28 篇原创文章 · 获赞 4 · 访问量 1240

猜你喜欢

转载自blog.csdn.net/wengfuying5308/article/details/103867743