TCP和UDP协议发送数据包的大小

2023-05-16

在进行UDP编程的时候,我们最容易想到的问题就是,一次发送多少bytes好?

       当然,这个没有唯一答案,相对于不同的系统,不同的要求,其得到的答案是不一样的,这里仅对像ICQ一类的发送聊天消息的情况作分析,对于其他情况,或许也能得到一点帮助:
首先,我们知道,TCP/IP通常被认为是一个四层协议系统,包括链路层,网络层,传输层,应用层.UDP属于运输层,下面我们由下至上一步一步来看:
以太网(Ethernet)数据帧的长度必须在46-1500字节之间,这是由以太网的物理特性决定的.这个1500字节被称为链路层的MTU(最大传输单元).但这并不是指链路层的长度被限制在1500字节,其实这个MTU指的是链路层的数据区.并不包括链路层的首部和尾部的18个字节.所以,事实上,这个1500字节就是网络层IP数据报的长度限制.因为IP数据报的首部为20字节,所以IP数据报的数据区长度最大为1480字节.而这个1480字节就是用来放TCP传来的TCP报文段或UDP传来的UDP数据报的.又因为UDP数据报的首部8字节,所以UDP数据报的数据区最大长度为1472字节.这个1472字节就是我们可以使用的字节数。:)
当我们发送的UDP数据大于1472的时候会怎样呢?这也就是说IP数据报大于1500字节,大于 MTU.这个时候发送方IP层就需要分片(fragmentation).把数据报分成若干片,使每一片都小于MTU.而接收方IP层则需要进行数据报的重组.这样就会多做许多事情,而更严重的是,由于UDP的特性,当某一片数据传送中丢失时,接收方便无法重组数据报.将导致丢弃整个UDP数据报。
因此,在普通的局域网环境下,我建议将UDP的数据控制在1472字节以下为好.
进行Internet编程时则不同,因为Internet上的路由器可能会将MTU设为不同的值.如果我们假定MTU为1500来发送数据的,而途经的某个网络的MTU值小于1500字节,那么系统将会使用一系列的机制来调整MTU值,使数据报能够顺利到达目的地,这样就会做许多不必要的操作.鉴于 Internet上的标准MTU值为576字节,所以我建议在进行Internet的UDP编程时.最好将UDP的数据长度控件在548字节 (576-8-20)以内.

理论上,IP数据报的最大长度是65535字节,这是由IP首部16比特总长度字段所限制的。去除20字节的IP首部和8个字节的UDP首部,UDP数据报中用户数据的最长长度为65507字节。但是,大多数实现所提供的长度比这个最大值小。
我们将遇到两个限制因素。第一,应用程序可能会受到其程序接口的限制。socket API提供了一个可供应用程序调用的函数,以设置接收和发送缓存的长度。对于UDP socket,这个长度与应用程序可以读写的最大UDP数据报的长度直接相关。现在的大部分系统都默认提供了可读写大于8192字节的UDP数据报(使用这个默认值是因为8192是NFS读写用户数据数的默认值)。
第二个限制来自于TCP/IP的内核实现。可能存在一些实现特性(或差错),使IP数据报长度小于65535字节。
在SunOS 4.1.3下使用环回接口的最大IP数据报长度是32767字节。比它大的值都会发生差错。
但是从BSD/386到SunOS 4.1.3的情况下,Sun所能接收到最大IP数据报长度为32786字节(即32758字节用户数据)。
在Solaris 2.2下使用环回接口,最大可收发IP数据报长度为65535字节。
从Solaris 2.2到AIX 3.2.2,发送的最大IP数据报长度可以是65535字节。很显然,这个限制与源端和目的端的实现有关。
主机必须能够接收最短为576字节的IP数据报。在许多UDP应用程序的设计中,其应用程序数据被限制成512字节或更小,因此比这个限制值小。
由于IP能够发送或接收特定长度的数据报并不意味着接收应用程序可以读取该长度的数据。因此,UDP编程接口允许应用程序指定每次返回的最大字节数。如果接收到的数据报长度大于应用程序所能处理的长度,那么会发生什么情况呢?不幸的是,该问题的答案取决于编程接口和实现。
典型的Berkeley版socket API对数据报进行截断,并丢弃任何多余的数据。应用程序何时能够知道,则与版本有关(4.3BSD Reno及其后的版本可以通知应用程序数据报被截断)。
SVR4 下的socket API(包括Solaris 2.x) 并不截断数据报。超出部分数据在后面的读取中返回。它也不通知应用程序从单个UDP数据报中多次进行读取操作。TLI API不丢弃数据。相反,它返回一个标志表明可以获得更多的数据,而应用程序后面的读操作将返回数据报的其余部分。在讨论TCP时,我们发现它为应用程序提供连续的字节流,而没有任何信息边界。TCP以应用程序读操作时所要求的长度来传送数据,因此,在这个接口下,不会发生数据丢失。

 

