TCP-IP详解笔记6

TCP-IP详解笔记6

用户数据报协议和IP分片

  • UDP是一种保留消息边界的面向数据报的传输层协议.

    • 不提供差错纠正, 队列管理, 重复消除, 流量控制和拥塞控制.
    • 提供差错检测, 端到端(end-to-end)校验和.
    • 使用UDP的应用程序需要做一些数据报发送和处理的控制工作.
    • 每个被应用程序请求的UDP输出操作只产生一个UDP数据报, 发送一个IP数据报.
  • UDP不提供差错纠正: 它把应用程序传给IP层的数据发送出去, 但并不保证它们能够到达目的地.

    • UDP有可靠性和保护性的缺失.
    • 无连接的特征, 使UDP比其他的传输协议使用更少的开销.
    • 广播和组播更多直接使用像UDP这样的无连接传输.
    • 应用程序需选择自己的重传单元的能力.
  • IPv4数据报用字段用值17来标识UDP, IPv6在下一个头部字段使用相同的值.
    单个IPv4数据报中的UDP数据报封装

  • 越偏底层数据报的长度越长, 因为底层的协议会原封不动地封装上层的数据报.

  • UDP的头部通常只有8个字节.

    • 端口号相当于邮箱(mailbox), 可以帮助协议辨认发送和接收进程, 端口好为16bite(位)数据.
    • 数据报的发送者不要求对方恢复, 端口号就设置为0.
    • 传输协议(UDP, TCP, SCTP)使用目的端口来帮组分离从IP层进入的数据.
      • 端口号在不同传输协议之间是独立的, 即TCP的端口只能用于TCP, UDP的端口号只能用于UDP.
      • 两个完全不同的服务器可以使用相同的端口号和IP地址, 只要他们使用不同的传输协议.

UDP头部和负载(数据)

  • UDP长度(Length)字段是UDP头部和UDP数据的总长度, 以字节为单位.
    • UDP的长度是冗余的, 因为IPv4和IPv6都包含了负载长度(数据长度)或数据报的总长度.
    • UDP的长度都能从IP层提供的信息中计算得到.

UDP校验和

UDP/IPv4数据报

  • UDP校验和是一个端到端的传输层校验和(ICMP有一个端到端的校验和, 但ICMP不是真正的传输层协议).
    • UDP校验和覆盖了UDP头部, UDP数据和一个伪头部.
    • 由初始的发送方计算得到, 由最终的目的方校验.
    • IPv4头部中的校验和只覆盖整个头部, 在每个IP跳都要被重新计算(因为TTL字段的值在数据报转发时会被路由器减少).
    • 传输协议(TCP, UDP), 使用校验和来覆盖他们的头部和数据.
      • UDP的校验和是可选的, 其他传输协议是强制的.
      • 在IPv6中, UDP是强制的, 因为IP层是没有头部校验和的. 必须计算校验和或者使用其他插锁检测机制.
    • UDP数据报的长度可以是奇数个字节, 而校验和算法只相加16位数字.
      • 奇数长度时会添加一个0当作填充字节(虚字节).
    • UDP计算校验和时会包含IP层的伪头部.
      • IP层伪头部的目的是让UDP层验证数据是否已经到达正确的目的地.
      • 伪头部本身就违反了分层规则.
      • 部分校验和(partial checksum).

UDP和IPv6

  • IPv6不存在IP头部校验和, 无论是UDP还是TCP, 在IPv6中伪头部校验和都是必须的.
  • Teredo隧道: 通过IPv4隧道传输IPv6.
    • Teredo为没有其他IPv6链接选项的系统传动IPv6数据报. 把IPv6数据报置于UDP/IPv4数据报的负载区里.
      • Teredo客户机实现了Teredo隧道接口的IPv4/IPv6主机.
      • Teredo服务器帮助Teredo封装的IPv6分组建立通道以穿越NAT.
      • Teredo中继器与服务器功能类似.
      • 对IPv6连接来说, 使用Teredo中继器是最后的手段, 如果发现其他任何可选的IPv6连接(直接或使用6to4), 节点就会放弃使用Terredo隧道技术.
  • 一个Teredo地址包含Teredo前缀(2001::/32), Teredo服务器的IPv4地址, 一个16位的标志(Flags)字段, 然后是映射的IPv4地址.
    • 一旦一个已取得资格的客户机建立了自己的Teredo地址, 它就可以发送IPv6流量的.
  • 有些应用程序可以容忍在发送和接收的数据里面引入的比特差错.
    • UDP-Lite协议通过部分校验和来进行部分负载的校验.
    • UDP-Lite用一个校验和覆盖范围(Checksum Coverage)字段取代了(冗余的)长度字段来修改UDP字段.

