Archive for dezembro \21\UTC 2008

A importância dos Codecs

dezembro 21, 2008

Caros colegas,

Novamente tomo a liberdade para escrever no blog do Ensinar. Acredito que este seja um assunto de interesse geral e voltado a todos que trabalham com telefonia IP e VoIP. Este artigo busca fazer entender o que é um codec, quais suas características e critérios para implementação dentro de um servidor Asterisk. Devo frisar que a fonte desse post provém do conteúdo da revista Linux Magazine “Especial 3 – VoIP com Asterisk”, baseado em uma análise escrita por Flávio E. Gonçalves.

Um boa leitura para todos!

 

Introdução

Primeiramente devemos definir o que é um codec. Um codec (coder-decoder) é um codificador-decodificador (traduzindo ao “pé da letra”), de um sinal ou um fluxo de dados digitais. Temos um exemplo abaixo que mostra como funciona a codificação PCM (Pulse Code Modulation):

No caso um sinal analógico de 4000 Hz (faixa da voz humana) é amostrado , quantizado e codificado, gerando um fluxo digital de 8000 amostras, cada uma codificada em 8 bits de dados, consumindo 64kbps de banda, que será transmitido para o sistema. De acordo com a norma da ITU G.711 existem 2 tipos de algoritmos para codificar um sinal PCM: Mu-law e A-law, designados no Asterisk como “ulaw” e “alaw”. O primeiro é usado nos EUA e Japão, enquanto o segundo é usado em quase todos os países. Existem várias características que devem ser entendidas em relação a um codec. Abaixo temos uma tabela com os codecs mais conhecidos e usados no Asterisk e a seguir focaremos em algumas características e pontos importantes a respeito dos codecs.

 

Tabela comparativa dos Codecs
Codecs G.711 G.729 G.723 GSM iLBC
Largura de Banda (Kbps) 64 8 5,3 ou 6,3 13 13,3 ou 15
Complexidade (Mips) 0,35 13 19 5 18
Resistência a perda de pacotes ——- 3% 3% 3% 5% ou 7%
MOS 4,41 4,14 3,79 N/A 4,07

 

  • Qualidade de Voz

A qualidade de voz é medida em MOS (Mean Opinion Score, ou média dos resultados das opiniões). Os testes para MOS seguem a norma P.800 da ITU. O MOS varia em uma escala de um (qualidade ruim) a cinco (qualidade excelente);

  • Compensação (ocultação)

Conhecida como ocultação da perda de pacotes (Packet Loss Concealment). Codecs com essa característica conseguem compensar eventuais perdas de pacotes de voz, “ocultando” isso para o usuário final;

  • Silêncio e ruído

Alguns codecs permitem a detecção de silêncio ou intervalo sem presença de voz, fazendo com que esse “vazio” não seja transmitido, economizando banda. Infelizmente o Asterisk  não suporta (ainda) a inclusão desse recurso;

  • Forma de licenciamento

Nem todos os codecs são gratuitos. Alguns como o G.729 e o G.723 necessitam ser licenciados. O custo não é alto: cerca de 10 dólares por canal simultâneo.

Complexidade

A complexidade de um codec é medida em MIPS (milhões de instruções por segundo). Chega a ser difícil comparar a complexidade em MIPS, pois ela é dependente de um processador. Em muitos casos os codecs são processados em DSP’s (Digital Signal Processor), preparados, construídos e até programados para isso, o que alivia a CPU principal do processo de codificação e decodificação. Logo o processamento de codecs pode ser feito tanto por software como por hardware.

Escolhendo o codec

Cada tipo de codec possui uma aplicação diferente, dependente do sistema, ambiente e solução a que ele for implementado. Por isso, saber escolher pode fazer uma grande diferença. Abaixo temos uma análise para cada tipo de rede:

  • Codecs para redes locais

Em redes locais geralmente temos banda passante em abundância, de forma que o nível de compressão tem um peso pequeno na escolha do codec a ser utilizado. Nesse caso uma escolha natural seria o g.711, que ocuparia cerca de 100kbps (incluindo os cabeçalhos) para cada ligação;

  • Codecs para redes WAN

Em uma rede WAN (Wide Area Network), normalmente temos uma banda passante pequena (64, 128 ou 256 Kbps) onde podemos priorizar o tráfego de voz. Nesse tipo de redes, normalmente, é pouco comum ocorrerem perdas de pacotes. Há três bons codecs para esse tipo de rede: o G.729 provavelmente se destaca, pois provê uma excelente qualidade de voz com uma compressão de 8 para 1; o G.723 permite taxas de compressão ainda maiores, mas com certa perda de qualidade; por fim temos o GSM que é uma alternativa para aqueles que procuram custo/benefício. O ponto negativo do GSM fica para o fato de não ter suporte ao codec na maioria dos telefones IP’s e ATA’s.

  • Codecs para Internet

Em uma rede com Internet há dois desafios: banda passante e falta de controle do meio. Por isso temos uma latência alta e jitter (variação da latência), que culminam com a perda de pacotes. Alguns codecs foram desenvolvidos com esses requisitos em mente. O codec mais indicado para esse tipo de rede é o iLBC, que tem uma boa resistência a perda de pacotes e usa pouca banda passante. Mais informações podem ser encontradas na tabela de codecs desse post.

Consumo

A banda usada em codecs é reservada apenas para o que chamamos de payload, ou “carga”, de voz. Para que um pacote de voz possa trafegar pela rede é preciso que ele seja encapsulado usando cabeçalhos de rede. Uma sessão de voz usando o codec G.729 em uma rede Ethernet , por exemplo, consome cerca de 30 Kbps (quase 4 vezes o tamanho do payload!). Para verificar quanto cada codec consome, em qualquer tipo de rede, podemos usar uma calculadora de banda.

