首页 > 其他分享 >粘包/拆包问题一直都存在,只是到TCP就拆不动了。

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

时间:2023-05-09 20:11:41浏览次数:34  
标签:协议 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 callsocket 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粘包。


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

附录: ip报头结构:[源ip、目标ip在这定义]

旁白

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

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

相关文章

  • 《开发板移植tcpdump 交叉编译 带有依赖库如何移植》
    1.下载源码由于tcpdump依赖于libpcap,所以需要先下载这两个的源代码;官方地址:https://www.tcpdump.org/这里示例所下载的版本是tcpdump-4.9.3.tar.gzlibpcap-1.9.1.tar.gz 2.编译libpcap解压libpcap源码,创建build目录,避免编译的临时文件污染源码tarxvflibp......
  • TCP/IP网络模型
    在网络模型中有分为7层模型(OSI模型)和5层模型和TCP/IP模型OSI模型将应用层和表示层作为独立的两层,而TCP/IP模型将它们合并为一个应用层。两种对比来说,TCP/IP模型更符合实际开发应用应用层应用层是最上层的一层,也是在开发中接触到最多的,因为在开发中一般需要提供HTTP接口来......
  • C# 聊天室(基于TCP协议)
    客户端和服务端客户端usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Linq;usingSystem.Net;usingSystem.Net.Sockets;usingSystem.Text;usingSystem.Threading.Tasks;using......
  • 《asyncio 系列》8. 在 asyncio 中通过流(StreamReader、StreamWriter)来实现 TCP 请求
    楔子在编写网络应用程序时,我们使用了socket库来读取和写入客户端。虽然在构建低级网络库时直接使用套接字很有效,但用法上还是有些复杂,例如启动服务端、等待客户端连接以及向客户端发送数据等等。asyncio的设计者意识到这一点,并构建了网络流API,这些更高级的API比套接字更容......
  • TCP系列01—概述及协议头格式
    目录 一、TCP简单介绍面向连接可靠性字节流式二、TCP的封装和协议头的格式三、TCP中的数据包窗口和滑窗一、TCP简单介绍connection-oriented)、可靠的(reliable)、字节流式(byte stream)传输协议, TCP的这三个特性该怎么理解呢?面向连接在应用TCP协议进行通信之前双方通常需要通......
  • MPTCP(二):MPTCP版本说明
    MPTCP版本说明简介参考链接https://github.com/multipath-tcp/mptcp_net-next/wikiMPTCP的两个版本MPTCPv0:在5.6之前的linux内核版本中并未集成MPTCP相关的源码,需要开发者自行向内核中打入MPTCP的补丁以启用MPTCPMPTCPv1:在5.6及之后的内核版本中,已经集成了MP......
  • 第二章:用电信号传输TCP/IP数据-02-连接:connect()
    一、连接是什么意思话说网线一直插着,网络一直连着,网线中随时都有信号流过,那这个“连接”是连接什么呢?可以类比人与人之间的联系,满大街都是人,身边随时有人走过,我们算是跟任何人有联系吗?当然没有!怎么才算有联系?先要双方有交往意愿,然后互换个名片,这才算联系上了。哪天一方找到另......
  • TCP协议三次握手的原因是什么?为什么不用两次握手和4次握手?
    今天复习了TCP协议的三次握手,对上一篇C++网络编程有了更深的理解。当时考研的时候计网学过,这里再总结一下分享。网图都是截图来的,侵删。TCP协议属于传输层协议,上面的应用层协议包括HTTP、FTP之类,应用层协议是最接近用户的,每往下一层就套一层头部数据来提供给当前层协议解析。那......
  • CS144 计算机网络 Lab4:TCP Connection
    前言经过前面几个实验的铺垫,终于到了将他们组合起来的时候了。Lab4将实现TCPConnection功能,内部含有TCPReceiver和TCPSender,可以与TCP连接的另一个端点进行数据交换。实验要求简单来说,这次实验就是要在TCPConnection类中实现下图所示的有限状态机:这些状态对应T......
  • TCP/IP-2023-05-06
    1、图片来自:https://www.bunian.cn/3772.html 2、三次握手四次挥手见《TCP三次握手四次挥手-嵌入式Linux网络编程基础-麦子学院》的11:00开始的地方。【返回目录树】......