IP 分片

  • 链路层对可传输的每个帧的最大长度有一个上限, 为了保持IP数据报抽象与链路层的一致和分离, IP引入了分片和重组.
    • 如果数据报太大, IP层就会进行分片.
    • IPv4中的分片可以在原始发送方主机和端到端路径上的任何中间路由器上进行.
    • 数据报分片自身也可被分片. IPv6中只允许源主机进行分片.
    • 当一个IP数据报被分片了, 直到它到达最终目的地才会被重组.
      • 网络中不进行重组可以减轻路由器转发目标.
      • 同一数据的不同分片可能通过不同路径到达相同的目的地.
      • 路径上的路由器只能看到所有分片的一个子集.
  • 虽然IP分片看起来是透明的, 但是如果任何一个分片丢失了, 整个数据报就丢失了.
  • 只重发数据报的一个分片是不可能的.
  • 当一个数据报的任何一个分片首先到达是, IP层就得启动一个定时器.
    • 防止不能到达的分片导致接收方缓存的用尽.
    • 一般超时重传的时间被设置为30s或60s.
    • 接收任何一个分片时计时器就开始计时, 且收到新的分片也不会被重置, 定时器给出了统一数据报分片之间可被分隔的最大间隔时间.
  • 采用UDP的路径MTU发现:
    • IP 层经常基于每个目的地址缓存一个PMTUD(路径MTU发现机制)信息, 并且当没有更新时就让它超时.

IP分层和ARP/ND之间的交互

  • ARP是用于将IP层地址映射到同一个IPv4子网里的相应的MAC层地址.

  • 使用UDP可以看到诱导的IP分片和典型的ARP之间的关系.

  • 最大UDP数据报长度:

    • 系统的本地协议实现可能有一些限制.
    • 接收应用程序可能没有准备好去处理这么大的数据报.
    • 一台主机重组分片时要提供足够的缓存来接收至少一个576字节的IPv4数据报.
      • DNS和DHCP协议对UDP数据报的大小使用了限制.
    • UDP/IP能发送和接收一个给定大小的数据报并不意味着应用程序就能够读取这种大小的数据报.
      • API截断(truncate)数据报, 丢弃这个数据报里超过接收应用程序这顶字节的任何超额数据.
      • 一些系统把这些截断的数据放到后续的读操作中.
      • 另一些则通知调用者有多少数据被截断.
  • 服务器一般启动后进入休眠, 等待一个客户机请求的到达.

    • 到达UDP服务器的是来自客户机的UDP数据报, IP头部包含了源和目的IP地址, UDP头部包含了源和目的UDP端口号.
    • 当一个应用程序接收到一个UDP消息时, 它的IP和UDP头部已经被剥掉.
  • DNS服务器是对目的IP地址敏感的一种服务器类型.

  • 在创建UDP端点时都使其本地IP地址具有通配符(wildcard)的特点.

    • 如果进入的UDP数据包的目的地址是一个服务器的端口, 那么在该服务器上的任何本地接口均可接收它(任何本地机器中使用的IP地址, 包含本地回路地址).
    • 只有目的IP地址与指定的本地地址匹配时, 进入的UDP数据报才会被转到这个端点.
  • 使用多地址:

    • 在同一个端口号开启几个不同的服务器, 每个服务器使用一个不同的本地IP地址, 这是可能的.
    • 可以使用sock程序在同一个UDP端口(8888)开启三个不同的UDP实例.
    • 当有带通配符地址的端点存在时, 就暗示着一种优先级, 带指定IP地址的端点, 会越过通配符, 当这个指定的IP与目的IP地址匹配时, 它总是被优先选择.
      • 只有当匹配不成功时才会使用带通配符的端点.
  • 限制远程IP地址:

    • 选择限制远端地址, 也就是说端点只接收来自指定IPv4地址和端口号的UDP数据报.
  • 每端口多服务器的使用:

    • 对给定的地址族(即IPv4或IPv6), 同一时间只运行一个应用程序端点与任何一个(本地IP地址, UDP端口号)对关联.
  • 跨越地址族: IPv4和IPv6:

    • IPv6地址能以一种互操作的方式来对IPv4地址进行编码, IPv6里的通配符绑定方式可能会接收到进入IPv4流量.

流量和拥塞控制的缺失

  • 大多数UDP服务器是迭代(iterative)服务器.
    • 单个服务器(或进程)在单个UDP端口处理所有客户请求.
    • 一个应用程序使用的每个UDP端口均有一个大小有限的队列与之对应.
    • 超额的数据报会被UDP丢弃.
  • 当IP路由其的队列被填满时, 此时的网络被称为阻塞(congested).
  • UDP是缺失拥塞控制(congestion control)的协议.

互联网中的UDP

  • 互联网中大多数的分片流量都来自与UDP.
    • 基于UDP的多媒体流量.
  • 分片出现的原因:
    • 粗糙封装和路径MTU发现的缺失;
      • 增加了额外的头部.
    • 采用可使用大消息的应用程序.
      • 增加了数据报的负载(数据部分).
  • UDP其他主要用途之一是支持DNS.

名称解析和域名系统

  • 协议使用IP地址来识别参与分布式应用的主机.
    • IP地址难以使用和记忆.
    • 互联网支持使用主机名称(host names)来识别包括客户机和服务器在内的主机.
    • 主机名称通过称为名称解析(name reslution)的过程转换成IP地址.
    • 分布式数据库系统, 人们熟知的域名系统(DNS). DNS作为互联网上的应用程序, 它使用IPv4或IPv6, DNS是分层的, 是支持名称解析的服务器.
  • DNS是一个分布式的客户机/服务器网络数据库, TCP/IP应用程序使用它来完成主机名称和IP地址之间的映射, 提供电子邮件路由信息, 服务命名和其他信息.
  • 从应用程序的角度看, 访问DNS是通过一个称为地址解析协议(resolver)的应用程序库来完成.

