网络层对数据进行切片后会出现粘包问题吗?

news/2024/5/18 12:08:08 标签: udp, tcp/ip

IP 层会对大包进行切片,是不是也有粘包问题?

先说结论,不会。首先前文提到了,粘包其实是由于使用者无法正确区分消息边界导致的一个问题。

先看看 IP 层的切片分包是怎么回事。

图片

P分包与重组

  • 如果消息过长,IP层会按 MTU 长度把消息分成 N 个切片,每个切片带有自身在包里的位置(offset)同样的IP头信息

  • 各个切片在网络中进行传输。每个数据包切片可以在不同的路由中流转,然后在最后的终点汇合后再组装

  • 在接收端收到第一个切片包时会申请一块新内存,创建IP包的数据结构,等待其他切片分包数据到位。

  • 等消息全部到位后就把整个消息包给到上层(传输层)进行处理。

可以看出整个过程,IP 层从按长度切片到把切片组装成一个数据包的过程中,都只管运输,都不需要在意消息的边界和内容,都不在意消息内容了,那就不会有粘包一说了。

粘包这个问题的根因是由于开发人员没有正确理解 TCP 面向字节流的数据传输方式,本身并不是 TCP 的问题,是开发者的问题。

  • TCP 不管发送端要发什么,都基于字节流把数据发到接收端。这个字节流里可能包含上一次想要发的数据的部分信息。接收端根据需要在消息里加上识别消息边界的信息。不加就可能出现粘包问题。

  • TCP 粘包跟Nagle算法有关系,但关闭 Nagle 算法并不解决粘包问题。

  • UDP 是基于数据报的传输协议,不会有粘包问题。

  • IP 层也切片,但是因为不关心消息里有啥,因此有不会有粘包问题。

  • TCP 发送端可以发 10 次字节流数据,接收端可以分 100 次去取;UDP 发送端发了 10 次数据报,那接收端就要在 10 次收完。


http://www.niftyadmin.cn/n/1629027.html

相关文章

CentOS 7上VNCServer的安装使用

1、安装 yum install tigervnc tigervnc-server2、配置 vncserver的配置,创建一个新的配置文件 cp /lib/systemd/system/vncserver.service /lib/systemd/system/vncserver:1.service编辑/lib/systemd/system/vncserver:1.service vim /lib/systemd/system/vncserve…

力扣刷题续

79.实现strStr(KMP) 方法一 .常规方法 class Solution { public:int strStr(string haystack, string needle) {if(haystack.empty() && needle.empty()) return 0;int m haystack.length();int n needle.length();for(int i0;in<m;i){bool flag true;for(int …

衬线字体和非衬线字体区别

衬线字体和非衬线字体区别 一、总结 1、衬线字体&#xff08;宋体&#xff09;&#xff1a;见名知意&#xff0c;就是比划有粗有细&#xff0c;非衬线字体所以字的所有比划的都是一样粗细&#xff08;幼圆&#xff09; 二、衬线字体和非衬线字体区别 衬线体棱角分明&#xff0c…

分布式缓存--系列1 -- Hash环/一致性Hash原理

当前&#xff0c;Memcached、Redis这类分布式kv缓存已经非常普遍。从本篇开始&#xff0c;本系列将分析分布式缓存相关的原理、使用策略和最佳实践。 我们知道Memcached的分布式其实是一种“伪分布式”&#xff0c;也就是它的服务器结点之间其实是相互无关联的&#xff0c;之间…

strcpy,memcpy以及mommove的实现

一、strcpy&#xff08;只适用于字符串&#xff09; strcpy在进行字符串拷贝时&#xff0c;会将\0字符一同拷贝过去。 除了内存重叠&#xff0c;strcpy函数还有一个弊端&#xff1a;如果目的地址分配的长度小于源地址的要拷贝的数据的长度&#xff0c;那么会发生越界&#xf…

SQL表连接查询

USE h /*默认值*/ CREATE TABLE emp(id INT,ename VARCHAR(5),address VARCHAR(20) DEFAULT 山东淄博(默认值&#xff09;)INSERT INTO emp(id,ename) VALUES(1,张三);INSERT INTO emp VALUES(2,李四,山东济南);INSERT INTO emp VALUES(3,小红,);SELECT * FROM emp;/*不能为空值…

mac 开发新户攻略-brew

原文 https://www.cnblogs.com/kccdzz/p/7676840.html 这里为了备份一下,方便我自己寻找. 1.介绍 brew是一个软件包管理工具,类似于centos下的yum或者ubuntu下的apt-get,非常方便,免去了自己手动编译安装的不便brew 安装目录 /usr/local/Cellarbrew 配置目录 /usr/local/etcbre…

谈谈Exception,什么时候抛出?什么时候接住?

2019独角兽企业重金招聘Python工程师标准>>> DOTNET世界中的异常机制 ------------------------------ Exception是很基础&#xff0c;可是后期很麻烦的东西。初学者会认为exception仅仅是&#xff1a; try{}catch(Exception ex){}finally{} 但是到了后期开发&…