CH394Q常见问题答疑(持续更新)
1.TCP模式下想要动态修改socket端口号,如何操作,是否可以直接随时修改?
答:
不可以,如果在socket已经打开的情况下需要修改端口号,需要先将socket关闭--设置端口号--重新打开socket,只有这样修改才会生效。
2.tcp连接成功后,主调写disconncet命令,CH394Q何时产生断开中断?
答:
主调写disconnect命令后,芯片会发出FIN包,等待收到对端回复的FIN包后,产生断开中断。
3.tcp连接成功后,对端主动发FIN包,芯片如果处理?
答:
对端主动断开发出FIN包,芯片收到FIN包后产生断开中断,此时芯片处于CLOSE-WAIT状态,不能再发出数据。
4.tcp连接成功后发送数据,此时网线物理层面掉了,芯片如果处理?
答:
芯片发数据,重传达到设置的超时时间后,触发超时,产生超时中断,socket被关闭。
5.tcp连接成功后,主动写disconnect命令后,芯片发出FIN包,收到对端的FIN包后,产生断开中断,在断开中断里查询socket状态发现并非为CLOSED状态而是TIME-WAIT状态,是何缘由?
答:
(1)芯片正常由TIME-WAIT状态变为CLOSED至多需要100ms时间,需要在中断里轮询查状态,等到状态变为CLOSED再对socket进行其他操作如重新打开socket等等。
(2)如果不想轮询等待socket状态变为CLOSED,则可以在进入断开中断后直接写close命令关闭socket,简单直接。
6.芯片可以设置超时时间和重传次数,这个时间具体如何计算?
答:以芯片默认参数为例(默认重传时间为200ms,次数为8次)
(1)比如一包tcp数据发出去,对端没有回复ack,那么触发重传机制,即200ms、400ms、800ms、1600ms、3200ms、6400ms、12800ms、25600ms(共8次,约51秒,每次时间是*2累计,遵循指数退避的策略)
(2)特例,ARP的重传不会累计,即如果arp产生重传,传8次,间隔200ms传一次
7.udp发包,一包填入1460字节往外发送,但如果抓包看确实1472+576的组合,为何?
答:
一般是由于发一包数据后没有判断CR寄存器导致。发送缓冲区默认是2K,不判断CR,导致包被存在缓冲区中,存满了一起发,导致变成了1472+576的组合(1472是因为udp模式下最大数据字段长度就是1472)
8.芯片在四次挥手阶段,处于LAST-WAIT阶段后,如何处理?
答:
(1)处于LAST-WAIT阶段时,是芯片已经发出FIN包,在等待对端回复ACK以表明对端已经收到芯片发出的FIN,所以此状态下,需要轮询查socket状态直到芯片处于CLOSED状态才可以重新对socket进行其他操作如重新打开等等。
(2)一般对端回复ack都是很快,这个不会耗费太多时间。如果对端迟迟不回复ACK,触发重传机制,重传结束还未回复ACK最终超时产生超时中断
9.芯片运行过程中,主动写close命令,会发生什么?
答:
主动写close命令是客户行为,此情况下无任何中断产生,芯片也不会往外发任何报文,直接关闭socket。
10.如把CH394Q的发送缓冲区设置为8K,调用send命令时,可以一次性传入8K的数据吗?
答:
可以,底层会分包。
11.CH394Q接有源晶振怎么接?
答:
有源晶振的out直连芯片XI,不需要串电阻,XO悬空。
12.如何实现芯片做服务器,连接多个客户端?
答:
创建多个socket,每个socket的源端口号设置一致且都为tcp服务器模式,即可实现。(最多连接8个,因为CH394Q只有8个socket)
13.在tcp模式下,如何启用芯片的keepalive功能?
答:
CH394Q在tcp建立连接后,数据交互一次后将启动keepalive功能,即如果后续不进行数据通信,会发keepalive报文保活;CH394L则是在芯片主动发出一包数据后开启。
浙公网安备 33010602011771号