Red Hat Training
A Red Hat training course is available for RHEL 8
Capítulo 25. Introducción al TCP multirruta
El TCP multirruta se proporciona sólo como una Muestra de Tecnología. Las funciones de la Muestra de Tecnología no son compatibles con los Acuerdos de Nivel de Servicio (SLA) de producción de Red Hat, pueden no ser funcionalmente completas y Red Hat no recomienda su uso para la producción. Estas vistas previas proporcionan un acceso temprano a las próximas características del producto, permitiendo a los clientes probar la funcionalidad y proporcionar comentarios durante el proceso de desarrollo.
Consulte el alcance del soporte de las características de Technology Preview en el Portal del Cliente de Red Hat para obtener información sobre el alcance del soporte de las características de Technology Preview.
El TCP multirruta (MPTCP) es una extensión del Protocolo de Control de Transmisión (TCP). Mediante el Protocolo de Internet (IP), un host puede enviar paquetes a un destino. TCP garantiza la entrega fiable de los datos a través de Internet y ajusta automáticamente su ancho de banda en respuesta a la carga de la red.
Las ventajas de MPTCP son las siguientes:
- Permite el uso de TCP en dispositivos equipados con dos o más interfaces de red.
- Permite a los usuarios utilizar simultáneamente diferentes interfaces de red o cambiar sin problemas de una conexión a otra.
- Mejora el uso de los recursos dentro de la red y la resistencia a los fallos de la misma.
Esta sección describe cómo:
- crear una nueva conexión MPTCP,
-
utilizar
iproute2
para añadir nuevos subflujos y direcciones IP a las conexiones MPTCP, y - desactivar MPTCP en el kernel para evitar que las aplicaciones utilicen conexiones MPTCP.
25.1. Preparación de RHEL para habilitar el soporte de MPTCP
Pocas aplicaciones soportan nativamente MPTCP. En su mayoría, los sockets orientados a la conexión y al flujo solicitan el protocolo TCP en la llamada socket() al sistema operativo. Puede habilitar el soporte de MPTCP en RHEL utilizando la herramienta sysctl
para los programas que soportan MPTCP de forma nativa. La implementación de MPTCP también está diseñada para permitir el uso del protocolo MPTCP para las aplicaciones que solicitan la llamada IPPROTO_TCP
al kernel.
Este procedimiento describe cómo habilitar el soporte de MPTCP y preparar a RHEL para habilitar MPTCP en todo el sistema utilizando un script de SystemTap.
Requisitos previos
Los siguientes paquetes están instalados:
-
kernel-debuginfo
-
kernel-debuginfo-common
-
systemtap
-
systemtap-devel
-
kernel-devel
-
nmap-ncat
Procedimiento
Habilitar los sockets MPTCP en el kernel:
#
echo "net.mptcp.enabled=1" > /etc/sysctl.d/90-enable-MPTCP.conf
#sysctl -p /etc/sysctl.d/90-enable-MPTCP.conf
Cree un archivo
mptcp.stap
con el siguiente contenido:#! /usr/bin/env stap %{ #include <linux/in.h> #include <linux/ip.h> %} /* according to [1], RSI contains 'type' and RDX * contains 'protocol'. * [1] https://github.com/torvalds/linux/blob/master/arch/x86/entry/entry_64.S#L79 */ function mptcpify () %{ if (CONTEXT->kregs->si == SOCK_STREAM && (CONTEXT->kregs->dx == IPPROTO_TCP || CONTEXT->kregs->dx == 0)) { CONTEXT->kregs->dx = IPPROTO_MPTCP; STAP_RETVALUE = 1; } else { STAP_RETVALUE = 0; } %} probe kernel.function("__sys_socket") { if (mptcpify() == 1) { printf("command %16s mptcpified\n", execname()); } }
Sustituye el socket TCP por MPTCP:
#
stap -vg mptcp.stap
Nota: Utilice Ctrl+C para volver a convertir la conexión a TCP desde MPTCP.
Inicie un servidor que escuche el puerto TCP 4321:
#
ncat -4 -l 4321
Conectar con el servidor e intercambiar tráfico. Por ejemplo, aquí el cliente escribe "Hola mundo" al servidor 5 veces, luego termina la conexión.
#
ncat -4 192.0.2.1 4321
Hello world 1
Hello world 2
Hello world 3
Hello world 4
Hello world 5
Pulse Ctrl+D para salir.
Pasos de verificación
Verifique que MPTCP está habilitado en el kernel:
#
sysctl -a | grep mptcp.enabled
net.mptcp.enabled = 1Después de que el script
mptcp.stap
instale la sonda del kernel, aparecen las siguientes advertencias en la salida del kerneldmesg
#
dmesg
... [ 1752.694072] Kprobes globally unoptimized [ 1752.730147] stap_1ade3b3356f3e68765322e26dec00c3d_1476: module_layout: kernel tainted. [ 1752.732162] Disabling lock debugging due to kernel taint [ 1752.733468] stap_1ade3b3356f3e68765322e26dec00c3d_1476: loading out-of-tree module taints kernel. [ 1752.737219] stap_1ade3b3356f3e68765322e26dec00c3d_1476: module verification failed: signature and/or required key missing - tainting kernelUna vez establecida la conexión, verifique la salida de
ss
para ver el estado específico del subflujo:#
ss -nti '( dport :4321 )' dst 192.0.2.1
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process ESTAB 0 0 192.0.2.2:60874 192.0.2.1:4321 cubic wscale:7,7 rto:201 rtt:0.042/0.017 mss:1448 pmtu:1500 rcvmss:536 advmss:1448 cwnd:10 bytes_sent:64 bytes_$cked:65 segs_out:6 segs_in:5 data_segs_out:4 send 2758095238bps lastsnd:57 lastrcv:3054 lastack:57 pacing_rate 540361516$bps delivery_rate 413714280bps delivered:5 rcv_space:29200 rcv_ssthresh:29200 minrtt:0.009 tcp-ulp-mptcp flags:Mmec token:0000(id:0)/4bffe73d(id:0) seq:c11f40d6c5337463 sfseq:1 ssnoff:f7455705 maplen:0Capturar el tráfico mediante
tcpdump
y comprobar el uso de la subopción MPTCP:#
tcpdump -tnni interface tcp port 4321
client Out IP 192.0.2.2.60802 > 192.0.2.1.4321: Flags [S], seq 3420255622, win 29200, options [mss 1460,sackOK,TS val 411 4539945 ecr 0,nop,wscale 7,mptcp capable v1], length 0 client In IP 192.0.2.1.4321 > 192.0.2.2.60802: Flags [S.], seq 2619315374, ack 3420255623, win 28960, options [mss 1460 sackOK,TS val 3241564233 ecr 4114539945,nop,wscale 7,mptcp capable v1 {0xb6f8dc721aee7f64}], length 0 client Out IP 192.0.2.2.60802 > 192.0.2.1.4321: Flags [.], ack 1, win 229, options [nop,nop,TS val 4114539945 ecr 3241564 233,mptcp capable v1 {0xcc58d5d632a32d13,0xb6f8dc721aee7f64}], length 0 client Out IP 192.0.2.2.60802 > 192.0.2.1.4321: Flags [P.], seq 1:17, ack 1, win 229, options [nop,nop,TS val 4114539945 ecr 3241564233,mptcp capable v1 {0xcc58d5d632a32d13,0xb6f8dc721aee7f64},nop,nop], length 16 client In IP 192.0.2.1.4321 > 192.0.2.2.60802: Flags [.], ack 17, win 227, options [nop,nop,TS val 3241564233 ecr 411459945,mptcp dss ack 1105509586894558345], length 0 client Out IP 192.0.2.2.60802 > 192.0.2.1.4321: Flags [P.], seq 17:33, ack 1, win 229, options [nop,nop,TS val 4114540939 ecr 3241564233,mptcp dss ack 13265586846326199424 seq 105509586894558345 subseq 17 len 16,nop,nop], length 16El paquete
tcpdump
es necesario para ejecutar este comando.
Recursos adicionales
- Para más información, consulte el artículo ¿Cómo puedo descargar o instalar paquetes debuginfo para sistemas RHEL?
-
Para más información sobre
IPPROTO_TCP
, consulte las páginas de manual detcp(7)
.