首页 > 其他分享 >TCP就拆不动粘包/拆包问题

TCP就拆不动粘包/拆包问题

时间:2023-07-20 22:35:01浏览次数:40  
标签:TCP 协议 IP tcp 粘包 拆包 拆不动

粘包/拆包问题一直都存在,只是到TCP就拆不动了。

  • OSI open-system-Interconnection
  • TCP/IP 5层协议栈
    • 应用层和操作系统的边界是 系统调用 ,对应到网络编程是socket api
  • TCP/UDP 概况
  • TCP粘包问题
  • TCP/IP报头深思

 

OSI开放系统互联

 

定义了网络框架,以层为单位实现协议,同时控制权逐层传递。

 

OSI实际并没有落地,TCP/IP 5层协议栈是目前主流的落地实现

 

TCP/IP 5层协议栈

 

TCP/IP协议栈不止是传输层tcp/网络层ip, 还包括应用层等,这是一个协议簇,只是因为TCP/IP很具代表性。

 

不管是OSI还是TCP/IP5层协议栈,均会出现应用程序和操作系统边界(代码执行在用户态/内核态)。

 

 

边界调用被称为系统调用system call, socket api便是TCP/IP协议栈中应用层的网络编程接口。

 

TCP/UDP概览

 

  • TCP: Transmission Control Protocol面向连接的,可靠的,基于字节的、双向流式传输层协议。

  • UDP: USer Datagram Protocol面向消息的传输服务,传输的数据是有边界的。
    区别:

 

TCP可靠性是tcp三次握手的基础,在此之上,增加了seq、ack数据确认机制、 拥塞控制, 其中ack= seq+len(data)。

 

UDP: 想法就发,不用三次握手建立连接。

 

我们目前常见的应用场景底层都是tcp,比如http请求、sql数据库请求。

 

建立TCP连接之后,才能做http请求、sql请求,tcp连接很耗时,故服务器都存在连接池化机制。

 

这里我要给自己强调的是:开发者对于tcp一定不要带入http请求-响应模型,tcp是双向通信流。

 

TCP粘包/拆包

 

TCP粘包并不是TCP协议造成的问题,因为tcp协议本就规定字节流式传输

 

  • 正常的理想情况,应用层下发的两个原始包恰好满足TCP缓冲区的大小或达到TCP等待时长,分别发送两个包;
  • 粘包:两个包较小,间隔时间短,发生粘包,合并成一个包发送;
  • 拆包:一个包过大,超过缓存区大小,拆分成两个或多个包发送;
  • 拆包和粘包:Packet1过大,进行了拆包处理,而拆出去的一部分又与Packet2进行粘包处理。

 

image.png

 

粘包拆包问题在数据链路层、网络层以及传输层都有可能发生。
数据链路层,网络层的粘包和拆包问题都由协议自行处理了,我们日常的网络应用开发都在对接传输层,故面临的粘包问题指的是TCP粘包。

 

 


 

当粘包、拆到TCP层的时候我们就没办法识别应用层的请求/调用了, 所以解决方法是:一开始就需要在字节流中加入[特殊分隔符]或者[长度+偏移量]含义。

 

HTTP 超文本传输协议的规定如下:

 

image.png

 

旁白

 

梳理了整个TCP/IP协议栈各层封包逻辑, 我们就知道粘包、拆包一直都存在,只是拆到TCP层的时候,我们没有办法区分应用层断续发送的请求/调用, 这就是我们口口相传的TCP粘包/拆包问题, 需要应用层用特殊分隔符或者长度解析。

标签:TCP,协议,IP,tcp,粘包,拆包,拆不动
From: https://www.cnblogs.com/Leo_wl/p/17569863.html

