linux write 함수 질문드립니다.
글쓴이: pwy1575 / 작성시간: 화, 2017/11/21 - 6:37오후
안녕하세요
linux 환경에서 블럭 소켓을 만들어 wirte 함수를 이용중에 궁금한게 있어 질문 드립니다.
소켓이 정상 동작 중 인터넷 망의 유실이나 방화벽에 의해 정상적인 FIN 절차 없이 write에 대한 ack 가 없는 경우를 보았습니다.
위 상황에서 tcpdump로 살펴 본 결과 write 함수에서는 네트워크 유실을 인지 하지 못하고 지속적으로 해당 데이터를 반복적으로 전송하고 있습니다.(전송 retry는 커널단에서 실행하는것 같습니다 - write 함수에서 block 되지 않음)
여기서 궁금한 점은 write 함수는 ack 가 없는 경우에도 정상적으로 return 값을 반환하고 종료가 되는 이유와
write 함수에서 위 와 같은 상황을 인지 하고 소켓을 close 할 수 있는 방법이 있는지 알고 싶습니다.
감사합니다.
Forums:
write는 단순히 어플리케이션에서 커널의 버퍼로
write는 단순히 어플리케이션에서 커널의 버퍼로 옮겨지고, 실제 전송은 커널에서 맡아서 합니다.
커널 버퍼에 여유 공간만 있다면 write는 실제 전송 유무와는 상관없이 바로 리턴할 수 있습니다.
소켓 뿐만 아니라 파일도 마찬가지로 write가 리턴한다고해서 실제 데이터가 하드 디스크 파일에 기록된다는 말은 아닙니다.
기본 tcp에서도 이 상황을 처리할 수 있는지는 잘 모르겠지만, 요즘은 대부분 시스템은 tcp keepalive를 지원하니까
네트워크 유실을 인식하는게 필요하다면 tcp keepalive를 이용하거나 http처럼 어플리케이션 레이어 프로토콜에서 따로 구현해 주면 됩니다.
댓글 달기