0. 前言

UDP 的内容实在是少了一些,所以把 IP 的一些内容一起加上。

对于一个 iOS 开发者来说,IP 协议已经算是非常底层的协议了,只做简单了解就好。

1. UDP是何物?

UDP,(User Datagram Protocol),用户数据报协议,是一个传输层协议。提供面向事务的简单不可靠信息传送服务。在RFC768中定义。

除了复用/功能及少量的差错检测之外,它几乎没有对 IP 增加别的东西,事实上当我们使用 UDP 的时候,差不多就是直接与 IP 打交道。

所以索性和 IP 一起讲了。

  • 数据报:
    一个完整、独立的数据实体,携带从源节点到目的地的节点的足够信息,对这些节点间之前的数据交换和传输网络没有任何依赖。

2. UDP 的特点

UDP 的特点,不在于它引入的什么东西,而在于它忽略的那些特性。

  • 无需建立连接
    TCP 在开始传输数据之前需要三次握手,但是 UDP 却可以直接发送数据。
  • 无连接状态 不用保存连接状态,适合流媒体。
  • 分组首部开销很少
  • 发送时间更加精细
    不同于 TCP,因为无需握手,所以 UDP 可以直接的发送数据。
    也代表没有重传延迟。适合游戏。

无协议服务

这个要从 IP 协议说起了。IP 协议的主要任务就是按照地址从源主机向目标主机发送数据报。为此,消息会被封装在一个 IP 分组内(下图所示 IPv4 的首部,20 字节),其中标明了源地址和目标地址,以及一些其他参数。

UDP 协议用自己的分组结构封装了 IP 消息,他只增加了四个字段:源端口、目标端口、分组长度和校验和。如下图所示:

这四个字段的作用分别如下:

  • 源端口
    一个可选字段,它表示发送方进程的端口号,接收方可以使用该字段(不一定准确)向发送方发送信息;
  • 目的端口
    数据报接收方的端口号,它只在目标的 IP 地址下才有意义;
  • 分组长度
    协议头和数据报中数据长度的总和,表示整个数据报的大小;
  • 校验码
    使用 IP 首部、UDP 首部和数据报中的数据进行计算,接收方可以通过校验码验证数据的准确性,发现传输过程中出现的问题。

这里的源端口和校验码都是可选的。IP 分组也自带校验码,可以直接使用。而 UDP 只用于发送信息,不知道发送者也是可以的。

长度字段看起来有点无用,事实上也是如此,接收方其实可以也能算出来。但是很有意思的是,如果你刻意的省略掉,一些程序还可能犯错。因为你不知道应用程序究竟是从 IP 头部来获取长度还是从 UDP 获取长度。

数据不可拆分

我们知道 TCP 是可以通过多个分组发送消息,每个分组都有序号,丢失了还要重发,并且要按序交付。而 UDP 则是只有一个限制:数据报必须封装在 IP 分组中,应用程序必须要读取完整的信息。换句话说,数据报不可以分片。

4. IP

IP,(Internet Protocol)网际互连协议,是一个网络层的协议。再度放上这张图。

IP协议是无连接

IP 面相无连接的。即在发送数据之前,不需要建立与目标地址之间的连接。

5. IPv4 & IPv6

IPv4地址是由 32(4 x 8) 位正整数来表示。而随着地址需求的不断增加,不够用了!然后催生了 IPv6。IPv6 是原有地址长度的 4 倍,即 128(8 x 16)位。

IPv4 的首部格式如图所示。 IPv6 的首部格式如图所示

这里不再赘述各部分代表什么,有兴趣的可以翻阅《图解 TCP/IP 》。

资料

RFC768

《图解 TCP/IP 》