如果想利用CANoe自带的TCP/IP协议栈验证TCP的零窗口探测机制,就必须添加一个网络节点并配置独立的CANoe TCP/IP协议栈,作为验证对象。而与它进行TCP通信的对端也是一个网络节点,但不要配置TCP/IP协议栈,而是使用CAPL代码在底层组装TCP报文模拟TCP通信过程。这样可以尽量减少对端协议栈的影响。
零窗口探测机制的原理:
当TCP通信双方A和B建立连接后,就可以在通道上传输数据。但如果有一方的接收缓冲区满了,TCP层再接收到数据无法存储进接收缓冲区,就会造成数据丢失。所以TCP在通信时需要告诉对方自己的接收缓冲区大小,发送TCP报文时用window字段表示自己的接收缓冲区。对方收到报文时,如果window字段为0,即使应用层有数据要发送,TCP也不会发送报文。
但TCP层也不能无限期地等待,因为接收缓冲区剩余空间是动态变化的。这就要求TCP层能够提供一种机制探测对方的接收缓冲区,这就是零窗口探测机制。
根据上面的描述,只需要在建立连接时让对方发送过来的SYN报文的window字段为0,然后发送数据,TCP层肯定立刻发送。而是在等待一定时间后发送零窗口探测帧。
当Server端在建立TCP连接时发送的SYN报文的window字段为0: