作者cole945 (躂躂..)
看板Visual_Basic
标题Re: [.NET] 网路即时更新
时间Wed Jul 23 01:57:23 2008
※ 引述《vn801368 (没钱了...衰)》之铭言:
: 可是TCP要一个一个建立连线 很费时
你可能被书上说的 "很费时" 吓到了,
为什麽 TCP 会很费时, 是来自於 TCP 在建立连线时的 3-way-handshake
3-way-handshake的流程是像这样子的..
A syn -> B A 想与 B连线, 送 syn 给B
B syn -> A B 收到後回一个 syn 给 A
A ack -> B A 收到 B的 syn後, 回 ack 给 B
简设你的 A 与 B 间的 ping 值是 200ms
整个 "建立" 连线的时间大约大约大约在 300ms
只有在这个时间点会比 UDP 多花时间.
会很费时吗? 其实也还好啦~
像 MSN 这类连线软体根本没有这种建立连线速度的需求..
: 万一要是其中一个一直连线失败就会等很久
: 还有如果需要通知的人数很多的话
: 就会要建立很多连线 费时又麻烦
: UDP虽然比较快 可是怕会掉包没收到
UDP 也是可以自己实作 可靠性 的机制,
如果一段时间内对方没回应 "已收到", 那就要重传.
TCP与UDP还有另一个差别是,
TCP才有连线的观念(connection-oriented)而UDP没有(connectionless)
所以你可以从一条固定的连线知道他是哪个user,
但在 UDP, 你每一次收到一个packet, 对你而言, 对方都一个client,
为了辨别client, client还需要多传输自己的ID,
server再根据ID来回应..
使用TCP或UDP对程式端的架构设计, 也会因此有很大的差别...
: 然後client端固定30秒去更新一次
: 可是这样程式负担很大
: 而且也没办法达到及时的效果....
这就有点像 polling 与 interrupt 间的决择是一样的..
一种就是client固定周期向server要新资料,
一种就是有新资料时, server主动传给 client..
在像你这样子的聊天程式, 个人会建议你用後者..
因为像 MSN 这类的聊天程式, 据wikipedia上说有 290百万人在使用..
如果全球每 30 秒去向 server 问一次资料,
这和 DDoS 攻击有什麽不一样?
你再仔细想想, 其实这些 24 小时挂在网路上的宅宅,
可能一天只有很密集的一两个小时有真的在聊天, 其他时段都是空闲的..
如果你检查周期太短=>server负担很重, 周期太长=>讯息太晚收到,聊天不顺畅
所以有新讯息时, 再由 server 主动传给你, 应该会是较佳的设计..
而且你的 client 也不用另外开一个 thread 来固定时间检查+处理同步问题~
想一想, 好像也比较好撰写?
当然在像 MSN Messenger 这类有百万user在线上的服务
会有更复杂的机制来简轻 sever的负担 ..
server可以被设计成, 用来提供你某个user所在的ip
如果某个user换了ip(或上线)或下线, 则由server主动告知你,
你取得 对方的ip後, 再直接与他建立点对点的连线,
这样也是另一种可行的设计方案..
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 211.74.113.211
1F:推 shipship:你猜对了...MSN应该是用你这种方式 07/23 16:01