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 |