DNS名称空间

  • DNS中使用的所有的名称集合构成了DNS名称空间(name space). 划分为层次并且大小写不敏感的.

  • DNS名称空间是一颗域名树, 位于顶部的树根未命名.

  • 树的最高层是所谓的顶级域名(TLD), 包括通用顶级域名(gTLD), 国家代码顶级域名(ccTLD), 国际化国家代码顶级域名(IDN ccTLD), ARPA的基础设施顶级域名(infrastructure TLD).

  • gTLD分为: 通用/通用限制和赞助. 以非常规的方式穿件一个域名有时被称为域名黑客(domain hack).

  • DNS命名语法:

    • DNS名称树中TLD下面的名称进一步划分成组, 称为子域名(subdomain).
    • 完全限定域名(FQDN), 与系统配置中的默认域名或域名搜索列表结合使用的非限定域名(unqualified domain name).
    • 一个域名包含一系列由点分开的标签(label).
    • DNS名称空间的层次结构允许不同的管理机构管理名称空间的不同部分.
  • 部分DNS名称空间的管理负责分配给个人或组织.

    • 两台名称服务器(name server)或是DNS服务器(DNS server).
    • 管理授权的单位称为区域(zone).
    • 不同的区域和包含的服务其可能被访问以提供名称信息. 授权(delegation).
  • 一台主服务器(primary server)在磁盘文件中包含区域数据库, 一个或多个辅助服务器(secondary server)使用称为区域传输(zone transfer)的进程, 从主服务器完整地获取该数据库的副本.

    • DNS有一个专用的协议用于执行区域传输.

缓存

  • 名称服务器可以从三个途径获取IP地址映射信息:
    • 直接从区域数据库中获取. 具有授权信息, 授权服务器(authoritative server).
    • 区域传输的结果(一个从属服务器).
    • 在处理解析过程中的另一台服务器.
    • 缓存的区域信息, 直到生存时间(TTL)的时间限制为止.
  • 缓存同时适用于成功的解析和不成功的解析(否定缓存(negative caching)).
  • 名称服务缓存进程(name service caching daemon, NSCD) 提供客户端的缓存功能.

DNS协议

  • DNS协议由两个主要部分组成:

    • 用于执行对DNS特定名称查询的查询/响应协议.
    • 名称服务器用于交换数据库记录的协议(区域传输).
      • DNS通知.
      • 动态更新.
      • 使用一个简单的查询/响应来查找域名对应的IPv4地址.
  • DNS名称解析就是将域名映射到IPv4地址的过程.

  • 通过每个站点或ISP本地部署服务器和一组特殊的根服务器(root server)构成DNS分布式基础设施, 通过基础设施支持DNS查询/响应操作.

    • 通用顶级域名服务器(generic top-level domain server).
  • 有一种基本的DNS消息格式, 它用于所有DNS操作(查询, 响应, 区域传输, 通知和动态更新).
    DNS消息格式.

  • 每个名称由一系列的标签(label)组成, 标签的类型有两种:

    • 数据标签(data label). 构成一个标签的字符.
    • 压缩标签(compression label). 充当指向其他标签的指针.
  • 偏移量给出了距离DNS消息开始处的字节数, 在哪里可以找到一个用于代替压缩标签的数据标签(压缩目标(compression target)).

  • 对TCP和UDP来说, DNS的知名端口号都是53.

    • DNS消息通常封装在UDP/IPv4数据报中, 并且其长度限制为512字节.
      DNS消息封装
  • 查询名称(Query Name)是要被查询的域名, 每个问题都有查询类型(Query Type)和查询类(Query Class).

  • DNS信息中的最后三个区段: 回答, 授权和额外信息, 包含RR的集合. RR可以使用通配符域名作为自己的名称.

  • 名称字段是随后的资源数据对应的域名.

  • Linux系统下, 使用dig工具可以查看名称服务器的记录.

动态更新

  • 动态更新一个区域是可能的, 被称为DNS update.

    • 支持指定先决条件(prerequisite)和更新请求.
  • 通过向一个区域的授权DNS服务器发送动态更新的DNS消息, DNS UPDATE就可以完成.

    • 更新信息(update information).
  • 开放动态DNS(Dynamic DNS, DDNS) 服务器可以用来支持特殊的更新协议, 称为DNS更新API.

    • 本地链路组播名称解析(Link-Local Multicast Name Resolution, LLMNR).
    • 组播DNS(multicast DNS, mDNS).
  • LDAP互联网应用层协议, 提供了搜索, 修改, 添加, 比较和删除基于用户选择模式的条目的能力.

    • LDAP是一个目录条目的树, 每个条目包含一组属性.
posted @ 2019-04-10 16:41  coding-for-self  阅读(315)  评论(0编辑  收藏  举报