相关文章

  • TCP和UDP协议的区别
    1、TCP是面向连接的,而UDP是无连接的协议。2、TCP对于传输有用的数据非常可靠,因为它需要确认发送的信息,并且能重新发送丢失的数据包;UDP是一种不可靠的协议,数据包丢失,它不会请求重新传输,目标计算机会收到损坏的数据3、TCP速度较慢,但更健壮,因为TCP在传输数据之前建立连接,并确保数据......
  • tcp/ip 面试问题总结
    tcp三次握手为什么三次典型场景:1客户端对服务器说:大哥你好这是我的窗口大小,以及初始序号2服务器对客户端说:好的老弟,这是我的窗口大小和初始序号3客户端对服务器说:好的大哥......
  • N58(4G模块)通过AT指令连接TCP数据传输调试记录(1)
    背景有方科技的N58-CA4G模块+以太网+TCP客户端+SSCOM串口助手+AT指令的方式调通TCP通信开发流程1.模块初始化2.非透传TCP客户端通信流程一.模块初始化1.模块初始化2.非透传TCP客户端通信流程小tips:代码主要是按照流程复现,初始化代码可以使用例程通用代码其中会用到一些调用函数,包......
  • 网络编程 p4 TCP编程
    TCP编程基本介绍基于客户端——服务端的网络通信;底层使用的是TCP/IP协议;应用场景举例:客户端发送数据,服务端接收并显示在控制台;基于Socket的TCP编程;示意图netstat指令netstat-an可以查看当前主机网络情况,包括端口监听情况和网络连接情况;netstat-an|more......
  • TCP三次握手及四次挥手
    TCP是一个面向连接的服务,面向连接的服务是电话系统服务模式的抽象,每一次完整的数据传输都必须经过建立连接,数据传输和终止连接三个过程,TCP建立连接的过程称为三次握手。TCP三次握手过程主机A通过向主机B发送一个含有同步序列号的标志位的数据段给主机B,向主机B请求建立连接,......
  • Nginx 代理 WebSocket 、TCP协议
    Nginx代理WebSocket什么是WebSocketWebSocket是一种网络传输协议,可在单个TCP连接上进行全双工通信,位于OSI模型的应用层。WebSocket中的握手和HTTP中的握手过程兼容,且可以使用HTTP中的Upgrade协议头将连接从HTTP升级到WebSocket。代理结构WebSocket可以工作在......
  • 三菱FX系列PLC以太网通讯处理器ModbusTCP通讯
    大家好,今天我们要来聊一聊转以太网捷米特JM-ETH-FX,这款设备内部集成了ModbusTCP通讯服务器,这意味着什么?ModbusTCP客户机,比如支持ModbusTCP的组态软件、OPC服务器、PLC以及使用高级语言开发的实现ModbusTCP客户机软件等等,可以直接访问三菱FX系列PLC的内部数据区。 Modbus协议地......
  • TCP的Keep-Alive机制:链接存在但是没有数据传输,内核怎么处理
    服务端会定期发送探测报文来检测客户端的存活状态。由三个内核参数控制:首次发送探测报文时间:net.ipv4.tcp_keepalive_time有报文传输时重置探测报文的发送间隔:net.ipv4.tcp_keepalive_intvl探测报文的最大重试次数:net.ipv4.tcp_keepalive_probes#sysctl-a|grep......
  • TCP/IP 五层模型
    TCP/IP五层模型从下到上依次是:1)物理层:主要是指具体的物理媒介和物理设备任务:物理层的主要功能是利用传输介质为数据链路层提供物理联接,负责数据流的物理传输工作(主要定义了系统的电气、机械、过程和功能标准。如:电压、物理数据速率、最大传输距离、物理联接器和其他的类似特......
  • 【网络】【TCP】TCP 协议有什么缺陷?
    1  前言这节我们来看个问题,就是 TCP协议有什么缺陷?TCP通过序列号、确认应答、超时重传、流量控制、拥塞控制等方式实现了可靠传输,看起来它很完美,事实真的是这样吗?TCP就没什么缺陷吗?所以,今天就跟大家聊聊,TCP协议有哪些缺陷?主要有四个方面:升级TCP的工作很困难;TCP建......