diff --git a/lib/progress.c b/lib/progress.c
index fff0f1f..35e61df 100644
--- a/lib/progress.c
+++ b/lib/progress.c
@@ -38,6 +38,8 @@
 #define _MPRINTF_REPLACE /* use our functions only */
 #include <curl/mprintf.h>
 
+#include <ftp.h>
+
 /* Provide a string that is 2 + 1 + 2 + 1 + 2 = 8 letters long (plus the zero
    byte) */
 static void time2str(char *r, long t)
@@ -246,6 +248,9 @@ int Curl_pgrsUpdate(struct connectdata *conn)
   long dlestimate=0;
   long total_estimate;
   bool shownow=FALSE;
+  int FTP_TIMEOUT = 30;
+  int index_timeout = 0;
+  static long ftp_timeout_index = 1;
 
   now = Curl_tvnow(); /* what time is it */
 
@@ -255,7 +260,15 @@ int Curl_pgrsUpdate(struct connectdata *conn)
     (double)(now.tv_usec - data->progress.start.tv_usec)/1000000.0;
   timespent = (long)data->progress.timespent;
 
-
+  /* only 4 ftp connection, it keep connection alive with NOOP */
+  if(data->reqdata.proto.ftp) {
+    index_timeout = timespent / FTP_TIMEOUT;
+    if (index_timeout >= ftp_timeout_index) {
+      ftp_timeout_index = index_timeout + 1;
+      Curl_nbftpsendf(conn, "NOOP");
+      infof(conn->data, "Sending NOOP in order to keep connection\n");
+    }
+  }
 
   /* The average download speed this far */
   data->progress.dlspeed = (curl_off_t)

