Networking 微处理器通信中的TCP与UDP

Networking 微处理器通信中的TCP与UDP,networking,microcontroller,Networking,Microcontroller,我使用TCP通过以太网屏蔽与arduino通信(只需打开一个套接字并等待连接),同时观看/阅读使用某种网络接口进行通信的各种其他项目,它们似乎都使用UDP而不是TCP进行通信。我想知道的是,如果改用UDP,我会得到什么好处?您获得了多播,但失去了可靠性。UDP堆栈比TCP堆栈简单得多。您可以轻松地自己从头开始编写UDP堆栈,TCP有点困难,可行,但更难。TCP内置了重试和其他功能,因此您不会直接失去UDP的可靠性,您使用它所做的事情可以进行比较。UDP比TCP快得多,这就是为什么它现在或曾经被用

我使用TCP通过以太网屏蔽与arduino通信(只需打开一个套接字并等待连接),同时观看/阅读使用某种网络接口进行通信的各种其他项目,它们似乎都使用UDP而不是TCP进行通信。我想知道的是,如果改用UDP,我会得到什么好处?

您获得了多播,但失去了可靠性。

UDP堆栈比TCP堆栈简单得多。您可以轻松地自己从头开始编写UDP堆栈,TCP有点困难,可行,但更难。TCP内置了重试和其他功能,因此您不会直接失去UDP的可靠性,您使用它所做的事情可以进行比较。UDP比TCP快得多,这就是为什么它现在或曾经被用于视频和各种事情的原因。此外,像视频这样的东西可能会在这里或那里丢失一个数据包,而且根本不在乎。对于嵌入式UDP来说,其小巧、快速等优点非常好。如果您使用的是其他人的库,那么UDP可能不会为您节省太多内存/闪存资源,它仍然会快一点。当您实现自己的UDP时,您可以节省相当多的内存,因为您可以走捷径。您可以只实现arp和udp,而不实现其他功能(虽然ping很有用,但有点痛苦),并且您可以根据需要对arp/rarp做些什么,在arp/rarp上走捷径。您只能对感兴趣的数据包大小实施支持。对数据包进行编号,让请求方发送两到三个数据包,并对每个请求进行响应,可以大大减少数据包丢失问题。保持数据包的大小非常小有助于解决嵌入式资源问题,并避免任何mtu或其他问题。为了简单起见,您甚至可以强制指定特定的数据包长度


我总是以另一种方式问这个问题,使用TCP我能得到什么。有时,它是有用的,嵌入式的,桌面的或服务器的,尽管我仍然每次都会问这个问题,并且必须证明使用TCP over UDP是合理的,否则我不会使用它。

您可以获得代码空间、数据内存和确定性

重新组装TCP流需要相当大的内存,除非您想对每个不正常的数据包进行NAK。他们从来没有保证会井然有序


带有超时的异步命令响应协议,其中所有命令和响应都适合单个UDP数据包,并且命令是幂等的(可以多次应用并保持正确的结果),是一个非常健壮的协议。

还请注意,tcp是基于流的,UDP是基于打包的。因此,如果你得到udp数据包,你将得到整个东西。当您收到tcp数据包时,无法保证它以离开的方式到达。如果您假设它的行为类似于udp,那么您将丢失数据/数据包,因为您不会意识到这两个小数据包常常是一个更大的数据包。在tcp堆栈的额外代码之上添加内存需求和解析数据包所需的代码量,等等。