本篇是原创, 有点长, 推荐有耐心的同学看完, 没有耐心的同学看一看粗体字和最后的结论就可以了.
: I; A, U0 z" f* s/ z* c( [& [. `* z0 y! d1 x
从最早的 XP SP2 引入, 到 Vista, 再到 Windows 7, 半开连接数限制已经为人所共知. 破解补丁层出不穷, 下载软件还纷纷附带, 装个迅雷都会自己蹦出来让你修改连接限制. 且不说大家是否真的理解这个限制的意义和影响, 但起码是个人都知道"刚装完的系统好像有个什么什么连接限制得破解一下". 但是, 真的是这样吗? 下面我们就从原理上来分析一下这个问题." w0 F+ i* s/ K0 C/ j$ d
- O$ Y- [0 J# a v! I0 h! z) m% g' N首先要明确这样一个概念, 什么是半开连接?) S' \8 U2 A3 ^ {- M7 [( U
9 h4 W5 T+ A2 P# M9 U: M: D& D我们网络传输广泛使用的 TCP 是一个面向连接的协议, 也就是说真正的数据传输开始前, 先需要连接(与之相对的, UDP 是无连接的协议, 传输数据前无需建立连接). 这个所谓的面向连接和无连接, 并不是字面上理解的那样, 好像无连接就是不插网线他也哗哗地往外发, 这个所谓的连接是建立在双方的网络能够互通的基础上的, 一个形象的比喻就是好像两个人打网球, 甲先跟乙说, 我要发球了, 乙说我准备好了, 你发吧, 然后甲把球发过去, 这个是所谓面向连接的情况. 而无连接是指在发球之前不打招呼, 直接就发. 当然了, 这两个人首先先得见着面, 到了网球场里面, 开始打网球了, 这才能讨论发球的问题.5 X$ \1 [5 v$ b; h4 `
. ~1 w6 g V+ Z+ s2 m
面向连接和无连接也是这样, 两个节点间的网络首先得是通的, 这才考虑面向连接和无连接. 无连接就很好理解了, 就是两个人网络是通的情况下, 直接发数据, 而没有打招呼的过程. 既然是无连接, 讨论什么连接数也就是没有意义的.0 f) r( c+ Q& Z3 p1 s; G
. [ R, q, w, S _, V
因此我们首先得出第一个重要结论: 对于无连接的协议, 讨论连接数是没有意义的.! J; c6 X) x* B* ]
) A4 a. d+ r! m4 B: \: S0 d: y6 B
而 UDP 就是这样的协议. 而 UDP 主要应用范围, 就是那些不需要可靠性的服务, 比如网络视频, 网络电话, 具体点的, 比如什么优酷啊土豆啊PPLive啊PPStream啊, 甚至连QQ的文件传输都是UDP. 另外一些BT软件也支持UDP传输. 对于这些服务, 根本就没有连接数这样一个概念, 当然也就更谈不上什么半开连接数了.
! K7 \7 F5 l+ v: s. q3 p
) L9 Y4 r$ J* W5 l; p再看看面向连接的协议 TCP 吧. 所谓的面向连接, 就是数据传输之前要建立连接, 说得直白一点就是要打招呼, 看看双方是否都准备好了, 一旦双方都确认对方准备好了, 也就是连接建立起来了, 这样才开始传输数据. TCP 就是这样面向连接的协议. 一些需要保证数据不会出错的服务, 比如看网页啊文件下载啊什么的, 包括MSN的文件传输, 用的都是 TCP.(当然面向连接只是TCP可靠性的一部分, 还要辅以分片序号啊校验啊等等, 但和本文主题没有太大关系, 因此略去不提) / }; h) G P; o1 }
7 B, c; ]& ~3 V! }8 p0 m, _+ L
举个具体的例子, 比如甲需要通过 TCP 传输来得到乙的某些数据, 那么最简单地说, 建立连接有三步:
; f c& b5 \2 Q! s: T8 e! n" W% |% L7 G. R2 R1 w
1. 甲先打开一个连接, 向乙发送一个同步请求, 并把自己的状态设置为"同步已发送", 并启动计时器, 准备如果在75秒后还没有收到回应时关闭这条连接
4 z2 @8 W8 T- m; Y* D) }( `! [* O7 D; n7 H
2. 乙收到同步请求, 向甲发送一个确认, 再附加向甲发送一个同步请求, 并把自己的状态设置为"同步已接收", 也启动75秒的计时器.
7 L! |2 H- V1 F9 m2 d" S# C/ W* K$ _' S% L7 S
3. 甲收到确认和乙发来的同步请求, 再向乙发送一个确认, 并把自己的状态设置为"连接已建立". 乙收到确认包后也把自己状态设置为"连接已建立".
% u4 \1 m. [7 }( I, B5 E3 L6 a4 O* o7 J8 Z
经过这三步, 连接建立起来后, 才可以开始传输数据. 用直白一点的话说, 就是甲先问乙准备好了没有, 乙说准备好了, 然后乙再问甲准备好了没有, 甲也说准备好了, 这样双方都确认对方准备好了, 这才开始传送数据.' k& E: _# g; I' r. a- t% ^
9 x5 t3 \1 e5 F, i/ Z而所谓的半开连接, 就是双方的状态处于"同步已发送"或"同步已接收"时, 这条连接才算作半开连接. 而一旦双方状态都变成"连接已建立"时, 这条连接就成为已建立的连接, 就不属于半开连接了.1 G, E5 F* a+ d( f& |
# q( ~: a, X% w2 `% l
明确了上面的概念, 我们再来看看从 Windows XP SP2 开始的大名鼎鼎的或者说臭名昭著的半开连接数限制吧. 系统把半开连接数限制为10条, 但这里要注意, 限制的是半开连接数, 而不是总的连接数. 已经建立的连接有多少条他都不管你, 他唯一关心的只是半开连接数. # L+ C4 d2 @7 a. h3 ~: j! p9 E+ o
0 c- j$ D+ Z7 _
这里得出第二个重要结论: 系统限制的不是最大并发连接数, 而是半开连接数, 对于已经建立的连接, 系统并不限制其数量.: y3 e6 [% s6 M: z; @+ `
4 b1 k+ W* q1 B% p而从上面的解释可以看到, 一条连接处于半开状态时, 是根本不传输数据的. 因此半开连接数限制到多少, 和数据传输的速度没有一丁点关系.# W. g7 K9 a$ ~( I! R
/ S) [; u& {! K4 n- x那么半开连接数限制对下载来说有什么影响呢? 再举一个形象的例子, 比如今天发售国债, 银行还没开门呢好多人就跟外边排着, 排了一大长队, 全是来买国债的, 然后到点银行开门了, 可是银行就三个柜台. 银行也想早点把这国债全卖出去, 要不全是来买国债的, 人家办别的业务的也不好办呀. 可是我三个柜台办事效率有限, 可能头好几十个人每个人就都只买一百块钱的, 直到后来好半天才终于赶上一个, 一下就买了好几万的. 可要是柜台多呢, 比如有10个柜台, 一下全开开, 那肯定卖得就快, 不一会就能卖完了., ?/ j$ s/ ?2 a" G
# s2 C0 v3 b- P0 a# ^
再回到半开连接数的问题, 也是这样的, 总的下载带宽是一定的, 这就好比银行手里的国债是有限的, 而半开连接数呢就相当于柜台窗口, 窗口要是少了呢, 卖得可能就就慢一些, 同样, 半开连接数要是少, 那么达到最大带宽所需要的时间就会慢一些, 说通俗点就是速度起来得可能就慢一些. 当然要是一上来就碰到个有钱的, 说今你们这有多少国债我全包圆了, 那当然一下就卖完了. 如果你下载的时候碰上一大水管, 一下就把你带宽给塞满了, 那当然你速度也就一下起来了. 但不管怎样, 国债总会卖完, 带宽同样也总会达到满速. 而对于一些冷门种子, 本来peer就少速度就慢, 就好像过时积压货, 本来愿意买的人就少, 柜台开得再多, 该卖不出去还是一样卖不出去.
1 l4 n9 L b! G! p
- v$ u# Q. k2 R4 T4 B1 v由此我们得出第三个重要结论: 半开连接数不决定速度的快慢, 只在一定程度上决定达到最高速度的时间长短.
1 b3 ?# A6 P$ ^! D3 ]# [
: Q+ Q$ S5 N/ A3 ?: R4 v( v' a那么限制半开连接数有什么意义呢? 还可以继续类比, 为什么银行不开100个窗口呢? 答案太显然了, 成本太高, 开不起. 半开连接也是一样, 每条连接都是要耗费系统资源的, 而所谓的 DoS 拒绝服务攻击, 还有冲击波和震荡波, 也正是用大量半开连接数来企图耗尽服务器或者电脑的资源. 因此半开连接数设得过大, 是有一定潜在危险性的.# I# k" k- V& F; M0 d4 V
/ c& o8 `* _$ U! m% ?
1 m- r- ^# ]! h) E
& P% s4 b* C4 w7 B$ o% u3 o C综合以上三个结论, 我们来看看把半开连接数改大能有什么影响: 首先, 对你看优酷看土豆看PPS等网络视频没有任何的改善, 打Skype也不会更流畅, 对于BT下载中的UDP连接也没有任何的影响; 另外, 本来速度就慢的, 半开连接数开得多速度也不会加快. 改大的唯一好处, 就是有可能会让你达到满速的速度更快一些, 而且还只是"有可能", 因为何时碰上大水管是一个随机问题.
8 |* b- o; K8 N" u- V$ N- k
1 g7 Q$ x- Q- r9 C, Q6 q至于安全性问题, 其实我们自己的电脑很少会遭到 DoS 攻击, 人家玩 DoS 攻击的也不会看上我们这种个人的小破电脑, 让我们这种档次的电脑死机了于他们也没有什么快感可言; 但是也确实不排除有还未发现的漏洞会导致某些病毒产生大量无用的半开连接, 而这其实也正是微软限制半开连接数的初衷.) p6 e; a3 w& t, t& T F" z
- j+ {' V1 `! A( f7 _; y* u综上所述, 我个人的观点是, 半开连接数改或不改其实无所谓, 并不像有些以讹传讹的说法那样"能够大幅提高下载速度". 我自己是没有改的, 我觉得10个半开连接够使. 如果改的话推荐也不要改得太多, 100个就足够了, 即使让5个BT种子同时开始下载恐怕也就将将用得了100个半开连接, 改得太多不仅没有意义, 反而会留下隐患. |