# Redes
## CAMADA 2
### hub e swicth (aula 4/prática 1 - 16/11/22)
[VLAN](https://support.huawei.com/enterprise/en/doc/EDOC1100086556)
````
#device
ifconfig eth0 192.168.0.1
#switch
ovs-vsctl show
ovs-vsctl del-br br0
ovs-vsctl add-br br0
ovs-vsctl add-port br0 eth1 tag=100
ovs-vsctl add-port br0 eth2 tag=200
ovs-vsctl add-port br0 eth3 trunks=100,200
ambos:
ip link add link eth0 name eth0.100 type vlan id 100
ip link add link eth0 name eth0.200 type vlan id 200
````



---
### Spanning Tree (aula 5 e 6/prática 2/3 - 30/11/22)
Autora: [Radia Perlman](https://cs.wmich.edu/gupta/teaching/cs4310/lectureNotes_cs4310/spanning%20tree%20poem%20by%20Radia%20Perlman.pdf)
O grande problema do spanning tree é que ele é lento. Se uma interface cair ele muda automaticamente o status de blocking pra foward, porém é demorado.
BPDU - Bridge Protocol Data Unit
```
ovs-vsctl get bridge br0 status
ovs-vsctl set bridge br0 stp_enable=true
#pra saber qual endereço mac
ovs-vsctl get intaerface br0 mac-in-use
# pra verificar o status da porta
ovs-vsctl get port eth0 status
ovs-vsctl get port eth3 status
````
### Rapid Spanning Tree
````
ovs-vsctl set bridge br0 rstp_enable=true
ovs-vsctl get bridge br0 rstp_status
ovs-vsctl get port eth3 rstp_status
ovs-vsctl get port eth4 rstp_status
````

---
**DESAFIO**
trabalhar com LAG 802.1ad - Link Agreggation
LAG+ST
no linux o lag se chama bond (de super bonder) tipo interfaces coladas
---
ethernet:
- endereço mac tem 6 bytes ou 48 bits
- com 32 bits vc conta até 4 bilhões
6 bytes destino, 6 origem, 2 ethertype, 4 CRC (redundância cíclica). **Total 18 bytes**.
esse pode variar de 46 bytes até 1500 bytes. Daí vem que o tamanho do frame tem média de 1518 bytes.
MTU, 1500 de dados mais 18 de cabeçalho.
ãs vezes aparece 1514 pq o CRC já foi extraído.
## CAMADA 3
### Parte 1 - Endereço IP (Internet Protocol)
IPv4: 32 bits - Ex: 192.168.0.1 (decimal)
IPv6: 128 bits - Ex: 2001::DB8:1 (hexadecimal)
IPv4: 11000000.10101000.00000000.00000001.
- 00000000 -> endereço de rede
- meio do caminho -> endereço de host
- 11111111 -> endereço de broadcast
Unicast = A, B, C (endereço não pode ser duplicado)
Multicast = D
Broadcast = limitado - 255.255.255.255
| Class |start| NetID| HostID | Net | Hosts | primeiro endereço| último endereço|máscara padrão|
| -------| ---- | -------- |--------|---------|--------|------------------|----------------|----|
| A | 0 | 8 | 24 | 2ˆ7 =128 | 2ˆ24 -2| 0.0.0.0 rota default/gateway|127.255.255.255 broadcast direto 127.0.0.1 localhost| 255.0.0.0|
| B | 10 | 16 | 16 | 2ˆ14 =16K| 2ˆ16 -2=65534| 128.0.0.0|191.255.255.255|255.255.0.0|
| C | 110 | 24 | 8 | 2ˆ21 | 2ˆ8 -2 = 254| 192.0.0.0|223.255.255.255|255.255.255.0|
| D | 1110 | - | - | | |224.0.0.0|239.255.255.255|
| E | 1111 | - | - | | |240.0.0.0|255.255.255.255 broadcast limitado|
Para IPv4 - **NAT**: ganbiarra para compartilhar endereço de ip
#### Endereços Públicos versus Privados (RFC 1918)
- públicos dá pra navegar na internet, exemplo 8.8.8.8 (Google)
- Privado:
A: 10.0.0.0
B: 172.16 até 172.31
C: 192.168.0 até 192.168.255
### Aula 07/12/22 - ARP (Address Resolution Protocol)
Dado um endereço lógico (camada 3, configurado no sistema operacional) descobre-se o endereço físico.
ARP manda em broadcast quem tem o endereço de IP x, e a máquina q tem responde e preeenche a tabela ARP (não a de roteamento)
* Dentro da própria LAN a gente não precisa de roteador. Ele só aparece quando duas máquinas precisam conversar em redes diferentes.
Encaminhamento direto - tabela ARP
Duas redes - tabela de rotas

- informção importante no cabeçalho IP: endereço destino e origem
Para camada 2 (endereço mac) conversar com camada 3 (ip)
Quando vc faz um ping: vc tem ip destino, ip origem, e mac de origem. Falta o mac destino. Ele aparece magicamente pq o ARP descobre ele.
---
edit config na máquina e descomentar auto eth0 e iface eth0 inet static (menos o gateway)

a é de all e n é pra mostrar números
````zsh=
ifconfig eth0 192.168.0.1
arp -an
ping -c 1 192.168.0.2
arp -an
#delete
arp -d. 192.168.0.2
#insere na tabela
arp -s 192.168.0.2 0a:0a:0a:0a:0a:0a
ip neigh show
## n número / x para mostrar endereço mac / e e para mostrar pedaço do conteúdo
tcpdump -i eth0 -n -xe
##Para editar endereço mac
ifconfig eth0 hw ether 0a:0a:0a:0a:0a:0a
````
inicia captura:

tem dois pares de mensagem pq existe a resposta de A e de B
Para detectar endereço de ip duplicado na rede? Se duas máquinas responderem a requisição arp
Sempre manter um entrada na tabela arp
````zsh==
# quem tem? mas não altera a tabela arp
arping 192.168.0.2
````
DHCP (Dinamic Host Configuration Protocol)
````
udhcpc eth0
`````
**exercício**: bricar com o DHCP (openwrt)
---
endereço 0.0.0.0 indica rota default
192.168.0.0 endereço de rede
#### Prática 2

````
route -n
ping 192.168.0.1
route add default gw 192.168.0.1
# na R1
route add -net 10.0.0.0 netmask 255.0.0.0 gw 172.16.0.2
#na R2
route add -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1
````
---
****Datagrama****
tamanho mínimo do cabeçalho IP, 20 bytes!!!!!!!!!!
tamanho máximo 64 kB!
[RFC](https://rfc-editor.org/rfc/rfc791)

Tamanho máximo de um datagrama que vc vai mandar é de 2ˆ16 = 64KB
Tamanho máximo de um frame ethernet = 1500
se mandar datagrama maior q MTU (tamanho máximo de transferência)
- **Identification**: (se tiver que fragmentar, todas as partes vão ter o mesmo ID)
- Flags: _MORE FRAG - bit ligado
_DO NOT FRAG - bit desligado
quando a msg não consegue ser encaminha ela gera uma msg de erro através do **protocolo ICMP** (tipo e código)
Cabeçalho ICMP 8 bytes.
ping:
tipo 8 código 0 request
tipo 0 e código 0 reply
- **Fragment Offset**: deslocamento do fragmento (serve pra saber onde juntar as partes)
- **Time To Live (ttl)**: quantidade de roteadores q o datagrama pode passar
para testar o comportamento da rede, usar o comando **ping** e o **traceroute**
traceroute de a para x, quero uma lista de todos os host no caminho
ttl: proprio roteador gera a mensagem ICMP se acabar
````
traceroute 10.0.0.2
````
- **Protocol**: serve pra dizer o que vc ta carregando na area de dados
- **Header Checksum** toda vez que vc muda o ttl vc recalcula o checksum
---
**ping:**
com o ping vc descobre se o outro lado ta vivo se ok, ok, senão não da pra saber muita coisa
rtt (route trip time): o tempo que demora pra mandar o request e receber o reply (soma da ida e da volta)
packet loss maior que zero, a rede ta uma bosta
tempo se manter constante é bom
### aula 14/12/22 - Fragmentação e loop de camada 3
Responsável pela fragmentação será o roteador que tiver uma MTU menor que a do pacote.
- em ipv6 existe fragmentação apenas na origem. Um roteador que não consegue avisa a origem: mande menor! Ou seja, mensagem de controle: ICMP
- Se vc não aceita ICMP, ipv6 não funciona legal.
Se vc for fragmentar um pacote, todos os pedaços terão o mesmo ID.
````
na R2
ifconfig eth1 mtu 600
````
número nunca fica exato pq o tamanho do frame TEM QUE SER MÚLTIPLO DE 4 BYTES
*Uma vez fragmentado o pacote é remontado no destino*
---
LOOP DE CAMADA 3
topologia livre de camada 2:

Quantas vezes o loop pode dar voltas? depende do TTL
vim em R1 e disse que a rota default é R2
vim em R2 e disse que a rota default é R3
vim em R3 e disse qua a rota default é R1
loop certo!
Rota default pro seu provedor, vc acabou de fazer um looping com seu provedor
máquinas linux não vem com encaminhamento de pacotes habilitado.
Pra transformar em roteador, edite o forwarding pra 1.
as duas linhas de baixo (amarelas da figura) deixam com cara de roteador
a linha de cima serve para aceitar endereços locais (receber coisas de vc mesmo)
Você pode editar isso edit config. ou no up ou no post-up:

se vc pinga pra rotas default, funciona pq é encaminhamento direto. mas se rotear pra 200 gera o loop
Como que tira o loop da rede 200?
rotas para o buraco negro!
````
ip route add blackhole 200.0.0.0/255.255.255.0
````

### aula 21/12/22 Sub-redes e CIDR
- encaminhamento direto, precisa de ARP
- encaminhamento indireto, que precisa de roteador (gateway)
500 hosts + 500 hosts (dividir uma classe B)
- máscara padrão: 255.255.0.0
- netID: 16 bits
- hostID: 65534 endereços
Se eu dividir por 4 ficam 16384 endereços
a máscara fica: 255.255.192.0
ficam 18 bits de netID
Exemplo:
172.16.0.0/255.255.0.0
divididos por 4 fica:
endereço/mascara padrão/endereço broadcast
subrede1: 172.16.0.0/255.255.192.0/172.16.63.255
subrede2: 172.16.64.0/255.255.192.0/172.16.127.255
subrede3: 172.16.128.0/255.255.192.0/172.16.191.255
subrede4: 172.16.192.0/255.255.192.0/172.16.255.255






````
route del defaut gw 172.16.192.1
ip route add 172.16.128.0/18 via 172.16.192.0
````

#### Classless Interdomain Routiny - CIDR
- **roteamento CIDR segue a rota mais específica!!!!**
- conceitos de subredes aplicado a toda a internet
- as tabelas de rotas agora precisam de máscara
- qualquer endereço e qualquer máscara
- ipv6 (até /128) - em ipv4(até /32)
- pra ipv6 não existe o conceito de endereço de redes e de broadcast
- a rota default é exatamente 0.0.0.0/0
200.0.0/16
| máscaras | hostID | obs |
|:--------:|:--------:|:--------:|
| /0 | 2ˆ32 | toda a internet (rota default) |
| /8 | | |
| /22 | 2ˆ10 = 1024 | |
| /24 | 2ˆ32-24 = 2ˆ8 = 254 | |
| /30 | 2ˆ32-30 = 2ˆ2 = 4 | ligação ponto a ponto |
| /31 | 2ˆ32-31 = 2ˆ1 = 2 | |
| /32 | 2ˆ32-32 = 2ˆ0 = 1 | |
| /128 | | ipv6 |
- Rota mais específica é a que tem a maior máscara (maior /n)
***Para evitar Loop coloque uma rota menos específica para blackhole***
#### Projeto de endereçamento:
SP1 (230) - /24 até 254
SP2 (150) - /24 até 254
SP3 (100) - /25 até 126
SP4 (70) - /25 até 126
PR1 (50) - /26 até 62
* resto da divisão do meu GRR é 40
200.040.0.0/19
roteador central: /22 para SP e /24 pro PR
roteador SP: dois /24 e dois /25 e rota default
roteador PR: um /26 e duas rotas pra blackhole, uma de /25 e uma de /26
```
ip route add blackhole
```
configue - adapters, acicionar mais uma eth
trocar o swich simples por um openvswitch e separe o trafego por vlan: eth1.200, eth1.300, eth1.400
trabalho 2:

---
---
## CAMADA 4 - Transporte
- garantir a comunicação fim-a-fim entre processos (PID)
L2: ethernet: MAC origem e destino
L3: Datagrama ipv4/ipv6: endereço ip (32/ 128 bits)
L4: TCP/UDP: porta (16 bits)
*porta: 16 bits (0 a 65535)*
Da 1 a 1023 são bem conhecidos. Exemplos:
22 - ssh
80 - http
443 - https
25 - SMTP
53 - DNS
**Ponto de Comunicação** Também chamado de SOCKET
**tupla - 5**
preciso saber:
- ip de origem (IP SRC)
- ip de destino (IP DST)
- ***porta de origem*** (a cada operação pede uma porta aleatória)
- porta de destino (porta do servidor)
- protocolo (TCP ou SCTP ou UDP)
NAT - Network Adress Translation - protocolo para editar dados do cabeçalho, faz traduçao de endereço ip e porta basicamente. Para ele funcionar ele chega nos protocolos de camada 4.
comando screen - comando pra fazer coisas remotas. Rodar em background
Para destacar: ctrl + a + d
````
netstat -anp
````
a all
n número
p processo - só vai funcionar se vc for super usuário
---
````
#netcat
nc -l -u -p 4000
````
l de listen
u de UDP
p de porta
````
nc -u 192.168.0.2 4000
````
---
**confiável** - ter certeza que a mensagem chegou
**orientado a conexão** - chegar em ordem
Datagrama é quando não é confiável e não orientado a conexao
- TCP - confiavel e orientado a conexão
["Datagrama" TCP](https://www.ietf.org/rfc/rfc793) esse link cabeçalho antigo
*Datagrama TCP não existe, pois é confiável e orientado a conexão
- UDP - não confiável e não orientado a conexão
[Datagrama UDP](https://www.rfc-editor.org/rfc/rfc768) - cabeçalho tem 8 bytes. Exemplo: perguntar a hora, consulta DNS (normalmente coisas rápidas)
````
# para fazer NAT. Esse é um NAT stateful. Significa que ele guarda tudo que está sendo enviadp, para depois decifrar
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
````
quando é stateless, não guarda nada, é só redirecionamento de porta. Tipo acessar camera de segurança da sua casa pela internet
````
conntrack -L #para listar os pings
````
aplicativo UPNP (update plug and play) para configurar redirecionamento de portas.
stateful - casado
stateless - carnaval
---
## TCP - Transmission Control Protocol - 25/01/2023
[SEGMENTOS TCP](https://datatracker.ietf.org/doc/html/rfc9293)
não é mais datagrama e, sim, segmento!
20 bytes de cabeçalho
STATEFUL - "Diagrama de Estado" (da pra desenhar com UML)
- **confiável**
- **orientado a conexão**
- **controle de fluxo** "WINDOW (no cabeçalho TCP) - SLIDING"- permite que as pontas possam informar pro outro lado as taxas q querem receber as informações. Maneiras de freiar (RTT ex); lado remoto informa que não tem mais espaço.
- **controle de congestionamento** retransmissão - medido pela porcentagem de pacotes perdidos "LOSS" e pelo ateraso "DELAY"
---
AR - pode ser seletivo ou acumulativo
**ACK - acumulativo:** é a tecnica que confirma qual o próximo segmento que vc quer receber
**SACK - seletivo** (não é padrao do TCP): diz quais são os que ele recebeu implementa no OPTIONS do cabeçalho
outras OPTIONS interessantes
**MSS** - tamanho máximo do segmento (equivalente MTU da camada 3): conta qual o tamanho máximo do segmento que o host pode receber
**Timestamp** - o TCP faz retransmição de mensagem, aí com a marcação de tempo (que só cresce) vc consegue saber se está recebendo a original ou a cópia. Se timestamp for igual é cópia
---
1. Abertura de conexão - "dois sentidos" - Full-Duplex
cliente: mandar um SYN e um número de sequencia aleatorio (x)
servidor: SYN, número de sequencia dele (y), e ligar o ACK (x + 1)
SOMA desses dois tempos é RTT
cliente: núm.seq (x+1) e ACK (y+1)
CONEXÃO ESTABELECIDA - 3 WAY HANDSHAKE - 3WH - SYN/SYN ACK/ACK
2. Encerramento da conexão
cliente: FIN
servidor: FIN ACK (closed no cliente)
cliente: ACK
para garantir que o ACK chegou no servidor existe o timeout
---
a **vazão teórica** que vc consegue mandar pelo TCP é dada por (em bytes por segundo):
**W * MSS / RTT**
W é o contador WINDOW
trabalhar com enlaces de baixa latência (menor RTT)
---
## HTTP 08/02/23
#### [ RFC HTTP](https://www.rfc-editor.org/rfc/rfc2616)
#### [SOCKET API](https://realpython.com/python-sockets/)
[socket no R](https://developer.r-project.org/Blog/public/2020/03/17/socket-connections-update/)
[Using R to communicate via a socket connection](https://www.r-bloggers.com/2013/05/using-r-to-communicate-via-a-socket-connection)
---
# Trabalho 1
H1
````
ifconfig eth0 192.168.0.1
ping 192.168.0.2
````
H2
````
ifconfig eth0 192.168.0.2
````
S1
````
ovs-vsctl show
ovs-vsctl del-br br0
ovs-vsctl del-br br1
ovs-vsctl del-br br2
ovs-vsctl del-br br3
ovs-vsctl add-br br0
ovs-vsctl add-port br0 eth0 trunks=455
ovs-vsctl add-port br0 eth1 trunks=455
ovs-vsctl add-port br0 eth2 trunks=455
ovs-vsctl set bridge br0 stp_enable=true
#pra saber qual endereço mac
ovs-vsctl get interface br0 mac-in-use
# pra verificar o status da porta
ovs-vsctl get port eth0 status
ovs-vsctl set bridge br0 rstp_enable=true
ovs-vsctl get bridge br0 rstp_status
````
S2
````
ovs-vsctl show
ovs-vsctl del-br br0
ovs-vsctl del-br br1
ovs-vsctl del-br br2
ovs-vsctl del-br br3
ovs-vsctl add-br br0
ovs-vsctl add-port br0 eth0 tag=455
ovs-vsctl add-port br0 eth1 trunks=455
ovs-vsctl add-port br0 eth2 trunks=455
ovs-vsctl set bridge br0 stp_enable=true
#pra saber qual endereço mac
ovs-vsctl get interface br0 mac-in-use
# pra verificar o status da porta
ovs-vsctl get port eth0 status
ovs-vsctl set bridge br0 rstp_enable=true
ovs-vsctl get bridge br0 rstp_status
````
S3
````
ovs-vsctl show
ovs-vsctl del-br br0
ovs-vsctl del-br br1
ovs-vsctl del-br br2
ovs-vsctl del-br br3
ovs-vsctl add-br br0
ovs-vsctl add-port br0 eth0 trunks=455
ovs-vsctl add-port br0 eth1 trunks=455
ovs-vsctl add-port br0 eth2 trunks=455
ovs-vsctl set bridge br0 stp_enable=true
#pra saber qual endereço mac
ovs-vsctl get interface br0 mac-in-use
# pra verificar o status da porta
ovs-vsctl get port eth0 status
ovs-vsctl set bridge br0 rstp_enable=true
ovs-vsctl get bridge br0 rstp_status
````
S4
````
ovs-vsctl show
ovs-vsctl del-br br0
ovs-vsctl del-br br1
ovs-vsctl del-br br2
ovs-vsctl del-br br3
ovs-vsctl add-br br0
ovs-vsctl add-port br0 eth0 trunks=455
ovs-vsctl add-port br0 eth1 trunks=455
ovs-vsctl add-port br0 eth2 trunks=455
ovs-vsctl set bridge br0 stp_enable=true
#pra saber qual endereço mac
ovs-vsctl get interface br0 mac-in-use
# pra verificar o status da porta
ovs-vsctl get port eth0 status
````
S5
````
ovs-vsctl show
ovs-vsctl del-br br0
ovs-vsctl del-br br1
ovs-vsctl del-br br2
ovs-vsctl del-br br3
ovs-vsctl add-br br0
ovs-vsctl add-port br0 eth0 tag=455
ovs-vsctl add-port br0 eth1 trunks=455
ovs-vsctl add-port br0 eth2 trunks=455
ovs-vsctl set bridge br0 stp_enable=true
#pra saber qual endereço mac
ovs-vsctl get interface br0 mac-in-use
# pra verificar o status da porta
ovs-vsctl get port eth0 status
ovs-vsctl set bridge br0 rstp_enable=true
ovs-vsctl get bridge br0 rstp_status
````
# Trabalho 2 Projeto de endereçamento:
SP1 (230) - /24 até 254
SP2 (150) - /24 até 254
SP3 (100) - /25 até 126
SP4 (70) - /25 até 126
PR1 (50) - /26 até 62
* resto da divisão do meu GRR é 40
200.040.0.0/19
roteador central: /22 para SP e /24 pro PR
roteador SP: dois /24 e dois /25 e rota default
roteador PR: um /26 e duas rotas pra blackhole, uma de /25 e uma de /26
```
ip route add blackhole
```
configue - adapters, acicionar mais uma eth
trocar o swich simples por um openvswitch e separe o trafego por vlan: eth1.200, eth1.300, eth1.400
trabalho 2:
[](https://i.imgur.com/vZfxyWN.jpg)
---
SP
auto eth0
iface eth0 inet static
address 192.168.040.2
netmask 255.255.255.252
gateway 192.168.040.1
auto eth1
iface eth1 inet static
address 200.040.0.1
netmask 255.255.255.0
auto eth2
iface eth2 inet static
address 200.040.1.1
netmask 255.255.255.0
auto eth3
iface eth3 inet static
address 200.040.2.1
netmask 255.255.255.128
auto eth4
iface eth4 inet static
address 200.040.3.1
netmask 255.255.255.128
---
GERAL
auto eth0
iface eth0 inet static
address 192.168.040.1
netmask 255.255.255.252
auto eth1
iface eth1 inet static
address 192.168.040.5
netmask 255.255.255.252
---
PR
auto eth0
iface eth0 inet static
address 192.168.040.6
netmask 255.255.255.252
gateway 192.168.040.5
auto eth1
iface eth1 inet static
address 200.040.3.1
netmask 255.255.255.192
---
---
H1
auto eth0
iface eth0 inet static
address 200.040.0.2
netmask 255.255.255.0
gateway 200.040.0.1
---
H2
auto eth0
iface eth0 inet static
address 200.040.1.2
netmask 255.255.255.0
gateway 200.040.1.1
---
H3
auto eth0
iface eth0 inet static
address 200.040.2.2
netmask 255.255.255.128
gateway 200.040.2.1
---
H4
auto eth0
iface eth0 inet static
address 200.040.3.2
netmask 255.255.255.128
gateway 200.040.3.1
---
H5
auto eth0
iface eth0 inet static
address 200.040.3.2
netmask 255.255.255.192
gateway 200.040.3.1
---
Console central
`````
````