Transferência confiável de dados sobre um canal perfeitamente confiável
Vamos considerar primeiramente o caso mais simples, em que o canal subjacente é completamente confiável. O protocolo em si, que denominaremos rdt1.0, é trivial. As definições de máquina de estado finito (finite-state machine — FSM) para o remetente e o destinatário rdt1.0 são apresentadas na Figura 3.9.
A FSM da Figura 3.9(a) define a operação do remetente, enquanto a FSM da Figura 3.9(b) define a operação do destinatário. É importante notar que há FSM separadas para o remetente e o destinatário. Ambas as FSM da Figura 3.9 têm apenas um estado. As setas na descrição da FSM indicam a transição do protocolo de um estado para outro. (Uma vez que cada FSM da Figura 3.9 tem apenas um estado, uma transição é, necessariamente, de um dado estado para ele mesmo; examinaremos diagramas de estados mais complicados em breve.)
O evento que causou a transição é mostrado acima da linha horizontal que a rotula, e as ações realizadas quando ocorre o evento são mostradas abaixo da linha horizontal. Quando nenhuma ação é realizada em um evento, ou quando não ocorre nenhum evento e uma ação é realizada, usaremos o símbolo L, acima ou abaixo da linha horizontal, para indicar explicitamente a falta de uma ação ou de um evento, respectivamente. O estado inicial da FSM é indicado pela seta tracejada.
Embora as FSMs da Figura 3.9 tenham somente um estado, as outras que veremos em breve têm vários estados, portanto, será importante identificar o estado inicial de cada FSM.
O lado remetente do rdt simplesmente aceita dados da camada superior pelo evento rdt_send(data), cria um pacote que contém os dados (pela ação make_pkt(data)) e envia-o para dentro do canal. Na prática, o evento rdt_send(data) resultaria de uma chamada de procedimento (por exemplo, para rdt_send()) pela aplicação da camada superior.
Do lado destinatário, rdt recebe um pacote do canal subjacente pelo evento rdt_rcv(packet), extrai os dados do pacote (pela ação extract(packet, data)) e os passa para a camada superior (pela ação deliver_data(data)). Na prática, o evento rdt_ rcv(packet) resultaria de uma chamada de procedimento (por exemplo, para rdt_rcv( )) do protocolo da camada inferior.
Nesse protocolo simples, não há diferença entre a unidade de dados e um pacote. E, também, todo o fluxo de pacotes corre do remetente para o destinatário; com um canal perfeitamente confiável, não há necessidade de o lado destinatário fornecer qualquer informação ao remetente, já que nada pode dar errado! Note que também admitimos que o destinatário está capacitado a receber dados seja qual for a velocidade em que o remetente os envie. Assim, não há necessidade de pedir para o remetente desacelerar!

Comentários
Postar um comentário