# Internet

Antes de seguirmos com opções de comunicação (IPC) para processos em computadores distintos, vamos entender um pouco o contexto da **Internet** e suas formas de comunicação.

### Um pouco de história da Internet

O conceito de internet, como conhecemos, foi criado na década de 60 com o intuito de resolver um problema de interconexão entre computadores em redes distintas.&#x20;

O objetivo era criar infra-estrutura para que a informação trafegasse rapidamente de um ponto remoto a outro no planeta, **de forma descentralizada**.

Durante o desenvolvimento do projeto, para evitar que cada rede tivesse sua própria forma de enviar mensagens, foi preciso delinear convenções e protocolos de comunicação dentro desta rede.&#x20;

Dentre diversos outros padrões e conjuntos de protocolos criados naquela época de *Protocol Wars*, cria-se também o **TCP/IP**, que acaba se tornando a *principal* suite de protocolos para a internet desde então.

### &#x20;TCP/IP

Um dos conjuntos de padrões para a internet que foi concebido e hoje amplamente utilizado é a Suite de *Protocolo de Internet*, ou **Internet Protocol Suite TCP/IP**, que define protocolos de comunicação entre diferentes computadores na rede global.&#x20;

No TCP/IP, são estabelecidas **4 camadas de comunicação**:

* **Application**: é o formato de mensagem que os diferentes programas irão interpretar. Exemplos como FTP, SSH e HTTP aparecem nesta camada.
* **Transport**: nesta camada, são definidas regras de como a informação será transportada. Se será sem conexão, como os datagram sockets, ou com conexão, como os stream sockets, dentre outras regras. Exemplos como TCP e UDP surgem nesta camada.
* **Internet**: cada processo na rede global precisa ter um identificador único, também chamado de *endereço de protocolo de internet*, ou **endereço de IP**. É esta camada que também define o formato da mensagem, se contém header, payload, dentre outros metadados.&#x20;
* **Link**: camada mais voltada para a parte de *roteamento*, especificações de canais de dados, dentre outros protocolos para a parte **física** da comunicação.

<figure><img src="https://1859591191-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ipiROc4LnGxp3JLLiCL%2Fuploads%2FEXs8cEiADCRFWeUe9wLt%2FScreenshot%202022-10-08%20at%2022.06.02.png?alt=media&#x26;token=2dae3135-80d1-4458-8d41-9d1b0f9b9c26" alt=""><figcaption></figcaption></figure>

Neste guia, para que possamos entender os fundamentos da Web, vamos focar na camada de Transporte e Aplicação, pois a camada de Internet é basicamente a definição do que temos por endereçamento IP e camada de Link refere-se a toda a parte física (WiFi, fibra ótica, rádio, etc).&#x20;

### Camada de Transporte

Uma vez que a informação trafegou pela Internet e chegou ao computador, como a mesma é enviada ao processo destinatário?

#### Sockets

Sabemos que *sockets* são utilizados como IPC dentro do sistema operacional. Com isto, no TCP/IP, uma solução seria **implementar a API de Sockets**, assim conseguiríamos manter a mesma *interface*, facilitando a evolução de sistemas construídos em cima da Internet.&#x20;

É com esta ideia que foi criado o projeto **Berkeley Sockets**, que é uma API que faz parte do *TCP/IP* mas que implementa *UNIX Sockets*. Desta forma, com Berkeley Sockets, conseguimos IPC de forma muito similar à UNIX Sockets.&#x20;

Tipos de sockets no TCP/IP:

* **TCP**: é a utilização de stream sockets no TCP/IP
* **UDP**: é a utilização de datagram sockets no TCP/IP

<figure><img src="https://1859591191-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F8ipiROc4LnGxp3JLLiCL%2Fuploads%2FGgrsT4uXeMq9jM3xhive%2FScreenshot%202022-10-08%20at%2022.31.07.png?alt=media&#x26;token=d97ca788-9469-4605-b963-fbe3de58fb3d" alt=""><figcaption></figcaption></figure>

Nas próximas seções, vamos explorar TCP e UDP como formas de comunicação entre processos através de TCP/IP.
