Como regla general, en redes locales y globales, los archivos se transfieren entre dispositivos mediante protocolos SMB, FTP o HTTP. El problema de todos estos protocolos son algunos problemas para reanudar la descarga de archivos grandes, que pueden empeorar si la red es lenta o poco confiable. Además, al copiar archivos utilizando estos protocolos, se utiliza todo el ancho de banda disponible entre un servidor y un destinatario, lo que puede afectar negativamente el rendimiento de la red y el funcionamiento de otras aplicaciones de red (no siempre es posible configurar las políticas de QoS correctas en la red). equipo). En este artículo, consideraremos cómo usar Protocolo BITS y PowerShell para copiar archivos grandes en una red lenta o inestable.
Protocolo BITS
BITS (servicio de transferencia inteligente en segundo plano) es un servicio de Windows que se utiliza para transferir archivos entre los sistemas. Puede descargar y cargar archivos usando el protocolo BITS. Este protocolo lo utilizan las computadoras cuando reciben archivos de servidores cuando realizan actualizaciones automáticas de Windows (incluido el caso cuando se descargan actualizaciones de un servidor WSUS), cuando reciben programas de puntos de distribución de SCCM, etc.
Ventajas del protocolo BITS:
- BITS es el protocolo inteligente que puede controlar el ancho de banda utilizado del canal de comunicación y no afectar el funcionamiento de otras aplicaciones y servicios de red. BITS puede usar solo el ancho de banda libre (no asignado) y cambiar dinámicamente la velocidad de datos durante la transferencia (si otras aplicaciones aumentan el uso de la red, el cliente BITS puede reducir la velocidad de transferencia de datos a través de la red);
- La descarga de archivos puede continuar en el modo de fondo transparente para el usuario;
- El trabajo de BITS en modo de reanudación continuará automáticamente incluso si el canal de comunicación entre la computadora y el cliente está roto o después de reiniciar la computadora;
- Puede pausar o reanudar la descarga mediante BITS sin perder datos;
Nota. La capacidad de reanudar la copia de archivos a través de la red también está disponible en la utilidad robocopy.exe, que le permite reanudar la descarga del archivo si se pierde la conexión.
- BITS le permite administrar las prioridades de los trabajos de descarga;
- La transferencia de archivos entre computadoras ocurre en los puertos 80 (HTTP) o 443 (HTTPS), por lo que no tendrá que abrir puertos adicionales en los firewalls. Por ejemplo, el puerto 445, que se usa al copiar archivos a través del protocolo SMB (no olvide que hay muchas vulnerabilidades en la versión anterior del protocolo SMB 1.0);
- No se requiere necesariamente un servidor IIS implementado en el lado del servidor y del destinatario de BITS.
Por lo tanto, BITS es el protocolo preferido para transferir archivos de gran tamaño a través de redes lentas e inestables (canal de satélite, conexión GPRS, etc.).
BITS: Requisitos de la versión del SO y PowerShell
El protocolo BITS apareció en Windows XP, en el que bitsadmin.exe La utilidad podría usarse para administrar tareas BITS. La utilidad todavía es compatible, pero está obsoleta. Para administrar trabajos de BITS, es preferible utilizar cmdlets especiales de PowerShell.
Para trabajar en este escenario, necesita un sistema operativo no inferior a Windows Vista o Windows Server 2008 y PowerShell 2.0 o más reciente. Las versiones modernas de Windows 10 y Windows Server 2016/2012 R2 son totalmente compatibles con BITS.
Consejo. También es posible utilizar Windows Server 2003. En este caso, deberá instalar la actualización KB 923845 y PowerShell 2.0.
Se requiere compatibilidad con BITS tanto del cliente como del servidor.
¿Cómo descargar un archivo a través del protocolo BITS usando PowerShell?
Suponga que desea descargar un archivo ISO grande almacenado en el servidor HTTP de IIS (http://10.1.1.18/erd65_32.iso). Se supone que se permite el acceso anónimo a esta URL (más adelante consideraremos el acceso a la URL con autenticación).
En primer lugar, importe el módulo BITS en su sesión de PowerShell:
Import-Module BitsTransfer
Después de importar el módulo, la lista de todos los comandos disponibles se puede mostrar de la siguiente manera:
get-command *-BITS*
Como puede ver, hay 8 cmdlets disponibles:
- Add-BitsFile
- Transferencia de bits completos
- Get-BitsTransfer
- Transferencia de bits
- Transferencia de bits de currículum
- Transferencia de bits
- Transferencia de bits de inicio
- Suspend-BitsTransfer
Transferencia de archivos sincrónica entre computadoras usando BITS
La Inicio-BitsTransfeEl cmdlet r le permite descargar archivos a través de HTTP (s) (como el cmdlet Invoke-WebRequest), así como desde carpetas compartidas de red (a través de SMB). Para descargar un archivo de la URL especificada usando el protocolo BITS y guardarlo en el directorio local C: Temp, use el comando:
Start-BitsTransfer –source http://10.1.1.18/erd65_32.iso -destination c:temp
El mensaje «Esta es una transferencia de archivos que utiliza el servicio de transferencia inteligente en segundo plano (BITS) » significa que el archivo especificado se está descargando mediante BITS.
En este caso, el cmdlet ha iniciado la descarga del archivo ISO en modo síncrono. La descarga es similar a un proceso habitual de copia de archivos a través del Explorador de archivos o mediante el cmdlet Copy-Item. Se muestra una barra de progreso en la pantalla, que muestra el estado de la descarga. Si se reinicia una computadora, la descarga no se reanudará (deberá descargar el archivo completo nuevamente).
Transferencia de archivos grandes a través de la red con BITS en modo asincrónico
La descarga de BITS también se puede iniciar en modo asíncrono. Para hacerlo, agregue -asincrónico parámetro al comando que se muestra arriba. En este modo, si algo sucede (reinicio del servidor o cliente, interrupción del canal de comunicación, etc.), el trabajo BITS se reanudará automáticamente después de que se restaure la fuente y la descarga del archivo continuará desde el momento en que se interrumpa la conexión:
Start-BitsTransfer -source http://10.1.1.18/erd65_32.iso -destination c:temp -asynchronous

Start-BitsTransfer -source http://10.1.1.18/erd65_32.iso -destination c:temp -asynchronous -Priority low
La tarea BITS asincrónica se ejecuta en segundo plano y el proceso de descarga del archivo no se muestra en la pantalla. El estado del trabajo de BITS se puede obtener desde la consola de PowerShell usando el Get-BitsTransfer mando:
Get-BitsTransfer | fl
El comando devuelve el estado de la transferencia (en este caso, la transferencia terminó: Transferido), la información sobre el número de bytes transferidos, el tamaño total del archivo, la hora en que se creó el archivo y la hora en que se completó la tarea.
Puede ver el estado de todas las tareas de BITS que se ejecutan en la computadora en forma de tabla:
Get-BitsTransfer | select DisplayName, BytesTotal, BytesTransferred, JobState | Format-Table -AutoSize
Cuando se utiliza el modo de transferencia asincrónica, un archivo temporal con TMP se crea la extensión (de forma predeterminada, está oculta en el Explorador de Windows). Para convertirlo en el archivo de origen (que se almacena en el servidor de origen), ejecute el comando Transferencia de bits completos:
Get-BitsTransfer | Complete-BitsTransfer

La tarea de descarga de BITS se considera completada y se elimina de la lista de trabajos.
Puede cargar un archivo local en una carpeta compartida de red en un servidor de archivos remoto de Windows. Para hacer esto, use el siguiente comando (para su comodidad, puede especificar el nombre del trabajo de copia):
Start-BitsTransfer -Source C:isow10_1809.iso -Destination \manch-fs1iso -Asynchronous -DisplayName CopyISOtoMan
Para suspender temporalmente una tarea de BITS, ejecute:
Get-BitsTransfer -Name CopyISOtoMan | Suspend-BitsTransfer
Para reanudar el trabajo de BITS, use el cmdlet Resume-BitsTransfer:
Get-BitsTransfer -Name CopyISOtoMan | Resume-BitsTransfer -Asynchronous
Puede agregar archivos adicionales a la tarea BITS mediante el cmdlet Add-BitsFile:
Get-BitsTransfer -Name CopyISOtoMan | Add-BitsFile -Source C:isow10msu* -Destination \manch-fs1iso -Asynchronous
Para eliminar todas las tareas de descarga de BITS en la computadora (incluidas las iniciadas por otros usuarios), ejecute el siguiente comando:
Get-BitsTransfer -Allusers|Remove-BitsTransfer
No puede cancelar trabajos de BITS que se ejecutan en la cuenta del sistema (error 0x80070005 «No se puede cancelar el trabajo»). Para cancelar dicha tarea, debe ejecutar el comando Remove-BitsTransfer en SYSTEM.
Si el servidor donde se almacena el archivo requiere autenticación de usuario, el siguiente comando permitirá mostrar una ventana para especificar las credenciales para acceder al recurso:
Start-BitsTransfer -source http://10.1.1.18/erd65_32.iso -destination c:temp -asynchronous -Priority low -Authentication NTLM -Credential Get-Credential

Para facilitar el seguimiento de los resultados de una tarea BITS, puede utilizar un script simple, que permite realizar un seguimiento del progreso de la tarea y una vez cada pocos segundos muestra el porcentaje de descarga en la pantalla. Una vez finalizada la descarga, el script convierte automáticamente el archivo TMP al formato de origen:
Import-Module BitsTransfer
$bitsjob = Start-BitsTransfer -Source http://10.1.1.18/erd65_32.iso -Destination c:temp -Asynchronous
while( ($bitsjob.JobState.ToString() -eq 'Transferring') -or ($bitsjob.JobState.ToString() -eq 'Connecting') )
{
Write-host $bitsjob.JobState.ToString()
$Proc = ($bitsjob.BytesTransferred / $bitsjob.BytesTotal) * 100
Write-Host $Proc “%”
Sleep 3
}
Complete-BitsTransfer -BitsJob $bitsjob
¿Cómo copiar el contenido del directorio usando BITS?
Como ya mencionamos, BITS no requiere un servidor web, y significa que podemos copiar archivos directamente desde otras computadoras con Windows o carpetas compartidas de la red:
Start-BitsTransfer -Source \lon-rep01osRHEL4.8-x86_64-AS-DVD.iso -Destination c:temp -Asynchronous
BitsTransfer no puede copiar de forma recursiva todos los archivos y carpetas de una carpeta específica o archivos utilizados por otros programas. Para copiar todos los archivos y subdirectorios de la carpeta compartida de red especificada, use este script (primero puede verificar si el directorio de destino existe y crearlo):
Import-Module BitsTransfer
$Source="\lond-rep01share"
$Destination="c:tmp"
if ( -Not (Test-Path $Destination))
{
$null = New-Item -Path $Destination -ItemType Directory
}
$folders = Get-ChildItem -Name -Path $source -Directory -Recurse
$bitsjob = Start-BitsTransfer -Source $Source*.* -Destination $Destination -asynchronous -Priority low
while( ($bitsjob.JobState.ToString() -eq 'Transferring') -or ($bitsjob.JobState.ToString() -eq 'Connecting') )
{
Sleep 4
}
Complete-BitsTransfer -BitsJob $bitsjob
foreach ($i in $folders)
{
$exists = Test-Path $Destination$i
if ($exists -eq $false) {New-Item $Destination$i -ItemType Directory}
$bitsjob = Start-BitsTransfer -Source $Source$i*.* -Destination $Destination$i -asynchronous -Priority low
while( ($bitsjob.JobState.ToString() -eq 'Transferring') -or ($bitsjob.JobState.ToString() -eq 'Connecting') )
{
Sleep 4
}
Complete-BitsTransfer -BitsJob $bitsjob
}

¿Cómo cargar un archivo en el servidor HTTP usando PowerShell y BITS?
Con BITS, no solo puede descargar un archivo de un servidor HTTP, sino también cargarlo en un servidor web remoto. Para hacer esto, el servidor web IIS con el Extensión de servidor de bits El componente debe estar instalado en el servidor de destino. En la configuración del directorio virtual de IIS en el Cargas de bits sección, debe habilitar el «Permitir que los clientes carguen archivos» opción.

Si usa la autenticación anónima, debe permitir que los usuarios anónimos escriban en el directorio en el nivel de permisos NTFS. Si las cargas de archivos se realizan con usuarios autorizados, deben otorgar permisos RW a la carpeta de carga.
Para cargar un archivo en un servidor HTTP usando el protocolo BITS, ejecute el siguiente comando:
Start-bits –source c:isowinsrv2016.iso -destination http://10.1.1.18/MEDVImages/winsrv2016.iso –Transfertype Upload
Tenga en cuenta que, de forma predeterminada, IIS le permite cargar archivos de hasta 30 MB. Para permitir la carga de archivos grandes, debe cambiar el valor en el parámetro maxAllowContentLength en el archivo web.config.
Por lo tanto, usar las funciones de BITS es una excelente alternativa a la copia común de archivos a través de la red mediante el protocolo SMB. La tarea de transferencia de archivos BITS se realiza a pesar de interrupciones de la conexión o reinicios de la computadora, y no ocupa mucho ancho de banda sin interferir con otras aplicaciones. El protocolo BITS puede ser la solución óptima para transferir grandes archivos de imágenes ISO y máquinas virtuales (vmdk, vhdx) a través de una red WAN.