Codec no Asterisk

Esse e os dois tópicos abaixo já são mais técnicos. Para selecionar um codec no Asterisk, é preciso editar o canal relativo ao protocolo desejado (IAX, SIP, H323, etc). Dentro de cada canal é possível escolher os codecs para todos os usuários, presente na seção [general], ou individualmente para cada user em [peer/user].  Por exemplo, para selecionar os codecs para todos os usuários, usamos a seção [general]:

[general]
disallow=all
allow=alaw

E individualmente, por [peer/user]:

[40200]
disallow=all
allow=g729

Transcodificação

Em algumas situações o Asterisk precisa converter os pacotes de voz de um codec para o outro.  Esse processo é conhecido como transcodificação e consome muitos recursos de CPU. Sempre que há conversão de pacotes de voz de um codec para o outro, inclusive em leitura e gravação de gravações de dados, ocorre a transcodificação. Se esse processo puder ser evitado pode-se poupar recursos de CPU e evitar a compra de licenças desnecessárias.

Empacotamento do RTP

Na versão 1.4 do Asterisk também é possível alterar os moldes de empacotamento de cada codec. Pode-se agora aumentar ou diminuir o payload de cada codec, por exemplo, usando 60ms ao invés de 20ms, no caso do codec G.729, impactando no consumo de banda. O empacotamento é definido na instrução Allow:

allow=g729:60

Maiores detalhes podem ser encontrados no site da Digium.

Conclusão

A escolha correta do codec faz toda diferença na implementação de uma solução de telefonia IP ou VoIP. Ela influencia, sobretudo, o consumo de banda, número de canais simultâneos e qualidade de voz para o usuário final. Por isso escolha o codec mais correto para o seu tipo de rede, use técnicas de QoS (qualidade de serviço), priorize o tráfego de pacotes de voz e evite as transcodificações.

Anúncios

A arquitetura TCP/IP

dezembro 19, 2008

TCP/IP é o nome que se dá a toda a família de protocolos utilizados pela Internet. Esta família de protocolos foi desenvolvida pela DARPA (Defense Advanced Research Project Agency) no DoD (Departamento de Defensa dos Estados Unidos).
Este conjunto de protocolos foi desenvolvido para permitir aos computadores compartilharem recursos numa rede. Toda a família de protocolos inclue um conjunto de padrões que especificam os detalhes de como comunicar computadores, assim como também convenções para interconectar redes e rotear o tráfego.
Oficialmente esta família de protocolos é chamada, Protocolo Internet TCP/IP, comumente referenciada só como TCP/IP, devido a seus dois protocolos mais importantes (TCP: Transport Control Protocol e IP: Internet Protocol).

um pouco de história…

Nos anos 60, o principal setor estratégico americano, Department of Defense – DoD se interessou em um protocolo que estava sendo
desenvolvido/utilizado pelas universidades para interligação dos seus sistemas computacionais e que utilizava a tecnologia de chaveamento de pacotes. O interesse do DoD estava no desejo de manter a comunicação entre os diversos sistemas espalhados pelo mundo, no caso de um desastre nuclear. O problema maior estava na compatibilidade entre os sistemas computacionais de diferentes fabricantes que possuíam diferentes sistemas operacionais, topologias e protocolos. A integração e compartilhamento dos dados passou a ser um problema de difícil resolução.
Foi atribuído assim à Advanced Research Projects Agency – ARPA a tarefa de encontrar uma solução para este problema de tratar com diferentes equipamentos e diferentes características computacionais. Foi feita então uma aliança entre universidades e fabricantes para o desenvolvimento de padrões de comunicação. Esta aliança especificou e construiu uma rede de teste de quatro nós, chamada ARPANET, e que acabou sendo a origem da Internet hoje.
No final dos anos 70, esta rede inicial evoluiu, teve seu protocolo principal desenvolvido e transformado na base para o TCP/IP (Transmition Control Protocol / Internet Protocol). A aceitação mundial do conjunto de protocolos TCP/IP deveu-se principalmente a versão UNIX de Berkeley que além de incluir estes protocolos, colocava-os em uma situação de domínio público, onde qualquer organização, através de sua equipe técnica poderia modificá-los e assim garantir seu desenvolvimento.

A arquitetura TCP/IP visualiza a rede de computadores em quatro camadas:

Interface de rede

Esta camada, com o menor nível de abstração na arquitetura TCP/IP, usa padrões para conexão à rede física, seja esta local (Ethernet-CSMA/CD, Token Ring, FDDI, ATM) ou de longa distância (HDLC, X.25, ATM).
Como a camada interface de rede opera com endereços físicos, protocolos de conversão entre endereços físicos e lógicos são definidos. São estes o ARP (Address Resolution Protocol) e o RARP (Reverse ARP).

Inter-redes
Esta camada estabelece os protocolos para transporte não-confiável de mensagens (IP – Internet Protocol), para controle da comunicação e informe de erros (ICMP – Internet Control Message Protocol) e para roteamento de mensagens (EGP – Exterior Gateway Protocol, RIP – Routing Information Protocol).
Endereços para comunicação entre máquinas (host-to-host) são lógicos (endereços IP), já usando o nível adicional de abstração oferecido pela camada inferior.
Na versão mais usual do protocolo (IPv4), endereços IP ocupam 32 bits e são divididos em cinco classes. As classes A, B e C têm seus endereços estruturados em um prefixo de identificação de classe (binários 0, 10 e 110, respectivamente), identificador de subrede (7, 14 e 21 bits) e identificador de host. A classe D (prefixo 1110) é utilizada para multicast, enquanto que endereços da classe E (11110) são reservados para uso futuro.
Usualmente, endereços IP são representados por um conjunto de quatro de valores decimais correspondente aos quatro grupos de 8 bits do endereço. Nessa forma de representação, endereços iniciados por valores entre 0 e 127 são da classe A; entre 128 e 191, classe B; entre 192 e 223, classe C; entre 224 e 239, classe D; e entre 240 e 247, classe E.

