关于网络协议的学习笔记

关于TCP网络协议的粘包分包的问题:

https://www.csdn.net/gather_25/MtTakgysOTMtYmxvZwO0O0OO0O0O.html


为什么要处理粘包分包

由于TCP协议本身的机制,客户端与服务器会维持一个连续发送的数据。如果发送的网络数据包太小,TCP会合并较小的数据包再发送,接收端便无法区分那些数据是发送端分开的,因此便产生了粘包问题。如果数据太大,TCP有可能会把数据拆成多分发送,接收端一次只能接收到部分信息,因此便出现分包问题。


最近关于网络socket编程的自己的demo学习 项目,git地址:

https://github.com/yuhezhangyanru/javaScoketGroupMessage.git


关于客户端和服务器的socket通信过程说明,相对写的能看明白一点:

https://www.cnblogs.com/Jasxu/p/Java-Socket.html


关于服务器阻塞socket模型的介绍和会出现的状况说明写的比较好,以及关于半包、粘包、分包的解释比较好

https://www.jianshu.com/p/cde27461c226

本文中引用别人的:

5.1 半包

接受方没有接受到一个完整的包,只接受了部分。

原因:TCP为提高传输效率,将一个包分配的足够大,导致接受方并不能一次接受完。

影响:长连接和短连接中都会出现

5.2 粘包

发送方发送的多个包数据到接收方接收时粘成一个包,从接收缓冲区看,后一包数据的头紧接着前一包数据的尾。

分类:一种是粘在一起的包都是完整的数据包,另一种情况是粘在一起的包有不完整的包

出现粘包现象的原因是多方面的:

1)发送方粘包:由TCP协议本身造成的,TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。

2)接收方粘包:接收方用户进程不及时接收数据,从而导致粘包现象。这是因为接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下一包数据放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据,这样就一次取到了多包数据。

5.3分包

分包(1):在出现粘包的时候,我们的接收方要进行分包处理;

分包(2):一个数据包被分成了多次接收;

原因:1. IP分片传输导致的;2.传输过程中丢失部分包导致出现的半包;3.一个包可能被分成了两次传输,在取数据的时候,先取到了一部分(还可能与接收的缓冲区大小有关系)。

影响:粘包和分包在长连接中都会出现

那么如何解决半包和粘包的问题,就涉及一个一个数据发送如何标识结束的问题,通常有以下几种情况

固定长度:每次发送固定长度的数据;

特殊标示:以回车,换行作为特殊标示;获取到指定的标识时,说明包获取完整。

字节长度:包头+包长+包体的协议形式,当服务器端获取到指定的包长时才说明获取完整;

所以大部分情况下,双方使用socket通讯时都会约定一个定长头放在传输数据的最前端,用以标识数据体的长度,通常定长头有整型int,短整型short,字符串Strinng三种形式。

下面我们通过几个简单的小示例,演示发送接受定长数据,前面我们讲过通过特殊标识的方式,可是有什么我们发送的数据比较大,并且数据本身就会包含我们约定的特殊标识,那么我们在接受数据时,就会出现半包的情况,通过这种情况下,我们都是才有包头+包长+包体的协议模式,每次发送数据的时候,我们都会固定前4个字节为数据长度,那到数据长度后,我们就可以非常精确的创建一个数据缓存区用来接收数据。
那么下面就先通过包类型+包长度+消息内容定义一个socket通信对象,数据类型为byte类型,包长度为int类型,消息内容为byte类型。
作者:长道
链接:https://www.jianshu.com/p/cde27461c226
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


关于TCP传输对象的解决方式,ObjectOutputStream对象序列化

在使用TCP通信传输信息时,更多是使用对象的形式来传输,可以使用ObjectOutputStream对象序列化流来传递对象,比如ObjectOutputStream os = new ObjectOutputStream(socket.getOutputStream());User user = new User(“admin”,“123”); os.writeObject(user);
————————————————

版权声明:本文为CSDN博主「二一点」的原创文章,遵循 CC 4.0 BY-SA

版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/a78270528/article/details/80318571


关于Java主流的网络框架有哪些:

https://blog.csdn.net/xiaojin21cen/article/details/78587541

简介:
1、Apache MINA

2、Grizzly

3、Netty

4、NIO Framework

5、QuickServer

6、xSocket

7、IOServer

8、XNIO


关于集中服务器底层类型:

BIO:同步阻塞IO
NIO:同步非阻塞IO
AIO:异步阻塞IO
适用场景
BIO:适用于连接数目比较小且固定的架构,这种方式对服务器资源要求比较高,并发局限于应用中。比如:文件的上传下载
NIO:适用于连接数目多且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂
AIO:使用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂。
作者:意识流丶
链接:https://www.jianshu.com/p/8e594959249e
来源:
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


Netty的协议支持有哪些

关于网络协议的学习笔记_第1张图片

最近看的一个比较好的关于Netty的结构性的文章,这个是文章集合的目录地址:

https://www.cnblogs.com/imstudy/p/9908791.html

Netty构建游戏服务器有什么优势

文章的地址:
https://blog.csdn.net/u012486840/article/details/52937757

1,游戏服务器是一个复杂的组成,基本要求是低延迟和高并发。游戏服务器经常需要各种通信,例如地图服务器、网管服务器、聊天服务器之间的通信。Netty的异步NIO框架可以保证高性能的通信能力。
2,灵活的编码解码定制能力,满足不同游戏场景下的多协议和私有协议编解码。
3,可配置的线程池,TCP参数,提供差异化定制能力。
4,黑白名单过滤(IP过滤),SSL安全,可以用于登录认证环节。
5,Netty心跳检测(链路有效性检测),用于检测客户端是否处于活跃状态。心跳检测是指,服务器定期向客户端发送指定内容,通过反馈来判断链路是否可用,客户端是否活着,是否可以正常接收和发送消息。
6,流量整形,一种主动调整流量输出速率的措施。作用是
1),防止由于上下游网元性能不均衡导致下游网元被压垮,业务流程中断;
2),防止由于通信模块接收消息过快,后端业务线程处理不及时导致的“撑死”问题。
流行整形原理是将废弃报文先缓存,放入队列中,当具有足够令牌的时候在发送缓存的报文。这种做法可以缓解压力,但是有一定的延迟。
7,日志统计能力,提供游戏服务可服务性。
8,基于内存池的对象重用技术,降低GC频度,使得玩家不卡。

你可能感兴趣的:(Java,NetWork,Java,Netty,Socket,TCP,网络)