默认
打赏 发表评论 4
想开发IM:买成品怕坑?租第3方怕贵?找开源自已撸?尽量别走弯路了... 找站长给点建议
《TCP/IP详解》学习笔记(六):UDP 协议
阅读(71587) | 评论(4 收藏1 淘帖1
微信扫一扫关注!

1、UDP 简要介绍


UDP 是传输层协议,和 TCP 协议处于一个分层中,但是与 TCP 协议不同,UDP 协议并不提供超时重传,出错重传等功能,也就
是说其是不可靠的协议。

2、UDP 协议头


2.1UDP 端口号


由于很多软件需要用到 UDP 协议,所以 UDP 协议必须通过某个标志用以区分不同的程序所需要的数据包。端口号的功能就在于此,例如某一个 UDP 程序 A 在系统中注册了3000端口,那么,以后从外面传进来的目的端口号为3000的 UDP 包都会交给该程序。端 口号理论上可以有2^16这么多。因为它的长 度是16个 bit。

2.2UDP 检验和


这是一个可选的选项,并不是所有的系统都对 UDP 数据包加以检验和数据(相对 TCP 协议的必须来说),但是 RFC 中标准要求, 发送端应该计算检验和。

UDP 检验和覆盖 UDP 协议头和数据,这和 IP 的检验和是不同的,IP 协议的检验和只是覆盖 IP 数据头,并不覆盖所有的数据。 UDP 和 TCP 都包含 一个伪首部,这是为了计算检验和而摄制的。伪首部甚至还包含 IP 地址这样的 IP 协议里面都有的信息,目的是 让 UDP 两次检查数据是否已经正确到达目的地。 如果发送端没有打开检验和选项,而接收端计算检验和有差错,那么 UDP 数据将会 被悄悄的丢掉(不保证送达),而不产生任何差错报文。

2.3UDP 长度


UDP 可以很长很长,可以有65535字节那么长。但是一般网络在传送的时候,一次一般传送不了那么长的协议(涉及到 MTU 的问 题),就只好对数据 分片,当然,这些是对 UDP 等上级协议透明的,UDP 不需要关心 IP 协议层对数据如何分片,下一个章节将会稍 微讨论一些分片的策略。

3、IP 分片


IP在从上层接到数据以后,要根据IP地址来判断从那个接口发送数据(通过选路),并进行MTU的查询,如果数据大小超过MTU 就进行数据分片。数 据的分片是对上层和下层透明,而数据也只是到达目的地还会被重新组装,不过不用担心,IP 层提供了足够的信 息进行数据的再组装。

在 IP 头里面,16bit 识别号唯一记录了一个 IP 包的 ID,具有同一个 ID 的 IP 片将会被重新组装;而13位片偏移则记录了某 IP 片相对整个包的 位置;而这两个表示中间的3bit 标志则标示着该分片后面是否还有新的分片。这三个标示就组成了 IP 分片的所有信息,接 受方就可以利用这些信息对 IP 数据 进行重新组织(就算是后面的分片比前面的分片先到,这些信息也是足够了)。

因为分片技术在网络上被经常的使用,所以伪造 IP 分片包进行流氓攻击的软件和人也就层出不穷。可以用 Trancdroute 程序来进行简单的 MTU 侦测。请参看教材。

4、UDP 和 ARP 之间的交互式用


这是不常被人注意到的一个细节,这是针对一些系统地实现来说的。当 ARP 缓存还是空的时候。UDP 在被发送之前一定要发送一个 ARP 请求来获得目的 主机的 MAC 地址,如果这个 UDP 的数据包足够大,大到 IP 层一定要对其进行分片的时候,想象中,该 UDP 数据包的第一个分片会发出一个 ARP 查询请求, 所有的分片都辉等到这个查询完成以后再发送。事实上是这样吗?

结果是,某些系统会让每一个分片都发送一个 ARP 查询,所有的分片都在等待,但是接受到第一个回应的时候,主机却只发送了 最后一个数据片而抛弃了其 他,这实在是让人匪夷所思。这样,因为分片的数据不能被及时组装,接受主机将会在一段时间内将永远 无法组装的 IP 数据包抛弃,并且发送组装超时的 ICMP 报文(其实很多系统不产生这个差错),以保证接受主机自己的接收端缓存不 被那些永远得不到组装的分片满。

5、ICMP 源站抑制差错


当目标主机的处理速度赶不上数据接收的速度,因为接受主机的 IP 层缓存会被占满,所以主机就会发出一个“我受不了”的一个 ICMP 报文。

6、UDP 服务器设计


UDP 协议的某些特性将会影响我们的服务器程序设计,大致总结如下:

  • 关于客户IP和地址:服务器必须有根据客户IP地址和端口号判断数据包是否合法的能力(这似乎要求每一个服务器都要具备)
  • 关于目的地址:服务器必须要有过滤广播地址的能力。
  • 关于数据输入:通常服务器系统的每一个端口号都会和一块输入缓冲区对应,进来的输入根据先来后到的原则等待服务器的处理,所以难免会出现缓冲区溢出的问题,这种情况下,UDP 数据包可能会被丢弃,而应用服务器程序本身并不知道这个问题。
  • 服务器应该限制本地IP地址,就是说它应该可以把自己绑定到某一个网络接口的某一个端口上。

即时通讯网 - 即时通讯开发者社区! 来源: - 即时通讯开发者社区!

标签:TCPIP详解
上一篇:《TCP/IP详解》学习笔记(五):IP选路、动态选路下一篇:有关“为何选择Netty”的11个疑问及解答

本帖已收录至以下技术专辑

推荐方案
评论 4
TCP/IP经典。边看书,边参考笔记,谢谢!
引用:kyxmly 发表于 2018-02-20 14:54
TCP/IP经典。边看书,边参考笔记,谢谢!

过年还这么努力!
“UDP检验和是一个端到端的检验和。它由发送端计算,然后由接收端验证”书中这句话有很大的歧义,刚开始还以为只有dest会验证校验和。实际上应该是每一级路由都会重新计算传到下一级路由的吧。
“ 如果发送端没有打开检验和选项,而接收端计算检验和有差错,那么 UDP 数据将会 被悄悄的丢掉”, 这句话一开始我不理解,认为既然没有开启校验那就没有参照就没办法做接收端的验证。后来查资料发现接收端的校验不是和原来的校验和进行比较而是直接拿现有的校验和去用一个算法得出所有的位是不是1. 我的理解对吗?还有这个算法是怎样的,我没有查到这种计算规则。
打赏楼主 ×
使用微信打赏! 使用支付宝打赏!

返回顶部