在/usr/include/netinet/udp.h中定义的UDP头结构如下
struct udphdr
{
u_int16_t source;
u_int16_t dest;
u_int16_t len;
u_int16_t check;
};
Run Code Online (Sandbox Code Playgroud)
标题的检查字段中存储了什么值?如何验证校验和是否正确?我的意思是校验和计算的数据是什么?(它只是udp头或udp头加上它后面的有效负载吗?)
谢谢.
我有一个应用程序,我必须使用UDP通过网络每秒发送几个小数据.应用程序需要实时发送数据(无需等待).我想加密这些数据并确保我所做的事情尽可能安全.
由于我使用的UDP,没有办法使用SSL/TLS,所以我有,因为协议是无连接/不可靠/不受监管的每个数据包加密孤单.
现在,我使用从用户密码派生的128位密钥,AES CBC模式(PBE使用AES-CBC).我决定使用带密码的随机盐来获取128位密钥(防止对密码短语的字典攻击),当然还要使用IV(以防止对数据包进行统计分析).
不过,我很担心几件事情:每个数据包中含有少量的数据(比如一对夫妇每包的整数值),这将使得加密的数据包受到已知明文攻击(这将导致更容易破解密钥) .此外,由于加密密钥是从口令派生,这将使密钥空间的方式少(我知道盐可以帮助,但我通过网络发送一次盐,任何人都可以得到它).鉴于这两件事,任何人都可以嗅探并存储发送的数据,并尝试破解密钥.虽然这个过程可能需要一些时间,但一旦密钥被破解,所有存储的数据都将被解密,这对我的应用程序来说将是一个真正的问题.
所以我的问题是,使用无连接协议(UDP)发送/加密连续小数据的最佳做法是什么?我的方式是最好的方式吗?...流入?...矫枉过正?
请注意,我不是要求100%安全的解决方案,因为没有这样的事情.
我正在发送非常大(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) 我正在尝试使用netcat发送广播消息.
我打开防火墙,发送这样的常规消息对我有用:
host: nc -l 192.168.1.121 12101
client: echo "hello" | nc 192.168.1.121 12100
Run Code Online (Sandbox Code Playgroud)
但我无法得到这样的东西.
host: nc -lu 0.0.0.0 12101
client: echo "hello" | nc -u 255.255.255.255 12100
Run Code Online (Sandbox Code Playgroud)
我使用正确的旗帜吗?注意,主机在Mac上,而客户端在Linux上.你能给我一个用于广播消息的例子吗?
谢谢!
我知道漂亮的UDP和TCP之间的差异一般(如http://www.onsip.com/about-voip/sip/udp-versus-tcp-for-voip)
问题是,在什么情况下使用TCP作为传输在SIP VOiP通信中具有明显的优势?
我正在开发一个完全在单个网络中运行的.net解决方案.当用户对系统进行更改时,我想发布一个通知,让其他人听到并做出相应的操作.有没有一种方法可以广播这样的消息(比如UDP会让你这么做),同时保证有保证的交付(比如TCP)?
这是一个小型网络(30个客户端),如果这会有所作为.
我可以掌握TCP与UDP的概念,但我仍然不知道为什么有两种方式发送UDP数据包,并且我仍然不明白这是否是bind()和accept()的绝对必要. .
我写了一个简单的UDP服务器程序,以了解更多可能的网络瓶颈.
UDP服务器:创建UDP套接字,将其绑定到指定的端口和地址,并将套接字文件描述符添加到epoll兴趣列表.然后它的epoll等待传入的数据包.收到传入数据包(EPOLLIN)后,它会读取数据包并只打印接收到的数据包长度.很简单,对:)
UDP客户端:我使用了hping,如下所示:
hping3 192.168.1.2 --udp -p 9996 --flood -d 100
当我以每秒100个数据包发送udp数据包时,我没有发现任何UDP数据包丢失.但是当我泛洪udp数据包时(如上面的命令所示),我看到了重要的数据包丢失.
测试1: 当从UDP客户端泛洪26356个数据包时,我的示例程序仅接收12127个数据包,剩余的14230个数据包被内核丢弃,如/ proc/net/snmp输出所示.
cat/proc/net/snmp | grep Udp:
Udp:InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors SndbufErrors
Udp:12372 0 14230 218 14230 0
对于Test1,丢包率为~53%.
我确认在客户端和服务器端使用"ethtool -S ethX"命令在硬件级别上没有太多损失,而在应用程序级别,我看到如上所述损失53%.
因此,为了减少数据包丢失,我尝试了以下方法:
- 使用renice命令提高了示例程序的优先级.
- 增加接收缓冲区大小(在系统级和进程级)
将优先级提高到-20:
renice -20 2022
2022(进程ID)旧优先级0,新优先级-20
将接收缓冲区大小增加到16MB:
在Process Level:
int sockbufsize = 16777216;
setsockopt(sockfd,SOL_SOCKET,SO_RCVBUF,(char*)&sockbufsize,(int)sizeof(sockbufsize))
在内核级别:
cat/proc/sys/net/core/rmem_default
16777216
cat/proc/sys/net/core/rmem_max
16777216
完成这些更改后,执行Test2.
测试2: 当1985076数据包从UDP客户端泛洪时,我的示例程序接收到1848791个数据包,剩余的136286数据包被内核丢弃,如/ proc/net/snmp输出所示.
cat/proc/net/snmp | grep Udp:
Udp:InDatagrams NoPorts InErrors OutDatagrams RcvbufErrors SndbufErrors
Udp:1849064 0 136286 236 0 0 …
在收到UDP数据包后,我需要使用他用来发送我正在回复的数据包的地址来响应发送方.
该recvfrom调用允许我获取发送方的地址,但是如何获取接收数据包的目标地址,该地址应该与本地主机接口之一的地址匹配?
我试图在我的程序中包含以下代码,但会出现错误('inet_pton':未找到标识符).
// IPv4:
struct sockaddr_in ip4addr;
int s;
ip4addr.sin_family = AF_INET;
ip4addr.sin_port = htons(3490);
inet_pton(AF_INET, "10.0.0.1", &ip4addr.sin_addr);
s = socket(PF_INET, SOCK_STREAM, 0);
bind(s, (struct sockaddr*)&ip4addr, sizeof ip4addr);
Run Code Online (Sandbox Code Playgroud)
产量
error C3861: 'inet_pton': identifier not found
Run Code Online (Sandbox Code Playgroud)
包括标题
#include <stdio.h>
#include <stdlib.h>
#include "udpDefine.h"
#include <windows.h>
Run Code Online (Sandbox Code Playgroud)
任何帮助可能会错过一些标题或库.