关于游戏开发网络协议方面的一些杂谈

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位程序的。但是反过来的话是运行不了的。

 

重连相关的问题:

重连这一块是一个很大的坑,以后再谈。

 

 

展开阅读全文

没有更多推荐了,返回首页