目前辭職在家,疫情期間也找不到工作,正好看到了一本書《3d網路遊戲實戰》,趁機學習一下網路知識,希望在此期間能找個遊戲公司收留我qaq。
先說網路遊戲大多是基於tcp/ip協議的bs(客戶端–伺服器)結構,客戶端執行在使用者的電腦或手機上,服務端執行在遊戲運營商的伺服器上,如圖:
在實現網路傳輸時,人們把通訊問題劃分成了多個小問題,為每個小問題設計類乙個單獨的協議,制定了開放系統互聯的七層參考模型:
其中應用層、表示層和會話層統稱為應用層,沒有很明確的界定,一般由程式開發者實現。傳輸層、網路層、資料鏈路層和物理層為底層,由作業系統提供。
下面以向客戶端傳送「hello「為例,說明過程。
例子
應用層:
使用者把字串「hello」轉換成二進位制流傳遞給傳輸層。
傳輸層:
資料傳輸。
網路層:
對傳輸的訊息新增資訊(指定目的、拆分等)
資料鏈路層:
傳輸中若發生差錯,為了達成只將有錯的資料進行重發,資料鏈路層將位元流組合成幀,然後以幀為單位進行傳送。所以在這一層會拆分資料或者新增一些額外的資料保證傳輸。
物理層:
資料通過物理介質進行傳輸的過程(電纜、光纖等),這些資料通過物理介質傳輸到目的地,目的地再依照與上述相反的過程進行解析,得到「hello」。
ip:網路上的計算機都是通過ip位址進行識別的。
埠:是裝置與外界通訊交流的出口,每台計算機可以分配0-65535個埠。其中0-1023號埠成為眾所周知的埠號,他們被分配黑一些固定的服務。
c#中的相關型別
c#的system.net命名空間中提供了ip和埠相關的類。
tcp是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議,
而與之對應的udp協議則是無連線的、不可靠的協議,但是傳輸效率比tcp高。
tcp連線的建立(三次握手)
tcp是面向連線的,無論哪一方在向另一方傳送資料前,都必須在雙方之間建立一條連線。在tcp/ip協議中,tcp協議提供可靠的連線服務,鏈結是通過三次握手進行初始化的。三次握手的目的是同步連線雙方的序列號和確認號,並交換tcp視窗大小的資訊。
三次握手流程舉例:
加入三個軍隊,a、b、c,a和b單獨一方都不可能打掉c,所以兩個決定合作,怎麼能確定什麼時候一起進攻呢:
1.a派人去告訴b今夜子時發動總攻,但是a派的人可能中途夭折,所以a只有確認了b收到訊息後才敢發動總攻,所以要等待b的回音(如果等待時間過長則在派出乙個,多次嘗試後才放棄)
2.b收到了a的訊息,b會派人回應a,但是b也面臨a一樣的擔憂,所以也得在等a回音。
3.a收到了b的回應,確認訊息。這時在派出人回應b。
4.b收到了回應,也確定了a收到了他們的回應,這裡即完成了通訊,可以發起總攻。
tcp連線的終止(四次揮手)
客戶端和伺服器通過三次握手建立了連線以後,等待資料傳輸完畢,便要斷開連線。與三次握手相似,需要通過四次揮手來確保斷開連線。
第一次揮手:主機1(可以使客戶端也可以是伺服器)向主機2傳送乙個終止訊號(fin),此時主機1進入fin_wait_1狀態,他沒有需要傳送的資料,只需要等待主機2的回應。
第二次揮手:主機2收到了主機1發的fin訊號,向主機1回應乙個ack。收到ack的主機1進入fin_wait_2狀態。
第三次揮手:在主機2把所有資料傳送完畢之後,主機2向主機1傳送終止訊號(fin),請求關閉連線。
第四次揮手:主機1收到主機2傳送的終止訊號(fin),向主機2回應ack,然後主機1進入time_wait狀態(等待一段時間,以便處理主機2的重發資料)。主機2收到主機1的回應後,關閉連線。四次揮手完成。
套接字是支援tcp/ip協議網路通訊的基本操作單元,可以將套接字看做不用主機間的程序雙向通訊的端點,
它構成了單個主機內及整個網路間的程式設計介面。
socket連線的流程
1.開啟乙個連線之前,需要先完成socket(新建乙個套接字)和bind(指定套接字的ip和埠)兩個步驟(客戶端在呼叫connect時會由系統分配埠,因此可省去bind)。
2.服務端通過listen開啟監聽,等待客戶端接入。
3.客戶端通過connect連線伺服器,服務端通過accept接收客戶端連線,三次握手就是在這期間完成。
4.客戶端和服務端通過write和read傳送和接收資料,作業系統將會完成tcp資料的確認、重發等步驟。
5.通過close關閉連線,這裡完成四次揮手操作。
socket類
system.net.sockets命名空間的socket為網路通訊提供了一套豐富的方法和屬性。這個大家去官方看下api吧(畢竟每個版本不一定一樣),這裡就不多說了。
下一章會開始著手做乙個簡單的網路程式。
python學習 網路程式設計(一)
udp的接收和傳送資料 udp的傳送資料 如下 import socket def main 建立套接字 udp socket socket.socket socket.af inet,socket.sock dgram 傳送資料 send data input 請輸入您要傳送的資訊 udp ip ...
深度學習網路學習筆記(一)
定義 全連線層 fc 在整個卷積神經網路中起到 分類器 的作用。如果說卷積層 池化層和啟用函式層等操作是將原始資料對映到隱層特徵空間的話,全連線層則起到將學到的 分布式特徵表示 對映到樣本標記空間的作用。在實際使用中,全連線層可由卷積操作實現 對前層是全連線的全連線層可以轉化為卷積核為11的卷積 而...
《3D山地賽車》遊戲 網路部分 一
3d山地賽車 遊戲 網路部分 一 1 前言 3d山地賽車 專案從6月12日做到7月7日,花了3週多的時間。其中網路部分的實現就花了一周多,將近2周。所以關於其中網路部分,我想寫寫我的一點心得。3d山地賽車 專案要求裡有個optional要求是實現聯機。雖然這是乙個可選項,做不做影響不大,但是我想做出...