classes

Existe também uma forma de representação simbólica de endereços IP baseada em nomes de domínios que são partições da rede Internet organizados hierarquicamente em estruturas de domínios e sub-domínios.
O mapeamento entre endereços IP representados simbolicamente e numericamente é realizado por servidores de nome distribuídos pela Internet, conhecido por Sistemas de Nomes de Domínio ou DNS.

Transporte
Esta camada estabelece protocolos para transporte confiável de dados por conexão (TCP/IP – Transfer Control Protocol/IP) e para transporte de datagramas, sem conexão (UDP – User Datagram Protocol).
Em termos de endereçamento, esta camada introduz o conceito de porta, um nível de endereço adicional que identifica a aplicação na máquina. Um endereço completo nesse nível é estabelecido por um par (host, port).

Aplicação

Esta camada, de maior nível de abstração, define o conjunto de serviços manipulados por usuários.
Os serviços definidos utilizam a arquitetura de distribuição cliente-servidor. Os servidores são processos que oferecem o serviço e estabelecem um endereço (host,port) para sua disponibilização. Os clientes devem entrar em contato com o servidor nesse endereço para requisitar o serviço.
Algumas portas de serviços TCP/IP já são pré-definidas, sendo denominadas de portas notáveis tais como:
Eco (retornar o mesmo que for enviado): porta 7 – echo
Transferência de arquivos: porta 21 – ftp
Terminal virtual: porta 23 – telnet
Correio eletrônico: porta 25 – smtp
arqt

O Modelo de Referência OSI

dezembro 12, 2008

O que é ?

uma arquitetura que divide as redes de computadores em sete camadas, de forma a se obter
camadas de abstração.
Cada protocolo implementa uma funcionalidade assinalada a uma determinada camada.

O que nao é…

O modelo de referência OSI não é uma implementação de rede. Ao invés disto, ele especifica as
funções de cada camada.
O modelo OSI não é uma arquitetura de rede, já que uma arquitetura de
rede é um conjunto de camadas e protocolos e o modelo OSI não especifica exatamente os serviços e
protocolos a serem usados em cada camada.

Um pouco de história…

O transporte de informações entre computadores de diferentes tipos é uma capacidade que
mostra-se extremamente importante.
No início dos anos 80, a ISO (International Organization of Standardization) reconheceu
a necessidade de um modelo de rede que auxiliasse na criação de implementações de redes
interoperacionais.
Em conseqüência dessa necessidade, surgiu o Modelo de Referência OSI ISO para Interconexão
de Sistemas Abertos, mais conhecido como modelo OSI.
Esse modelo foi um primeiro passo para a padronização internacional dos diversos protocolos
existentes hoje em dia

ISO ?

ISO foi uma das primeiras organizações para defirir formalmente uma forma comum de
conectar computadores
A ISO costuma trabalhar em conjunto com outra organização, a ITU (International Telecommunications Union),
publicando uma série de especificações de protocolos baseados na arquitetura OSI.
Estas séries são conhecidas como ‘X ponto’, por causa do nome dos protocolos – X.25, X.500, etc.

Esta arquitetura funciona através da Comunicação Hierárquica…

Comunicação Hierárquica ?

O modelo de referência OSI divide a transmissão de informações entre
computadores de uma rede em 7 camadas.
É como dividir um “grande problema”(ransmissão de informações entre
computadores) em problemas menores e consequentemente melhores e mais fáceis para gerenciar.
Cada uma dessas 7 áreas de problemas é resolvida por uma camada do modelo OSI.

Mas, por que 7 camadas ?

Entendo que o número de camadas deve ser grande o suficiente para que não seja preciso agrupar
funções em uma mesma camada porém nao deve ser muito extenso para que a arquitetura fique manejável
chegou-se aos quatro princípios abaixo:

1 – Uma camada deve ser criada onde é necessário um nível de abstração diferente.
2 – Cada camada deve desempenhar uma função bem definida.
3 – A função de cada camada deve ser definida tendo em vista a definição de protocolos padrões internacionais.
4 – As fronteiras entre as camadas devem ser escolhidas de forma a minimizar o fluxo de informações através das interfaces.

Sendo assim temos as seguintes camadas:

 

numero nome funcionalidade
7 Aplicações interface entre o protocolo de comunicação e o  aplicativo que pediu ou receberá a informação
6 Apresentação traduz os dados recebidos pela camada de sessão para um formato compreensível para os protocolos
5 Sessão permite que duas aplicações em computadores diferentes estabeleçam uma sessão de comunicação
4 Transporte  recebe dados da camada de sessão, dividindo-os me pacotes e pasando estes as demais camadas
3 Rede endereçamento dos pacotes, convertendo endereços lógicos(IP) em endereços físicos
Enlace detecta e, opcionalmente, corrige erros que possam acontecer no nível físico
1 Física  características técnicas dos dispositivos elétricos (físicos)

E como isso funciona ?

A maioria dos dispositivos de uma rede implementam todas as 7 camadas. Entretanto, para
tornar mais eficiente as operações, algumas implementações de rede omitem uma ou mais camadas. As
2 últimas camadas do modelo OSI são implementadas com software e hardware; as 5 camadas
superiores são geralmente implementadas em software.

Um exemplo pode deixar isso bem mais claro…

