首页 > 其他分享 >计算机网络 TCP粘包问题

计算机网络 TCP粘包问题

时间:2024-07-14 12:00:36浏览次数:17  
标签:OS 数据包 应用程序 粘包 计算机网络 TCP 接收 数据

什么是粘包?

粘包是指的是数据和数据之间没有没有明确的分界线,导致不能够正确的传输数据(只有TCP会粘包 UDP 永远不会粘包),粘包问题只针对于一切字节流的协议。

TCP也可以称为流式协议,UDP称为数据报式协议。

对于流式协议:发送端可以1K1K的发送数据,接收端可以2k2k的提取数据,也可以3K4K的提取数据,所以对于接收端应用程序中看到的数据就是一个整体,“数据流”,一条消息里面有多少字节应用程序是看不见的,所以TCP协议面向字节流,就会出现粘包问题,而UDP这种面向消息的协议,每个UDP段都是一条消息,接收方必须以消息为单位进行提取数据,不能一次提取任意字节的数据所谓的粘包问题就是接收方不知道消息和消息之间的边界,不知道一次提取多少个字节导致的。

粘包问题出现的具体原因

应用程序无法直接操作硬件,应用程序想要操作数据必须要将数据交给操作系统,OS会为应用提供数据传输的服务,所以OS不会立刻把数据发出去,会为应用程序提供一个缓冲区,存储临时的数据,这些数据存在一起就无法区分边界了。

发送方:当应用程序调用send函数时候,应用程序会将数据从应用程序拷贝到操作系统缓存里面,再由OS从缓冲区里面读数据,把数据发出去。

数据缓冲区的合并:TCP协议为了提高传输效率,可能会在发送数据时将多个数据包合并成一个进行发送,而接收方可能一次性接收到多个数据包。

接收方: 对方计算机收到的数据也是OS先收到的,至于应用程序如何处理这些数据,OS不知道,所以同样需要将数据先存储到OS 的缓冲区里面,当应用程序调用recv的时候,实际上是将OS缓冲区里面的数据拷贝到应用程序的过程。

接收方读取不及时:如果接收方没有及时读取缓冲区中的数据,可能会导致多个数据包被一次性读取,从而形成粘包现象。

粘包问题的解决

1.使用应用层协议(http,https)来封装要传输的不定长的数据包。

2.添加标志位,在每个数据的后面添加一些特殊字符,如果遇到特殊字符,说明这条数据接收完毕了 每接收一个字符就要对这些字符进行判定,判定是不是特殊的字符串,效率很低。

3.在发送数据快之前,在数据块之前添加一个固定大小的包头:数据头+数据块 数据头:存储当前数据包的总字节数,接收端先接收数据头,然后再根据数据头接收对应的大小 数据块:当前数据包的内容。

//例子:
struct Node n1;
int nSize = sizeof(n1);
//发送
send(sockClient,(char*)&nSize, sizeof(int),0); //先发包大小
send(sockClient,(char*)&n1, sizeof(n1),0);//发数据包
//接收 
int nPackSize = 0;
recv(sockClient,(char*)&nPackSize, sizeof(int),0);//先接收包大小
char* buf = new char[nPackSize]:
recv(sockClient, buf,nPackSize, 0);//再接收包,delete[] buf;

4.固定包大小,固定每个包的大小,但这样会造成资源浪费。

5.短连接,每次连接发一个包就断开重连再发,适合长时间短交流。

 

标签:OS,数据包,应用程序,粘包,计算机网络,TCP,接收,数据
From: https://blog.csdn.net/weixin_63162063/article/details/140412242

相关文章

  • 计算机网络 拥塞控制
    拥塞通常是由于网络中的资源(如路由器、链路)过载而导致的。当网络负载过大,超过其容量范围时,会出现数据包丢失、延迟增加、传输失败等问题,从而影响网络的性能和可靠性,如果发生,数据包丢失TCP就会重传数据,但是一重传就会导致网络的负担更重,产生更多的丢包,恶性循环不断放大。拥塞控......
  • TCP三次握手的意外情况分析
    >其实很简单,就像我个人给别人发信息一样,有个重传机制,毕竟对方可能突然有事忘看了,或者说看完了忘了回,所以我本人会重传,那么接下来就以聊天的角度来给大家解析一下TCP三次握手时的意外情况以及应对方针注文中的大部分知识非我原创,我只是知识的搬运工,并且尝试搬运进脑子里......
  • 2023-2024第二学期的助教工作总结(计算机网络)
    一、助教工作的具体职责和任务 (包括:你和老师是如何配合的、你和课程其他助教是如何配合的(如果有的话))1.及时跟进学生学习进度每周询问老师教学进度,自己复习知识点,随时准备回复学生问题,并对后续进行安排2.编写题目,拓宽题库每周编写5-8题题目,写出答案,并发给老师审核3.和老师......
  • 计算机网络 IP地址分类、子网掩码、子网划分
    ip地址=网络地址+主机地址(又称:网络号和主机号),我们把网络号相同的主机称之为本地网络中的主机,网络号不相同的主机称之为远程网络中的主机。本地网络中的主机可以直接相互通信,远程网络中的主机要相互通信必须通过本地网关来传递转发数据。IP地址分类类型范围作用A类1.0.0.......
  • 自己理解的TCP三次握手
    ###TCP三次握手过程是怎样的?TCP的建立连接是通过三次握手来进行的。三次握手的过程如下图:说实话这个很好理解,我称之为N字型首先我们理解到建立连接是一个虚的概念了对吧?那么我们来设计一个可靠的TCP,首先建立连接是必须的吧?相当于我们打电话,总要先说一句喂---wei?(面向......
  • 运维锅总浅析计算机网络
    计算机网络本质是什么?如何理解物理层的电气和机械特性?如何理解WLAN理层的电气和机械特性?如何理解数据链路层帧的封装、错误检测和纠正?如何理解网络层的路径选择和数据包的转发?为什么TCP要三握手四次挥手?为什么UDP不可靠?TCP与UDP应用场景是什么?希望读完本文能帮您解答这些疑......
  • TCP与UDP
    TCP(TransmissionControlProtocol)什么是TCP?TCP是一种面向连接的、可靠的传输层协议,用于在计算机网络中传输数据。它确保数据能够按照发送顺序到达目的地,并且不丢失,确保了数据的完整性和顺序性。详细解释:TCP在传输数据之前,首先在发送端和接收端之间建立连接。这个连接是通过......
  • 计算机网络 ARP协议(地址解析协议)
            ARP(AddressResolutionProtocol)是一种用于解析网络层地址(如IPv4地址)和数据链路层地址(如MAC地址)之间对应关系的协议。它主要用于在局域网(LAN)中根据目标设备的IP地址获取其对应的MAC地址,以便在数据链路层进行准确的数据传输。ARP协议工作原理:ARP请求和响应......
  • 计算机网络 DNS协议---域名解析
    域名解析是计算机网络中的重要过程,它指的是将人类可读的域名(例如www.example.com)转换为计算机可理解的IP地址(例如192.0.2.1)的过程。这个过程依赖于域名系统(DNS)协议的支持。 DNS协议基本概念DNS(DomainNameSystem)是互联网中用于将域名解析为IP地址的分布式命名系统。它......
  • TCP,Linux下清除空闲连接功能
    #include<iostream>#include<ctime>structConnection{ intsockfd; time_tlastActiveTime; //构造函数 Connection(intfd):sockfd(fd),lastActiveTime(time(nullptr)){} //更新最后活动时间 voidupdateActivity() { lastActiveTime=time(......