Gru*_*nge 5 c linux network-programming tcp mtu
我需要使用TCP通过具有固定非标准MTU(例如,1560)的子网发送一些数据.如果帧的长度小于MTU,则通过该子网传输的所有以太网帧应手动填充0.
因此,数据大小应为(1560 - sizeof(IP标头) - sizeof(TCP标头)).
这就是我要这样做的方式:
我设置TCP_CORK选项以减少数据的分段.它不可靠,因为有200毫秒的天花板,但它的工作原理.
我知道IP头的大小(20字节),因此数据长度应该等于(1540 - sizeof(TCP头)).
那就是问题所在.我不知道TCP头大小.它的"选项"字段的大小是浮动的.
所以,问题是:如何获得TCP头的大小?或者也许有一些方法来发送带有固定长度标头的TCP帧?
gby*_*gby 10
从用户应用程序使用TCP时,尝试控制帧的大小是错误的.您正在以错误的抽象级别工作.这也是不可能的.
您应该做的是考虑用其他东西替换TCP(UDP?),或者不太可能,但可能,重写您的以太网驱动程序以设置非标准MTU并执行您需要的填充.
使用主机的TCP堆栈是不可能的,因为遵循RFC 793的TCP堆栈不应该提供对应用程序的这种访问.
也就是说,没有(也不应该)有一种方法可以影响较低层对数据的影响.当然,有很多方法可以影响TCP
(例如Nagle),但这违反了协议的精神.TCP
应该用于最好的:传输连续的,有序的字节流.没有更多,没有更少.没有消息,数据包,帧.
如果您确实需要控制此类详细信息,则需要查看较低级别的API.你可以使用SOCK_RAW
和PF_PACKET
.
数据包套接字用于在设备驱动程序(OSI第2层)级别接收或发送原始数据包.
@gby提到UDP,这是(部分)一个好主意:UDP
有一个固定的大小.但请记住,您必须处理IP碎片(或使用IP_DONTFRAG
).
归档时间: |
|
查看次数: |
2130 次 |
最近记录: |