Considere que o sistema A tem informações a serem transmitidas para o sistema B. O programa de
aplicação do sistema A comunica-se com a camada 7 (a camada de topo) do sistema A, que se
comunica com a camada 6 do sistema A, que se comunica com a camada 5, até que a camada 1 desse
sistema seja carregada. A camada 1 preocupa-se em colocar e retirar informações do meio físico da
rede. Após as informações terem atravessado esse meio, elas ascendem pelas camadas do sistema B na
ordem inversa (primeiro a camada 1, depois a camada 2, etc.), até que finalmente carreguem o
programa de aplicação desse sistema B. Esse processo também é válido para o caso em que as
informações são transmitidas do sistema B para o sistema A.

sistema

Apesar de cada uma das camadas do sistema A comunicarem-se com a camada adjacente desse
mesmo sistema, o verdadeiro objetivo delas é a comunicação com as suas camadas iguais no sistema B
Isto é, o objetivo primário da camada 1 do sistema A é comunicar-secom a camada 1 do sistema B;
a camada 2 do sistema A se comunica com a camada 2 do sistema B e
assim por diante.
Isto é necessário porque cada camada em um sistema tem certas tarefas que devem
ser executadas, e para ocorrer essa execução, a camada precisa comunicar-se com a sua camada igual
do outro sistema

por que ?

vamos responder esta pergunta com outra pergunta

Como a camada 4 no sistema B sabe o que a camada 4 no sistema A quer? As especificações da
camada 4 requeridas são carregadas como uma informação de controle, que é transmitida entre
camadas iguais em um bloco chamado de cabeçalho (header), que é anexado na informação de
aplicação atual.

meiofisico1

Entendendo o que é NAT

dezembro 10, 2008

NAT (network address translation) é um protocolo que, faz a tradução dos endereços Ip e portas TCP da rede local para a Internet.
Ou seja, o pacote a ser enviado ou recebido de sua estação de trabalho na sua rede local, vai até o servidor onde seu ip é trocado pelo ip do servidor a  substituição do ip da rede local valida o envio do pacote na internet, no retorno do pacote acontece a mesma coisa porém ao contrário o que garante que o pacote chegue ao seu destino.

Um pouco de história

Com o surgimento das redes privadas com internet partilhada, surgiu o problema de como os computadores pertencentes à esta rede privada poderiam receber as respostas aos seus pedidos feitos para fora da rede.

Por se tratar de uma rede privada, os números de IP interno da rede não podiam ser passados para a internet pois não existem e o computador que recebesse um pedido com um desses números não saberia para onde enviar a resposta. então as requisições teriam de ser geradas com um IP global do router. Mas quando a resposta chegasse ao router, seria preciso saber a qual dos computadores da rede privada pertencia aquela resposta.

A solução foi fazer um mapeamento baseado no IP interno e na porta local do computador. Com esses dados o NAT gera um número de 16 bits  este número é então escrito no campo da porta de origem.

Esta foi uma medida de reação face à previsão da exaustão do espaço de endereçamento IP, e rapidamente adaptada para redes privadas também por questões econômicas (no início da Internet os endereços IP eram alugados individualmente ou por classes/grupos).

Um exemplo:

A estação com IP 192.168.1.8 faz uma requisição para um endereço externo. O pacote sai da estação com o IP da estação e vai ate o gateway que é o intermediador entre ambiente interno e o externo. O gateway, através do protocolo NAT mascara o IP da estação com seu IP (200.158.112.130 – que é válido na internet) desta forma faz com que o pacote seja entregue no destino solicitado pela estação. No retorno do pacote, ele parte do endereço externo (200.158.112.130), chega a nossa rede no servidor NAT com o ip externo e então volta ater o IP da estação chegando à estação (192.168.1.8).

Entao entende-se que a aplicação prática do NAT em uma rede local é para distribuição do acesso à internet. Sendo assim NAT é um proxy?

Não, o proxy tem função de armazenamento em cachê. Ele armazena os sites no servidor e distribui para a rede, quando o site requisitado não é encontrado no servidor, este vai a busca do site e o armazena no servidor para que as estações possam acessa-lo.
O proxy não depende de DNS instalado no servidor porém o NAT depende.

Utilizar Nat e Proxy juntos seria a ideal quando se tem uma rede um pouco extensa para diminuição do consumo da banda de seu link com a internet. Habilitar um Proxy para conteúdo http e deixar o resto com o NAT  diminuirá bastante o trafego do link.

Vantagens de usar NAT

As entradas no NAT são geradas apenas por pedidos dos computadores de dentro da rede privada. Sendo assim, um pacote que chega ao router vindo de fora da rede e que não tenha sido gerado em resposta a um pedido da rede, não encontrá nenhuma entrada no NAT e este pacote será automaticamente descartado e consequentemente não será entregue a nenhum computador da rede.
Isso impossibilita a entrada de conexões indesejadas e o NAT acaba funcionando como uma firewall.

Restrições
Como NAT conhece apenas os protocolos TCP e UDP, não é possível estabelecer uma conexão que não utilize um desses protocolos.

O número gerado pela tabela de hash tem apenas 16 bits, o que faz com que esta técnica permita até 65535 conexões ativas. Dependendo das dimensões da rede e do número de pedidos feitos pelos computadores desta rede, o limite de 65535 pode ser facilmente atingido

Post mais popular do mês de novembro

dezembro 8, 2008

Pessoal,

O post mais popular do mês de novembro foi o Telefonia Convencional x VoIP.

Os autores foram:

  • Wesley Volcov
  • Fabrício Campos
  • Rodrigo Ribeiro
  • Adelson Junior
  • Juliana Taguchi

