如何解决粘包问题?(200分)

  • 主题发起人 主题发起人 Pantheon
  • 开始时间 开始时间
P

Pantheon

Unregistered / Unconfirmed
GUEST, unregistred user!
最近我在写WINSOCK通信程序时,发现WINSOCK有时会将
几个数据包粘在一起,这与平时我们常见的WINSOCK将包
切碎传输正好相反。
好象在UNIX下没有这种问题。
各位大下请提提高见。
 
这不是WinSocket的问题,本来TCP传输数据的时候就不保证
包的边界的,只是保证字节流,拆包和拼包都是有可能的。
Unix下面一样有可能会出现这种问题,除非某种实现的不好
的系统才不做传输方面的优化
 
可是,Unix下好像没这种现象,而且,Sock
已经不是传输层了,它是在TCP之上的,
TCP中出现这种现象倒还可以理解.
前几天我在一本杂志上看到了解决算法,但不理想,
而且繁琐.我想要知道,有没有办法在配置WinSock时,设置某
个参数尽量抑制粘包.
 
1)Socket实际上是一个接口,支持连接的TCP,也支持非连接的UDP
2)分段可能发生的地方:
A:主机把从运输层交下来的数据报文交给网络层处理时,因为有
网络层最大数据报的限制,可能会分段,为处理"糊涂窗口综合症(老是发短报文,
释放小缓冲区造成滑窗协议退变为停等协议)",而把多个小报文合成为一个
较大的报文.为提高信道利用率,也会把小的报文合成一个大的报文.
B:从网络层交下来的数据报文交链路层处理时,同样会有在不同的子网里,相临的
节点机之间通信有最大帧限制,报文可能会分段,有的通信系统会在通信子网的源
节点(和源主机连)和目标节点(和目标主机连)之间把分段再重组,有的不会,而是
要求主机自己去完成,你可以看一看帧的结构,其中有字节表示,这一帧是否是被
分解的,是分解后的第几段等.和块的出现同上.
3)用socket不应该和平台有关,它是被标准化的.
只是个人看法.
 
昨天翻阅了电脑报,发现14期,15业讲到注册表里有
maxmtu的选项,即最大的数据包.
 
多人接受答案了。
 
后退
顶部