關於遊戲開發網絡協議方面的一些雜談

ip地址子網掩碼

子網掩碼的主要作用有兩個:

一、用於屏蔽IP地址的一部分以區別網絡標識和主機標識,並說明該IP地址是在局域網上,還是在遠程網上。在設置電腦IP時,會碰到兩個重要的參數,一個是IP地址,一個是子網掩碼。IP地址是互聯網上每個子網或每個主機在網絡上的唯一身份標籤。

使用子網是爲了減少IP的浪費。因爲隨着互聯網的發展,越來越多的網絡產生,有的網絡多則幾百臺,有的只有區區幾臺,這樣就浪費了很多IP地址,所以要劃分子網。使用子網可以提高網絡應用的效率。

 

二、用於將一個大的IP網絡劃分爲若干小的子網絡。通過IP 地址的二進制與子網掩碼的二進制進行與運算,確定某個設備的網絡地址和主機號,網掩碼是一種用來指明一個IP地址所標示的主機處於哪個子網中。子網掩碼不能單獨存在,它必須結合IP地址一起使用。

子網掩碼的作用,就是將某個IP地址劃分成網絡地址和主機地址兩部分。也就是說通過子網掩碼分辨一個網絡的網絡部分和主機部分。子網掩碼一旦設置,網絡地址和主機地址就固定了。

子網一個最顯著的特徵就是具有子網掩碼。與IP地址相同,子網掩碼的長度也是32位,也可以使用十進制的形式。

 

來自:百度百科

 

 

 

Client端主動撥號會話

因爲如果你不主動請求會話的話,Server端根本不知道你在哪裏,所有的網絡連接都是客戶端向服務器端發送請求。

 

tcp四次揮手

tcp四次揮手,由於TCP連接是全雙工的,因此每個方向都必須單獨進行關閉。

由於TCP連接是全雙工的,因此每個方向都必須單獨進行關閉。這個原則是當一方完成它的數據發送任務後就能發送一個FIN來終止這個方向的連接。收到一個 FIN只意味着這一方向上沒有數據流動,一個TCP連接在收到一個FIN後仍能發送數據。首先進行關閉的一方將執行主動關閉,而另一方執行被動關閉。

(1)客戶端A發送一個FIN,用來關閉客戶A到服務器B的數據傳送(報文段4)。

(2)服務器B收到這個FIN,它發回一個ACK,確認序號爲收到的序號加1(報文段5)。和SYN一樣,一個FIN將佔用一個序號。

(3)服務器B關閉與客戶端A的連接,發送一個FIN給客戶端A(報文段6)。

(4)客戶端A發回ACK報文確認,並將確認序號設置爲收到序號加1(報文段7)

TCP採用四次揮手關閉連接如圖所示爲什麼建立連接協議是三次揮手,而關閉連接卻是四次握手呢?

這是因爲服務端的LISTEN狀態下的SOCKET當收到SYN報文的建連請求後,它可以把ACK和SYN(ACK起應答作用,而SYN起同步作用)放在一個報文裏來發送。但關閉連接時,當收到對方的FIN報文通知時,它僅僅表示對方沒有數據發送給你了;但未必你所有的數據都全部發送給對方了,所以你可以未必會馬上會關閉SOCKET,也即你可能還需要發送一些數據給對方之後,再發送FIN報文給對方來表示你同意現在可以關閉連接了,所以它這裏的ACK報文和FIN報文多數情況下都是分開發送的。

 

來自:百度百科

 

tcp和udp區別,各自的優點和缺點

以前只知道tcp穩定,面向連接。udp不穩定,面向數據報。

tcp最根本的區別在於傳輸數據的方式

tcp基於流的方式,需要建立連接,建立連接簡單地來說就是server端知道了你的ip地址和端口號。

假如你在高鐵上,你現在附近的網絡基站ip地址是xxx,你到了下個地方,基站換了,ip地址不一樣了,這下你就需要重新建立連接。

優點:面向流,可以保證傳輸的可靠性和有序性,但是如果中間一段丟失的話,可能就會一直卡住,等待server端發送接收信號。由於滑動窗口有限制(https://blog.csdn.net/yao5hed/article/details/81046945https://www.cnblogs.com/alifpga/p/7675850.html),所以發送的包體大小不定,會出現黏包和拆包,這需要在定製自己的數據報協議時解決,比如在包體的最前面設置一個固定字節大小的數據用來表示本次包體的長度。

udp基於數據報的方式,udp不會像tcp那樣一段一段的發送,然後等待上一次發送成功後發送下一段,udp是將幾個需要發送的包直接全部發布到網絡上,然後每個包走自己的傳輸路徑,可能相同可能不同,所以到達server端時,順序可能會被打斷。但是最重要的問題是使用udp時,包體會丟失,因爲沒有tcp那樣可靠,還有防火牆等等的原因,udp的坑很多。

關於項目的數據報怎麼去設計也是一個比較重要的問題。

 

關於json,xml,protobuf

這三個都是用來序列化文件和進行存儲或信息傳輸的。

三者大部分都一樣,json和xml是文本的形式,較大,更側重於結構化,信息表示的更直觀。

protobuf是二進制的形式,較小,更側重於傳輸,信息表示沒那麼直觀。

 

各種類型的大小

確定數據中各種數據類型也是很重要的,如果你用一個2字節就可以表示的信息,用了4字節。

假如一天的流量是100w次,那麼你就多傳輸了2 * 100w的字節,即浪費速度,也浪費空間。 

WIN32下:

sizeof(char):1

sizeof(short):2

sizeof(int):4

sizeof(long):4

sizeof(long long):8

sizeof(unsigned int):4

sizeof(float):4

sizeof(double):8

sizeof(pointer):4

 

x64下:

sizeof(char):1

sizeof(short):2

sizeof(int):4

sizeof(long):4

sizeof(long long):8

sizeof(unsigned int):4

sizeof(float):4

sizeof(double):8

sizeof(pointer):8

 

Int16, 等於short

Int32, 等於int

Int64, 等於long,

這些都與操作系統的位數有關

32位和64位系統在Windows下基本數據類型的大小都是一樣的。只有指針的大小不一樣!32位指針大小爲4byte,而64位的指針大小爲8byte。

Linux下,long型是64位的,這一點是和Windows不同的地方。64位系統下是可以運行32位程序的。但是反過來的話是運行不了的。

 

重連相關的問題:

重連這一塊是一個很大的坑,以後再談。

 

 

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