TCP ACK에 관한 질문 입니다.
글쓴이: yun8085 / 작성시간: 목, 2009/12/10 - 6:04오후
송신측이 서버이고 수신측이 클라이언트 입니다.
TCP 기본 동작을 보면 송신측에서 수신측으로 ACK과 함께 데이터를 전송하게 되면 수신측에서
두번에 한번씩 ACK을 주잖아요?? (또는 일정시간을 기다리는 것으로 알고 있음.)
지금 송신측이 제가 테스트 하고 있는 임베디드 모듈이고
수신측이 windows XP sp3 플랫폼의 PC인데요 ....
송신측에서 파일을 전송하려고 하면 엄청 느리네요~~
그래서 패킷을 분석해 보았더니 송신측에서 하나의 세그먼트를 보내고
수신측에서 ACK을 줄때까지 기다리는 것으로 보입니다.
원인이 송신측에서 세그먼트를 두개 보낸후 ACK을 기다려야 하는데 한번 보내고 기다려서
PC에서 일정시간 기다렸다가 ACK을 보내서 그러는것 같은데 제가 생각하고 있는게 맞는가요???
맞다면 PC측에서 일정시간 이라는 부분을 조절할 수 있나요??
(패킷 분석결과 200ms 기다리는 듯 합니다.)
Forums:
송신측에서는 데이터
송신측에서는 데이터 세그먼트만 보내는 것이고 Ack 은 수신측에서 송신자에게 보내는 것으로 알고 있는데요. 수신측에서 Ack 을 기다린다는 것이 잘 이해가 되지 않습니다. (통상, 수신측은 데이터 세그먼트를 기다리고, 송신측에서 Ack을 기다리는 형식으로 통신이 이뤄지는것으로 알고 있습니다만)
말씀하신 부분으로 유추해보니, 송신측에서 delayed Ack 기능이 enable 되어 있지 않은 것 같습니다. PC에서 일정시간 기다렸다가 Ack 을 보내신다고 하셨고, 그 "일정시간"을 조정할 수 있느냐고 하셨는데, 그 "일정시간" 이라는 것이 아마 TCP delayed-Ack timer 를 말씀하시는 것 같고, 윈도 XP/2000/2003 에서 이 값이 조정 가능합니다.
위의 제 추측이 맞다는 가정하에 설명드리자면, 200 ms 는 XP 머신이 갖고 있는 default TCP timer out 값입니다 (delayed Ack에 관한 타이머). 이는 언제 발생하냐하면 XP 머신이 200 ms 이내에 두번째 TCP 세그먼트 받지 않으면, 이 타이머가 아웃되게 됩니다. 즉, sender측에는 delayed Ack을 다룰수 있게 세팅되어 있지 않는 것 같고 (sender는 두번째 세그먼트를 보내기 전, 첫번째 TCP 세그먼트에 대한 Ack을 계속 기다리고 있고), XP 머신(수신측)은 두번째 세그먼트를 받아야 Ack을 보내게 세팅되어 있어서, XP 머신의 delayed-Ack 타이머가 아웃되는 현상인 것 같습니다 (이는 매 200ms 마다 발생하게 됩니다).
자세한 설명은 http://support.microsoft.com/kb/328890 를 보시면 됩니다.
(여기 잘 읽어보시면 레지스트리 값을 이용하여 타이머 값도 바꿀수 있습니다.)
요약하여 말씀드리면,
(1) 임베디드 쪽의 TCP에서 delayed Ack을 다룰수 있게 설정을 변경하시거나
(2) 아니면, XP 쪽에 delayed Ack 기능을 꺼 놓으시거나
(3) 아니면, XP 머신의 timer 값을 조정하시면 될것 같습니다.
하지만, (3)번은 추천드리고 싶은 방법이 아니고, (1)번 방법이 가장 바람직 할 것 같습니다.
댓글 달기