发送固定长度的TCP帧

发送固定长度的TCP帧,第1张

概述发送固定长度的TCP帧

我需要使用TCP在固定的非标准MTU(例如1560)的子网上发送一些数据。 如果帧的长度小于MTU,则通过该子网传输的所有以太网帧都应手动填充0。

所以,数据大小应该是(1560 – sizeof(IP头) – sizeof(TCP头))。

这是我要这样做的方式:

我设置了TCP_CORK选项来减less数据的分段。 这是不可靠的,因为有200毫秒的天花板,但它的工作原理。

C的zip库,可以在windows上创build密码保护的zip文件?

使用循环与对象名称

为什么我的hrtimercallback在转发之后返回太早?

如何使用boost :: asio来抽象文件描述符?

Eclipse和MinGW中包含g ++的多个包含path(-I)

我知道IP头的大小(20字节),所以数据长度应该等于(1540 – sizeof(TCP头))。

那就是问题所在。 我不知道TCP头的大小。 它的“选项”字段的大小是浮动的。

所以,问题是:如何获得TCP头的大小? 或者也许有一些方法发送TCP帧与固定长度的头?

c#如何检查另一个进程正在使用的文件夹

为什么要在linux上挂载文件?

从linux上的消息队列读取时出错“错误的地址”

如何用dup2使用perror?

为什么我得到“错误:”pthread_delay_np“没有在这个范围内声明”?

尝试从用户应用程序使用TCP时控制帧的大小是错误的。 你正在错误的抽象层面上工作。 这也是不可能的。

你应该做的是考虑用别的东西替换TCP(UDP?),或者不太可能,但是可能的话,重写你的以太网驱动程序来设置非标准的MTU并且做你需要的填充。

使用主机的TCP堆栈是不可能的,因为遵循RFC 793的TCP堆栈不应该提供对应用程序的这种访问。

也就是说,没有(也不应该有)一种方法来影响下层对数据的处理。 当然,有些方法可以影响TCP工作(例如Nagle),但是这违背了协议的精神。 应该使用TCP最好的事情:传输连续的,有序的字节流。 没有什么比这更少的了。 没有消息,数据包,帧。

如果毕竟你需要控制这样的细节,你需要看低级的API。 你可以使用SOCK_RAW和PF_PACKET 。

数据包套接字用于在设备驱动程序(OSI第2层)级别接收或发送原始数据包。

@gby提到UDP,这是(部分)一个好主意: UDP有一个固定的大小。 但请记住,您将不得不处理IP碎片(或使用IP_DONTFRAG )。

除了我在OP的问题之下的评论之外,从原始的RFC中引用了这个引言,概述了如何通过以太网发送TCP / IP是相关的:

RFC 894 (强调我的):如果需要,数据字段应填充(八位字节为零)以满足以太网最小帧大小 。

如果他们想要所有的以太网帧最大的话,他们会这么说。 他们没有。

也许填充的含义是TCP头部填充使其在32位上对齐应该全部为零: http : //freesoft.org/CIE/Course/Section4/8.htm

总结

以上是内存溢出为你收集整理的发送固定长度的TCP帧全部内容,希望文章能够帮你解决发送固定长度的TCP帧所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1290905.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存