{"id":21442253,"url":"https://github.com/thotypous/redes-p3","last_synced_at":"2025-09-02T17:44:01.105Z","repository":{"id":69726840,"uuid":"400512109","full_name":"thotypous/redes-p3","owner":"thotypous","description":null,"archived":false,"fork":false,"pushed_at":"2023-03-14T14:51:05.000Z","size":6,"stargazers_count":1,"open_issues_count":0,"forks_count":3,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-29T12:35:08.681Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thotypous.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-08-27T13:06:42.000Z","updated_at":"2023-10-16T04:08:16.000Z","dependencies_parsed_at":"2025-01-23T10:42:04.126Z","dependency_job_id":"4019de8c-c754-40e6-af1a-2021ae54c8d8","html_url":"https://github.com/thotypous/redes-p3","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thotypous%2Fredes-p3","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thotypous%2Fredes-p3/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thotypous%2Fredes-p3/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thotypous%2Fredes-p3/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thotypous","download_url":"https://codeload.github.com/thotypous/redes-p3/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":249787075,"owners_count":21325569,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-23T01:53:14.277Z","updated_at":"2025-04-19T19:56:04.132Z","avatar_url":"https://github.com/thotypous.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Camada de rede – IP\n\nNesta prática, vamos implementar um protótipo de um protocolo compatível com o IPv4. A implementação será capaz de funcionar como *host*, como roteador, ou como ambos simultaneamente. Focaremos no plano de dados, ou seja, não implementaremos algoritmos de roteamento, apenas o encaminhamento com base em uma tabela previamente montada.\n\nSua implementação deve ser realizada no arquivo `ip.py`, que já veio com um esqueleto em cima do qual você vai construir o seu código. Para ajudar na sua implementação, você pode chamar as funções e usar os valores que já vieram declarados no arquivo [iputils.py](https://github.com/thotypous/redes-t3-grader/blob/main/iputils.py). Pode ser útil, também, consultar a [página sobre o formato do datagrama IPv4](https://en.wikipedia.org/wiki/IPv4#Header) e a página sobre o [ formato das mensagens ICMP](https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol#Header) na Wikipedia.\n\nPara testar seu código, execute `./run-grader`. Cada um dos testes vai usar a sua implementação como uma biblioteca, verificando se ela apresenta o comportamento esperado.\n\n## Passo 1 — 2 pontos\n\nImplemente os métodos `definir_tabela_encaminhamento` e `_next_hop` da classe `IP`.\n\nPor enquanto, você pode assumir que não acontecem ambiguidades na tabela de encaminhamento, ou seja, que cada endereço IP de destino casa um único CIDR dentre os fornecidos na tabela.\n\nA seu critério, o método `definir_tabela_encaminhamento` pode simplesmente armazenar a tabela para ser usada depois, ou pode transformá-la em alguma outra estrutura de dados que você julgue ser mais adequada ou eficiente.\n\nO método `_next_hop` deve retornar (como uma *string*) o endereço IP do próximo salto necessário para \"chegar mais perto\" do endereço IP de destino passado como argumento, de acordo com a tabela de encaminhamento configurada. Se nenhuma entrada da tabela de encaminhamento casar, o método não deve retornar nada (ou retornar `None`).\n\n## Passo 2 — 2 pontos\n\nTermine a implementação do método `enviar` da classe `IP`. Monte um datagrama IP que contenha como *payload* o segmento TCP fornecido.\n\n## Passo 3 — 2 pontos\n\nMelhore a sua implementação do método `_next_hop` da classe `IP`.\n\nQuando o endereço IP de destino casar com mais de um CIDR da tabela, faça o desempate usando a entrada que apresentar o prefixo mais longo.\n\n## Passo 4 — 2 pontos\n\nMelhore a implementação do método `__raw_recv` da classe `IP` para que ela consiga tratar adequadamente o campo de TTL quando estiver realizando a função de roteamento.\n\nDecremente o número contido no TTL antes de encaminhar o datagrama para o próximo roteador. Não se esqueça de corrigir o *checksum* do cabeçalho. Se o TTL chegar a zero, descarte o datagrama em vez de encaminhá-lo.\n\n## Passo 5 — 2 pontos\n\nMelhore a implementação do método `__raw_recv` da classe `IP` para que a sua implementação permita diagnóstico de rotas (como os gerados pelo utilitário *traceroute*).\n\nSempre que o TTL chegar a zero, além de descartar o datagrama, gere uma mensagem do tipo [ICMP Time exceeded](https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol#Time_exceeded) e envie-a de volta ao remetente.\n\n## Adiante o seu T5!\n\nO arquivo `exemplo_integracao.py` complementa o do trabalho anterior, colocando a implementação do protocolo IP que você construiu no lugar da implementação do Linux. Caso você tenha feito todos os trabalhos anteriores, tente portá-los para usar a implementação do IP que você acabou de construir.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthotypous%2Fredes-p3","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthotypous%2Fredes-p3","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthotypous%2Fredes-p3/lists"}