W5300 의 timeout

안녕하세요 저는 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하도록 해서 사용하고 있는데요 프로그램이 조금 지저분해 보입니다.

그럼 답변 기다리겠습니다. 수고하세요

안녕하세요 :slight_smile:

TCP통신은 데이터를 주면 받았다라는 ack라는 패킷을 응답으로 줍니다.
상대방 버퍼가 가득 차있다고 connection을 끊지는 않습니다.
상대방이 응답이 없을 경우 RTR만큼의 Timeout timer가 작동하게되고 RCR만큼 반복하게 됩니다.
이모든 과정동안 응답이 없을 시 timeout 인터럽트가 발생하게 됩니다.

즉 윈도우 프로그램 측에서 응답이 없어야 timeout 인터럽트가 발생하게 됩니다 그래서 랜선을 뽑으면 상대방의 ack가 도달할 수 없기때문에 인터럽트가 발생하게되고 랜선이 연결된상태라면 데이터는 못읽어가지만 응답은 주기 때문에 연결이 끊기지는 않습니다.

답변 감사드립니다.

답변을 보면 상대방 프로그램이 버퍼가 가득 차서 못 받는 상태에서도 TCP 통신상의 ACK는 보내주기 때문에 인터럽트가 발생하지 않는 것이라고 이해가 되는데요, 이런 경우에도 Sn_IR의 SendOK bit는 1로 되어야 하지 않을까요?

프로그램에서는 Sn_IR의 SendOK 가 1이 되지 않아서 계속 1이 될 때까지 기다리고 있는 중인데요 , 그 동안에도 timeout interrupt는 발생하지 않습니다. 요 부분이 명확히 이해가 안가서 질문드립니다.

그러니까 Sn_IR의 SendOK가 0인 상태가 계속 유지 되는 것과 retransmission timeout과의 관련성을 콕 찝어서 알려주시면 감사하겠습니다.

이만 줄이겠습니다.

안녕하세요 :smiley:
send ok 가 뜨려면 buffer데이터가 memory에 담겨야지 '1’로 뜹니다.

만약에 상대방이 데이터를 받지 못해 계속 재전송 상태에 놓여있다면,

이전 데이터가 보내지지않아서 memory가 차있으면 다음 보낼 데이터가 memory에 써지지 않기 때문에 send ok는 뜨지않는게 맞습니다.

감사합니다.