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

TCP分片解析

本文目录

  • 什么是IP分片
  • 为什么会产生IP分片
  • 为什么要避免IP分片
  • 如何避免IP分片

什么是IP分片

IP协议栈将TCP/UDP传输层要求它发送的,但长度大于发送端口MTU的一个数据包,分割成多个IP报文后分多次发送。这些分成多次发送的多个IP报文就是IP分片。

为什么会产生IP分片

TCP/UDP是工作在传输层,依赖于IP协议在网络层提供的服务。IP层又依赖于链路层提供的报文发送服务。链路层会根据链路层协议的不同,会要限制每次发送数据帧的最大长度(称之为Maximum Transmission Unit,最大传输单元MTU)。所以当TCP/UDP往IP层发送数据时(相当于IP层从TCP/UDP传输层接收到一份要发送的IP数据报),IP层要判断向本地哪个接口发送数据(选路),并查询该接口获得其MTU。IP把MTU与数据报长度进行比较,如果太长了一次发送不下(超过MTU)则需要则需要将这个数据报文,分割成多个IP报文后分多次发送,就产生了IP分片。这就是IP分片产生的原因。因为路由器是工作在IP层,负责IP报文的转发的,所以分片可以发生在原始发送端主机上,也可以发生在中间路由器上。

为什么要避免IP分片

IP分片产生了二个坏的影响:

  • IP头部占用了更多的带宽
    IP分片使得原来的一个IP报文,变成了多个IP报文,那么更多的IP报文,就使得IP头部占用了更多的网络带宽,网络传有效载荷的能力下降,使得网络有效吞吐能力下降。
  • 增加了报文丢失率
    IP分片发生在IP层,不仅发送商端主机会进行分片,中间的路由器也有可能分片,因为不同的网络的MTU是不一样的,如果传输路径上的某个网络的MTU比发送端网络的MTU要小,路由器就可能对IP数据报再次进行分片。然而,按照IP协议的定义,IP分片数据的重组只会发生在目的端的IP层,即当所有分片都正确到达目的端时,目的端会将这些IP分片重组成一个完整的数据报文,再提供给上层。如果注意这些分片报文中,只有第一片才带有传输层协议的状况信息,所以只要其中任何一个IP分片丢失或者超时,就会引起所有IP分片报文的丢失。此时如果传输层是不支持重传的不可靠协议,比如UDP,那么整个报文就全部丢失了(一个IP分片的丢失,引发所有IP分片的丢弃),这就增加了报文丢失率的,使得网络有效吞吐能力下降。
  • 降低了重传效率降低
    IP分片发生在IP层,不仅发送商端主机会进行分片,中间的路由器也有可能分片,因为不同的网络的MTU是不一样的,如果传输路径上的某个网络的MTU比发送端网络的MTU要小,路由器就可能对IP数据报再次进行分片。然而,按照IP协议的定义,IP分片数据的重组只会发生在目的端的IP层,即当所有分片都正确到达目的端时,目的端会将这些IP分片重组成一个完整的数据报文,再提供给上层。如果注意这些分片报文中,只有第一片才带有传输层协议的状况信息,所以只要其中任何一个IP分片丢失或者超时,就会引起所有IP分片报文的丢失。此时如果传输层是支持重传的可靠协议,比如TDP,那么整个报文全部都需要重传(一个IP分片的丢失,引发所有IP分片的重传),这就大大的降低的重传的效率,使得网络有效吞吐能力下降。

如何避免IP分片

  • 对于UDP
    我们需要在应用层去限制每个包的大小,应用层在往UDP层发送数据时,就考虑链路上的最小MTU,让自己发送的数据包+IP头+UDP头的总长度不要超过MTU。

  • 对于TCP数据
    应用层就不需要考虑这个问题了,因为TCP已经帮我们做了。TCP用TCP的MSS的计算与详解来保证每次发送的TCP报文的数据都不会超过MSS,也就保证了IP数据报不会超过MTU,从而避免了IP分片。

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

相关文章:

  • 开发了一款基于 Flask 框架的在线电影网站系统(附 Python 源码)
  • 如何获得CSM--敏捷教练证书
  • Java面试数据库
  • 关于进行vue-cli过程中的解决错误的问题
  • Rockchip Linux USB Gadget
  • Linux -文件系统操作与帮助命令
  • UMI 创建react目录介绍及配置
  • 基于matlab使用机器学习和深度学习进行雷达目标分类
  • Protocol Buffers V3语法全解
  • MediaPipe之人体关键点检测>>>BlazePose论文精度
  • CSS从入门到精通专栏简介
  • day01常用DOS命令
  • Java设计模式-生成器模式(建造模式)
  • ansible的常用模块介绍
  • 你不会还不知道如何监测用户的网络是否在线吧?
  • ASM Quorum FailGroup RAC on Extended Distance Clusters
  • VHDL语言基础-时序逻辑电路-触发器
  • 也许你应该学学 postman了
  • VHDL语言基础-状态机设计-ASM图法状态机设计
  • Python文件的属性获取,重命名,目录的创建,显示和改变
  • 好用的iPhone 数据恢复软件精选
  • Linux搭建redis集群6.x版本【超简单】
  • 双重检查锁是如何避免缓存雪崩的,代码例子说明
  • 【成为架构师课程系列】架构设计中的核心思维方法
  • Apollo/Nacos配置动态刷新原理及优劣
  • docker的基本管理
  • 2023年房地产投资-租金和IRR研究报告
  • 2023-2-10刷题情况
  • Python学习-----无序序列2.0(集合的创建、添加、删除以及运算)
  • 2023最详细的接口测试用例设计教程