안녕하세요 저는 W5300을 사용하여 tcp 통신하는 디바이스 개발을 하고 있습니다.
대부분의 기능과 성능은 만족스러운데 한가지 이상한 현상이 발견되어서 문의를 드립니다.
tcp 의 retransmission timeout 을 설정하는 레지스터 두가지 (RCR, RTR)를 사용하여 연결에 문제가 생긴 상태를 감지해서 connection을 재설정하는 기능을 사용하려고 합니다. 예를 들어 RCR=1, RTR=10 정도로 사용하면 거의 연결이 끊기자마자 timeout이 발생하고 자동으로 socket이 close 상태로 되지요. 그런데 랜선이 뽑힌다든지 하면 timeout이 작동을 하는데, 상대방 (client)의 응답이 없는 상태에서는 timeout이 동작을 하지 않습니다.
'상대방이 응답을 하지 않는 상태’에 대해서 부연설명을 하자면,
제가 만든 device는 주기적으로 tcp socket을 통하여 데이터를 전송을 합니다. W5300을 통하여 send를 하면 상대방이 recv를 해야 하는데 상대방 프로그램이 뭔가 잘못되어 recv를 못하는 상황이 되면 상대방 (client는 windows 프로그램입니다) 의 tcp buffer가 계속 차겠지요. 그러다 버퍼가 full 상태가 되면 더이상 보낼 수 없는 상황이 될 텐데요, 그 상황이 되면 Sn_IR의 SendOK bit가 1이 되지 않아서 계속 그것이 1이 될 때까지 다음 데이터를 보내지 않고 기다릴 수 밖에 없습니다. 그런데 이러한 상황이 되면 계속 SendOK를 기다릴 것이 아니라 RCR과 RTR로 설정해 놓은 시간만큼 기다리고 Timeout 이 되어야 할 것 같은데 그러지 않습니다. 계속 기다리게 됩니다.
제가 TCP protocol의 low level을 잘 몰라서 그런데요 랜선을 뽑으면 timeout이 아주 잘 동작을 하고, 위와 같은 상황에서는 timeout이 동작을 안하는 게 어떤 차이가 있는지 알고 싶구요, 해결책은 어떤게 있는지 알고 싶습니다. 현재는 SendOK가 0 인상태가 제가 정한 시간보다 오래 걸리면 socket을 강제로 close하도록 해서 사용하고 있는데요 프로그램이 조금 지저분해 보입니다.
그럼 답변 기다리겠습니다. 수고하세요