找回密码
 加入怎通
查看: 625|回复: 6

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

[复制链接]
Q18310195 发表于 2013-01-06 15:56:33 | 显示全部楼层 |阅读模式
TCP/IP是可靠性传输协议,它能保证数据能按顺序的方式到达目的地.看到以上描述在写TCP/IP应用的时候似乎就可以放心了,只要程序不出意外就数据输传就是正确.但最近在做一个文件传输工作的时候确得到的结果并不是这样,发现网络环境和一次发送数据大会影响整个输传结果.以下是这两晚的测试情况
8 P' H+ k3 c8 I: @( G1 u& y) t% {  r" Y  M& f" ?; B* h- L: M. I
  测试内容描述:
4 s6 g' q' f! o) H! _
  b/ o/ P; G7 A6 J  每个文件块信息包大概是120k左右
, g& |/ ^5 U5 m8 `/ c  @# k! C3 h" H
5 x- c* _) e* E1 H2 C) s  采用异步5连接输传,双方的Socket.SendBufferSize和Socket.ReceiveBufferSize都设置为64K  _* a$ K* R) g9 ]* ~

- k% k( {. D3 ^  测试服务器分别有:
, L$ @0 h, l7 Y& l3 K3 Y% ?* Q" w9 A' K7 l' z7 R
  局域网:ServerA
6 S9 b, V. Y% O6 z" F/ S1 i. M& c
0 \5 U9 t% \% Z7 P  在美国机房:ServerB 延时高,Ping有时会超时: v* q8 |$ T- g4 N- U: O+ _. e

4 }. ?7 \# z: o( d4 F' V  测试client一台,通过ADSL上网.
; L/ E$ ~$ [# u! `; J$ n4 F% S4 H& t- W- O$ U2 g8 k
  以下是Client从Sever下载文件的情况:
; h% G) ]) w1 L: D# D& R) |& _! ?2 N
  服务器8K SendBuffer,客户端是8K ReceiveBuffer
0 o! ]. S2 q6 V, @: c0 h! u+ A
! v( g) J1 s' R, m, E/ K  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.9 b. c5 E  s% G; W
( ~" K, C7 G2 n
  从ServerB下载文件,分别下载多个文件,几M或更小的文件有部分正确,大文件基本都是错误.两端记录的发送的字节数和接收的字节相等,符合文件大小,程序也没有跟踪到数据接收异常导致的协议分解错误.
9 o" X" I( i9 Z
6 V3 \4 Z$ Q' y7 H) D' J  服务器4K SendBuffer,客户端8K ReceiveBuffer. }) X( D# S* l1 J. z$ T
" Q  }1 V2 M+ w5 j+ r0 R
  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.
0 O# k* D, f9 y5 I4 B" G: r
* L  @$ y% B; {9 R  从ServerB下载文件,分别下载多个文件,文件的正确率比较高,不过还是大文件相对错误比较多.当开启迅雷下载后情况就开始变坏,大部分接收到的文件都出问题,两端记录的发送的字节数和接收的字节相等,符合文件大小,程序也没有跟踪到数据接收异常导致的协议分解错误% R' p+ L# f7 C/ E8 G: _- U
5 E# y+ n- j2 E
  服务器2K SendBuffer,客户端8K ReceiveBuffer
& K' P2 \$ ^/ m" j" P
9 F, ^7 K' n) p% C" e( y  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.
/ N7 X1 M$ |5 v& }3 e0 V1 J) L6 K$ \! i! r' @: U, |+ {; n
  从ServerB下载文件,分别下载多个文件,下载结果没有发现错误文件.当开启迅雷下载后还是有个别文件错误,两端记录的发送的字节数和接收的字节相等,符合文件大小,程序也没有跟踪到数据接收异常导致的协议分解错误
- B- e- E% ^$ F1 ]; K+ v0 I2 ]% u4 W
  服务器1K SendBuffer,客户端8K ReceiveBuffer2 {% V$ Y& f% c9 Q3 w" M

) ]5 r0 v/ ~/ {' w2 C  从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.7 ]4 j2 Q' o0 I6 R, b: [

4 L) t$ a$ g' Q$ x4 B7 ?  从ServerB下载文件,分别下载多个文件,下载结果没有发现错误文件.当开启迅雷下载后没有发现文件错误.! e5 o2 t) @7 F  ~- D1 ~3 p0 v! ?' x
6 p7 o6 J  H1 ^" \3 Y
  测试文件发送到Server和下载的情况基本差不多,这说明了在网络不好的情况处理发送大数据包似首容易产生错误,但看TCP/IP协议讲解这情况似乎不存在,因为当一个发送数据超过某个值的时候,TCP会划分块进行传输并保证其顺序.但网络不好的情况测试结果接收的数据有错误,但处理的数据大小是正确的,也并没影响整个协议的分解.由于对CP/IP协议、低层和路由处理的不了解,暂没找到具体原因。。。不排除程序存在还没发现的错误,打算给发送的文件数据加上校验再测试一下看情况
- `, q6 }; l( g0 ~2 T' B" ~* l( A
* J4 V" f: }8 @* Z5 |0 a  补充一下. r- O' `7 h# \
5 V' P. z! T5 h6 R5 p+ U
  以上测试只修改了一个属性
( Y2 A- V  I7 M3 O; u
; M5 E+ g: h5 r& L1 p5 \& ~  TcpUtils.SendBufferLength = 1K,2K,4K,8K
6 m. d$ E+ S. b, i- B
: a. V9 b" A! A2 z: \) L1 x- q9 p9 r  但只有1K的测试结果奇怪地没出现文件错误,其了几中均出现仅仅是对ServerB,对ServerA来说没有出现,2K,4K也只是开启迅雷的时候错误情况多.
- o! N7 Z1 m# m; w, u湖盟云防火墙
+ q, Q0 Q; ]" P! X& `4 {/ w1 V# f7 z% z5 s$ {

暂时无法加载帖子列表

回复

使用道具 举报

夜已深 发表于 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 | 显示全部楼层
分析得很透彻,很多细节都说到点子上了~
回复

使用道具 举报

易报修管家 发表于 2026-10-24 15:05:36 | 显示全部楼层
内容很干货,没有多余的废话,值得反复看
回复

使用道具 举报

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

    本版积分规则

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

    GMT+8, 2026-10-27 01:04 , Processed in 0.036326 second(s), 26 queries , Gzip On.

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

    Powered by Discuz! X3.5

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