Flighting遊戲服務器:關於TCP和UDP

一、前言

思考了兩天怎麼去做遊戲的服務器,不得不承認自己真的是想得太多了,什麼高併發低延遲之類的,導致盲目地看libevent(異步處理)這些高深的東西。其實這些可能以後是不得不考慮,但現在最重要還是先把簡單的功能實現吧。


二、學習到的知識

1.TCP VS UDP

TCP:面向連接,可靠,保證順序,慢,有延遲
     TCP每次發送一個數據包後都要等待接收方發送一個應答信息,這樣TCP纔可以確認數據包通過因特網完整地送到了接收方。如果在一段時間內TCP沒有收到接收方的應答,他就會停止發送新的數據包,轉而去重新發送沒有收到應答2的數據包,並且持續這種發送狀態知道收到接收方的應答。所以這會造成網絡數據傳輸的延遲,若網絡情況不好,發送方會等待相當長一段時間


UDP:無連接,不可靠,不保證順序,快

1.TCP 優點:保證數據傳輸的包的順序,數據傳輸的正確性。

      缺點:一旦發生丟包,會有阻塞,會有額外的操作,導致非常大的延遲。

      使用場景:1.對數據的正確性(順序、完整)高

       2.當數據發生丟包造成很大的延遲的時候,有一定的處理(客戶端預測、客戶端播放動畫等)

2.UDP 優點:數據傳輸速度快,扔幾個數據包過去就算了

      缺點:不保證安全性,丟包或者包的順序亂了的時候沒有處理

      使用場景:1.對包的正確性要求不高(大不了可以重發)

       2.客戶端不能進行預測,即不能 不等服務器就自己處理。



2.長連接 vs 短連接

長連接指在一個TCP連接上可以連續發送多個數據包,在TCP連接保持期間,如果沒有數據包發送,需要雙方發檢測包以維持此連接,一般需要自己做在線維
    連接→數據傳輸→保持連接(心跳)→數據傳輸→保持連接(心跳)→……→關閉連接


短連接:指通信雙方有數據交互時,就建立一個TCP連接,數據發送完成後,則斷開此TCP連接,如Http
    連接→數據傳輸→關閉連接


3.關於同步/異步/阻塞/非阻塞/IO

IO分兩個階段:
1.通知內核準備數據。2.數據從內核緩衝區拷貝到應用緩衝區

根據這2點IO類型可以分成:
    1.阻塞IO,在兩個階段上面都是阻塞的。
    2.非阻塞IO,在第1階段,程序不斷的輪詢直到數據準備好,第2階段還是阻塞的
    3.IO複用,在第1階段,當一個或者多個IO準備就緒時,通知程序,第2階段還是阻塞的,在第1階段還是輪詢實現的,只是所有的IO都集中在一個地方,這個地方進行輪詢
    4.信號IO,當數據準備完畢的時候,信號通知程序數據準備完畢,第2階段阻塞
    5.異步IO,1,2都不阻塞







   
同時阻塞多個I/O操作。而且可以同時對多個讀操作,多個寫操作的I/O函數進行檢測,直到有數據可讀或可寫時,才真正調用I/O操作函數
Java#Selector

   

允許套接口進行信號驅動I/O,並安裝一個信號處理函數,進程繼續運行並不阻塞。當數據準備好時,進程會收到一個SIGIO信號,可以在信號處理函數中調用I/O操作函數處理數據.



PS.以上摘自《MMORPG服務器架構


三.我的決定

現階段對於戰鬥場景的服務器方面可以採用UDP,而其餘基本功能的可以採用異步的TCP boost::asio



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章