标签: udp

UDP校验和计算

在/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头加上它后面的有效负载吗?)

谢谢.

c checksum udp network-programming

21
推荐指数
1
解决办法
8万
查看次数

加密连续/小UDP数据的最佳实践

我有一个应用程序,我必须使用UDP通过网络每秒发送几个小数据.应用程序需要实时发送数据(无需等待).我想加密这些数据并确保我所做的事情尽可能安全.

由于我使用的UDP,没有办法使用SSL/TLS,所以我有,因为协议是无连接/不可靠/不受监管的每个数据包加密孤单.

现在,我使用从用户密码派生的128位密钥,AES CBC模式(PBE使用AES-CBC).我决定使用带密码的随机盐来获取128位密钥(防止对密码短语的字典攻击),当然还要使用IV(以防止对数据包进行统计分析).

不过,我很担心几件事情:每个数据包中含有少量的数据(比如一对夫妇每包的整数值),这将使得加密的数据包受到已知明文攻击(这将导致更容易破解密钥) .此外,由于加密密钥是从口令派生,这将使密钥空间的方式少(​​我知道盐可以帮助,但我通过网络发送一次盐,任何人都可以得到它).鉴于这两件事,任何人都可以嗅探并存储发送的数据,并尝试破解密钥.虽然这个过程可能需要一些时间,但一旦密钥被破解,所有存储的数据都将被解密,这对我的应用程序来说将是一个真正的问题.

所以我的问题是,使用无连接协议(UDP)发送/加密连续小数据的最佳做法是什么?我的方式是最好的方式吗?...流入?...矫枉过正?

请注意,我不是要求100%安全的解决方案,因为没有这样的事情.

encryption udp

21
推荐指数
1
解决办法
2万
查看次数

什么会导致UDP数据包被发送到localhost时被丢弃?

我正在发送非常大(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)

java udp network-programming

21
推荐指数
1
解决办法
3万
查看次数

使用nc(netcat)广播消息

我正在尝试使用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上.你能给我一个用于广播消息的例子吗?

谢谢!

networking udp

21
推荐指数
4
解决办法
4万
查看次数

使用SIP,何时使用TCP而不是UDP?

我知道漂亮的UDP和TCP之间的差异一般(如http://www.onsip.com/about-voip/sip/udp-versus-tcp-for-voip)

问题是,在什么情况下使用TCP作为传输在SIP VOiP通信中具有明显的优势?

voip udp tcp sip

21
推荐指数
4
解决办法
6万
查看次数

像UDP一样广播,具有TCP的可靠性

我正在开发一个完全在单个网络中运行的.net解决方案.当用户对系统进行更改时,我想发布一个通知,让其他人听到并做出相应的操作.有没有一种方法可以广播这样的消息(比如UDP会让你这么做),同时保证有保证的交付(比如TCP)?

这是一个小型网络(30个客户端),如果这会有所作为.

.net networking udp tcp

20
推荐指数
3
解决办法
1万
查看次数

使用sendto/recvfrom而不是使用UDP套接字连接/发送/ recv的目的是什么?

我可以掌握TCP与UDP的概念,但我仍然不知道为什么有两种方式发送UDP数据包,并且我仍然不明白这是否是bind()和accept()的绝对必要. .

networking udp network-programming

20
推荐指数
2
解决办法
2万
查看次数

UDP数据包丢弃 - INErrors Vs .RcvbufErrors

我写了一个简单的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%.

因此,为了减少数据包丢失,我尝试了以下方法:
- 使用命令提高了示例程序的优先级.
- 增加接收缓冲区大小(在系统级和进程级)

将优先级提高到-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 …

linux udp epoll linux-kernel

20
推荐指数
2
解决办法
1万
查看次数

获取收到的UDP数据包的目标地址

在收到UDP数据包后,我需要使用他用来发送我正在回复的数据包的地址来响应发送方.

recvfrom调用允许我获取发送方的地址,但是如何获取接收数据包的目标地址,该地址应该与本地主机接口之一的地址匹配?

linux networking udp ipv4

19
推荐指数
2
解决办法
2万
查看次数

'inet_pton':找不到标识符

我试图在我的程序中包含以下代码,但会出现错误('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)

任何帮助可能会错过一些标题或库.

c++ linux windows networking udp

19
推荐指数
2
解决办法
4万
查看次数

标签 统计

udp ×10

networking ×5

linux ×3

network-programming ×3

tcp ×2

.net ×1

c ×1

c++ ×1

checksum ×1

encryption ×1

epoll ×1

ipv4 ×1

java ×1

linux-kernel ×1

sip ×1

voip ×1

windows ×1