У меня есть FTP-сервер, и во время тестирования я обнаружил странную проблему, которую не понимаю. Я отправляю команду RETR для файла "/Folder1/file.txt", и он работает нормально. Затем я отправляю команду RETR для файла "/Folder1/SubFolder1/file.txt", и время ожидания передачи данных клиенту истекает. Это было в активном режиме. Когда я перехожу в пассивный режим, он работает нормально.
Я понимаю разницу между этими двумя режимами, но не понимаю, почему он работал для одного файла в активном режиме, а для другого - нет. Я пробовал десяток раз и все равно получил те же результаты.
Любые идеи? Спасибо!
Если вы проверите официальная спецификация протокола передачи файлов, вы обнаружите, что:
FTP может работать в активном или пассивном режиме, которые определяют способ открытия второго соединения. В активном режиме клиент отправляет серверу номер порта IP-адреса, который клиент будет использовать для передачи данных, и сервер открывает соединение. Пассивный режим был разработан для использования там, где клиент находится за брандмауэром и не может принимать входящие TCP-соединения. Сервер отправляет клиенту IP-адрес и номер порта, и клиент открывает соединение с сервером. Оба режима были обновлены в сентябре 1998 года, чтобы добавить поддержку IPv6 и внести некоторые другие изменения в пассивный режим, сделав его расширенным пассивным режимом.
Итак, моя первая мысль заключается в том, что что-то не так с разрешениями вашей папки. Дважды проверьте их.
Я предполагаю, что первый файл был достаточно мал, чтобы его можно было передавать по тому же соединению, но второй файл был больше.
Хотя вряд ли в этом случае другое мыслимый Проблема может быть в межсетевом экране вашего клиента. Активный FTP требует, чтобы клиент открыл TCP-порт, к которому сервер подключается для передачи файлов.
Возможно, что брандмауэр клиента имеет один доступный расширенный порт, но не более того, поэтому первый файл разрешен через этот первый порт, а не через какие-либо другие расширенные порты (клиенты склонны выделять порты TCP постепенно).
Теперь с пассивный FTP сервер выделяет TCP-порты для передачи, и клиент подключается к серверу. В этом случае брандмауэр клиента больше не может вызывать особых проблем, потому что клиент подключается к внешний мир (брандмауэры защищают внешний мир от подключения к брандмауэру).
Почти всегда я обнаруживаю, что переключение из неработающего активного режима в рабочий пассивный режим указывает на проблемы с брандмауэром.
А теперь диаграмма:
Active FTP
client:n ---RETR portnum1---> server:21
client:portnum1 <---fetches-- server:m1
client:n ---RETR portnum2---> server:21
client:portnum2 <---fetches-- server:m2
Passive FTP
client:n ---PASV request----> server:21
client:n <--PORT portnum1---- server:21
client:n2 --fetches---------> server:portnum1
client:n ---PASV request----> server:21
client:n <--PORT portnum2---- server:21
client:n3 --fetches---------> server:portnum2
Обратите внимание, что порт 21 - это команда канал. Именно сюда отправляются инструкции. Остальные порты используются для фактической передачи данных.