什么是TCP粘包?怎么解决这个问题[通俗易懂]

什么是TCP粘包?怎么解决这个问题[通俗易懂]在socket网络编程中,都是端到端通信,由客户端端口+服务端端口+客户端IP+服务端IP+传输协议组成的五元组可以明确的标识一条连接。在TCP的socket编程中,发送端和接收端都有成对的socket。发送端为了将多个发往接收端的包,更加高效的的发给接收端,于是采用了优化算法(Nagle算法),将多次间隔较小、数据量较小的数据,合并成一个数据量大的数据块,然后进行封包。那么这样一来,接收端就必须…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

转载请说明原文出处!!!

在socket网络编程中,都是端到端通信,由客户端端口+服务端端口+客户端IP+服务端IP+传输协议组成的五元组可以明确的标识一条连接。在TCP的socket编程中,发送端和接收端都有成对的socket。发送端为了将多个发往接收端的包,更加高效的的发给接收端,于是采用了优化算法(Nagle算法),将多次间隔较小、数据量较小的数据,合并成一个数据量大的数据块,然后进行封包。那么这样一来,接收端就必须使用高效科学的拆包机制来分辨这些数据。

1.Q:什么是TCP粘包问题?

TCP粘包就是指发送方发送的若干包数据到达接收方时粘成了一包,从接收缓冲区来看,后一包数据的头紧接着前一包数据的尾,出现粘包的原因是多方面的,可能是来自发送方,也可能是来自接收方。

2.Q:造成TCP粘包的原因

(1)发送方原因

TCP默认使用Nagle算法(主要作用:减少网络中报文段的数量),而Nagle算法主要做两件事:

  1. 只有上一个分组得到确认,才会发送下一个分组
  2. 收集多个小分组,在一个确认到来时一起发送

Nagle算法造成了发送方可能会出现粘包问题

(2)接收方原因

TCP接收到数据包时,并不会马上交到应用层进行处理,或者说应用层并不会立即处理。实际上,TCP将接收到的数据包保存在接收缓存里,然后应用程序主动从缓存读取收到的分组。这样一来,如果TCP接收数据包到缓存的速度大于应用程序从缓存中读取数据包的速度,多个包就会被缓存,应用程序就有可能读取到多个首尾相接粘到一起的包。

3.Q:什么时候需要处理粘包现象?

  1. 如果发送方发送的多组数据本来就是同一块数据的不同部分,比如说一个文件被分成多个部分发送,这时当然不需要处理粘包现象
  2. 如果多个分组毫不相干,甚至是并列关系,那么这个时候就一定要处理粘包现象了

4.Q:如何处理粘包现象?

(1)发送方

对于发送方造成的粘包问题,可以通过关闭Nagle算法来解决,使用TCP_NODELAY选项来关闭算法。

(2)接收方

接收方没有办法来处理粘包现象,只能将问题交给应用层来处理。

(2)应用层

应用层的解决办法简单可行,不仅能解决接收方的粘包问题,还可以解决发送方的粘包问题。

解决办法:循环处理,应用程序从接收缓存中读取分组时,读完一条数据,就应该循环读取下一条数据,直到所有数据都被处理完成,但是如何判断每条数据的长度呢?

  1. 格式化数据:每条数据有固定的格式(开始符,结束符),这种方法简单易行,但是选择开始符和结束符时一定要确保每条数据的内部不包含开始符和结束符。
  2. 发送长度:发送每条数据时,将数据的长度一并发送,例如规定数据的前4位是数据的长度,应用层在处理时可以根据长度来判断每个分组的开始和结束位置。

5.Q:UDP会不会产生粘包问题呢?

TCP为了保证可靠传输并减少额外的开销(每次发包都要验证),采用了基于流的传输,基于流的传输不认为消息是一条一条的,是无保护消息边界的(保护消息边界:指传输协议把数据当做一条独立的消息在网上传输,接收端一次只能接受一条独立的消息)。

UDP则是面向消息传输的,是有保护消息边界的,接收方一次只接受一条独立的信息,所以不存在粘包问题。

举个例子:有三个数据包,大小分别为2k、4k、6k,如果采用UDP发送的话,不管接受方的接收缓存有多大,我们必须要进行至少三次以上的发送才能把数据包发送完,但是使用TCP协议发送的话,我们只需要接受方的接收缓存有12k的大小,就可以一次把这3个数据包全部发送完毕。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/169702.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • arthas 案例: 动态更新应用Logger Level

    来源: case-ognl-update-logger-level案例: 动态更新应用Logger Level在这个案例里,动态修改应用的Logger Level。查找UserController的ClassLoadersc -d com.example.demo.arthas.user.UserController | grep classLoaderHash$ sc -d com.example.demo.arthas.user.UserController | grep classLo

    2022年3月1日
    39
  • CloudSim 学习实例1

    CloudSim 学习实例1Cloudsimexample1cloudsim教程例1解读创建一个含一台主机的数据中心,并在其上运行一个云任务代码packageorg.cloudbus.cloudsim.examples;/**Title:CloudSimToolkit*Description:CloudSim(CloudSimulation)Toolkitfor…

    2022年8月31日
    0
  • pycharm运行tkinter结果窗口_pycharm运行py文件

    pycharm运行tkinter结果窗口_pycharm运行py文件对于3.x版本中运行thinter问题1:ModuleNotFoundError:Nomodulenamed‘Tkinter’引入的模块没有这个Tkinter这个名字出现的问题2:AttributeError:module‘tkinter’hasnoattribute‘TK’问题原因:调用的属性书写不正确正确的书写importthinter#都是小写的T…

    2022年8月27日
    2
  • 网购冷门产品有哪些_淘宝比较冷门的商品

    网购冷门产品有哪些_淘宝比较冷门的商品sharonshen ,熠仔6149人赞同1. 小白鞋纳米喷雾!!!这个真是绝了,本人就是穿小白鞋一周就会穿成小脏鞋的那种,有了这个在新鞋的时候全方位喷一下,真的就再也不会脏了耶!其实呢,当年买它,是宝宝在法国的时候,去北欧玩,穿的雪地靴,踩在雪里,雪都能化进鞋里(顺便吐槽下,雪地靴真的不适合在雪地里面行走!!!),所以买了下面的这个喷雾,防水,后来惊讶的发现,

    2022年10月4日
    0
  • Mac更换pip源[通俗易懂]

    Mac更换pip源[通俗易懂]这里用的是阿里的源,其他源请自行更换http://mirrors.aliyun.com/pypi/simple/即可mkdir~/.piptee~/.pip/pip.conf<<-‘EOF'[global]index-url=http://mirrors.aliyun.com/pypi/simple/[install]trusted-host=mirrors.al…

    2022年5月27日
    66
  • 实例分割综述(单阶段/两阶段/实时分割算法汇总)

    实例分割综述(单阶段/两阶段/实时分割算法汇总)点击上方“3D视觉工坊”,选择“星标”干货第一时间送达简介目标检测或定位是数字图像从粗到细的一个渐进过程。它不仅提供了图像对象的类,还提供了已分类图像中对象的位置。位置以边框或中心的形式…

    2022年8月23日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号