网络编程之UDP中一个包的大小最大能多大
读书笔记:here
结论1:局域网环境下,建议将UDP数据控制在1472字节以下
一定要知道
因为链路层的传输单元(MTU)是1500字节,1500字节中并不包含链路层的首尾18个字节。1500字节是链路层的数据区。 udp数据包就是放在这个数据区中,
网络层是数据链路层的上层,所以,网络层IP数据报长度就是1500字节。 这1500字节包含了IP数据报首部+IP数据报的数据区。 1500-20=1480,这1480的长度专门存放TCP传来的数据报: TCP或者UDP数据报。
由上可知,UDP数据报的长度为1480字节(含有报头),而UDP首部占有8个字节,故UDP的数据区长度为1472字节(1480-8=1472).
注意,上面这些都是理论数据。
丢包或者重组
因为UDP不保证数据的可靠性。那么,当传给UDP数据区的长度大于1472时,此时,IP数据报的长度已经大于1500字节。这时,IP层就需要将这个数据包分片发送并在接收端重组。 但是,如果分片传输的过程中出现丢包,怎么处理? 比如,IP层需要将一个2000字节的数据包分为两个包A和B发出,接收端没有收到B仅收到A。那么,IP层将会丢弃整个数据包,当然也就不会有重组了。
结论2:Internet编程时,建议将UDP数据控制在548字节以下
网络中的设备繁多,可能设定的传输控制单元(MTU)的大小也不尽相同。这样,同一段数据经历不同的设备,设备需要做很多繁琐的工作。
根据Internet的协议,MTU设置576字节。 实际中,我们应该尽量控制UDP数据报中的数据区的长度为548(576-8(首部长度)=548)字节以下。
unix网络编程第一卷里说:ipv4协议规定ip层的最小重组缓冲区大小为576!所以,建议udp包不要超过这个大小,而不是因为internet的标准MTU是576!
网络编程之UDP中一个包的大小最大能多大的更多相关文章
- UDP中一个包的大小最大能多大?TCP呢?
(以上为以太网的帧格式) Preamble:前导同步码7个字节+帧开始定界符1个字节=8个字节 Destination MAC adress:目的MAC地址 Source MAC adress:源MA ...
- Java网络编程之UDP
Java网络编程之UDP 一.C/S架构中UDP网络通信流程 ①创建DatagramSocket与DatagramPacket对象 ②建立发送端,接收端 ③建立数据包 ④调用Socket的发送.接收方 ...
- 网络编程之UDP编程
网络编程之UDP编程 UDP协议是一种不可靠的网络协议,它在通信的2端各建立一个Socket,但是这个Socket之间并没有虚拟链路,这2个Socket只是发送和接受数据的对象,Java提供了Data ...
- IP分片 与 TCP分段的区别 !!!!careful========以及udp中一个包大小究竟为多大合适 ==========三次握手四次挥手细节
首先声明:TCP分片应该称为TCP分段 TCP/IP详解--TCP的分段和IP的分片 分组可以发生在运输层和网络层,运输层中的TCP会分段,网络层中的IP会分片.IP层的分片更多的是为运输层的UDP服 ...
- 网络编程之UDP(3)丢包总结
读书笔记 from here UDP socket缓冲区满造成的UDP丢包 如果socket缓冲区满了,应用程序没来得及处理在缓冲区中的UDP包,那么后续来的UDP包会被内核丢弃,造成丢包.在sock ...
- Python 之网络编程之socket(2)黏包现象和socketserver并发
一:黏包 ###tcp协议在发送数据时,会出现黏包现象. (1)数据粘包是因为在客户端/服务器端都会有一个数据缓冲区, 缓冲区用来临时保存数据,为了保证能够完整的接收到数据,因此缓冲区 ...
- java 网络编程之UDP通信和简单的群聊程序
*/ .hljs { display: block; overflow-x: auto; padding: 0.5em; color: #333; background: #f8f8f8; } .hl ...
- java网络编程之UDP通讯
详细介绍了java中的网络通信机制,尤其是UDP协议,通过对UDP的基本使用进行举例说明如何使用UDP进行数据的发送接收,并举了两个小demo说明UDP的使用注意事项. UDP协议原理图解: UDP协 ...
- (28)网络编程之UDP
介绍UDP通信协议的编程之前,先介绍一下网络编程,socket相关的概念: 网络编程:网络编程主要用于解决计算机与计算机(手机平板等)之间的数据传输问题. 网络编程:不需要基于html网页就可以达到数 ...
随机推荐
- 如何鉴定全基因组加倍事件(WGD)
目前鉴定全基因组加倍(whole-genome duplication events)有3种 通过染色体共线性(synteny) 方法是比较两个基因组的序列,并将同源序列的位置绘制成点状图,如果能在点 ...
- nginx_日志切割脚本
#!/bin/bash NGINX_LOG=/usr/loca/nginx/logs/access.log RE_LOG=/data/backup/`data +%Y%m%d` echo -e &qu ...
- dart系列之:HTML的专属领域,除了javascript之外,dart也可以
目录 简介 DOM操作 CSS操作 处理事件 总结 简介 虽然dart可以同时用作客户端和服务器端,但是基本上dart还是用做flutter开发的基本语言而使用的.除了andorid和ios之外,we ...
- C++中Try Catch中的继承
1.C++中Try Catch简介:我们编译运行程序出错的时候,编译器就会抛出异常.抛出异常要比终止程序灵活许多. 而C++异常是指在程序运行时发生的反常行为,这些行为超出了函数正常功能的范围.当程序 ...
- 巩固javaweb的第十九天
巩固内容: 使用 form 元素 使用 form 元素封装要提交的信息 要向服务器提交信息,需要使用 form 元素,所有要提交的信息都应该在 form 内部.在 注册界面中,所有要输入的信息都位于 ...
- A Child's History of England.33
To strengthen his power, the King with great ceremony betrothed his eldest daughter Matilda, then a ...
- Angular 组件通信的三种方式
我们可以通过以下三种方式来实现: 传递一个组件的引用给另一个组件 通过子组件发送EventEmitter和父组件通信 通过serive通信 1. 传递一个组件的引用给另一个组件 Demo1 模板引用变 ...
- Linux系统时钟与硬件时钟
linux系统有两个时钟:一个是由主板电池驱动的硬件时钟(Real Time Clock),也叫做RTC或者叫CMOS时钟.当操作系统关机的时候,用这个来记录时间,但是对于运行的系统是不用这个时间的: ...
- Prompt branches and tab completion
$ chmod +x ~/.git-prompt.sh $ chmod +x ~/.git-completion.bash $ atom ~/.bash_profile 编辑.bash_profile ...
- Linux基础命令---mailq显示邮件队列
mailq mailq指令可以显示出待发送的邮件队列. 此命令的适用范围:RedHat.RHEL.Ubuntu.CentOS.Fedora. 1.语法 mailq 2.选项参数列表 ...