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

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

[复制链接]
Q18310195 发表于 2013-01-06 15:56:33 | 显示全部楼层 |阅读模式
TCP/IP是可靠性传输协议,它能保证数据能按顺序的方式到达目的地.看到以上描述在写TCP/IP应用的时候似乎就可以放心了,只要程序不出意外就数据输传就是正确.但最近在做一个文件传输工作的时候确得到的结果并不是这样,发现网络环境和一次发送数据大会影响整个输传结果.以下是这两晚的测试情况+ z7 s8 V6 h6 s" i1 u1 P- r

. p! E4 Z- o0 @0 m  测试内容描述:$ t+ u  V7 R/ z- A0 r0 F' o1 F
5 q4 z6 r) q! J$ q
  每个文件块信息包大概是120k左右
6 u  @: s0 V5 u5 U
: p5 ^/ ?- B8 S  采用异步5连接输传,双方的Socket.SendBufferSize和Socket.ReceiveBufferSize都设置为64K) ]1 R$ b# L/ z) G  r
2 m! g; o3 Q2 J1 n  e. f/ ?  m
  测试服务器分别有:
! S/ {& U" P  n
6 L6 [! S0 U4 I0 K/ d% X; L& J  局域网:ServerA
8 p* K2 M0 P! d4 j5 J
- p  ?9 u) O# u) M" u  K  在美国机房:ServerB 延时高,Ping有时会超时
5 I: o; @! ]5 z/ W+ Z9 j  y2 b
  M; ^" {2 ~/ \: w0 y% y  测试client一台,通过ADSL上网.5 u0 y# o3 F+ Y- r5 B/ l! t
0 o' x! c( Y6 f; C
  以下是Client从Sever下载文件的情况:1 r0 E" v$ S& e- g$ J2 z$ o
/ E, t, w' c  \: G* K/ R/ [0 A
  服务器8K SendBuffer,客户端是8K ReceiveBuffer
3 O% x# R. N& A0 }8 E; E6 }; v
) q+ t6 U) m7 [$ a( W6 h% c  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.
5 V( h# P+ C* f. y
7 c$ ^! D- c+ k4 E6 d/ [  从ServerB下载文件,分别下载多个文件,几M或更小的文件有部分正确,大文件基本都是错误.两端记录的发送的字节数和接收的字节相等,符合文件大小,程序也没有跟踪到数据接收异常导致的协议分解错误.
2 s& K6 _% j# Z2 X0 |
+ C) e( C0 o$ k4 H% I( U  x/ u9 l" ~, r  服务器4K SendBuffer,客户端8K ReceiveBuffer
; d0 G# ?* w$ j4 f$ t5 k
0 _9 O1 d. F* X# g3 d  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.0 E: O( ~2 E7 Y, s- @0 H

6 i& q5 `+ J/ t4 j7 |6 j  从ServerB下载文件,分别下载多个文件,文件的正确率比较高,不过还是大文件相对错误比较多.当开启迅雷下载后情况就开始变坏,大部分接收到的文件都出问题,两端记录的发送的字节数和接收的字节相等,符合文件大小,程序也没有跟踪到数据接收异常导致的协议分解错误. t8 l* A3 a, a: V/ t" s

7 p9 w* g  W( p; r& o  a5 p' _" g  服务器2K SendBuffer,客户端8K ReceiveBuffer9 T7 B4 e: l' `- O
. z( l/ @3 w$ J- x
  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.
# ~) Y& \* b; p: r% w+ Q
' k2 c, _, n( t6 f8 ~5 I1 X' ?5 J  从ServerB下载文件,分别下载多个文件,下载结果没有发现错误文件.当开启迅雷下载后还是有个别文件错误,两端记录的发送的字节数和接收的字节相等,符合文件大小,程序也没有跟踪到数据接收异常导致的协议分解错误+ s' P! m+ s" u

: G9 k: O" {9 {& o. E4 \% f1 t7 U  服务器1K SendBuffer,客户端8K ReceiveBuffer
1 H$ l2 x, Z7 G7 A; Z
, J  m4 l; k$ U  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.
6 N4 H& N/ E/ l# c! K6 l
2 d" g1 q& n- Y# U2 E  从ServerB下载文件,分别下载多个文件,下载结果没有发现错误文件.当开启迅雷下载后没有发现文件错误.
( `' q( }0 t. X6 _# ]  {: F
2 I1 Y" v6 Y+ {2 E6 e/ C7 \' y  测试文件发送到Server和下载的情况基本差不多,这说明了在网络不好的情况处理发送大数据包似首容易产生错误,但看TCP/IP协议讲解这情况似乎不存在,因为当一个发送数据超过某个值的时候,TCP会划分块进行传输并保证其顺序.但网络不好的情况测试结果接收的数据有错误,但处理的数据大小是正确的,也并没影响整个协议的分解.由于对CP/IP协议、低层和路由处理的不了解,暂没找到具体原因。。。不排除程序存在还没发现的错误,打算给发送的文件数据加上校验再测试一下看情况9 h2 |4 e$ X  W+ Y3 H

5 T" W  D- h7 q1 ^  \2 a# e4 Q  补充一下$ |+ ]) C6 n5 L9 {0 E. Z/ P
" M9 x6 C) d$ {! j3 E- M' J( E
  以上测试只修改了一个属性
) T6 R0 S: G; j( e) O! i# n( S
+ s. ~  n+ u  u; x( Q  TcpUtils.SendBufferLength = 1K,2K,4K,8K7 Y6 C' |# {: s5 |! X7 f: ?
/ o: l7 b' T+ u: U' C6 v
  但只有1K的测试结果奇怪地没出现文件错误,其了几中均出现仅仅是对ServerB,对ServerA来说没有出现,2K,4K也只是开启迅雷的时候错误情况多.1 b4 a5 o& d" j6 l" R5 Q8 @
湖盟云防火墙! Q) ]! |6 U& `$ Q% h7 M2 T$ |2 C* v

3 K2 o! ], s& E. K9 Z

暂时无法加载帖子列表

回复

使用道具 举报

夜已深 发表于 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-10 21:23 , Processed in 0.053927 second(s), 25 queries , Gzip On.

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

    Powered by Discuz! X3.5

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