TCP以及TCP中的粘包与分包

1.TCP

tcp:确认,重传机制,按序到达
拥塞控制:防止过多的数据注入到网络中
流量控制:流量控制所要做的就是抑制发送端发送数据的速率,以便使接收端来得及接收

不同的协议层对数据包有不同的称谓,在传输层叫做段(segment),在网络层叫做数据报(datagram),在链路层叫做帧(frame)

采用TCP协议进行数据传输是不会造成IP分片的。一旦TCP数据过大,则在传输层会对TCP包进行分段
UDP不能像TCP一样自己进行分段,因此会在IP层分片
IP分片由网络层完成,也在网络层进行重组;TCP分段是在传输层完成,并在传输层进行重组.

2.Socket发送与接收缓冲区

发送缓冲区:系统不断从发送Buffer取数据发送到接收端,应用不断往发送Buffer写数据
接收缓冲区:系统把接收到的数据送入接收Buffer中,应用不断从接收Buffer取数据

TCP保证接收到数据的顺序是发送的顺序,按序到达

一次send可能会有多次recv,多次send也可能对应一次recv

3.TCP中的分包与粘包

粘包&分包产生原因:1.应用数据大小大于发送Buffer,要分多次发。 2.TCP分段

解决数据分包和粘包的基本策略如下
1.消息定长,比如定一个100,那么读取端每次读取数据就截取100个长度的数据,然后交给业务成去做解析
2.在消息的尾部加一些特殊字符,那么在读取数据的时候,只要读到这个特殊字符,就认为已经可以截取一个完整的数据包了,这种情况在一定的业务情况下实用。
3.读取缓存的数据是不定长的,所以我们把读取到的数据添加到我们自己的一个byte[]数组中,然后根据我们的业务逻辑来找到指定的特殊协议头部,协议长度,协议尾部,然后从我们的byte[]中获取一个完整的数据包,然后再对数据包进行业务解析就可以得到正确结果。

猜你喜欢

转载自blog.csdn.net/janker5/article/details/83309537