Red Hat Training

A Red Hat training course is available for RHEL 8

Capítulo 25. Começando com o Multipath TCP

Importante

O TCP Multipath é fornecido apenas como uma Visualização de Tecnologia. Os recursos de Technology Preview não são suportados com os Acordos de Nível de Serviço (SLAs) de produção da Red Hat, podem não ser completos funcionalmente e a Red Hat não recomenda o seu uso para produção. Estas prévias fornecem acesso antecipado às próximas características do produto, permitindo aos clientes testar a funcionalidade e fornecer feedback durante o processo de desenvolvimento.

Veja Technology Preview Features Support Scope no Portal do Cliente da Red Hat para obter informações sobre o escopo de suporte para os recursos de Technology Preview.

O TCP Multipath (MPTCP) é uma extensão do Protocolo de Controle de Transmissão (TCP). Usando o Protocolo de Internet (IP), um host pode enviar pacotes para um destino. O TCP garante a entrega confiável dos dados através da Internet e ajusta automaticamente sua largura de banda em resposta à carga da rede.

As vantagens do MPTCP são as seguintes:

  • Ele permite TCP para uso em dispositivos equipados com duas ou mais interfaces de rede.
  • Ela permite que os usuários utilizem simultaneamente diferentes interfaces de rede ou mudem sem problemas de uma conexão para outra.
  • Ela melhora o uso de recursos dentro da rede e a resiliência à falha da rede.

Esta seção descreve como fazê-lo:

  • criar uma nova conexão MPTCP,
  • usar iproute2 para adicionar novos subfluxos e endereços IP às conexões MPTCP, e
  • desabilitar o MPTCP no kernel para evitar aplicações que utilizam conexões MPTCP.

25.1. Preparando a RHEL para permitir o apoio ao MPTCP

Poucas aplicações suportam nativamente o MPTCP. Na maioria das vezes, a conexão e os soquetes orientados a fluxo solicitam o protocolo TCP no soquete() chamada para o sistema operacional. Você pode habilitar o suporte a MPTCP na RHEL usando a ferramenta sysctl para programas suportados nativamente por MPTCP. A implementação do MPTCP também foi projetada para permitir o uso do protocolo MPTCP para aplicações que solicitem IPPROTO_TCP call to the kernel.

Este procedimento descreve como habilitar o suporte a MPTCP e preparar a RHEL para habilitar todo o sistema MPTCP usando um script SystemTap.

Pré-requisitos

Os seguintes pacotes estão instalados:

  • kernel-debuginfo
  • kernel-debuginfo-common
  • systemtap
  • systemtap-devel
  • kernel-devel
  • nmap-ncat

Procedimento

  1. Habilitar soquetes MPTCP no núcleo:

    # echo "net.mptcp.enabled=1" > /etc/sysctl.d/90-enable-MPTCP.conf
    # sysctl -p /etc/sysctl.d/90-enable-MPTCP.conf
  2. Crie um arquivo mptcp.stap com o seguinte conteúdo:

    #! /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());
            }
    }
  3. Substitua o soquete TCP por MPTCP:

    # stap -vg mptcp.stap

    Nota: Use Ctrl+C para converter a conexão de volta para TCP a partir de MPTCP.

  4. Inicie um servidor que escute a porta TCP 4321:

    # ncat -4 -l 4321

  5. Conecte-se ao servidor e troque tráfego. Por exemplo, o cliente aqui escreve "Olá mundo" para o servidor 5 vezes, depois ele encerra a conexão.

    # ncat -4 192.0.2.1 4321
    Hello world 1
    Hello world 2
    Hello world 3
    Hello world 4
    Hello world 5

    Imprensa Ctrl+D para desistir.

Etapas de verificação

  1. Verificar se o MPTCP está habilitado no núcleo:

    # sysctl -a | grep mptcp.enabled
    net.mptcp.enabled = 1
  2. Após o script mptcp.stap instalar a sonda do kernel, os seguintes avisos aparecem na saída do kernel dmesg

    # 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 kernel
  3. Depois que a conexão for estabelecida, verifique a saída ss para ver o status específico do subfluxo:

    # 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:0
  4. Capture o tráfego usando tcpdump e verifique o uso de sub-opções 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 16

    O pacote tcpdump é necessário para executar este comando.

Recursos adicionais