----------------------------------------------------------------------------------------------------------------------------------------------------
****************************************************************************************************************************************************
TCP 和 UDP 协议发送数据包的大小(浅析)


MTU最大传输单元,这个最大传输单元实际上和链路层协议有着密切的关系,EthernetII帧的结构DMAC+SMAC+Type+Data+CRC由于以太网传输电气方面的限制,每个以太网帧都有最小的大小64bytes最大不能超过1518bytes,对于小于或者大于这个限制的以太网帧我们都可以视之为错误的数据帧,一般的以太网转发设备会丢弃这些数据帧。


由于以太网EthernetII最大的数据帧是1518Bytes这样,刨去以太网帧的帧头(DMAC目的MAC地址48bit=6Bytes+SMAC源MAC地址48bit=6Bytes+Type域2bytes)14Bytes和帧尾CRC校验部分4Bytes那么剩下承载上层协议的地方也就是Data域最大就只能有1500Bytes这个值我们就把它称之为MTU。

PPPoE所谓PPPoE就是在以太网上面跑PPP协议,有人奇怪了,PPP协议和Ethernet不都是链路层协议吗?怎么一个链路层跑到另外一个链路层上面去了,难道升级成网络层协议了不成。其实这是个误区:就是某层协议只能承载更上一层协议。

为什么会产生这种奇怪的需求呢?这是因为随着宽带接入(这种宽带接入一般为Cable Modem或者xDSL或者以太网的接入),因为以太网缺乏认证计费机制而传统运营商是通过PPP协议来对拨号等接入服务进行认证计费的.

PPPoE带来了好处,也带来了一些坏处,比如:二次封装耗费资源,降低了传输效能等等,这些坏处俺也不多说了,最大的坏处就是PPPoE导致MTU变小了以太网的MTU是1500,再减去PPP的包头包尾的开销(8Bytes),就变成1492。

UDP 包的大小就应该是 1492 - IP头(20) - UDP头(8) = 1464(BYTES)
TCP 包的大小就应该是 1492 - IP头(20) - TCP头(20) = 1452(BYTES)

目前大多数的路由设备的MTU都为1500
我对上面的理解是:如果我们定义的TCP和UDP包小于1452,1464,那么我们的包在IP层就不用分包了,这样传输过程中就避免了在IP层组包发生的错误。如果使用UDP协议,如果IP层组包发生错误,那么包就会被丢弃,UDP不保证可靠传输。但是TCP发生组包错误时,该包会被重传,保证可靠传输。所以,我们在用Socket编程时,包的大小设定不一定非要小于1400,UDP协议要求包小于64K,TCP没有限定。




总结:

