天天看点

TCP/IP Illustrated I 读书笔记5 - UDP协议及其应用

1.       UDP checksum校验覆盖UDP头和数据, 计算校验和的时候通常还加一个并不传输的伪头 (pseudo-header) 再次确认IP层正确地处理了该UDP datagram.

2.       UDP不对应用层请求发送的数据报进行分段调整而是将数据报加上UDP头传递给IP层发送. 当IP层要发送一个数据报时, 需要比较MTU和数据报的大小决定是否需要分段. 考虑到分段效率, 应用层最好不要发送超过MTU的数据报. 当分段发生时, 由于所有的传输层信息都只在第一个分段中, 所以除了目标结点, 其他结点都不组装分段. 并且一旦有分段丢失, 整个数据报都要重新发送. 实际中, 因为RFC规定主机必须能接收576 byte的数据报, 所以UDP的应用程序一般不要发送超过512 byte的数据报.

3.       为了在传输过程中减少分段所带来的带宽和计算消耗, 需要找出整条路径上的最小MTU. 可以通过设置IP头里的DF (Don’t Fragment)标识, 路由器不能分段设置了该标识的数据报, 而必须发送ICMP Fragmentation Required error. 如果路由器支持在该消息中包含MTU信息, 则我们可以更快地确定路径上最小的MTU. 否则就要用某种算法来猜直到不收到ICMP error.

4.       如果IP在发送数据报时还不知道对方的物理地址, 则数据报被直接丢弃. UDP也不会缓存该数据报. ARP有可能会缓存最后一个数据报, 但是并不保证实现. 这也可以看出UDP不可靠.

5.       ICMP source quench是一种尽量减少UDP buffer overflow的方法, 但是实际中大多数并不实现. 一旦buffer overflow, 数据报直接被丢弃.

6.       使用netstat命令可以限制UDP服务器的本地地址和外部地址访问.

7.       DNS是一个分布式数据库, 不同的机构提供独立的DNS服务器. 目前世界上有13个根域名服务器 – letter.root-servers.net (letter是从A到M). 解析器需要解析一个地址时, 可能通过网络中一系列的DNS服务器获取. 每一个DNS服务器都必须知道根域名服务器的地址. 根域名服务器知道二级域名服务器的地址并告知发送请求的DNS服务器. 这样通过迭代就能找到能解析该域名的DNS. DNS服务器可以缓存从其他服务器上获取的域名信息以减少消息交互所带来的延迟. 解析器通常build到应用程序而不是在kernel里.

8.       完整的域名以dot (.)结尾, 比如”brianyang.rnd.gdnt.local.”. 对于不完整的域名, 不同的DNS实现会把它添加完整, 比如”brianyang”会被添加成”brianyang.rnd.gdnt.local.”.域名”in-addr.arpa.”用于进行从IP地址到名称的转换, 当一个机构申请域名后, 也会得到在”in-addr.arpa.”下面的域名, 比如”56.140.in-addr.arpa.” (140.56是网络号).

9.       DNS主要使用UDP, 但当数据超过512字节时, 解析器会尝试使用TCP连接. 主备服务器之间做zone transfer也是使用TCP.

10.   TFTP协议比较小因而适合加载到BIOS中以使得无盘工作站也可以使用. TFTP的数据传输是基于stop-and-wait机制的, 因此效率比较低. 也不进行数据校验.

11.   BOOTP可以代替RARP进行IP地址的分配并返回网关和DNS服务器等信息. 和DHCP相比, BOOTP适用于无盘工作站, 它使用TFTP传输启动镜像. 而DHCP常用于配置有完全引导能力的终端.