- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我想知道是否有任何方法可以调整(在 Linux 系统上)给定套接字的 MTU。 (使 IP 层分段成比实际设备 MTU 更小的 block )。
当我说对于给定的套接字时,我并不是指在拥有套接字的应用程序代码中以编程方式,而是在外部,例如通过 sysfs 条目。
如果目前没有办法做到这一点,您是否知道在 linux 内核中的何处 Hook /打补丁以实现这种可能性?
谢谢。
编辑:我到底为什么要这么做?
我正在做一些 Layer3-in-Layer4(例如:通过 TCP 隧道隧道 IP 及以上)隧道。与类似 VPN 的解决方案不同,我没有使用虚拟接口(interface)来实现这一点。我正在使用 iptables 捕获数据包,以正常方式丢弃它们并将它们写入隧道套接字。
考虑一个大文件传输的情况,所有数据包都被填充到 MTU 大小。当我对它们进行隧道传输时,我会添加一些开销,导致每个原始数据包都产生两个隧道数据包,这是欠佳的。
最佳答案
如果创建套接字后在传出数据包上设置了 DF,您可能会幸运地欺骗(注入(inject))ICMP 分段需要的消息返回给自己,直到您最终获得所需的 MTU。相当丑陋,但取决于你有多绝望,它可能是合适的。
例如,您可以使用 iptables 规则生成这些数据包,因此匹配和发送很简单并且在您的应用程序外部。看起来 iptables 的 REJECT 目标没有 reject-with of fragmentation 需要,但添加一个可能不会太棘手。
另一种方法,如果它只是您关心的 TCP 数据包,您可能会幸运地使用套接字选项 TCP_MAXSEG 或 TCPMSS 目标(如果这适合您的问题)。
对于 UDP 或原始数据包,您可以自由地send()
数据包,只要您喜欢!
更新:
基于“我为什么要那样做?”回答,如果未设置 DF 或提高 ICMP“需要分段”并丢弃实际上是正确的解决方案,则似乎分段数据包。
这是一个更“正常”的路由器会做的事情,如果防火墙不吃掉 ICMP 数据包,那么它在所有情况下都会表现正常,而回顾性地改变事情是奇怪行为的秘诀。
iptables clamp mss不过,对于通过此“VPN”的 TCP 来说,这是一个很好的解决方案,尤其是当您似乎已经广泛使用 iptables 时。
关于linux - 在每个套接字的基础上调整 MTU?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4165403/
获取 MTU 大小值的 POSIX 函数是什么??谢谢。 最佳答案 不,没有通用的 POSIX 函数。您可以做的最好的事情是在套接字上调用 GET_MTU/SIOCGIFMTU ioctl,但这不在
我是 BLE 开发的新手。我想通过 BLE 连接以最大吞吐量发送大量数据。 我有一个在 Linux 上运行的 GATT 服务器,以及一个在 Android 上作为应用程序运行的客户端。我创建了一个具有
我想通过ifconfig docker0 mtu 1400将docker0 mtu修改为1400,并且成功。 但过了一会儿,MTU回到1500。请帮忙,如何在我的K8S集群中修改docker0。 最佳
我是一名新手,正在尝试一些网络编程。我正在通过多播读取数据(请参见下面的代码),并且想要找到最大传输单元(MTU)或我可以读取的传输单元。任何人都可以指导我找到来源或方法来做到这一点。谢谢。 tr
我想知道是否有任何方法可以调整(在 Linux 系统上)给定套接字的 MTU。 (使 IP 层分段成比实际设备 MTU 更小的 block )。 当我说对于给定的套接字时,我并不是指在拥有套接字的应用
ifconfig 1.2.3.4 mtu 1492 这会将传入、传出数据包或两者的 MTU 设置为 1492?我认为它仅适用于传入 最佳答案 TLDR:两者都有。它只会传输有效载荷长度小于或等于该大小
我用 BluetoothGatt.requestMtu(512)在我的安卓应用程序中。 第一次效果很好 但是在 Mtu 自动更改为 23 之后(默认) 我不知道是什么问题... 这是一个日志 `D/B
我正在开发与 BLE 设备通信的应用程序。我可以轻松地在特征上写 20 个字节,但是当它超过 20 个字节时就会产生问题。我正在使用 mBluetoothGatt.requestMtu(512); 成
我的手机在向网络发送数据时出现问题。我认为我必须更改其 MTU 大小才能使其正常工作。 最佳答案 要更改 MTU 设置,您需要对手机进行 Root。在论坛中搜索如何操作。之后你需要安装一个终端模拟器并
我在 iOS 7 中使用 CoreBluetooth,并成功地让两台设备在彼此之间发送大量数据(一个是中央设备,一个是外围设备)。 在 iPhone 5 和 4S 之间我有一个 20 字节的 MTU,
我需要将 MTU 永久更改为 1500。我所说的永久是指如果我重新启动系统或将执行 service network restart,它将始终为 1500。 我关注了这篇文章http://www.cyb
如何找到连接之间的路径 MTU?我需要它来定义我的 UDP 连接的数据包大小。 .Net 中有 Path MTU Discovery 之类的东西吗? 最佳答案 我找到了一种方法(解决方法)来在 C#
我正在开发一个应用程序,我需要在多个 UDP 数据包中向客户端发送大量数据,我如何以编程方式确定我的 UDP 套接字的 MTU? 我需要能够在 Windows 和 Linux 上执行此操作。 最佳答案
对智能手机上 BLE 的参数进行一些跨平台研究。 我有 iOS 设备,因此嗅探了适用于 iOS 的 ATT_Exchange_MTU_Req/Rsp。 有没有人为 Android 做过同样的事情并获得
写入器程序使用固定缓冲区的多次写入发送几 MB(几乎没有延迟)。处理程序在 EPOLLOUT | 中注册。 EPOLLET 标志。 MTU=16KB,写入缓冲区 = 4KB 或更多。 write(..
我的 RAW-Socket 有一个小问题。我必须捕获网络中的数据包才能修改它们。为此,我必须添加特殊数据,例如时间戳。一切正常,但我的 MTU (Linux) 有问题。 如果上层的某些应用程序生成接近
我正在使用 ioctl(s, SIOCSIFMTU, (caddr_t)&ifr) 更改接口(interface)的 MTU。 代码类似这样 struct ifreq ifr; ifr.ifr_add
当我通过 TCP 套接字连接时,我的设备出现问题,因为客户端在 SYN 连接中发送 MSS,并且服务器(我的设备)使用相同的 MSS 设置,但我不想在我的设备中设置此 MSS。 那么我怎样才能在MSS
class A : boost::noncopyable { int type; A(int type, enum e) : type(type) { /* ... */ } } ty
我正在学习内核模块并且是新手。我想更改 eth0 的 MTU 大小。这是我写的模块程序。 本意是将 eth0 的 MTU 大小更改为 1000。但它没有得到更改。谁能告诉我,我错过了什么。如果方法本身
我是一名优秀的程序员,十分优秀!