Ejemplo n.º 1
0
    datagrama, next_hop = enlace.fila.pop()
    assert len(datagrama) == 20, 'O tamanho mudou ao ser encaminhado'
    dscp, ecn, identification, flags, frag_offset, ttl, proto, \
           src_addr, dst_addr, payload = read_ipv4_header(datagrama, verify_checksum=True)
    assert dscp == 0 and ecn == 0 and identification == 0 and flags == 0 and frag_offset == 0 and \
           ttl in {63, 64} and proto == IPPROTO_TCP and src_addr=='1.2.3.4' and dst_addr==dest and \
           len(payload) == 0, 'Foram alteradas informações do datagrama original'
    return next_hop


# Testa roteador com uma única rota padrão
gw = rand_ip()
myip = rand_ip()
rede.definir_endereco_host(myip)
rede.definir_tabela_encaminhamento([
    ('0.0.0.0/0', gw),
])
used_ids = set()
for i in range(64):
    dest = rand_ip()
    segmento = os.urandom(random.randint(0, 1024))
    rede.enviar(segmento, dest)
    assert len(
        enlace.fila
    ) == 1, 'Só foi enviado um datagrama, mas foi encaminhado mais de um'
    datagrama, next_hop = enlace.fila.pop()
    assert len(datagrama) == 20 + len(
        segmento
    ), 'Datagrama com tamanho %d em vez de %d. Será que você inseriu um cabeçalho fora do tamanho padrão de 20 bytes?' % (
        len(datagrama), 20 + len(segmento))
    dscp, ecn, identification, flags, frag_offset, ttl, proto, \
Ejemplo n.º 2
0
        enlace.fila
    ) == 1, 'Só foi recebido um datagrama, mas foi encaminhado mais de um'
    datagrama, next_hop = enlace.fila.pop()
    assert len(datagrama) == 20, 'O tamanho mudou ao ser encaminhado'
    dscp, ecn, identification, flags, frag_offset, ttl, proto, \
           src_addr, dst_addr, payload = read_ipv4_header(datagrama, verify_checksum=True)
    assert dscp == 0 and ecn == 0 and identification == 0 and flags == 0 and frag_offset == 0 and \
           ttl in {63, 64} and proto == IPPROTO_TCP and src_addr=='1.2.3.4' and dst_addr==dest and \
           len(payload) == 0, 'Foram alteradas informações do datagrama original'
    return next_hop


# Testa roteador com uma única rota padrão
gw = rand_ip()
rede.definir_tabela_encaminhamento([
    ('0.0.0.0/0', gw),
])
for i in range(16):
    next_hop = enviar_datagrama(rand_ip())
    assert next_hop == gw, 'Datagrama encaminhado para next_hop incorreto'

# Testa máscaras /1
for i in range(16):
    gw1 = rand_ip()
    gw2 = rand_ip()

    rede.definir_tabela_encaminhamento([
        ('0.0.0.0/1', gw1),
        ('128.0.0.0/1', gw2),
    ])
    dest = rand_ip()
Ejemplo n.º 3
0
import asyncio
from camadaenlace import CamadaEnlaceLinux
from tcp import Servidor  # copie o arquivo do Trabalho 2
from ip import IP


def dados_recebidos(conexao, dados):
    if dados == b'':
        conexao.fechar()
    else:
        conexao.enviar(dados)  # envia de volta


def conexao_aceita(conexao):
    conexao.registrar_recebedor(
        dados_recebidos)  # usa esse mesmo recebedor para toda conexão aceita


enlace = CamadaEnlaceLinux()
rede = IP(enlace)
rede.definir_endereco_host(
    '192.168.0.123'
)  # consulte o endereço IP da sua máquina com o comando: ip addr
rede.definir_tabela_encaminhamento([
    ('0.0.0.0/0', '192.168.0.1'
     )  # consulte sua rota padrão com o comando: ip route | grep default
])
servidor = Servidor(rede, 7000)
servidor.registrar_monitor_de_conexoes_aceitas(conexao_aceita)
asyncio.get_event_loop().run_forever()
Ejemplo n.º 4
0
    assert dscp == 0 and ecn == 0 and identification == 0 and flags == 0 and frag_offset == 0 and \
           ttl in {63, 64} and proto == IPPROTO_TCP and src_addr=='1.2.3.4' and dst_addr==dest and \
           len(payload) == 0, 'Foram alteradas informações do datagrama original'
    return next_hop


# Testa máscaras /1
for i in range(16):
    gw1 = rand_ip()
    gw2 = rand_ip()
    tbl = [
        ('0.0.0.0/0', gw1),
        ('128.0.0.0/1', gw2),
    ]
    random.shuffle(tbl)
    rede.definir_tabela_encaminhamento(tbl)
    dest = rand_ip()
    next_hop = enviar_datagrama(dest)
    first_bit = int(dest.split('.')[0]) >> 7
    if first_bit == 0:
        assert next_hop == gw1, 'Datagrama encaminhado para next_hop incorreto'
    else:
        assert next_hop == gw2, 'Datagrama encaminhado para next_hop incorreto'

# Testa máscaras variadas com rota padrão definida
for j in range(8):
    gw1, gw2, gw3, gw4, gw5, gw6, gw7, gw8, gw9, gw10 = \
        tuple(rand_ip() for i in range(10))
    tbl = [
        ('200.0.0.0/7', gw1),
        ('201.0.0.0/8', gw2),
def dados_recebidos(conexao, dados):
    if dados == b'':
        conexao.fechar()
    else:
        conexao.enviar(dados)  # envia de volta


def conexao_aceita(conexao):
    conexao.registrar_recebedor(
        dados_recebidos)  # usa esse mesmo recebedor para toda conexão aceita


linha_serial = PTY()
outra_ponta = '192.168.123.1'
nossa_ponta = '192.168.123.2'

print('Para conectar a outra ponta da camada física, execute:')
print('  sudo slattach -v -p slip {}'.format(linha_serial.pty_name))
print('  sudo ifconfig sl0 {} pointopoint {}'.format(outra_ponta, nossa_ponta))
print()
print('O serviço ficará acessível no endereço {}'.format(nossa_ponta))
print()

enlace = CamadaEnlace({outra_ponta: linha_serial})
rede = IP(enlace)
rede.definir_endereco_host(nossa_ponta)
rede.definir_tabela_encaminhamento([('0.0.0.0/0', outra_ponta)])
servidor = Servidor(rede, 7000)
servidor.registrar_monitor_de_conexoes_aceitas(conexao_aceita)
asyncio.get_event_loop().run_forever()