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]
我要赚赏金打赏帖 |
|
|---|---|
| OK1126B-S开发板下函数构建及步进电机驱动控制被打赏¥25元 | |
| 【S32K3XX】LPI2C 参数配置说明被打赏¥20元 | |
| OK1126B-S开发板的脚本编程及应用设计被打赏¥27元 | |
| 5v升压8.4v两节锂电池充电芯片,针对同步和异步的IC测试被打赏¥35元 | |
| 【S32K3XX】S32DS LPI2C 配置失败问题解决被打赏¥22元 | |
| 【S32K3XX】FLASH 的 DID 保护机制被打赏¥19元 | |
| OK1126B-S开发板串口通信及其使用被打赏¥18元 | |
| 【S32K3XX】多核 CORE ID 获取被打赏¥18元 | |
| OK1126B-S开发板的GPIO资源及其使用被打赏¥20元 | |
| 【分享开发笔记,赚取电动螺丝刀】三分钟快速上手驱动屏幕(Arduino IDE环境)被打赏¥23元 | |
我要赚赏金
