撸完了TCP
,天然要来撸一下UDP
算法
UDP 协议,即 用户数据报协议(User Datagram Protocol
),是一个简单的 面向数据报 的 传输层 协议。缓存
咱们能够将UDP
协议看做IP
协议 暴露 在 传输层 的一个 接口。网络
UDP 协议一样以 数据包(datagram
)的方式传输,它的传输方式也是Best Effort
的,因此UDP
协议也是不可靠的(unreliable
)。socket
那么,咱们为何不直接使用IP
协议而要额外增长一个UDP
协议呢?3d
一个重要的缘由是IP
协议中并无 端口(port
)的概念。IP
协议进行的是IP
地址到IP
地址的传输,这意味者两台计算机之间的对话。但每台计算机中须要有 多个通讯通道,并将 多个通讯通道 分配给 不一样的进程 使用。一个端口 就表明了这样的一个 通讯通道。UDP
协议实现了 端口,从而让 数据包 能够在送到IP
地址的基础上,进一步能够送到 某个端口。code
尽管UDP
协议很是 简单,但它的产生 晚于 更加 复杂 的TCP
协议。orm
早期的网络开发者开发出IP
协议和TCP
协议分别位于 网络层 和 传输层,全部的通讯都要先通过TCP
封装,再通过IP
封装(应用层->TCP
->IP
)。cdn
开发者将TCP/IP
视为相互合做的 套装。但很快,网络开发者发现,IP
协议的功能和TCP
协议的功能是相互 独立 的。blog
对于一些简单的通讯,咱们只须要Best Effort
式的IP
传输就能够了,而不须要TCP
协议复杂的创建链接的方式(特别是在 早期 网络环境中,若是 过多 的创建TCP
链接,会形成很大的网络 负担,而UDP
协议能够相对快速的处理这些简单通讯)。接口
UDP 协议随之被开发出来,做为IP
协议在 传输层 的 傀儡。这样,网络通讯能够经过 应用层->UDP->IP 的封装方式,绕过TCP
协议。
header
)和
数据 (
payload
)两部分。
UDP 是传输层(transport layer
)协议,这意味着UDP
的数据包须要通过IP
协议的封装(encapsulation
),而后经过IP
协议传输到 目的电脑。随后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
校验。
端口(port
)是伴随着 传输层 诞生的概念。它能够将 网络层 的IP
通讯分送到 各个通讯通道。
UDP 协议和TCP
协议尽管在工做方式上有很大的不一样,但它们都创建了 从一个端口到另外一个端口的通讯。
一个特定的IP
和特定的 端口 就构成了一个socket
。
无链接的
发送数据以前 不须要创建链接,减小了开销和发送数据以前的时延。
尽最大努力交付
不保证可靠的交付,主机 不须要 维持复杂的连接状态表。
面向报文的
发送方的UDP
对应用程序交下来的报文,在添加首部后就向下交付给IP
层。
既 不拆分,也 不合并,而是 保留 这些报文的 边界。
所以,应用程序须要选择 合适 的报文 大小。
没有拥塞控制。
支持一对1、多对一和多对多的交互通讯。
首部开销小,只有8个字节。
UDP 端口扫描比较麻烦,它同TCP
不同,由于它不须要创建链接。
咱们向 目标主机 的固定端口发送UDP
数据包,能够获得 两种结果:
ICMP
的port-unreachable
响应 那么,咱们就能够coding
,大部分同TCP
探测:
构造一系列目标端口的UDP
包
经过第二层的sr
发送而且接收返回的包
遍历接收的包,判断是否目标端口有ICMP
回复包,此端口就为没有开放端口
经过遍历的全部端口集合和不开放端口集合作差集,就能获得全部开放端口的集合
整个代码就是:
扫描发现对方主机 88 号端口开放:
愿意与你们分享交流各类技术,我的公众帐号[mindev],以及 知识星球[ 极客世界 ]