当前位置:  开发笔记 > 编程语言 > 正文

我应该怎么知道UDP编程?

如何解决《我应该怎么知道UDP编程?》经验,为你挑选了4个好方法。

我不是指如何连接到套接字.我应该了解UDP编程?

我需要担心套接字中的错误数据吗?

我应该假设如果我发送200字节,我可能分别得到120和60字节?

我是否应该担心另一个连接在同一端口上发送错误数据?

如果数据通常不会到达多长时间(通常)不能看到数据(250ms?1秒?1.75sec?)

我真的需要知道什么?



1> Don Neufeld..:

"我应该假设,如果我发送200字节,我可能分别得到120和60字节?"

当您发送UDP数据报时,您的读取大小将等于您的写入大小.这是因为UDP是数据报协议,而不是TCP的协议.但是,在路由器将数据包分段或丢弃之前,您只能写入最大为MTU大小的数据.对于一般的互联网使用,安全MTU是576字节,包括标头.

"我应该担心另一个连接在同一个端口发送错误的数据?"

你没有连接,你有一个端口.您将收到发送到该端口的任何数据,无论它来自何处.由您来确定它是否来自正确的地址.

如果数据通常没有到达多长时间我(通常)看不到数据(250ms?1秒?1.75sec?)

数据可能永远丢失,数据可能会延迟,数据可能无序到达. 如果有任何困扰你,请使用TCP. 在UDP之上编写可靠的协议是一项非常重要的任务,几乎所有应用程序都没有理由这样做.


我写了很多商业游戏,通常只是因为游戏并不意味着数据包丢失是可以接受的.我们通常会在使用UDP确定用户完全链接死亡之前至少等待30秒.
不应该欢迎丢包.相反,你应该专注于不发送大量数据.正如Don暗示的那样,数据包丢失可能意味着连接丢失 - 可能是高丢失,或者存在延迟突发.在游戏中使用UDP是一个研究很好的领域.知道你正在编写游戏,在UDP _might_上写一个可靠的包装器适用于这种情况.但唐的警告应该受到重视 - 这是非常重要的.在网上搜索 - 在游戏中正确使用UDP时有很多好的信息.

2> Robert S. Ba..:

我是否应该担心另一个连接在同一端口上发送错误数据?

是的你应该担心它.任何应用程序都可以随时将数据发送到您的开放UDP端口.UDP的一个重要用途是多种到一种类型的通信,其中您使用在recvfrom区分对等体期间传回的地址来复用与单个端口上的多个对等体的通信.

但是,如果要避免这种情况并且只接受来自单个对等方的数据包,则可以实际调用connectUDP套接字.这会导致IP堆栈拒绝来自任何主机的数据包:端口组合(套接字)而不是您要与之通信的数据包.

调用connectUDP套接字的第二个好处是,在许多操作系统中,它可以显着提高速度/延迟.当您调用sendto未连接的UDP套接字时,操作系统实际上会临时连接套接字,发送数据然后断开套接字,从而增加了大量开销.

使用连接的UDP套接字的第三个优点是它允许您将ICMP错误消息接收回应用程序,例如路由或由于崩溃而未知的主机.如果没有连接UDP套接字,操作系统将不知道从网络向哪里发送ICMP错误消息,并将静默丢弃它们,可能导致您的应用程序在等待崩溃主机的响应时挂起(或等待您的选择超时).



3> Brian Agnew..:

您的数据包可能无法到达那里.

您的数据包可能会两次或更频繁地到达那里.

您的数据包可能没有整理.

您对基础网络层施加的数据包有大小限制.数据包大小可能非常小(可能是576字节).

这些都没有说"不要使用UDP".但是,您应该了解上述所有内容并考虑您可能想要采取的恢复选项.



4> TrayMan..:

碎片和重组在IP级别发生,因此您无需担心(维基百科).(这意味着您不会收到拆分或截断的数据包).

UDP数据包具有数据和标头的校验和,因此不太可能接收虚假数据,但这是可能的.丢包或重复包也是可能的.无论如何,你应该检查你的数据.

没有拥塞控制,所以你可能希望考虑一下,如果你计划用大量UDP数据包堵塞管道.

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有