TCP/IP是可靠性传输协议,它能保证数据能按顺序的方式到达目的地.看到以上描述在写TCP/IP应用的时候似乎就可以放心了,只要程序不出意外就数据输传就是正确.但最近在做一个文件传输工作的时候确得到的结果并不是这样,发现网络环境和一次发送数据大会影响整个输传结果.以下是这两晚的测试情况# ]$ o4 E0 u' E
) s7 Q) Y/ p* o) z7 z 测试内容描述:
7 d% l+ D `( G' z1 K! P- B9 C2 K( K% [( X
每个文件块信息包大概是120k左右6 Y" A( G: \- O3 F' d h0 r$ o
1 Y4 ~- ?' i2 ~4 q$ ~ 采用异步5连接输传,双方的Socket.SendBufferSize和Socket.ReceiveBufferSize都设置为64K
2 p' f! T3 x: w; R0 v! D9 n$ w. @8 k ~; C: G
测试服务器分别有:
; V0 W. ~2 k/ ]
+ }& u/ e$ Q( a _ 局域网:ServerA Q+ g9 E1 [/ {6 s7 b
. F# p; U2 Q1 c8 K7 S
在美国机房:ServerB 延时高,Ping有时会超时6 K4 L6 _; E! z4 j! \4 v3 \9 m1 |
$ E- N: N2 S0 `" [# I0 r# `$ `8 c 测试client一台,通过ADSL上网.
$ i7 j' U2 j% k5 W+ z1 ~
8 i. u3 m0 M2 F& W# z& p 以下是Client从Sever下载文件的情况:
* g9 V6 p7 K( `4 W; x5 o1 Q5 ]. w R3 r
服务器8K SendBuffer,客户端是8K ReceiveBuffer2 @' A: z3 {2 J) I% ]- H
6 Q4 b/ V' m+ H' g
从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.
) J# R+ P- Y/ x( V! i7 I! [9 @2 X7 h7 v9 J8 j/ b( l
从ServerB下载文件,分别下载多个文件,几M或更小的文件有部分正确,大文件基本都是错误.两端记录的发送的字节数和接收的字节相等,符合文件大小,程序也没有跟踪到数据接收异常导致的协议分解错误.
5 O ~+ c0 ^- |- [" B4 ^2 F$ Q
* A6 s) h: b9 B& H$ j" B1 O# m% { 服务器4K SendBuffer,客户端8K ReceiveBuffer V6 U7 ]! P+ {! q% u; m( J4 W' R
2 G) q; O% q* |- n7 _7 |- m3 d 从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.4 n8 ^4 z) J. }8 m: m
8 c g' n+ T+ k: I" m) P: ]* G 从ServerB下载文件,分别下载多个文件,文件的正确率比较高,不过还是大文件相对错误比较多.当开启迅雷下载后情况就开始变坏,大部分接收到的文件都出问题,两端记录的发送的字节数和接收的字节相等,符合文件大小,程序也没有跟踪到数据接收异常导致的协议分解错误$ C4 _3 [, K$ Z" j9 n& j
. @" ?+ @* i8 r- a8 z
服务器2K SendBuffer,客户端8K ReceiveBuffer
/ E/ L! V' X4 w
1 N5 L" [6 j. K7 @- N 从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.
6 ?4 c# c/ v; k
% o/ _) A4 G- s3 M. i! Y 从ServerB下载文件,分别下载多个文件,下载结果没有发现错误文件.当开启迅雷下载后还是有个别文件错误,两端记录的发送的字节数和接收的字节相等,符合文件大小,程序也没有跟踪到数据接收异常导致的协议分解错误& W9 o' e8 v5 P% F) S; R, O
# S% C2 O4 \% t 服务器1K SendBuffer,客户端8K ReceiveBuffer
+ R# B( q* {& r+ H! \& P3 e* b0 E' m& L$ P; k! e
从ServerA下载文件,分别下载多个文件几M到几百M不等,下载后文件正确.2 i# ~) e% u# d0 n5 b
; }4 c4 q; ^, C0 I3 u# G
从ServerB下载文件,分别下载多个文件,下载结果没有发现错误文件.当开启迅雷下载后没有发现文件错误.- s+ W7 E$ B& I+ I
+ p# l2 G6 K/ X0 T; o: N
测试文件发送到Server和下载的情况基本差不多,这说明了在网络不好的情况处理发送大数据包似首容易产生错误,但看TCP/IP协议讲解这情况似乎不存在,因为当一个发送数据超过某个值的时候,TCP会划分块进行传输并保证其顺序.但网络不好的情况测试结果接收的数据有错误,但处理的数据大小是正确的,也并没影响整个协议的分解.由于对CP/IP协议、低层和路由处理的不了解,暂没找到具体原因。。。不排除程序存在还没发现的错误,打算给发送的文件数据加上校验再测试一下看情况3 @0 t0 {+ N) m+ d
! r; \; s3 T6 ^, L) w k 补充一下
) r" h8 ], J: J) ^/ X
( p6 T# e0 K! e8 |% l: ]% C 以上测试只修改了一个属性7 t, G6 W! D8 L% {9 E
* g' k6 a! S C M- c' C TcpUtils.SendBufferLength = 1K,2K,4K,8K1 c" K2 U8 P" ]: u, |% ?1 n
# ?4 R! @) @. R5 A5 `- R1 I% L3 z9 ]9 z 但只有1K的测试结果奇怪地没出现文件错误,其了几中均出现仅仅是对ServerB,对ServerA来说没有出现,2K,4K也只是开启迅雷的时候错误情况多.
; l1 q3 P5 B+ i+ j& W+ ]湖盟云防火墙
, M# U/ l+ A. Z
: O7 j8 A6 K9 d3 C( k |