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$ {
|