赞
踩
UDP的路径MTU发现
- 让我们考察使用UDP的应用程序与路径MTU发现机制(PMTUD)之间的交互过程
- 对一个像UDP这样的协议来说,调用这样协议的应用程序一般只控制输出数据报的大小,如果有方法能确定一个可以避免分片的合适的数据报大小,那么这会是很有用的
- 传统的PMTUD使用ICMPPTB消息(见前面ICMP文章)来获得一个最大分组大小,其沿着一条路由路径传输不会引人分片。典型地,这些消息在UDP层之下被处理,对应用程序不可见,因此,它们要么是一个API调用,被应用程序用于获取对路径(与每个路径的目的地 都已通信过)的MTU大小的当前最好的估计,要么是不被应用程序所知的、能独立地进行 PMTUD的IP层。IP层经常基于每个目的地址缓存一个PMTUD信息,并且当没有更新时就让它超时
例子
- 待续
实现限制
- 协议实现给应用程序提供一个API以让它选择一些默认缓存大小来进行发送和接收。某些实现提供的默认值小于最大IP数据报大小,实际上有些还不支持发送大于几十kB的数据报(尽管这个问题不多见)
- API套接字提供一组函数让应用程序能够调用以设置或查询接收和发送缓存的大小。对于一个UDP套接字,这个大小与应用程序可读或可写的最大UDP数据报大小直接关联。典型的默认值是8192字节或65 535字节,但一般可以调用setsocketopt() API来设置更大的值
- 在前面Internet协议文章中我们提到过一台主机重组分片时要提供足够的缓存来接收至少一个576字节的IPv4数据报。许多UDP应用程序被设计成限制数据报的大小在512字节或更小以下(这使得IPv4数据报小于576字节)。对UDP数据报的大小使用了这些限制的例子包括DNS和DHCP
数据报截断
- UDP/IP能发送和接收一个给定大小的(大)数据报并不意味着接收应用程序就能够读取这种大小的数据报
- UDP编程接口允许应用程序指定每次一个网络的读操作完成时返回的最大字节数。如果接收的数据报超过这个指定大小会发生什么?
- 大多数情况下,这个问题的答案是API截断数据报,丢弃这个数据报里超过接收应用程序指定字节数的任何超额数据
- 然而,每种实现的具体操作是不同的。一些系统把这些数据报的超额数据放到后续的读操作中,另一些则通知调用者有多少数据被截断了(或有些情况是通知有一些数据被截断但不知具体是多少)
- 备注:
- 在Linux中,MSG_TRUNC选项可被套接字API用来查看有多少数据被截断
- 在HP-UX上,MSG_TRUNC却是一个标志,当一个读操作返回“有数据被截 断时”就进行设置。SVR4(包括Solaris 2.x)的套接字API不会截断数据报。任何 超额的数据都被返回给后续的读操作。对一个UDP数据报进行的多次读操作是不会通知应用程序的
- 在我们讨论TCP时会发现,它给应用程序提供连续的字节流,没有任何消息边界。因此,应用程序可得到它请求的任意大小的数据量,可供给充足的数据(如果不行,通常可以等待)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。