Rodrigo e Adelson já tinham camiseta. Juliana não está na Voice e não temos modelo feminino (hehe). Por isso, as camisetas irão para Fabrício e Wesley.

Para o mês de dezembro, a promoção do Ensinar será a seguinte:

  • O melhor post do mês ganhará uma camiseta. O post será escolhido por uma enquete com os 5 posts mais acessados. Será feita uma enquete para que os usuários do site escolham o melhor.
  • Caso o post tenha mais de uma pessoa, somente duas camisetas serão dadas para o post vencedor (dando prioridade para quem não tem camiseta).
  • Chega de regras, afinal, a idéia é dar o prêmio para o post mais legal.

O post ganhador deverá ser conhecido no dia 15 de janeiro de 2009.

Até mais,

André

Depurando com minidumps (Windows)

dezembro 8, 2008

“Structured Exceptions” (SE) é o nome que se dá para as condições anormais que, normalmente, encerram um processo dentro do Windows. Muito equivalente ao signal do POSIX.

Semana passada, aprendi uma técnica muito interessante para tratamento da SE em aplicações windows com o Visual C++ Express e também pode ser feito com o windbg. A técnica consiste em implementar um trecho de código que gere um minidump no momento em que for detectada uma exceção deste tipo. A partir daí, é uma escolha da aplicação continuar rodando ou não, uma vez que esse tipo de exceção nunca vem sozinho e sempre deixa alguma seqüela.

Criei um projeto simples de aplicação console que executa este snippet:

// início seh.cpp
#include "iostream"

/*
	Por simplicidade, vamos fazer uma versão de new() que sempre falha e retorna nulo;
	Ignorando a especificação de std::nothrow.
 */
void * operator new[](size_t size)
{
	return 0;
}

int main()
{
	const size_t tamString = 10;
	char * s = new char[tamString]; // Ops! não vi que um new[] falhou...
	strcpy(s, "teste");
	std::cout << s << std::endl;

	return 0;
}
// fim seh.cpp

O operador new[] foi sobrecarregado para gerar o efeito desejado.

Na hora de executar o programa, você ou o usuário pode encontrar (neste caso, encontrará) uma janela como esta:

Tipica tela de SE

Tipica tela de SE

Numa primeira etapa, podemos melhorar o programa para que ele termine tranqüilamente (feche o que tiver que fechar etc). O resultado desta mudança, por exemplo, poderia ser como este:

// início seh.cpp (v1.1)
#include <iostream>
#include <iomanip>

//v1.1 -- cabeçalhos para o tratamento de exceção
#include <sstream>
#include <string>

#include <windows.h>
#include <eh.h>

/*
    Por simplicidade, vamos fazer uma versão de new() que sempre falha e retorna nulo;
    Ignorando a especificação de std::nothrow.
 */
void * operator new[](size_t size)
{
    return 0;
}

//v1.1 Cria uma classe simples de exceção
class StructuredException: public std::exception
{
public:
    StructuredException(PEXCEPTION_POINTERS ptr)
    {
        std::ostringstream out;
        out << "Exceção 0x" << std::hex << ptr->ExceptionRecord->ExceptionCode <<
            std::dec << ": " << "O endereço " << ptr->ExceptionRecord->ExceptionAddress <<
            " tentou " << (ptr->ExceptionRecord->ExceptionInformation[0] ? "GRAVAR" : "LER") <<
            " o endereço " <<
            reinterpret_cast<void*>(ptr->ExceptionRecord->ExceptionInformation[1])
            << std::endl;
        message_ = out.str();
    }

    const char * what() const
    {
        return message_.c_str();
    }

private:
    std::string message_;
};

// v1.1 -- handler para tratamento de exceções, diferente daquela tela.
void MySETranslator(unsigned int code, PEXCEPTION_POINTERS ptr)
{
    std::cout << "Deu merda." << std::endl;
    throw StructuredException(ptr);
}

int main()
{
    // v1.1 -- prepara o ambiente para um melhor tratamento de exceções.
    _set_se_translator(MySETranslator);

    try
    {
        const size_t tamString = 10;
        char * s = new char[tamString]; // Ops! não vi que um new[] falhou...
        strcpy(s, "teste");
        std::cout << s << std::endl;
    } catch(std::exception & e)
    {
        std::cout << e.what() << std::endl;
    }
    std::cout << "Terminei meu programa." << std::endl;
    return 0;
}
// fim seh.cpp

E a execução deste programa seria um pouco mais amigável, mas ainda difícil de depurar (neste caso não, mas imagine isto em um projeto realmente grande).

Nosso primeiro programa, com algum tratamento

Nosso primeiro programa, com algum tratamento

Enfim, é extremamente difícil rastrear entre módulos apenas com esse endereço. Para se extrair informação útil, podemos utilizar a API de minidumps. Aqui está o exemplo atualizado:

// início seh.cpp (v1.2)
#include <iostream>
#include <iomanip>

//v1.1 -- cabeçalhos para o tratamento de exceção
#include <sstream>
#include <string>

#undef UNICODE // para simplificar
#include <windows.h>
#include <eh.h>

// v 1.2 -- cabeçalhos para geração de minidumps.
#include <dbghelp.h>

/*
    Por simplicidade, vamos fazer uma versão de new() que sempre falha e retorna nulo;
    Ignorando a especificação de std::nothrow.
 */
void * operator new[](size_t size)
{
    return 0;
}

//v1.1 Cria uma classe simples de exceção
class StructuredException: public std::exception
{
public:
    StructuredException(PEXCEPTION_POINTERS ptr)
    {
        std::ostringstream out;
        out << "Exceção 0x" << std::hex << ptr->ExceptionRecord->ExceptionCode <<
            std::dec << ": " << "O endereço " << ptr->ExceptionRecord->ExceptionAddress <<
            " tentou " << (ptr->ExceptionRecord->ExceptionInformation[0] ? "GRAVAR" : "LER") <<
            " o endereço " <<
            reinterpret_cast<void*>(ptr->ExceptionRecord->ExceptionInformation[1])
            << std::endl;
        message_ = out.str();
    }