我们设定包的大小对于UDP和TCP协议是不同的,关键是看系统性能和网络性能,网络是状态很好的局域网,那么UDP包分大点,提高系统的性能。不好,就分小于1464,这样可以减低丢包率。对于TCP来说,这个就要靠经验了,因为,TCP丢包可以自动重传,分大了,系统性能提高了,分包和错误重组可能会耗费时间,使传送时间延长,分小了,系统性能又降低了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TCP和UDP协议发送数据包的大小 的相关文章

  • 主成分分析之法国经济分析数据详解

    用数据框的形式输入数据 conomy lt data frame x1 61 c 149 3 161 2 171 5 175 5 180 8 190 7 202 1 212 4 226 1 231 9 239 0 x2 61 c 4 2 4
  • 朴素贝叶斯 手机垃圾信息过滤 机器学习与R语言

    Chapter 4 Classification using Naive Bayes Example Filtering spam SMS messages Step 2 Exploring and preparing the data r
  • 子网掩码和IP地址计算网络地址和广播地址的换算

    子网掩码和IP地址计算网络地址和广播地址的换算 已知 IP地址为 xff1a 202 112 14 137 子网掩码 xff1a 255 255 255 224 要求计算出这台主机所在的网络地址和广播地址是 xff1f 解 xff1a 第一
  • 手机浏览器查看vue项目

    在手机浏览器上面我们可以直接查看vue项目 在有网的条件下 xff0c 我们使用指令npm run serve启动一个项目 xff0c 会出现两个网址 xff0c 一个是本地的 xff0c 一个是网络的 在手机浏览器地址栏输入第二个网址 x
  • STM32 HAL库IIC驱动

    1 STM32上IIC的一些争议 关于STM32的IIC驱动 xff0c 网上有很多争论 xff0c 究竟是使用STM32自带的硬件IIC还是用IO口和软件模拟IIC呢 xff1f 下面这个图形象展示了这些争论 总结一些 xff1a ST为
  • 怎么看jdk的安装路径

    首先 xff0c 先来说下第一种情况 已经安装好了jdk xff0c 也配置了环境变量 xff0c 这种情况下 xff0c 查看jdk路径是很容易的 在window环境下 xff0c 我们先执行java version 指令查看是否已经配置
  • c总结 使用scanf输入字符串问题

    学习c时经常遇到字符串的输入问题 xff0c 使用scanf输入时总是会或多或少的遇到错误 xff0c 总结一下我遇到过的情况 同时输入字符和字符串 刚开始编写时可能大多数会这样写 xff1a xff08 ch1为字符类型的数组 xff0c
  • VCPKG安装和使用教程

    文章目录 1 安装2 使用命令选项 3 集成vcpkgWindows 上的 Visual Studio 集成Linux 或 macOS 上的 Visual Studio Code 集成删除 vcpkg 集成 使用举例4 详细介绍4 1 新增
  • docker中debian系统更换阿里云镜像源

    今天在docker中的debian系统中执行apt get update的时候 xff0c 看到一些无法连接http deb debian org源的错误 xff0c 如下 apt get span class hljs operator
  • 【Java】中常用类

    目录 一 String类 xff08 一 xff09 概述 xff08 二 xff09 String的特性 1 String的不可变性 2 String实例化方法 3 字符串拼接方式赋值对比 4 String使用陷阱 5 String类常用
  • golang如何执行脚本并获取返回值

    golang中如何执行脚本并获取返回值 调用脚本 在golang标准库中提供了两种方式可以用来启动进程调用脚本 第一种是在os库中的Process类型 xff0c Process类型包含一系列方法用来启动进程并对进程进行操作 xff08 参
  • Spring的Bean加载流程

    Spring IOC容器就像是一个生产产品的流水线上的机器 xff0c Spring创建出来的Bean就好像是流水线的终点生产出来的一个个精美绝伦的产品 既然是机器 xff0c 总要先启动 xff0c Spring也不例外 因此Bean的加
  • 【Java】枚举类和注解

    目录 一 枚举类的使用 1 枚举类的说明 xff1a 2 如何自定义枚举类 xff1f 3 JDK 5 0 新增使用enum定义枚举类 二 注解的使用 1 注解的理解 2 注解的使用示例 3 如何自定义注解 4 元注解 xff1a 5 如何
  • 【Java】集合

    目录 一 集合与数组 1 集合与数组存储数据概述 xff1a 2 数组存储的特点 xff1a 3 数组存储的弊端 xff1a 4 集合存储的优点 xff1a 5 集合的分类 6 集合的框架结构 二 Collection接口 1 单列集合框架
  • 【Java】泛型

    目录 一 泛型简介 1 泛型的概念 2 泛型的引入背景 3 引入泛型的目的 二 泛型在集合中的应用 1 在集合中没有使用泛型的例子 2 在集合中使用泛型的例子1 3 在集合中使用泛型例子2 4 集合中使用泛型总结 xff1a 三 自定义泛型
  • 【Java】IO流

    目录 一 File类的使用 1 File类的理解 2 File的实例化 3 File类的常用方法 4 内存解析 5 小练习 二 IO流概述 1 简述 2 流的分类 3 IO流的体系分类 4 输入 输出标准化过程 三 节点流 xff08 文件
  • 【Java】网络编程

    目录 一 概述 二 网络通讯要素 3 通讯要素一 xff1a IP和端口号 4 通信要素二 xff1a 网络通信协议 5 套接字Socket 三 TCP网络编程 1 基于Socke的TCP编程 四 UDP网络编程 1 简述 2 Datagr
  • 【Java】反射

    目录 一 反射的概述 1 反射的简介 2 反射动态性体现 3 反射机制提供的功能 4 相关API 二 Class类 1 Class简述 2 Class类的常用方法 3 获取Class实例的几种方式 xff1a 4 Class实例可以代表的结
  • 【Java】之Java8新特性

    Java 基础系列的笔记终于完成了 x1f389 x1f389 x1f389 目录 一 Lambda 表达式 1 Lamdba 表达式概述 2 使用 Lambda 表达式前后对比 3 怎样使用Lambda表达式 4 Lamdba表达式总结
  • 【Docker】基础使用

    目录 一 Docker简介 二 Docker核心概念 三 Docker安装 四 Docker常用操作 1 镜像操作 2 容器操作 3 安装MySQL 一 Docker简介 Docker 是一个开源的应用容器引擎 xff0c 基于Go 语言并

