找回密码
 加入怎通
查看: 603|回复: 5

[关于百度] 解决C# Socket发送数据大小而影响整个传输的问题

[复制链接]
Q18310195 发表于 2013-01-06 15:56:33 | 显示全部楼层 |阅读模式
TCP/IP是可靠性传输协议,它能保证数据能按顺序的方式到达目的地.看到以上描述在写TCP/IP应用的时候似乎就可以放心了,只要程序不出意外就数据输传就是正确.但最近在做一个文件传输工作的时候确得到的结果并不是这样,发现网络环境和一次发送数据大会影响整个输传结果.以下是这两晚的测试情况
# j5 I3 N; v* D( i0 C. v6 @) z* B, o/ R% t9 o
  测试内容描述:
' B' ?: e% m) I1 R+ C& W
$ b7 ]7 B8 N4 J+ P1 ^  每个文件块信息包大概是120k左右% y7 M6 [0 V6 l; z$ W" l/ z, M
& c7 x* Y( v8 z
  采用异步5连接输传,双方的Socket.SendBufferSize和Socket.ReceiveBufferSize都设置为64K; S3 N, e' J- f$ @# s! B
2 y6 V8 \; y4 s( Y2 s- E/ E
  测试服务器分别有:0 Z. `3 t& l9 a: H/ C9 _
( _7 N" T2 d( U( R( ?
  局域网:ServerA* e* A! P$ D8 p4 Z

9 R* u5 o7 J9 m! {  在美国机房:ServerB 延时高,Ping有时会超时6 g2 U) Z: n2 L/ b) B

: m+ B1 h7 K/ g  测试client一台,通过ADSL上网.
3 R/ R7 m: m  j* p$ E
3 g+ L: b, I" b! A7 [6 t, O  以下是Client从Sever下载文件的情况:
$ ?* }0 P, V2 \/ z5 E6 a& ^# g7 u" P
  服务器8K SendBuffer,客户端是8K ReceiveBuffer' b. ]' j2 `" M3 D2 f) A1 ~3 p

; Z( z+ r& a3 d  t  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.% V% G* x) N. A5 r6 F
' P, k% @7 L5 v
  从ServerB下载文件,分别下载多个文件,几M或更小的文件有部分正确,大文件基本都是错误.两端记录的发送的字节数和接收的字节相等,符合文件大小,程序也没有跟踪到数据接收异常导致的协议分解错误.4 G- n& u: N/ y: b5 B7 U$ s

! W4 F: y. ?9 Y/ ]: `/ s  服务器4K SendBuffer,客户端8K ReceiveBuffer
' S) `- q# E. W0 \5 Y4 E5 I2 g  h
  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.
. V- K/ U' P* A$ i5 G1 O; J8 i- D; m
$ P! }8 Z5 e; k( W& w+ p6 P( e  从ServerB下载文件,分别下载多个文件,文件的正确率比较高,不过还是大文件相对错误比较多.当开启迅雷下载后情况就开始变坏,大部分接收到的文件都出问题,两端记录的发送的字节数和接收的字节相等,符合文件大小,程序也没有跟踪到数据接收异常导致的协议分解错误
, s/ M2 ]: \& M4 E" j8 R' I. b
- ?6 E# I5 ~& A" ~1 \  服务器2K SendBuffer,客户端8K ReceiveBuffer2 M4 I- o) a) s

% R+ T* O$ ~5 i: a: Z, s* S  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.5 t7 ]2 F2 i# w4 U* d5 P  Y

9 H  t, w% F  N+ v  从ServerB下载文件,分别下载多个文件,下载结果没有发现错误文件.当开启迅雷下载后还是有个别文件错误,两端记录的发送的字节数和接收的字节相等,符合文件大小,程序也没有跟踪到数据接收异常导致的协议分解错误
. |  ^6 E  l# y8 i2 N' G& b7 A
8 v; V5 |8 W" W  服务器1K SendBuffer,客户端8K ReceiveBuffer
' g/ K. u  |+ q+ Q/ U  ~9 d: B% W2 r! a& i6 e* D
  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.
% c& r3 U4 X2 |4 ~; D+ @5 u& u  t
/ g. F$ m  P5 H! u# _8 P) t  从ServerB下载文件,分别下载多个文件,下载结果没有发现错误文件.当开启迅雷下载后没有发现文件错误.
8 h4 c- a: |2 _$ M  `# o: R/ S1 d% d, w% S' u2 U2 v+ z
  测试文件发送到Server和下载的情况基本差不多,这说明了在网络不好的情况处理发送大数据包似首容易产生错误,但看TCP/IP协议讲解这情况似乎不存在,因为当一个发送数据超过某个值的时候,TCP会划分块进行传输并保证其顺序.但网络不好的情况测试结果接收的数据有错误,但处理的数据大小是正确的,也并没影响整个协议的分解.由于对CP/IP协议、低层和路由处理的不了解,暂没找到具体原因。。。不排除程序存在还没发现的错误,打算给发送的文件数据加上校验再测试一下看情况' E$ H! Z5 H( F6 x3 B" a8 }" w! |

% Q+ @( W7 J7 M: `) w  补充一下
) [3 @/ a( q: ?" E& s2 J3 a+ V
: {: }5 ]' e4 p6 I" ?1 y/ H  以上测试只修改了一个属性; E# x* H9 W5 s  d) _& W3 s

5 M  _! R1 F( ~+ ?; S" T  TcpUtils.SendBufferLength = 1K,2K,4K,8K# D6 B6 x; `! \, a$ l+ ?% }7 o4 b1 V

2 [. [$ B4 K. H: P% ^* X/ b  但只有1K的测试结果奇怪地没出现文件错误,其了几中均出现仅仅是对ServerB,对ServerA来说没有出现,2K,4K也只是开启迅雷的时候错误情况多.5 d1 Q2 D/ q9 K, q& s7 I& t6 |
湖盟云防火墙
! g5 u2 F. I8 R& ?& J
" F! Q$ J& l7 w" x& l, v

暂时无法加载帖子列表

回复

使用道具 举报

夜已深 发表于 2026-03-13 13:24:56 | 显示全部楼层
楼主辛苦了,整理这么多内容,必须点赞收藏
回复

使用道具 举报

而tvs 发表于 2026-04-28 01:40:02 | 显示全部楼层
楼主太厉害了,整理得这么详细,必须支持
回复

使用道具 举报

DAIV 发表于 2026-07-23 05:49:28 | 显示全部楼层
这个思路很新颖,打开了新世界的大门,谢谢分享
回复

使用道具 举报

萌小妞。 发表于 2026-07-27 11:37:12 | 显示全部楼层
学习到了,之前一直没注意过这个点,受教了
回复

使用道具 举报

晓晓凯 发表于 2026-09-08 19:30:15 | 显示全部楼层
分析得很透彻,很多细节都说到点子上了~
回复

使用道具 举报

    您需要登录后才可以回帖 登录 | 加入怎通

    本版积分规则

    QQ|手机版|小黑屋|网站地图|真牛社区 ( 苏ICP备2023040716号-2 )

    GMT+8, 2026-9-12 09:28 , Processed in 0.047170 second(s), 26 queries , Gzip On.

    免责声明:本站信息来自互联网,本站不对其内容真实性负责,如有侵权等情况请联系420897364#qq.com(把#换成@)删除。

    Powered by Discuz! X3.5

    快速回复 返回顶部 返回列表