    const char * what() const
    {
        return message_.c_str();
    }

private:
    std::string message_;
};

// v1.1 -- handler para tratamento de exceções, diferente daquela tela.
void MySETranslator(unsigned int code, PEXCEPTION_POINTERS ptr)
{
    std::cout << "Deu merda." << std::endl;
    // v1.2 -- Cria o minidump antes de lançar a exceção.
    HANDLE file = CreateFile("minidump.dmp", GENERIC_WRITE, 0, NULL,
        CREATE_ALWAYS, 0, NULL);
    MINIDUMP_EXCEPTION_INFORMATION exception = {0};
    exception.ThreadId = GetCurrentThreadId();
    exception.ExceptionPointers = ptr;
    MiniDumpWriteDump(GetCurrentProcess(), GetCurrentProcessId(), file,
        MiniDumpNormal, &exception, NULL, NULL);
    CloseHandle(file);
    // v1.2 fim

    throw StructuredException(ptr);
}

int main()
{
    // v1.1 -- prepara o ambiente para um melhor tratamento de exceções.
    _set_se_translator(MySETranslator);

    try
    {
        const size_t tamString = 10;
        char * s = new char[tamString]; // Ops! não vi que um new[] falhou...
        strcpy(s, "teste");
        std::cout << s << std::endl;
    } catch(std::exception & e)
    {
        std::cout << e.what() << std::endl;
    }
    std::cout << "Terminei meu programa." << std::endl;
    return 0;
}
// fim seh.cpp

O uso deste recurso também implica na inclusão da biblioteca “dbghelp.lib” nas opções do projeto. Vamos, agora, executar o projeto mais uma vez. A tela da execução ficou exatamente igual à anterior. Porém, agora, temos o arquivo de minidump no diretório do projeto:

Listagem de diretório com o arquivo de Minidump

Listagem de diretório com o arquivo de Minidump

Agora vem a parte mais fácil: como depurar nosso programa?? Dois cliques no arquivo .dmp e temos um novo projeto do visual studio:

Iniciando a depuração com o minidump

Iniciando a depuração com o minidump

Depuração do erro na execução.

Depuração do erro na execução.

Como podemos ver aqui, depois da geração do arquivo de minidump, ficou meio “automático” para encontrar o erro.

O que é o que no mundo voip

dezembro 6, 2008

Estudando voip e sip , vi que muitas vezes somos capazes de entender
contextos e situações porém as vezes falta saber o que é exatamente
cada um dos elementos que fazem parte deste ambiente.
Sendo assim resolvi definir alguns destes elementos

Definiçao Voip –  Voz sobre IP (também conhecido por VoIP, Telefonia IP e Telefonia Internet) se refere à tecnologia que permite a tramsmissão de sinais de voz por uma rede seja ela privada ou uma rede pública como a internet.
É necessário um telefone sip OU um telefone VoIP para que esse tipo de telefonia seja possível. As ligações podem ser feitas para qualquer lugar tanto para números telefônicos VoIP quanto para pessoas com números telefônicos convencionais.

É necessário um telefone sip , mas … o que é um telefone sip ?

Telefone SIP, Telefone VOIP ou soft phones são termos sinônimos entre si e usados par designar telefones que permitem fazer chamadas através da tecnologia VoIP (voz sobre protocolo da internet).

Existem dois tipos de Telefones SIP. O primeiro tipo é o Telefone SIP hardware, que se assemelha a um aparelho de telefone comum, mas pode receber e fazer chamadas usando a internet ao invés do sistema tradicional PSTN.
Os telefones SIP podem também ser com base em software. Estes permitem que qualquer computador seja usado como telefone através de um fone de ouvido com um microfone e/ou placa de som. É necessário também ter uma conexão de banda larga e conexão com um Provedor VOIP ou Servidor SIP.

Entendi tudo, menos o que é um servidor sip ? 

Um servidor SIP é o componente principal de um IP PBX e lida com a organização de todas as chamadas SIP na rede. O servidor SIP também é conhecido por Proxy SIP ou SIP Registrar.
ok , mas e sip e ip pbx ?

SIP é uma sigla para Protocolo de Iniciação de Sessão (Session Initiation Protocol – SIP) é um protocolo de aplicação, que utiliza o modelo “requisição-resposta”, similar ao HTTP, para iniciar sessões de comunicação interativa entre utilizadores

faltou o ip pbx…

IP PBX é um sistema telefônico que gerencia telefones na empresa e atua como o “gateway” para redes externas. Ao contrário de um PABX convencional que exige duas redes separadas, uma para dados e outra para voz , o IP PBX trabalha com ambas (dados e voz) em uma unica rede e pode ser usado com telefones IP, softphones e tradicionais telefones conectados a adaptadores Ethernet (um ATA / “Lingo Box”) ou PCs

O que é um Sistema de Telefonia PBX?

PBX significa Private Branch Exchange (troca automática de ramais privados). É uma rede de telefonia privada usada por uma empresa. Os usuários de um sistema de telefonia PBX compartilham um número de linhas externas para a realização de chamadas externas.

Um PBX conecta os telefones internos de uma empresa e também os conecta à rede pública (PSTN). Uma das tendências mais recentes da telefonia PBX é o VoIP PBX, também conhecido como IP PBX que usa o protocolo de Internet para a transmissão de chamadas.

