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]
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |