继续UDP问题,127.0.0.1的udp会不会错包

jackyjkchen 2011-08-24 05:38:27
众所周知,UDP无法保证不丢包,也不能保证不错包(包内内容二进制发生改变),需要我们自己做检验

现在的问题是,我前端的“接收进程”,在接到UDP包的时候会做CRC校验,然后转发给同样在本机的“处理进程”,因为127.0.0.1是在TCP/IP协议栈内实现,不走网卡,那么我可不可以在后端的“处理进程”不做CRC校验了。

网上有人说发太快了127.0.0.1也会丢包,丢包没关系,我们的数据就单包的,不需要连接组合,丢掉就算了当他没发,问题是会不会错包。

CRC校验毕竟有一定开销,很想节省一次
...全文
1315 22 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaopoy 2011-08-25
  • 打赏
  • 举报
回复
好伙计,持续的死循环了几天之后,你的内存里面某个变量会突然变成另一个值吗?

127.0.0.1根本不经过网络的,用抓包工具也是抓不到127.0.0.1的包的,因为没有经过发送的过程,直接送到本机处理收到的包的过程了。
luciferisnotsatan 2011-08-24
  • 打赏
  • 举报
回复
本机,基本可以不用。
如果硬要说出问题,内存还可能出硬件故障,某比特位原本是0,自己突然变1了。只不过几率基本为0.但放卫星上,就可能发生了。
zhang_xm001 2011-08-24
  • 打赏
  • 举报
回复
路过咯!
jernymy 2011-08-24
  • 打赏
  • 举报
回复
之前实现过一个wireshark抓去环回包,一台电脑调试Client/Server很方便。
jernymy 2011-08-24
  • 打赏
  • 举报
回复
楼主的127.0.0.1相互发送和接收是不走物理网卡的

windows上的是微软的环回网卡
linux 上的是lo - Link encap:Local Loopback

没有做太深的研究,不过觉得数据不通过物理层的传输,这样速度快于,物理网卡的传输,同时数据被中间传递过程少了几步,数据会完整。

那么我可不可以在后端的“处理进程”不做CRC校验了?
个人认为,丢包会有,乱序会有,但是数据到对端可以不用做crc校验的。
jackyjkchen 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 hnwyllmm 的回复:]

不仅丢,而且乱序,感觉很严重,以前做文件传送的时候发现的
[/Quote]
丢和乱序都不要紧,不错就可以
羽飞 2011-08-24
  • 打赏
  • 举报
回复
不仅丢,而且乱序,感觉很严重,以前做文件传送的时候发现的
hacqing 2011-08-24
  • 打赏
  • 举报
回复

UDP走LOOP接口过程:
1.USER空间数据复制到KERNEL
2.UDP层: 数据+UDP头给IP层
3.IP层: UDP数据+IP头给IP输出函数扔给LOOP驱动
4.LOOP驱动又传回来到应用程序.

如此多的过程涉及的不单单有: 信号, 信号量, 消息队列. 如果网络负载大, LOOP口的数据很可能被淹没.

LZ的要求完全可以通过:信号, 信号量, 消息队列来协助完成哈.
qq120848369 2011-08-24
  • 打赏
  • 举报
回复
外部要不要CRC不知道,那是server方面的问题。

但一旦走内网或者单机,不需要做什么特殊处理,直接送就行了。
至善者善之敌 2011-08-24
  • 打赏
  • 举报
回复
CRC就是保证你出错的话有通知机制,可以丢包或重发!如果这都不需要,那可以去掉了
ctreewang 2011-08-24
  • 打赏
  • 举报
回复
求楼主一样的工作~
ringer564597 2011-08-24
  • 打赏
  • 举报
回复
这可未必,如果是大型数据库要进行数据挖掘而传来的数据。。
[Quote=引用 9 楼 babilife 的回复:]
CRC校验的开销能有多大,这也要省?
[/Quote]
jackyjkchen 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 babilife 的回复:]

CRC校验的开销能有多大,这也要省?
[/Quote]
CRC的单线程速率大概在600MB/s,确实不低,但我不想写没有作用的代码,如果本机udp不错包,何必要用crc
至善者善之敌 2011-08-24
  • 打赏
  • 举报
回复
CRC校验的开销能有多大,这也要省?
ringer564597 2011-08-24
  • 打赏
  • 举报
回复
如果是软件要在本机上测试,可以不用校验,
如果CRC算法写得好的话,基本都是位运算,想节省开销,可以用混合编程,__asm,你懂的。
ringer564597 2011-08-24
  • 打赏
  • 举报
回复
软件实现,不会有错。
jackyjkchen 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ouyh12345 的回复:]

复杂的电磁环境下,只要有交换,就可能会2个包不同
[/Quote]
127.0.0.1完全走的软件,不走任何物理通信线路,电磁环境会有影响么?
jackyjkchen 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 0153 的回复:]

发送的SOCKET用socket(PF_INET,SOCK_RAW,IPPROTO_RAW)创建,发送时自己构建IP和UDP头,把其中UDP头的校验置0,这样收到时应该不会再校验了。
[/Quote]

不是UDP本身的校验的问题,因为他那个是奇偶校验,我有强度更大的CRC,他自己是否校验我都不能信任
jackyjkchen 2011-08-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 ouyh12345 的回复:]

本机,直接用共享内存
[/Quote]
socket的架构通信效率稍低,但通信的瓶颈在对外的socket,内部使用socket并不会明显降低效率

考虑socket比较通用,所以现在是这个架构

不太想用共享内存,维护比较麻烦,而且内容一旦发生破坏,多个进程都受影响

如果有UDP socket这样的发包式或队列式进程间通信,推荐一下,但不要广播的那种,我不同的包是要进不同的处理进程的
0153 2011-08-24
  • 打赏
  • 举报
回复
发送的SOCKET用socket(PF_INET,SOCK_RAW,IPPROTO_RAW)创建,发送时自己构建IP和UDP头,把其中UDP头的校验置0,这样收到时应该不会再校验了。
加载更多回复(2)

70,027

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