由于TCP保证了数据包传输,因此可以被认为是"可靠的",而UDP不保证任何东西,数据包可能会丢失.在应用程序中而不是在TCP流上使用UDP传输数据有什么好处?在什么样的情况下,UDP是更好的选择,为什么?
我假设UDP更快,因为它没有创建和维护流的开销,但如果某些数据永远不会到达目的地那么这不是无关紧要的吗?
我正在发送非常大(64000字节)的数据报.我意识到MTU远小于64000字节(典型值大约是1500字节,来自我的阅读),但我怀疑会发生两件事之一 - 要么没有数据报就能通过(所有大于1500字节)会被静默删除或导致抛出错误/异常)或64000字节数据报将被分成大约43个1500字节的消息并透明地传输.
从长远来看(2000 + 64000字节数据报),数据报的大约1%(即使是LAN似乎异常高)也会被丢弃.我可能期望通过网络,数据报可能无序到达,被丢弃,过滤等等.但是,在localhost上运行时我没想到这一点.
是什么导致无法在本地发送/接收数据?我意识到UDP是不可靠的,但我没想到它在localhost上如此不可靠.我想知道它是否只是一个时间问题,因为发送和接收组件都在同一台机器上.
为了完整起见,我已经包含了发送/接收数据报的代码.
发送:
DatagramSocket socket = new DatagramSocket(senderPort);
int valueToSend = 0;
while (valueToSend < valuesToSend || valuesToSend == -1) {
byte[] intBytes = intToBytes(valueToSend);
byte[] buffer = new byte[bufferSize - 4];
//this makes sure that the data is put into an array of the size we want to send
byte[] bytesToSend = concatAll(intBytes, buffer);
System.out.println("Sending " + valueToSend + " as " + bytesToSend.length + " bytes");
DatagramPacket packet = new DatagramPacket(bytesToSend,
bufferSize, …Run Code Online (Sandbox Code Playgroud) 我试图找出在两个系统之间通过网络传输大量数据的最佳方法.我目前正在研究FTP,HTTP或RSync,我想知道哪一个是最快的.我在网上找了一些答案,发现了以下网站:
问题是这些都是旧的,并且更多地谈论协议如何通信之间的理论差异.我对实际的基准测试更感兴趣,可以说对于特定的设置,当传输不同大小的文件时,一个协议比其他协议快x%.
有没有人测试这些并将结果发布到某个地方?
有办法通过命令行吗?man tcp告诉我,我需要设置tcp_nodelay = 1,但我无法在/ proc/sys/net/ipv4下创建tcp_nodelay文件.如果有任何方法可以在Linux中禁用Nagle,请告诉我.
UdpClient和TcpClient有什么区别?什么时候我应该使用Tcp和Udp从软件arhitecture点?我希望我解释得对..
我已经为Python中通过TCP和UDP进行套接字通信实现了一个小型基准。令人惊讶的是,TCP几乎是UDP的两倍。
为避免路由影响,服务器和客户端在同一台Unix计算机上运行,但在不同的线程上运行。
也许代码很有用。这是服务器代码:
import socket
import sys
host = 'localhost'
port = 8888
buffersize = 8
server_address = (host, port)
def start_UDP_server():
socket_UDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
socket_UDP.bind(server_address)
print("UDP server is running...")
while True:
data, from_address = socket_UDP.recvfrom(buffersize)
if not data: break
socket_UDP.sendto(data, from_address)
socket_UDP.close()
def start_TCP_server():
socket_TCP = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
socket_TCP.bind(server_address)
socket_TCP.listen(1)
print("TCP server is running...")
while True:
client, client_address = socket_TCP.accept()
while True:
data = client.recv(buffersize)
if not data: break
client.sendall(data)
client.close()
Run Code Online (Sandbox Code Playgroud)
因此,您可以运行start_TCP_server()或start_UDP_server()。
在客户端,代码是:
import …Run Code Online (Sandbox Code Playgroud) 我有一个Android应用程序,需要每100毫秒通过协议UDP发送数据.每个UDP数据包平均有15000字节.数据包以广播形式发送
下面每100毫秒行都会循环一次.
DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, broadcast, 9876);
clientSocket.send(sendPacket);
Run Code Online (Sandbox Code Playgroud)
应用程序开始正常工作,但在大约1分钟后,接收到的数据包的频率会降低,直到数据包没有到达目的地.
UDP数据包的最大大小的理论限制(在Windows上)为65507字节
我知道网络的媒体MTU是1500字节,当我发送一个更大的数据包时,它被分成几个片段,如果一个片段没有到达目的地,整个包就会丢失.
我不明白为什么在最初的1分钟内数据包被正确发送,一段时间后数据包不再到达.所以我想知道解决这个问题的最佳方法是什么?
许多游戏开发者选择在应用程序级别使UDP 可靠.这不是TCP的用途吗?我创建了一个API,使用UDP和TCP数据包启用客户端 - 服务器通信.我应该在列表中添加Reliable UDP吗?为什么?如果我使用TCP有问题吗?
我只是想知道RUDP是否对TCP有任何好处,因此我可以选择是否添加RUDP支持.
我的应用程序需要从服务器到客户端逐帧发送视频数据.我在使用TCP或UDP之间摇摆不定.
从我的测试中,我发现了一些以下结果:
TCP:非常容易实现.
UDP:要向客户端发送一个帧(大约50KB),如果我为每个帧创建1个UDP包,则发送总是丢失帧.所以我必须将每个帧分成许多UDP包.这使得我的算法非常复杂,因为UDP协议可能会丢失包,并且包可能无序传递.另外,如果每个UDP包中的数据长度很大,那么很容易丢失.
我有以下几个问题:
我应该在这种类型的应用程序中使用TCP或UDP.
如果我想使用UDP来实现更快的传输,那么如何确定每个包中的数据长度在传输时不会轻易丢失?(这可能属于网络带宽?).
根据您的经验,您能估算出TCP更快的UDP有多少百分比?
很抱歉在帖子中有很多问题,但在我的应用程序中决定使用TCP或UDP之前我需要了解更多细节,这对我来说非常重要.
很多人,
T&T组