这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界» 论坛首页» 嵌入式开发» MCU» [讨论]TCP连接的MTU问题,驱动丢弃待发报文

共2条 1/1 1 跳转至

[讨论]TCP连接的MTU问题,驱动丢弃待发报文

菜鸟
2004-02-17 18:35:40 打赏
Telnet到设备,开始一切正常,但执行到某条命令时,telnet便停在那边,既无输出也不能回显,看起来就象程序死掉的一样。
具体分析发现情况是这样的,这条命令输出较多,有2000多个字节。此时TCP分片发送数据。但分片发送的数据并没有送到主机与设备相连的以太网上(Sniffer抓包)。使用tcpstatShow查看发现重传的报文字节在增加
-> tcpstatShow
TCP:
128 packets sent
82 data packets (8247 bytes)
1 data packet (1456 bytes) retransmitted-> tcpstatShow
TCP:
129 packets sent
82 data packets (8247 bytes)
2 data packets (2912 bytes) retransmitted 1456+1456=2912

-> tcpstatShow
TCP:
131 packets sent
82 data packets (8247 bytes)
3 data packets (4368 bytes) retransmitted 2912+1456=4368-> tcpstatShow
TCP:
132 packets sent
82 data packets (8247 bytes)
4 data packets (5824 bytes) retransmitted 4368+1456=5824从这点看来协议栈应该是将报文送给了驱动,而使用ifShow查看对应的接口,发现 octets sent值无显著增加,所以肯定是驱动将TCP报文丢弃。现在不明白的一点是为何数据长度短的报文不会被丢弃,而达到分片长度的报文会被丢弃。

另外一点是,在这样的情况下,主机仍能继续向设备发送Telnet数据,但设备已不能回显任意长度的字符,主机能做的只是发送exit命令正常推出Telnet连接,设备端正常关闭,无socket泄漏。 if_ether.h中定义的MTU大小是 #define ETHERMTU 1496这个值应该是不将以太头部计算在内的报文长度。协议栈计算出的报文分片大小是 1456=1496-40个字节,40个字节应该是IP报头加上TCP头部的长度。如果再加上以太头部就应该是 1456+40+14=1510个字节。以为会是MTU值太大的缘故,将值改成1400,结果TCP分片的报文变成1360,还是在驱动出被丢弃,不知是为何。硬件用的是GNL交换套片,驱动与之对应。 恳请请高人指点,该报文究竟是会在何处以何种原因被驱动丢弃的,为何驱动丢弃大报文后,连之后发送的小报文也丢弃了!
[align=right][color=#000066][此贴子已经被作者于2004-2-17 10:36:47编辑过][/color][/align]



关键词: 讨论 连接 问题 驱动 丢弃 待发 报文 pack

菜鸟
2004-02-18 00:44:00 打赏
2楼
自顶三次,1。

共2条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册]