看板 Visual_Basic 關於我們 聯絡資訊
※ 引述《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
shipship:你猜對了...MSN應該是用你這種方式 07/23 16:01