重学UDP(一)

重学UDP(一)

离校多年,最近重学IP/TCP协议。

UDP 报文结构

头部8字节,64位

头(0-63)

  • 0-15 源端口号,可用全0
  • 16-31 目的端口号
  • 32-47 整个UDP报文长度,包括头(8)和数据
  • 48-63 UDP校验和

第一部分是UDP发送端和接收端的端口号,整个头里米有IP地址信息,是因为IP地址是在底层IP协议上指定的。
第二部分是该UDP数据报的整个长度,所以其实实际负载长度应该是这个长度减去固定头长度8
第三部分是该UDP数据报的内容校验,全为0则表示没有计算校验和

具体校验的过程是这样的。
* 发送方先在UDP数据报之前增加12字节的伪首部,这部分数据主要从底层IP协议中取得,包括4字节源IP、4字节目的IP,2字节的固定内容,2字节的UDP长度
* 将UDP头中校验和部分暂时置为全0
* 把待校验数据看成是由许多16位的子串连接起来,末尾不够的补0
* 按照二进制反码计算出这些16位字的和,并将此和的二进制反码写入校验和字段
* 接收方同样先吧收到得UDP数据报加上伪首部
* 将整体看成是由许多16位的子串连接起来,末尾不够补0,按二进制反码计算出这些16位字的和。当无差错时其结果全为1。否则就表明有差错出现,接收方应该丢弃这个UDP数据报。

从以上校验流程里可以发现,UDP校验部分其实是违反分层原则的,这主要是实现上的微小影响,问题不大。

内容体

这部分为报文实际有效负载,由于UDP头报文长度字段限制,所以实际每个报文的最大有效负载为65535-20=65515,

在考虑实际网络环境MTU设置避免分片重组,在普通的局域网环境下,UDP的数据最大为1472字节最好;在Internet上,路由器可能有设置成不同的MTU值,Internet上的标准MTU值为576,所以Internet的UDP编程时数据长度最好在576-20-8=548字节以内。

特点

核心的特点就是简单,主要原因就在于UDP是无连接的

主要是与TCP相比较而言,使用UDP传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。

另一个指的一提的是其支持 广播/组播

广播UDP与单播UDP的区别就是IP地址不同,广播使用广播地址255.255.255.255,组播使用组播地址,将消息发送到在同一广播网络上的每个主机。值得强调的是:本地广播信息是不会被路由器转发。当然这是十分容易理解的,因为如果路由器转发了广播信息,那么势必会引起网络瘫痪。这也是为什么IP协议的设计者故意没有定义互联网范围的广播机制。

上层协议

鉴于以上提到的UDP特性,实际也有许多基于UDP的上层协议,以下是常见的几个。

RIP

是一种应用较早的内部网关协议(IGP),是一种较为简单的动态路由选择协议,用于自治系统(AS)内的路由信息的传递。

RIP进程会使用UDP的520端口来发送和接收RIP分组。主要采用广播的方式来发送自己的路由表信息至相邻其它路由器

SNMP

SNMP是另外一种比较常见的标准协议,简单网络管理协议。主要用于对IP网络节点(服务器、工作站、路由器、交换机及HUBS等)的管理。

SNMP的工作方式较为简单,管理端向被管理端发送请求,返回数据,内容主要包括获取信息和设置等,此外相对复杂点的Trap消息,在此不做过多介绍。

TFTP

TFTP是一种传输小文件的简单协议,同样是标准协议,相比于FTP要简单许多。

TFTP日常较少使用,一般见于路由器固件,交换机固件,烧写DSP等场景,对于这些较小的计算机或者某些特殊用途的设备来说一般不需要硬盘,只需要固化了TFTP、UDP和IP的小容量只读存储器即可。当电源接通后,设备执行只读存储器中的代码,在网络上广播一个TFTP请求。网络上的TFTP服务器就发送响应,其中包括可执行二进制程序。设备收到此文件后将其放入内存,然后开始运行程序。这种方式增加了灵活性,也减少了开销。

DNS

这可能是UDP最常见的应用了,用户向域名服务器53端口发送域名解析请求,DNS服务器对其进行解析并返回实际IP信息

DNS 定义了两种报文 ,一种为查询报文;另一种是对查询报文的响应,称为响应报文。具体协议格式网络上已经比较多了。

QUIC

QUIC谷歌发明的新传输协议,类似于在 UDP 上实现的 TCP + TLS + HTTP/2。

之所以提出这个协议,个人理解主要有以下原因:

一是TCP是由操作系统在内核协议栈层面实现的,应用程序只能使用,不能直接修改。虽然应用程序的更新迭代非常快速和简单。但是 TCP 的迭代却非常缓慢,原因就是操作系统升级很麻烦;

其次是HTTP建立连接的握手延迟大光TCP就需要三次握手,TLS 完全握手又需要至少 2 个 RTT 才能建立,对于很多短连接场景,这样的握手延迟影响很大,且无法消除;

再者,TCP协议为可靠性机制引入了队头阻塞,数据必须按照顺序处理,如果前面的数据丢失,后面的数据就算到达了也不会通知应用层来处理。

而QUIC的核心优势就在于其连接建立延时低,改进了拥塞控制和流量控制,基于stream的多路复用并且很大程度上缓解甚至消除了队头阻塞的影响。

处理以上优势以外,QUCI还具有一些特性。如连接迁移。

任何一条 QUIC 连接不再以 IP 及端口四元组标识,而是以一个 64 位的随机数作为 ID 来标识,这样就算 IP 或者端口发生变化时,只要 ID 不变,这条连接依然维持着,上层业务逻辑感知不到变化,不会中断,也就不需要重连。而且由于这个 ID 是客户端随机产生的,并且长度有 64 位,所以冲突概率非常低。

KCP

准确来说,KCP并不是基于UDP的上层协议,KCP是纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据包的发送方式,以 callback的方式提供给 KCP。

Spread the love
Comments are closed.