我需要使用TCP通过具有固定非标准MTU(例如,1560)的子网发送一些数据.如果帧的长度小于MTU,则通过该子网传输的所有以太网帧应手动填充0.
因此,数据大小应为(1560 - sizeof(IP标头) - sizeof(TCP标头)).
这就是我要这样做的方式:
我设置TCP_CORK选项以减少数据的分段.它不可靠,因为有200毫秒的天花板,但它的工作原理.
我知道IP头的大小(20字节),因此数据长度应该等于(1540 - sizeof(TCP头)).
那就是问题所在.我不知道TCP头大小.它的"选项"字段的大小是浮动的.
所以,问题是:如何获得TCP头的大小?或者也许有一些方法来发送带有固定长度标头的TCP帧?
在Android上,我们有requestMtuand onMtuChanged,这似乎意味着如果中央设备和外围设备都基于Android,则必须手动协商MTU大小(但我可能是错的,并且可能在连接时也会自动发生,而无需我干预)。requestMtu仅讨论写请求(无响应写)操作的文档,没有提及通知,还说该文档用于“连接”,但没有提及它来自中央还是外围。
因此,目前尚不清楚,可以/应该使用连接的哪一侧requestMtu以及它如何影响通知大小和写入大小?
在iOS上,似乎没有直接替代品,requestMtu而我们只有central.maximumUpdateValueLength(自iOS 7,起)。它的文档(与Android相反)说它maximumUpdateValueLength仅用于通知更新,这意味着它仅在外围设备方面有用,因为您是从外围设备向中央发送通知。
但是写呢?如果我正在写(再次无响应)从中央到外围设备的特性,我如何知道我的批处理大小以确保有效写入?
考虑到混合系统(Android / iOS中央/外围设备),这一切都令人困惑,并且不清楚在哪方面以及何时/应该/应该请求/响应MTU大小协商。是否有描述ATT MTU交换选项的文档,它们对应于实际的Android和iOS实现?
有没有办法将 iOS 上的 MTU 值从默认值更改为任意值?
就像在 Android 中一样,可以执行 requestMTU(512)。
谢谢
我正在Linux中进行路径MTU发现的一些实验.据我所知,从RFC 1191中,如果路由器接收到一个非零DF位的数据包,并且该数据包无法在没有分段的情况下发送到下一个主机,那么路由器应丢弃数据包并将ICMP消息发送到初始发件人.
我在我的计算机上创建了几个VM,并按以下方式链接它们:
VM1 (192.168.100.2)
R1 (192.168.100.1,
192.168.150.1)
R2 (192.168.150.2,
192.168.200.1)
VM2 (192.168.200.2)
Run Code Online (Sandbox Code Playgroud)
Rx - 是安装了Linux的虚拟机,它们有两个带静态路由的网络接口.从V1 Ping V2并反之亦然.
traceroute from 192.168.100.2 to 192.168.200.2 (192.168.200.2)
1 192.168.100.1 (192.168.100.1) 0.437 ms 0.310 ms 0.312 ms
2 192.168.150.2 (192.168.150.2) 2.351 ms 2.156 ms 1.989 ms
3 192.168.200.2 (192.168.200.2) 43.649 ms 43.418 ms 43.244 ms
tracepath 192.168.200.2
1: ubuntu-VirtualBox.local 0.211ms pmtu 1500
1: 192.168.100.1 0.543ms
1: 192.168.100.1 0.546ms
2: 192.168.150.2 0.971ms
3: 192.168.150.2 1.143ms pmtu 750
3: 192.168.200.2 1.059ms reached
Run Code Online (Sandbox Code Playgroud)
段100.x和150.x具有MTU 1500.段200.x具有MTU 750.
我正在尝试发送启用了DF的UDP数据包.事实上,在数据包大小超过750的情况下,VM1根本不发送数据包(我收到了send()调用的EMSGSIZE错误). …
我必须编写一个代码,我需要在python中使用udp协议发送数据.我需要将数据包大小设置为网络的MTU值.有什么方法可以决定在python中编写一些代码的网络的MTU值?
目前我的程序正在调用system()来ifconfig执行此操作。
它看起来有点乱 - 也许ifconfig不在路径上,或者在某个非标准位置。然后我需要检查iproute2 的等效项,以防失败。
有没有办法使用 C 以编程方式设置它?
我想永久改变MTU来1500.通过永久我的意思是,如果我重新启动系统还是会做service network restart它总是支持1500.
我按照这篇文章http://www.cyberciti.biz/faq/centos-rhel-redhat-fedora-debian-linux-mtu-size/
但不幸的是,它对我不起作用.
这是我做的:
检查当前MTU:
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9001 qdisc pfifo_fast state UP qlen 1000
Run Code Online (Sandbox Code Playgroud)
添加MTU="1500"到/etc/sysconfig/network-scripts/ifcfg-eth0:
[root@ip-xx-xx-xxx~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
BOOTPROTO=dhcp
ONBOOT=yes
TYPE=Ethernet
USERCTL=yes
PEERDNS=yes
IPV6INIT=no
PERSISTENT_DHCLIENT=yes
IPV6_MTU="1500"
MTU="1500"
Run Code Online (Sandbox Code Playgroud)
然后MTU再次检查,(没有运气):
root@ip-xx-xx-xxx ~]# service network restart
Shutting down interface eth0: [ OK ]
Shutting down loopback interface: [ OK ]
Bringing up loopback interface: [ OK ]
Bringing up interface eth0:
Determining …Run Code Online (Sandbox Code Playgroud) 我在线阅读了各种网站和教程,但我仍感到困惑.如果消息大于IP MTU,则send()返回发送的字节.消息的其余部分会发生什么?我是否send()再次打电话并尝试发送其余信息?或者是IP层应该自动处理的东西?