推 shipship:你猜對了...MSN應該是用你這種方式 07/23 16:01
※ 引述《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