随机推荐

  • ASP.NET MVC | 简介

    目录 前提 1 教程 2 MVC 编程模式 最后 前提 在学习学过很多课程 xff0c 但是最主要学的还是ASP NET MVC这门课程 xff0c 工作也是用的ASP NET MVC xff0c 所以写一点ASP NET MVC的东西 x
  • ASP.NET MVC | 创建应用程序

    目录 首先 NO 1 No 2 App Data 文件夹 Content 文件夹 Controllers 文件夹 Models 文件夹 Views 文件夹 Scripts 文件夹 最后 首先 一步一步的来 xff0c 电脑上需要安装vs20
  • 关于Docker的Debian和Ubuntu镜像

    Debian和Ubuntu都是目前较为流行的Debian系的服务器操作系统 xff0c 在Docker Hub上都可以直接搜索到官方版本 一 搜索Debian 二 搜索Ubuntu Ubuntu相关镜像很多 xff0c 使用 s 参数 xf
  • ASP.NET MVC | 增删改查小项目-MySQL数据库

    目录 前提 数据库和表 完成展示 主页 xff1a Index 添加商品页面 xff1a Add 修改商品页面 xff1a Edit 删除 xff1a Del 代码 No 1 配置MySQL数据库 No 2 初始化数据 No 3 删除操作
  • 用Navicat Premium连接数据库!

    Navicat Premium介绍 Navicat Premium 是一套数据库开发工具 xff0c 让你从单一应用程序中同时连接 MySQL MariaDB MongoDB SQL Server Oracle PostgreSQL 和 S
  • 介绍一款非常好用的截图软件-《Snipaste》

    目录 Snipaste介绍 Snipaste下载 Snipaste功能介绍 总结 Snipaste介绍 非常好用的截图软件 xff0c 一句话 xff0c 非常非常好用 xff0c 比你用过任何的截图软件都好用 xff0c 不好用你顺着网线
  • 推荐一款卸载软件的小工具-《UninstallToo》

    目录 UninstallToo介绍 UninstallToo下载 UninstallToo使用 总结 UninstallToo介绍 Uninstall Tool 是一款可以用来替代 添加 删除程序 的工具 它允许您显示隐藏的安装程序 xff
  • 【MySQL】下载(超详细教程)

    目录 First 下载 Second 安装 Third 检测是否安装 Last 总结 First 下载 首先 xff0c 我们一步一步跟着我的操作来 xff0c 不能越步骤 xff0c 很容易报错 xff0c 就芭比Q了 第一步直接进入这个
  • 【ASP. Net Mvc】毕设之【在线考试项目】

    前提 这个项目是毕设 xff0c 是用asp net mvc和SQL server数据库完成的 xff0c 分为前端和后台 后台功能 xff1a 老师添加试卷 xff0c 上传试卷 xff0c 审核试卷 xff0c 管理学生 前端功能 xf
  • 继承——Person为父类,Teacher和Student都继承Person

    一 题目 按照要求完成以下操作 创建Person xff0c Teacher xff0c Student类 其中 xff0c Person为父类 xff0c Teacher和Student都继承Person Person中有属性 xff1a
  • c语言求数组中10 个整数中最大值

    c语言求数组中10 个整数中最大值 要求在数组中输入10个整数 xff0c 输出最大值 这里先用一种简单的方法 xff0c 创建一个变量max xff1d 0 xff0c 用max与这10个数依次比较 xff0c 如果比max大就把它的值赋
  • c语言详细解答辗转相除法求两个数的最小公倍数

    C语言详细解答辗转相除法求两个数的最小公倍数 1 辗转相除法的用法 最大公约数 辗转相除法是用一个大的数除以一个小的数 xff0c 如果有余数 xff0c 就用被除数 余数 xff0c 如果还有余数就继续用 xff08 上一个公式的 被除数
  • Linux 嵌入式 笔记 NFS网络文件系统

    文章目录 Linux 嵌入式 笔记 提示 xff1a 写完文章后 xff0c 目录可以自动生成 xff0c 如何生成可参考右边的帮助文档 文章目录 文章目录前言一 nfs 相关命令二 原理1 第一点2 第二点 总结 前言 注意 xff1a
  • linux下cpu锁定频率以及频率设置

    linux下cpu锁定频率以及频率设置 环境如下 ubuntu22 04cpu为5700g 前期准备 使用工具为 xff1a cpufrequtils span class token function sudo span span cla
  • CentOS7安装xrdp(windows远程桌面连接linux)

    前提 CentOS安装桌面 xff0c 如果无桌面 xff0c 请执行 xff1a yum y groups install 34 GNOME Desktop 34 startx 方法一 配置源 yum install epel y 安装x
  • Linux CPU超频设置

    查看当前cpu运行频率 xff1a cat proc cpuinfo grep i cpu mhz 开始设置 xff1a cpupower c all frequency set g performance 或者 cpupower freq
  • Ozone调试经验总结

    如何查看内存 view gt memory打开内存窗口即可查看 如何读写内存 Target ReadU32 addr Target WriteU32 addr value 遇到不会的 xff0c 可以使用help命令找找看
  • 元宇宙创作者必备技能TouchDesigner

    元宇宙的资源清单又更新啦 github com shadowcz007 awesome metaverse 感谢ML211 提供线索metaworld app 感谢ML1462 提供线索 The Sims Resource opus Git
  • 栈的入栈和出栈的顺序规律

    栈的入栈和出栈的顺序规律是先进后出 xff0c 所以出栈的可能数目跟入栈的可能排列数目是一致的 a的出入有2中可能 xff0c b的出入有2种可能 xff0c c的出入有2种可能 xff0c d只需要关系入 xff0c 只有一种可能 所以出
  • TCP和UDP协议发送数据包的大小

    在进行UDP编程的时候 我们最容易想到的问题就是 一次发送多少bytes好 当然 这个没有唯一答案 xff0c 相对于不同的系统 不同的要求 其得到的答案是不一样的 这里仅对像ICQ一类的发送聊天消息的情况作分析 xff0c 对于其他情况