프로그래밍

FTP Upload시 "Unable to listen, too many pending PASV requests from same client IP." 발생 문제

채윤아빠 2010. 2. 10. 23:14
728x90
반응형
간단한 파일 업로드 프로그램이었는데, 패시브(Passive) 모드로 여러 파일들을 올려 주어야하는 프로그램이었습니다. 다 완성한 이후에 테스트하는 도중 "Unable to listen, too many pending PASV requests from same client IP." 오류가 발생하며 파일이 정상적으로 올려지지(Upload)가 않았습니다.

"netstat -na"로 포트 상태를 알아보니, TIME_WAIT가 엄청나게 있어서 문제인 것으로 파악되었습니다(FTP Passive Mode에서 클라이언트에서 사용하는 포트 대역이 1025~ 5000 사이의 값이라 한번에 이론적으로 4000개 이상을 업로드할 수가 없는 셈입니다). 작은 이미지 수천개의 파일을 한꺼번에 올리는 어떻게 보면 단순 무식한 프로그램인데, 수천개의 TIME_WAIT가 사라지지 않고 남아 있어서 더이상 업로드가 안되었던 것입니다. TIME_WAIT야 Windows 계열에서는 보통 2분이면 사라지는데... 한꺼번에 수천개의 파일을 올려야만 하는 상황이라, 완전히 포트가 반환이 되지 않아서 업로드에 계속 문제가 되었습니다.



처음에는 IndyFTP 컴포넌트의 문제가 아닌가 의심하여 Delphi7(Indy 9)으로 개발된 것을 Delphi 2007(Indy 10) 수정 후 다시 빌드하여 테스트해 보았으나, 문제가 여전하였습니다. 그래서 다시 다른 FTP 컴포넌트로 MS에서 개발하여 IE에서도 사용하고 있는 WinINet 계열의 FTP 컴포넌트를 이용하였으나, 동일한 문제가 나타났습니다. -_-;

일반적으로 많이 사용하는 FileZilla Clinet로는 어떨까 확인해 보았습니다만, 역시 동일하게 패시브 모드에서 서버로 파일을 여러개 올리면, TIME_WAIT가 남더군요. TIME_WAIT가 지금과 같은 극한(?) 상황에서는 오류로 느껴질 수 있겠지만, 일반적인 소켓의 구조가 그렇게 되어 있는 터라 오류로 보기도 어렵고, 레지스트리 등을 바꾸어 TIME_WAIT 대기 시간을 줄일 수도 있지만, 왠지 꺼림직하고 하여, 결국은 업로드 방식을 FTP에서 HTTP POST 방식으로 변경하였습니다.

HTTP POST 방식으로 변경하였더니, TIME_WAIT가 발생하는 문제가 완전히 사라지고, HTTP 1.1의 KeepAlive 등을 활용하니, FTP 보다도 오히려 성능이 더 좋은 것 같기도 합니다.


참고자료