前言
开篇之前让我们先来一起回顾下关于网络通信的一些基础知识。
TCP/IP协议是什么
(transfer control protocol/internet protocol传输控制协议/网际协议)
我们先从宏观上来看两台机器是如何进行通信的:两台主机进行通信,需要知道双方电脑的地址,也就是IP地址,知道了地址之后,我们还需要知道发送到目的电脑的哪个软件,一般使用端口来标记。这样两台电脑连接成功之后就可以传递数据了。
关于目的地如何规定,要发送的数据如何包装,放到哪里等等这些问题,这中间就需要有各种协议,协议也是一种规范,使用该协议的人一起遵守这个规范,这样符合这种规范的各个设备之间就能够进行兼容性的通信了。
最为广泛的协议就是OSI协议和TCP/IP协议,但是因为OSI协议较为繁琐,并未受广大用户所喜爱,反而TCP/IP协议简单明了,得到了广泛的应用。
TCP/IP协议准确的来说是一组协议,是很多协议的集合,这些协议分别作用在网络通信的各个层级,共同组成一个整体的通信规范。
比如:传输层的TCP和UDP协议,用来建立端到端的连接。
网络层的IP协议,用来寻址和路由。
IP地址和端口
IP地址:用来唯一的标记计算机的位置,端口号用来标记一台电脑中的不同的应用程序。
其中IP地址的格式是32位的二进制,如192.168.0.0.1等等,
端口号范围是0~65536,其中0 ~1023是系统专用端口,例如HTTP超文本传输协议的默认端口即为:80端口,FTP文件传输协议默认端口为21。
Socket套接字
IP地址和端口号共同组成了我们的Socket,也就是套接字, Socket只是一个API,原理如下:
通信两端都有Socket,网络通信其实就是Socket通信,数据在两个Socket之间通过IO传输。
单独的Socket是没有任何作用的,基于一定的协议,比如TCP,UDP协议,才能使得数据畅通传输。
TCP与UDP的区别与使用场景
TCP:对于TCP的数据传输而言,传输数据之前要进行三次握手建立稳定的连接。建立连接通道后,数据包会在这个通道中以字节流的形式进行数据传输。由于建立稳定连接之后才开始传输数据,而同时还是以字节流的形式发送数据,所以发送数据的速度较慢,但是不会造成数据包丢失,即使数据包丢失了,会进行数据重发,同时,如果收到的数据包顺序错乱,会进行排序纠正。
连接的建立是需要3次握手的,而释放则需要4次挥手,所以说每个连接的建立都是需要资源消耗和时间消耗的,因此会有点慢。
总结下来就是:面向连接,数据可靠,速度慢,有序的。
适用于需要稳定安全的传输数据的场景,例如开发交易类,支付类的软件时,都需要基于TCP协议的Socket连接进行安全可靠的数据传输。
UDP:对于UDP的数据传输而言,UDP不会去建立连接,它不管目的地是否存在,直接将数据发送给目的地,同时不会过问发送的数据是否丢失,到达的数据是否顺序错乱,如果你要处理这些问题的话,需要自己在应用层自行处理。
总结下来就是:不面向连接,数据不可靠,速度快,无序。
适用于需要实时性较高不较为关注数据结果的场景,例如打电话,视频会议,广播等。
基于TCP协议的长连接和短连接
长连接: 指在一个TCP连接上可以连续发送多个数据包,在TCP连接保持期间,如果没有数据包发送,需要双方发检测包以维持此连接(心跳保持), 一般需要自己做在线维持。
因为服务器若是一段时间内没有收到客户端请求会自动关闭连接,这就要求长连接在没有数据通信时,定时发送数据包(心跳),以维持连接状态,短连接在没有数据传输时直接关闭就行了。
短连接: 指通信双方有数据交互时,就建立一个TCP连接,数据发送完成后,则断开此TCP连接;一般银行都使用短连接。
它的优点是:管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段
心跳包机制
心跳包之所以叫心跳包是因为:它像心跳一样每隔固定时间发一次,以此来告诉服务器,这个客户端还活着。事实上这是为了保持长连接,至于这个包的内容,是没有什么特别规定的,不过一般都是很小的包,或者只包含包头的一个空包。
在TCP的机制里面,本身是存在有心跳包的机制的,也就是TCP的选项:SO_KEEPALIVE。系统默认是设置的2小时的心跳频率。但是它检查不到机器断电、网线拔出、防火墙这些断线。而且逻辑层处理断线可能也不是那么好处理。一般,如果只是用于保活还是可以的。
心跳包一般来说都是在逻辑层发送空的echo包来实现的。下一个定时器,在一定时间间隔下发送一个空包给客户端,然后客户端反馈一个同样的空包回来,服务器如果在一定时间内收不到客户端发送过来的反馈包,那就只有认定说掉线了。
总的来说,心跳包主要也就是用于长连接的保活和断线处理。一般的应用下,判定时间在30-40秒比较不错。如果实在要求高,那就在6-9秒。
心跳检测步骤:
1 客户端每隔一个时间间隔发生一个探测包给服务器
2 客户端发包时启动一个超时定时器
3 服务器端接收到检测包,应该回应一个包
4 如果客户机收到服务器的应答包,则说明服务器正常,删除超时定时器
5 如果客户端的超时定时器超时,依然没有收到应答包,则说明服务器挂了。