UDP协议
撸完了TCP,自然要来撸一下UDP
UDP 协议,即 用户数据报协议(User Datagram Protocol),是一个简单的 面向数据报 的 传输层 协议。
我们可以将UDP协议看作IP协议 暴露 在 传输层 的一个 接口。
UDP 协议同样以 数据包(datagram)的方式传输,它的传输方式也是Best Effort的,所以UDP协议也是不可靠的(unreliable)。
那么,我们为什么不直接使用IP协议而要额外增加一个UDP协议呢?
一个重要的原因是IP协议中并没有 端口(port)的概念。IP协议进行的是IP地址到IP地址的传输,这意味者两台计算机之间的对话。但每台计算机中需要有 多个通信通道,并将 多个通信通道 分配给 不同的进程 使用。一个端口 就代表了这样的一个 通信通道。UDP协议实现了 端口,从而让 数据包 可以在送到IP地址的基础上,进一步可以送到 某个端口。
UDP依然不是那么“可靠”
尽管UDP协议非常 简单,但它的产生 晚于 更加 复杂 的TCP协议。
早期的网络开发者开发出IP协议和TCP协议分别位于 网络层 和 传输层,所有的通信都要先经过TCP封装,再经过IP封装(应用层->TCP->IP)。
开发者将TCP/IP视为相互合作的 套装。但很快,网络开发者发现,IP协议的功能和TCP协议的功能是相互 独立 的。
对于一些简单的通信,我们只需要Best Effort式的IP传输就可以了,而不需要TCP协议复杂的建立连接的方式(特别是在 早期 网络环境中,如果 过多 的建立TCP连接,会造成很大的网络 负担,而UDP协议可以相对快速的处理这些简单通信)。
UDP 协议随之被开发出来,作为IP协议在 传输层 的 傀儡。这样,网络通信可以通过 应用层->UDP->IP 的封装方式,绕过TCP协议。
UDP报文

header)和 数据 (payload)两部分。
UDP 是传输层(transport layer)协议,这意味着UDP的数据包需要经过IP协议的封装(encapsulation),然后通过IP协议传输到 目的电脑。随后UDP包在目的电脑拆封,并将信息送到 相应端口 的缓存中。
- UDP协议的头部
-
source port
UDP 包的出发端口 -
destination port
目的地端口 -
Length
整个 UDP 包的长度。 -
checksum
它的算法与IP协议的header checksum算法相类似。
然而,UDP的checksum所校验的序列包括了 整个UDP数据包,以及封装的IP头部的一些信息(主要为出发地IP和目的地IP)。
这样,checksum就可以 校验IP:端口 的正确性了。
在IPv4中,checksum可以为 0,意味着 不使用 checksum。IPv6要求必须进行checksum校验。
-
socket
端口(port)是伴随着 传输层 诞生的概念。它可以将 网络层 的IP通信分送到 各个通信通道。
UDP 协议和TCP协议尽管在工作方式上有很大的不同,但它们都建立了 从一个端口到另一个端口的通信。

一个特定的IP和特定的 端口 就构成了一个socket。
UDP主要特点
-
无连接的
发送数据之前 不需要建立连接,减少了开销和发送数据之前的时延。 -
尽最大努力交付
不保证可靠的交付,主机 不需要 维持复杂的链接状态表。 -
面向报文的
发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。
既 不拆分,也 不合并,而是 保留 这些报文的 边界。
因此,应用程序需要选择 合适 的报文 大小。 -
没有拥塞控制。
-
支持一对一、多对一和多对多的交互通信。
-
首部开销小,只有8个字节。
UDP端口探测
UDP 端口扫描比较麻烦,它同TCP不一样,因为它不需要建立连接。
我们向 目标主机 的固定端口发送UDP数据包,可以得到 两种结果:
- 端口开了
UDP 不会给我们任何回复,没办法,谁叫人家是 无连接的 - 端口没开
目标主机端口会给我们回复
ICMP的port-unreachable响应
那么,我们就可以coding,大部分同TCP探测:
-
构造一系列目标端口的
UDP包 -
通过第二层的
sr发送并且接收返回的包 -
遍历接收的包,判断是否目标端口有
ICMP回复包,此端口就为没有开放端口 -
通过遍历的所有端口集合和不开放端口集合做差集,就能得到所有开放端口的集合
整个代码就是:

扫描发现对方主机 88 号端口开放:

愿意与大家分享交流各种技术,个人公众账号[mindev],以及 知识星球[ 极客世界 ]
