当前位置: 首页 > news >正文

数据的TCP分段和IP分片

本文简述下TCP分段和IP分片的区别与联系。

我们知道,用户空间的数据拷贝到内核空间的TCP发送缓冲区(这个是一个结构体,叫sk_buffer,简称skb)后就由内核网络协议栈做后续的封装和发送处理了,用户无需考虑下层的网络问题。
按理来说,MAC帧中搭载的数据部分越长,则一次可发送的数据越多,即数据发送效率就越大。但是由于数据链路的负载能力不是没有上限的,而且为了更方便差错控制,每一种数据链路层协议都规定了数据帧的数据部分上线,即最大传送单元MTU,MAC协议的MTU是1500字节。
这个1500字节不包括以太网的帧头、帧尾,而是包括IP头、TCP头和数据部分。
因此,IP层如果封装后的报文大于1500字节,那就违反了MAC协议,因此无法被封装成MAC帧,IP层此时必须将数据进行分片。

而这1500字节里,还有固定的IP报头20字节,TCP报头的20~60字节(一般是20字节),因此从TCP发送缓冲区到封装成TCP报文,TCP层也需要对数据进行分段,使其起码要小于1460.当然具体来说是小于(MTU - IP头长度 - TCP头度),这个长度成为最大报文长度MSS,英文全称Maximum Segment Size。

这个过程如下图:
在这里插入图片描述

问题一:为什么IP对数据分片了,还要TCP分段?

既然IP层会迫于MTU的限制而对数据报进行分片,使其符合MAC协议,并能够正常在以太网中传输。IP层使得数据报满足了MTU,那里面负载的数据肯定小于MSS呀,为什么还需要TCP分段呢?
因为对于一份很大的数据,如果只是IP分片,那么某个数据片丢失后,TCP的重传机制是对这整个数据进行重传,IP是它的下层协议,它不知道IP对这个数据分了多少片,自然也不知道是哪个片丢失了。
而TCP也分段之后,该段数据丢失了,那么TCP只需要重传这一段就可以了。

问题二:TCP有分段,IP还要分片吗?

既然TCP的分段使得数据满足了MSS的要求,肯定也就满足了MTU的要求吧,为什么IP层还是需要对数据分片。

IP分段取决于MTU大小,这个是和网络负载能力有关的。实际上,不同链路负载能力不同,不是所有链路大小都是1500字节。比如IP数据报在到达某路由器时,接下来要走的链路的MTU更小,那么路由器会在IP层对其继续分片,使其满足后面的链路的MTU要求。

http://www.lryc.cn/news/10330.html

相关文章:

  • HTML中嵌入B站视频
  • Mars3D Studio 的使用方法
  • Flutter For Web实践
  • 【神级Python代码】作为技术xiao白如何制作一款超炫酷的黑客主题代码雨?牛逼就完了。(源码分享学习)
  • 供应链挑战迎刃而解!桑迪亚国家实验室使出“量子杀手锏”
  • java程序设计-ssm博客管理系统
  • 从0到1一步一步玩转openEuler--17 openEuler DNF(YUM)检查更新
  • SpringBoot-自动配置-@Import注解与@EnableAutoConfiguration注解
  • 【笔记】C#一维数组、多维数组和交错数组的区别总结
  • 【SpringBoot】分布式日志跟踪—通过MDC实现全链路调用日志跟踪
  • 【设计模式】创建型模式
  • Spark Catalyst 查询优化器原理
  • 贝叶斯分析法在市场调研中的应用
  • JavaEE——MyBatis将查询结果集封装进POJO实体类
  • C++11 包装器function
  • XCP实战系列介绍14-基于Vector_Davinci工具的XCP配置介绍(三)
  • 计算机图形学:中点BH算法对任意斜率的直线扫描转换方法
  • (十一)、用户中心页面【uniapp+uinicloud多用户社区博客实战项目(完整开发文档-从零到完整项目)】
  • LA@复数和复矩阵@实对称阵相关定理
  • cmd set命令笔记
  • IB学校获得IBO授权究竟有多难?
  • 火山引擎 DataTester:A/B 测试,让企业摆脱广告投放“乱烧钱”
  • 黑马redis学习记录:缓存
  • CD20靶向药物|适应症|市场销售-上市药品前景分析
  • 多源 复制
  • 微服务项目【消息推送(RabbitMQ)】
  • vr电力刀闸事故应急演练实训系统开发
  • C++类和对象补充
  • 08 SpringCloud 微服务网关Gateway组件
  • 极验3代 加密分析