Atualmente, há quatro opções diferentes de telefonia PBX:

PBX
Hosted/ PBX Virtual
IP PBX
Hosted/ IP PBX Virtual

IP PBX é um sistema de telefonia PBX com base em software que ajuda na realização de certas tarefas e oferece serviços que podem ser difíceis e caros de simplementar usando um sistema PBX tradicional.

E o ATA ?

Adaptador de Telefone Analógico: Um dispositivo que se liga em uma conexão de Internet banda larga em umas das extremidades e em telefones comuns na outra, permitindo a comunicação entre os dois

O que é DID ?

DID – Direct Inward Dialing é um recurso oferecido por companhias telefônicas para serem usadas com o sistema PBX de seus clientes, através do qual a companhia telefônica agrupa um conjunto de números associados com uma ou mais linhas telefônicas.

Tem o propósito de permitir que uma companhia designe um número específico para cada funcionário, sem que cada um precise de uma linha telefônica separada. Desse modo, o tráfico telefônico pode ser dividido e gerenciado mais facilmente.

O que são codecs ?

Codecs são usados para converter um sinal analógico de voz versão codificada digitalmente. Codecs variam na qualidade sonora, largura de banda necessária entre outros requisitos computacionais
Cada serviço, programa, telefone, Gateway, etc suporta vários codecs diferentes, e quando falam entre si negociam qual codec utilizar.

Tipos de codecs mais usados atualmente:

GSM – 13 Kbps (full rate), quadros de 20ms
iLBC – 15Kbps, quadros de 20ms: 13.3 Kbps, quadros de 30ms
ITU G.711 – 64 Kbps, baseado em amostra. Também conhecido por alaw/ulaw
ITU G.722 – 48/56/64 Kbps
ITU G.723.1 – 5.3/6.3 Kbps, quadros de 30ms
ITU G.726 – 16/24/32/40 Kbps
ITU G.728 – 16 Kbps
ITU G.729 – 8 Kbps, quadros de 10ms
Speex – 2.15 to 44.2 Kbps
LPC10 – 2.5 Kbps
DoD CELP – 4.8 Kbps

O que é RTP ?

RTP – significa em inglês Real Time Transport Protocol (Protocolo de Transporte em Tempo Real) e determina um formato de pacote padrão para o envio de áudio e vídeo pela Internet. É definido pela RFC 1889. Foi desenvolvido pelo grupo Audio Video Transport Working e foi primeiramente publicado em 1996.

RTP e RTCP estão intimamente interligados – o RTP entrega os dados e o RTCP é usado como um feedback da qualidade do serviço.
E esse RTCP ?

RTCP significa em inglês Real Time Transport Control Protocol (Protocolo de Controle de Transporte em Tempo Real) definido pela RFC 3550. O RTCP funciona juntamente com o RTP. O RTP realiza a entrega dos dados, enquanto o RTCP envia pacotes de controle aos participantes de uma chamada. Sua função principal é fornecer um feedback da qualidade dos serviços oferecidos pelo RTP.

O que é enum  ?

ENUM significa em inglês Telephone Number Mapping (Mapeamento de Números de Telefone). Esta abreviação esconde em si uma ótima idéia: ser alcançável em qualquer lugar do mundo com o mesmo número de telefone – e com o melhor e mais barato reencaminhamento de chamadas. O ENUM conecta um número de telefone a um endereço da Internet que é publicado no sistema DNS. O proprietário de um número ENUM pode, portanto, publicar para onde uma chamada deve ser reencaminhada através de uma entrada DNS. E mais, diferentes rotas podem ser determinadas para diferentes tipos de chamadas – por exemplo, você pode determinar um reencaminhamento diferente se a chamada vier de um fax. O ENUM necessita do número de onde a chamada se origina para operar.
O número do ENUM é registrado de modo semelhante ao registro de um domínio. No momento, muitos registradores e provedores VoIP estão fornecendo este serviço de graça.
O ENUM é um padrão novo e ainda não muito divulgado. Apesar de parecer estar prontopara causar uma nova revolução nas comunicações e mobilidade pessoal.

O que é  CDR ?

Call Detail Record (Gravador de Detalhes de Chamada)
Um gravador de dados das chamadas em um sistema voip.
Grava informações como origem , destino , hora de inicio , finalização
e duração de uma chamada

fontes:

www.voip-info.org
www.3cx.com.br
http://www.primusvoip.co.uk/jargon_buster.html

Post ganhador da camiseta

dezembro 5, 2008

No mês de outubro, o post mais popular do mês e o autor com o maior número de posts ganharia a camiseta do Ensinar. O mês passou, e nada de camiseta. Com um mês de atraso, os ganhadores da camiseta Voice/Basix foram:

Até mais,

André

Sip. O que é isso ?

dezembro 5, 2008

O Protocolo de Iniciação de Sessão (Session Initiation Protocol – SIP) é um protocolo de aplicação, que utiliza o modelo “requisição-resposta”, similar ao HTTP, para iniciar sessões de comunicação interactiva entre utilizadores.

SIP é um protocolo de sinal para estabelecer chamadas e conferências através de redes via Protocolo IP. O estabelecimento, mudança ou término da sessão é independente do tipo de mídia ou aplicação que será usada na chamada; uma chamada pode utilizar diferentes tipos de dados, incluindo áudio e vídeo.

Um pouco de história…

SIP foi moldado, inspirado noutros protocolos de Internet baseados em texto como o SMTP (email) e o HTTP (páginas da web) e foi desenvolvido para estabelecer, mudar e terminar chamadas num ou mais utilizadores numa rede IP de uma maneira totalmente independente do conteúdo de dados da chamada. Como o HTTP, o SIP leva os controles da aplicação para o terminal, eliminando a necessidade de uma central de comutação.

SIP teve origem em meados da década de 1990 para que fosse possível adicionar ou remover participantes dinamicamente numa sessão multicast.

O que o SIP faz?
O SIP fornece configuração/estabelecimento,amarração, derrubada/finalização para comunicações multimídia integrando diversos conteúdos a sessões de administração.

Como ?

O SIP fornece cinco funções, usa uma abordagem por camada que dá flexibilidade e tem uma abertura que permite a ele ser utilizado por novas aplicações.

Localização de Usuário

O SIP determina a localização do usuário por um processo de registro. Quando um software de telefone é ativado em um computador, ele envia um registro ao servidor SIP anunciando a disponibilidade da rede de comunicações.
Os telefones de voz por IP (VoIP), os celulares ou até mesmo um sistema completo de teleconferências também podem ser registrados. Dependendo do ponto de registro escolhido, pode haver vários locais diferentes registrados simultaneamente.

Disponibilidade do Usuário

A disponibilidade do usuário é um método simples de determinar se o usuário quer
ou não responder a uma requisição de comunicação.
Um usuário pode ter vários locais registrados, mas só pode aceitar o recebimento das
comunicações em um dispositivo. Se um não responder, a chamada é transferida
para outro dispositivo ou outra aplicação.

Capacidades do Usuário

Com todos esses métodos e padrões diferentes de comunicação multimídia, é preciso algo que verifique a compatibilidade entre as comunicações e as capacidades do usuário.
Essa função também determina quais métodos de codificação/decodificação um usuário pode suportar.

Configuração da Sessão

O SIP estabelece parâmetros para ambas as pontas da comunicação – mais especificamente, no momento que uma pessoa chama e outra responde. O SIP estabelece os meios de configurar e/ou estabelecer as comunicações.

Gerenciamento da Sessão

Essa função é responsável pela maior parte da admiração dos usuários. Desde que o dispositivo seja capaz, um usuário pode transferir de um dispositivo para outro – como de um telefone por IP para um computador – sem gerar qualquer impacto perceptível.
As capacidades gerais do usuário irão mudar ele poderá ser capaz de iniciar novas aplicações entre outras o que talvez afete temporariamente a qualidade da voz, já que o SIP reavalia e modifica os fluxos de comunicação para voltar à qualidade de voz.
Com o gerenciamento da sessão SIP, o usuário também pode mudar a sessão, tornando-a uma conferência, passando de uma chamada de telefone para uma conferência de vídeo ou abrindo uma aplicação desenvolvida internamente. E, finalmente, o SIP encerra as comunicações.

Finalizando…

Embora o SIP tenha cinco funções, atualmente é mais fácil pensar o SIP como configurador, gerenciador e finalizador das comunicações por IP. As funções de localização e capacidades do usuário podem facilmente ser absorvidas pela função de configuração da sessão.

Fontes :

White Paper – Session Initiation Protocol (SIP): Um Protocolo de Cinco Funções

http://pt.wikipedia.org/wiki/SIP

IPComm 2008 – Palestra do Antonio e do Sakuma

dezembro 5, 2008

Pessoal,

Hoje foi o segundo dia do IPComm. Acompanhei somente as palestras da parte da tarde, mas o pessoal da Voice presente acompanhou as outras. Hoje o número de participantes era maior, mas ainda assim poderia ter um número maior de pessoas.

Pessoal da Voice no Evento, ainda faltou o Thiago

Pessoal da Voice no Evento, ainda faltou o Thiago na foto

Não acompanhei todas as palestras, mas posteriormente o pessoal irá colocar aqui as suas impressões sobre o evento.

David Duffet continuou a sua sequência de palestras sobre Asterisk e falou sobre wireless e reconhecimento de voz. Moises Mejia e o pessoal da Dialogic (Mariscal e Ricardo Franco) falaram sobre aplicações de vídeo sobre HMP. Flávio Gonçalves falou sobre Asterisk em sistemas embarcados.

Na sequência, Antonio e Sakuma realizaram a sua palestra sobre testes de performance em plataformas SIP utilizando SIPp. A palestra conceituou o que é um teste de performance e como ele pode ser utilizado através do SIPp.  Acredito que a palestra passou a idéia principal e as pessoas realizaram perguntas sobre como o teste de performance pode ser efetuado com o SIPp. O endereço do blog e dos e-mails dos palestrantes foi passado a todos, caso necessitem de mais informações.

O dia também foi bom para encontrar e conversar com pessoas, sejam elas fornecedores (Khomp, Dialogic) ou outros players do mercado, como o pessoal da iSolve que tem uma solução aparentemente bem montada em cima de Asterisk, inclusive com ACD.  No stand da iSolve o pessoal aproveitou para tirar fotos com o Jon “maddog” Hall.

Além disso aproveitaram e tiraram fotos com Maddog e o palestrante da Digium que era gente boa e dava um chocolate para cada pergunta que alguém fazia (um Alexsandro deve ter ganho uma caixa de bombom inteira).

Seguem algumas fotos (mais fotos no álbum no Multiply):

Pessoal com o Jon Maddog

Pessoal com o Jon Maddog

Pessoal com o palestrante da Digium

Pessoal com o palestrante da Digium

Antonio e Sakuma respondendo perguntas

Antonio e Sakuma respondendo perguntas

Foram duas palestras realizadas nestes últimos dois dias. No próximo ano pretendemos ampliar a nossa participação em eventos técnicos como o FISL e o Latinoware. Obrigado a todos pela ajuda e Santiago e Petri por gravarem as palestras, em breve elas estarão no YouTube.

Sakuma, o palestrante

Sakuma, o palestrante

Antonio falando

Antonio falando