Arquivo de categoria Dicas e Tutoriais

Código arquivo Remessa do Banco Itaú

<?php

/*

* @descr: Gera o arquivo de remessa para cobranca no padrao CNAB 400 vers. 7.0 ITAU

*/

 

function limit($palavra,$limite)

{

if(strlen($palavra) >= $limite)

{

$var = substr($palavra, 0,$limite);

}

else

{

$max = (int)($limite-strlen($palavra));

$var = $palavra.complementoRegistro($max,”brancos”);

}

return $var;

}

 

function sequencial($i)

{

if($i < 10)

{

return zeros(0,5).$i;

}

else if($i > 10 && $i < 100)

{

return zeros(0,4).$i;

}

else if($i > 100 && $i < 1000)

{

return zeros(0,3).$i;

}

else if($i > 1000 && $i < 10000)

{

return zeros(0,2).$i;

}

else if($i > 10000 && $i < 100000)

{

return zeros(0,1).$i;

}

}

 

function zeros($min,$max)

{

$x = ($max – strlen($min));

for($i = 0; $i < $x; $i++)

{

$zeros .= ‘0’;

}

return $zeros.$min;

}

 

function complementoRegistro($int,$tipo)

{

if($tipo == “zeros”)

{

$space = ”;

for($i = 1; $i <= $int; $i++)

{

$space .= ‘0’;

}

}

else if($tipo == “brancos”)

{

$space = ”;

for($i = 1; $i <= $int; $i++)

{

$space .= ‘ ‘;

}

}

 

return $space;

}

 

$fusohorario = 3; // como o servidor de hospedagem é a dreamhost pego o fuso para o horario do brasil

$timestamp = mktime(date(“H”) – $fusohorario, date(“i”), date(“s”), date(“m”), date(“d”), date(“Y”));

 

$DATAHORA[‘PT’] = gmdate(“d/m/Y H:i:s”, $timestamp);

$DATAHORA[‘EN’] = gmdate(“Y-m-d H:i:s”, $timestamp);

$DATA[‘PT’] = gmdate(“d/m/Y”, $timestamp);

$DATA[‘EN’] = gmdate(“Y-m-d”, $timestamp);

$DATA[‘DIA’] = gmdate(“d”,$timestamp);

$DATA[‘MES’] = gmdate(“m”,$timestamp);

$DATA[‘ANO’] = gmdate(“y”,$timestamp);

$HORA = gmdate(“H:i:s”, $timestamp);

$HORA1 = gmdate(“His”, $timestamp);

 

define(“REMESSA”,$PATH.”imagem/remessa/”,true);

 

$filename = REMESSA.$DATA[‘DIA’].$DATA[‘MES’].$DATA[‘ANO’].$HORA1.”.txt”;

$conteudo = ”;

 

## REGISTRO HEADER

#NOME DO CAMPO #SIGNIFICADO #POSICAO #PICTURE

$conteudo .= ‘0’; // tipo de registro id registro header 001 001 9(01)

$conteudo .= 1; // operacao tipo operacao remessa 002 002 9(01)

$conteudo .= ‘REMESSA’; // literal remessa escr. extenso 003 009 X(07)

$conteudo .= ’01’; // codigo servico id tipo servico 010 011 9(02)

$conteudo .= limit(‘COBRANCA’,15); // literal cobranca escr. extenso 012 026 X(15)

$conteudo .= 1234; // agencia mantenedora conta 027 030 9(04)

$conteudo .= complementoRegistro(2,”zeros”);// zeros complemento d registro 031 032 9(02)

$conteudo .= ‘01234’; // conta conta da empresa 033 037 9(05)

$conteudo .= 2; // dac digito autoconf conta 038 038 9(01)

$conteudo .= complementoRegistro(8,”brancos”);// complemento registro 039 046 X(08)

$conteudo .= limit(‘NOME DA SUA EMPRESA’,30);//nome da empresa 047 076 X(30)

$conteudo .= 341; // codigo banco Nº BANCO CÂMARA COMP. 077 079 9(03)

$conteudo .= limit(‘BANCO ITAU SA’,15); // nome do banco por ext. 080 094 X(15)

$conteudo .= $DATA[‘DIA’].$DATA[‘MES’].$DATA[‘ANO’];//data geracao arquivo 095 100 9(06)

$conteudo .= complementoRegistro(294,”brancos”);// complemento de registr 101 394 X(294)

$conteudo .= sequencial(1); // numero sequencial registro no arquivo 395 400 9(06)

 

$conteudo .= chr(13).chr(10); //essa é a quebra de linha

 

### DADOS DOS CLIENTES PARA TESTE

$clientes[] = array(“BOLETO001″,”Cliente A”,”11111111111″,”100,00″);

$clientes[] = array(“BOLETO002″,”Cliente B”,”22222222222″,”200,00″);

$clientes[] = array(“BOLETO003″,”Cliente C”,”33333333333″,”300,00″);

$clientes[] = array(“BOLETO004″,”Cliente D”,”44444444444″,”400,00″);

 

$i = 2;

foreach($clientes as $cliente)

{

## REGISTRO DETALHE (OBRIGATORIO)

#NOME DO CAMPO #SIGNIFICADO #POSICAO #PICTURE

$conteudo .= 1; // tipo registro id registro transacac. 001 001 9(01)

$conteudo .= ’02’; // codigo inscricao tipo inscricao empresa 002 003 9(02)

$conteudo .= ‘00965290700010’; // cnpj da empresa 004 017 9(14)

$conteudo .= 6896; // agencia mantenedora da conta 018 021 9(04)

$conteudo .= ’00’; // zeros complemento registro 022 023 9(02)

$conteudo .= ‘08436’; // conta numero da conta 024 028 9(05)

$conteudo .= 2; // dac dig autoconf conta 029 029 9(01)

$conteudo .= complementoRegistro(4,”brancos”); // brancos complemento registro 030 033 X(04)

$conteudo .= complementoRegistro(4,”zeros”); // CÓD.INSTRUÇÃO/ALEGAÇÃO A SER CANC NOTA 27 034 037 9(04)

$conteudo .= limit($cliente[0],25); // USO / IDENT. DO TÍTULO NA EMPRESA NOTA 2 038 062 X(25)

$conteudo .= complementoRegistro(8,”zeros”); // NOSSO NUMERO / ID TITULO DO BANCO NOTA 3 063 070 9(08)

$conteudo .= ‘0000000000000’; //QTDE MOEDA NOTA 4 071 083 9(08)V9(5)

$conteudo .= 109; // nº da carteira nº carteira banco 084 086 9(03)

$conteudo .= complementoRegistro(21,”brancos”); // uso do banco ident. oper. no banco 087 107 X(21)

$conteudo .= ‘I’; // carteira codigo da carteira NOTA 5 108 108 X(01)

$conteudo .= ’01’; // codigo ocorrencia / ident da ocorrencia NOTA 6 109 110 9(02)

$conteudo .= limit(”,10); // nº documento / nº documento de cobranca NOTA 18 111 120 X(10)

$conteudo .= ‘310808’; // vencimento data venc. titulo NOTA 7 121 126 9(06)

$conteudo .= ‘0000000000000’; // valor titulo valor nominal NOTA 8 127 139 9(11)V9(2)

$conteudo .= 341; // codigo do banco Nº BANCO CÂMARA COMP. 140 142 9(03)

$conteudo .= zeros(0,5); //agencia cobradora / ONDE TÍTULO SERÁ COBRADO NOTA 9 143 147 9(05)

$conteudo .= 15; // especie especie do titulo NOTA 10 148 149 X(02)

$conteudo .= ‘A’; // aceite ident de titutlo aceito (A=aceite,N=nao aceite) 150 150 X(01)

$conteudo .= ‘020808’; // data emissao titulo NOTA 31 151 156 9(06)

$conteudo .= ’88’; // instrucao 1 NOTA 11 157 158 X(02)

$conteudo .= ’86’; // instrucao 2 NOTA 11 159 160 X(02)

$conteudo .= ‘0000000000000’;// juros de 1 dia valor de mora NOTA 12 161 173 9(11)V9(02)

$conteudo .= zeros(0,6); // desconto até data limite p/ descont 174 179 9(06)

$conteudo .= ‘0000000000000’;// valor desconto a ser concedido NOTA 13 180 192 9(11)V9(02)

$conteudo .= ‘0000000000000’; // valor I.O.F RECOLHIDO P NOTAS SEGURO NOTA 14 193 205 9(11)V9(02)

$conteudo .= ‘0000000000000’; // abatimento a ser concedido NOTA 13 206 218 9(11)V9(02)

$conteudo .= ’02’; // codigo de inscricao tipo de insc. sacado 01=CPF 02=CNPJ 219 220 9(02)

$conteudo .= ‘00999999700010’; // numero de inscricao cpf ou cnpj 221 234 9(14)

$conteudo .= limit($cliente[1],30); // nome nome do sacado NOTA 15 235 264 X(30)

$conteudo .= complementoRegistro(10,”brancos”);//NOTA 15 complem regist 265 274 X(10)

$conteudo .= limit(”,40); // logradouro rua numero e compl sacado 275 314 X(40)

$conteudo .= limit(”,12); // bairro bairro do sacado 315 326 X(12)

$conteudo .= zeros(0,8); // cep cep do sacado 327 334 9(08)

$conteudo .= limit(”,15); // cidade cidade do sacado 335 349 X(15)

$conteudo .= limit(”,2); // estado uf do sacado 350 351 X(02)

$conteudo .= limit(”,30); // sacador/avalista sacad ou aval. NOTA 16 352 381 X(30)

$conteudo .= complementoRegistro(4,”brancos”);// complemento de regist. 382 385 X(04)

$conteudo .= zeros(0,6); // data de mora data de mora 386 391 9(06)

$conteudo .= zeros(0,2); // prazo qtde de dias NOTA 11(A) 392 393 9(02)

$conteudo .= complementoRegistro(1,”brancos”); // brancos complemento de registr. 394 394 X(01)

$conteudo .= sequencial($i++); // numero sequencial do registro no arquivo 395 400 9(06)

 

$conteudo .= chr(13).chr(10); //essa é a quebra de linha

/*

## REGISTRO DETALHE (OPCIONAL)

 

#NOME DO CAMPO #SIGNIFICADO #POSICAO #PICTURE

$conteudo .= 4; // tipo transacao id do registro 001 001 9(01)

$conteudo .= ”; // codigo de inscr tipo inscr. empresa NOTA 1 002 003 9(02)

$conteudo .= ”; // numero de inscr cpf ou cnpj 004 017 9(14)

$conteudo .= ”; // agencia mantenedora conta 018 021 9(04)

$conteudo .= ’00’; // zeros complemento de registro 022 023 9(02)

$conteudo .= ”; // conta da empresa 024 028 9(05)

$conteudo .= ”; // DAC autoconf conta 029 029 9(01)

$conteudo .= 109; // n carteira no banco NOTA 5 030 032 9(03)

$conteudo .= ”; // nosso número id titulo banco NOTA 3 033 040 9(08)

$conteudo .= ”; // dac nosso numero NOTA 3 041 041 9(01)

$conteudo .= ”; // sequencia n seq. tipo 4 titulo 042 043 9(02)

 

$conteudo .= ”; // agencia (01) agencia conta credito 044 047 9(04)

$conteudo .= ”; // conta (01) conta p credito 048 054 9(07)

$conteudo .= ”; // dac (1) autoconf conta credito 055 055 9(01)

$conteudo .= ”; // valor (1) valor p credito NOTA 32 056 068 9(11)V9(02)

 

$conteudo .= ”; // agencia (2) 069 072 9(04)

$conteudo .= ”; // conta (2) 073 079 9(07)

$conteudo .= ”; // dac (2) 080 080 9(01)

$conteudo .= ”; // valor (2) 081 093 9(11)V9(02)

 

$conteudo .= ”; // agencia (3) 094 097 9(04)

$conteudo .= ”; // conta (3) 098 104 9(07)

$conteudo .= ”; // dac (3) 105 105 9(01)

$conteudo .= ”; // valor (3) 106 118 9(11)V9(02)

 

$conteudo .= ”; // agencia (4) 119 122 9(04)

$conteudo .= ”; // conta (4) 123 129 9(07)

$conteudo .= ”; // dac (4) 130 130 9(01)

$conteudo .= ”; // valor (4) 131 143 9(11)V9(02)

 

$conteudo .= ”; // agencia (5) 144 147 9(04)

$conteudo .= ”; // conta (5) 148 154 9(07)

$conteudo .= ”; // dac (5) 155 155 9(01)

$conteudo .= ”; // valor (5) 156 168 9(11)V9(02)

 

$conteudo .= ”; // agencia (6) 169 172 9(04)

$conteudo .= ”; // conta (6) 173 179 9(07)

$conteudo .= ”; // dac (6) 180 180 9(01)

$conteudo .= ”; // valor (6) 181 193 9(11)V9(02)

 

$conteudo .= ”; // agencia (7) 194 197 9(04)

$conteudo .= ”; // conta (7) 198 204 9(07)

$conteudo .= ”; // dac (7) 205 205 9(01)

$conteudo .= ”; // valor (7) 206 218 9(11)V9(02)

 

$conteudo .= ”; // agencia (8) 219 222 9(04)

$conteudo .= ”; // conta (8) 223 229 9(07)

$conteudo .= ”; // dac (8) 230 230 9(01)

$conteudo .= ”; // valor (8) 231 243 9(11)V9(02)

 

$conteudo .= ”; // agencia (9) 244 247 9(04)

$conteudo .= ”; // conta (9) 248 254 9(07)

$conteudo .= ”; // dac (9) 255 255 9(01)

$conteudo .= ”; // valor (9) 256 268 9(11)V9(02)

 

$conteudo .= ”; // agencia (10) 269 272 9(04)

$conteudo .= ”; // conta (10) 273 079 9(07)

$conteudo .= ”; // dac (10) 280 280 9(01)

$conteudo .= ”; // valor (10) 281 293 9(11)V9(02)

 

$conteudo .= ”; // agencia (11) 294 297 9(04)

$conteudo .= ”; // conta (11) 298 304 9(07)

$conteudo .= ”; // dac (11) 305 305 9(01)

$conteudo .= ”; // valor (11) 306 318 9(11)V9(02)

 

$conteudo .= ”; // agencia (12) 319 322 9(04)

$conteudo .= ”; // conta (12) 323 329 9(07)

$conteudo .= ”; // dac (12) 330 330 9(01)

$conteudo .= ”; // valor (12) 331 343 9(11)V9(02)

 

$conteudo .= ”; // agencia (13) 344 347 9(04)

$conteudo .= ”; // conta (13) 348 354 9(07)

$conteudo .= ”; // dac (13) 355 355 9(01)

$conteudo .= ”; // valor (13) 356 368 9(11)V9(02)

 

$conteudo .= ”; // agencia (14) 369 372 9(04)

$conteudo .= ”; // conta (14) 373 379 9(07)

$conteudo .= ”; // dac (14) 380 380 9(01)

$conteudo .= ”; // valor (14) 381 393 9(11)V9(02)

 

$conteudo .= ”; // tipo de valor informado NOTA 32 394 394 9(01)

$conteudo .= ”; // numero sequencial de registro no arquivo 395 400 9(06)

*/

/*

IMPORTANTE:

· O arquivo pode conter tanto títulos de cobrança normal como títulos de cobrança com rateio de crédito;

· Para instruções de protesto, os títulos com rateio de crédito seguem os mesmos procedimentos dos títulos sem rateio;

· O rateio de crédito pode ser por percentual ou em valor (vide Nota 32);

· Títulos com rateio de crédito – Para cada Registro Detalhe Obrigatório (Tipo de Registro “1”) podem ser utilizados até 3 (três) Registros

Tipo “4” para indicação dos detalhes do rateio de crédito (máximo de 30 contas por título). Caso a Agência/Conta/Dac do cedente e Nº

da Carteira/Nosso Número do título, informados nos registros Tipo “4” não coincidam com os dados do respectivo registro Tipo “1”, a

entrada do título é aceita sem rateio de crédito (os registros Tipo “4” são desprezados);

· A entrada do título é rejeitada nos casos em que a soma dos valores ou percentuais de rateio (informados nos registros Tipo “4”)

ultrapasse o valor nominal do título do registro Tipo “1”;

· Caso os registros de rateio (Tipo “4”) não apresentem agências/contas de crédito, os registros Tipo 4 são desprezados e o título será

tratado como entrada de cobrança normal, sem rateio;

· A agência/conta do cedente e sua respectiva agência/conta centralizadora de crédito da cobrança, não podem estar entre as

agências/contas beneficiárias do rateio de crédito;

· Títulos com rateio de crédito não aceitam instruções de Desconto ou de Abatimento e não permitem alteração dos valores nominal e de

crédito;

· Não haverá incidência de CPMF quando a raiz do CPNJ da conta do cedente for igual a da conta de crédito do rateio.

*/

/*

$conteudo .= chr(13).chr(10); //essa é a quebra de linha

 

## REGISTRO DETALHE (OPCIONAL)

 

#NOME DO CAMPO #SIGNIFICADO #POSICAO #PICTURE

$conteudo .= 5; // tipo de registro id reg transac 001 001 9(01)

$conteudo .= ”; // endereco de email do sacado NOTA 29 002 121 X(120)

$conteudo .= ”; // codigo de inscr sacador/avalista NOTA 30 122 123 9(02)

$conteudo .= ”; // numero de inscr sacador/avalista NOTA 30 124 137 9(14)

$conteudo .= ”; // logradouro sacador/avalista NOTA 30 138 177 X(40)

$conteudo .= ”; // bairro sacador/avalista NOTA 30 178 189 X(12)

$conteudo .= ”; // cep sacador/avalista NOTA 30 190 197 9(08)

$conteudo .= ”; // cidade sacador/avalista NOTA 30 198 212 X(15)

$conteudo .= ”; // estado sacador/avalista NOTA 30 213 214 X(02)

$conteudo .= complementoRegistro(180,”brancos”);// brancos complem regist 215 394 X(180)

$conteudo .= ”; // numero sequencial do registro no arquivo 395 400 9(06)

*/

/*

IMPORTANTE:

· Este registro é opcional e deverá ser enviado apenas quando o Cedente desejar que o BOLETO de

cobrança seja entregue pelo Banco Itaú ao Sacado por e-mail e/ou, em substituição ou complemento

dos dados referentes ao Sacador/Avalista, quando de sua existência; e

· Sempre que for informado, deverá ser na seqüência do registro obrigatório de cobrança (Código de

Registro ‘1’) a que seus dados se referem;

· As informações constantes neste registro não são informadas no “arquivo retorno”;

· Quando as informações referentes ao “Sacador / Avalista” tiverem sido indicadas nos registros “1” e “5”,

prevalecerá sempre a do registro “5″;

· Na fase de testes não é possível o envio do BOLETO via e-mail, para tanto, este será emitido e

consistido fisicamente.

*/

 

}// fecha loop de clientes

 

//$conteudo .= chr(13).chr(10); //essa é a quebra de linha

 

## REGISTRO TRAILER DE ARQUIVO

/*

CORRETO LAYOUT ITAU

#NOME DO CAMPO #SIGNIFICADO #POSICAO #PICTURE

$conteudo .= 9; // tipo de registro id registro trailer 001 001 9(01)

$conteudo .= complementoRegistro(393,”zeros”); // brancos complemento de registro 002 394 X(393)

$conteudo .= zeros($sequencial,6); // nº sequencial do regsitro no arquivo 395 400 9(06)

*/

 

/* TENTATIVA SEM SUCESSO

$conteudo .= ‘9201341 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000 000000000000000000000000000000000010000000800000000000000 ‘.sequencial($i);

*/

 

// Em nosso exemplo, nós vamos abrir o arquivo $filename

// em modo de adição. O ponteiro do arquivo estará no final

// do arquivo, e é pra lá que $conteudo irá quando o

// escrevermos com fwrite().

// ‘w+’ e ‘w’ apaga tudo e escreve do zero

// ‘a+’ comeca a escrever do inicio para o fim preservando o conteudo do arquivo

 

if (!$handle = fopen($filename, ‘w+’))

{

erro(“Não foi possível abrir o arquivo ($filename)”);

}

 

// Escreve $conteudo no nosso arquivo aberto.

if (fwrite($handle, “$conteudo”) === FALSE)

{

echo “Não foi possível escrever no arquivo ($filename)”;

}

fclose($handle);

 

echo “Arquivo de remessa gerado com sucesso!”;

 

?>

 

Como descobrir se o domínio propagou

Como descobrir se o domínio propagou

Uma dúvida bastante comentada entre boa parte dos Webmasters quando  mudam de host (serviço de hospedagem): é em relação à propagação do DNS.

Quando a mudança de DNS é realizada para um novo servidor é normal que o site ainda continue sendo acessado pelo servidor antigo.

Isso ocorre porque leva certo tempo para que o cache dos servidores de DNS sejam atualizados. Normalmente em um período de 24 horas a 48 horas.

Como sei quando um domínio é propagado?

A propagação de um DNS pode ser um processo lento dependendo dos servidores de DNS do seu provedor de internet, chegando em média a demorar até 72horas para finalizar.

Para você identificar se o seu domínio já foi propagado é bem simples. Basta você clicar no seu botão iniciar do Windows,  acionar o “executar” e digitar cmd ou (tecla de atalho logotipo do teclado + R).

Agora digite o comando ping www.seudominio.com.br

Agora é só você verificar qual endereço IP ele está disparando os pacotes. Veja se o número bate com o endereço IP disponibilizado pelo seu novo servidor de hospedagem.

Outras alternativas para você consultar se o domínio já está propagado é acessando os seguintes endereços:

www.whatsmydns.net

www.intodns.com

 

Inserindo Dados com segurança usando bindParam no PDO

<?php

$conn = new PDO(“mysql:host=localhost;dbname=NOMEDOBANCO”, “USUARIODOBANCO”, “SENHADOBANCO”);

$stmt = $conn->prepare(“INSERT INTO tb_usuarios (deslogin, dessenha) VALUES(:LOGIN, :PASSWORD)”);

$login = “jose”;
$password = “1234567890”;

$stmt->bindParam(“:LOGIN”, $login);
$stmt->bindParam(“:PASSWORD”, $password);
$stmt->execute();
echo “Inserido OK!”;

?>

Conhecendo melhor o IPv6

O protocolo IPv6 apresenta como principal característica e justificativa para o seu desenvolvimento, o aumento no espaço para endereçamento. É importante conhecermos as diferenças entre o endereçamento IPv4 e IPv6 e saber reconhecer a sintaxe dos endereços IPv6, os diferentes tipos existentes e suas principais características.

No IPv4, o campo do cabeçalho reservado para o endereçamento possui 32 bits, com um máximo de 4.294.967.296 (232) endereços distintos.Na época de seu desenvolvimento, esta quantidade era considerada suficiente para identificar todos os computadores na rede e suportar o surgimento de novas sub-redes. No entanto, com o rápido crescimento da Internet, surgiu o problema da escassez dos endereços IPv4, motivando a criação de uma nova geração do protocolo IP.

Assim, o IPv6 surgiu, com um espaço para endereçamento de 128 bits, podendo obter 340.282.366.920.938.463.463.374.607.431.768.211.456 endereços (2128). Este valor representa aproximadamente 79 octilhões (7,9×1028) de vezes a quantidade de endereços IPv4 e representa, também, mais de 56 octilhões (5,6×1028) de endereços por ser humano na Terra, considerando-se a população estimada em 6 bilhões de habitantes.

1. Representação dos endereços

32 bits dos endereços IPv4 são divididos em quatro grupos de 8 bits cada, separados por “.”, escritos com dígitos decimais. Por exemplo: 192.168.0.10. A representação dos endereços IPv6, divide o endereço em oito grupos de 16 bits, separando-os por “:”, escritos com dígitos hexadecimais (0-F). Por exemplo:

  • 2001:0DB8:AD1F:25E2:CADE:CAFE:F0CA:84C1

Na representação de um endereço IPv6, é permitido utilizar tanto caracteres maiúsculos quanto minúsculos.

Além disso, regras de abreviação podem ser aplicadas para facilitar a escrita de alguns endereços muito extensos. É permitido omitir os zeros a esquerda de cada bloco de 16 bits, além de substituir uma sequência longa de zeros por “::”.

Por exemplo, o endereço 2001:0DB8:0000:0000:130F:0000:0000:140B pode ser escrito como 2001:DB8:0:0:130F::140B ou 2001:DB8::130F:0:0:140B. Neste exemplo é possível observar que a abreviação do grupo de zeros só pode ser realizada uma única vez, caso contrário poderá haver ambigüidades na representação do endereço. Se o endereço acima fosse escrito como 2001:DB8::130F::140B, não seria possível determinar se ele corresponde a 2001:DB8:0:0:130F:0:0:140B, a 2001:DB8:0:0:0:130F:0:140B ou 2001:DB8:0:130F:0:0:0:140B. Esta abreviação pode ser feita também no fim ou no início do endereço, como ocorre em 2001:DB8:0:54:0:0:0:0 que pode ser escrito da forma 2001:DB8:0:54::.

Outra representação importante é a dos prefixos de rede. Em endereços IPv6 ela continua sendo escrita do mesmo modo que no IPv4, utilizando a notação CIDR. Esta notação é representada da forma “endereço-IPv6/tamanho do prefixo”, onde “tamanho do prefixo” é um valor decimal que especifica a quantidade de bits contíguos à esquerda do endereço que compreendem o prefixo. O exemplo de prefixo de sub-rede apresentado a seguir indica que dos 128 bits do endereço, 64 bits são utilizados para identificar a sub-rede.

  • Prefixo 2001:db8:3003:2::/64
  • Prefixo global 2001:db8::/32
  • ID da sub-rede 3003:2

Esta representação também possibilita a agregação dos endereços de forma hierárquica, identificando a topologia da rede através de parâmetros como posição geográfica, provedor de acesso, identificação da rede, divisão da sub-rede, etc. Com isso, é possível diminuir o tamanho da tabela de roteamento e agilizar o encaminhamento dos pacotes.

Com relação a representação dos endereços IPv6 em URLs (Uniform Resource Locators), estes agora passam a ser representados entre colchetes. Deste modo, não haverá ambiguidades caso seja necessário indicar o número de uma porta juntamente com a URL. Observe os exemplos a seguir:

  • https://[2001:12ff:0:4::22]/index.html
  • https://[2001:12ff:0:4::22]:8080

2. Tipos de Endereços

Existem no IPv6 três tipos de endereços definidos:

  • Unicast – este tipo de endereço identifica uma única interface, de modo que um pacote enviado a um endereço unicast é entregue a uma única interface;
  • Anycast – identifica um conjunto de interfaces. Um pacote encaminhado a um endereço anycast é entregue a interface pertencente a este conjunto mais próxima da origem (de acordo com distância medida pelos protocolos de roteamento). Um endereço anycast é utilizado em comunicações de um-para-um-de-muitos.
  • Multicast – também identifica um conjunto de interfaces, entretanto, um pacote enviado a um endereço multicast é entregue a todas as interfaces associadas a esse endereço. Um endereço multicast é utilizado em comunicações de um-para-muitos.

Diferente do IPv4, no IPv6 não existe endereço broadcast, responsável por direcionar um pacote para todos os nós de um mesmo domínio. No IPv6, essa função foi atribuída à tipos específicos de endereços multicast.

Endereços Unicast

Os endereços unicast são utilizados para comunicação entre dois nós, por exemplo, telefones VoIPv6, computadores em uma rede privada, etc., e sua estrutura foi definida para permitir agregações com prefixos de tamanho flexível, similar ao CIDR do IPv4.

Existem alguns tipos de endereços unicast IPv6: Global Unicast; Unique-Local; e Link-Local por exemplo. Existem também alguns tipos para usos especiais, como endereços IPv4 mapeados em IPv6, endereço de loopback e o endereço não-especificado, entre outros.

  • Global Unicast – equivalente aos endereços públicos IPv4, o endereço global unicast é globalmente roteável e acessível na Internet IPv6. Ele é constituído por três partes: o prefixo de roteamento global, utilizado para identificar o tamanho do bloco atribuído a uma rede; a identificação da sub-rede, utilizada para identificar um enlace em uma rede; e a identificação da interface, que deve identificar de forma única uma interface dentro de um enlace.Sua estrutura foi projetada para utilizar os 64 bits mais a esquerda para identificação da rede e os 64 bits mais a direita para identificação da interface. Portanto, exceto casos específicos, todas as sub-redes em IPv6 tem o mesmo tamanho de prefixo, 64 bits (/64), o que possibilita 2^64 = 18.446.744.073.709.551.616 dispositivos por sub-rede.Atualmente, está reservada para atribuição de endereços a faixa 2000::/3 (001), que corresponde aos endereços de 2000:: a 3fff:ffff:ffff:ffff:ffff:ffff:ffff:ffff. Isto representa 13% do total de endereços possíveis com IPv6, o que nos permite criar 2^(64−3) = 2.305.843.009.213.693.952 (2,3×1018) sub-redes (/64) diferentes ou 2^(48−3) = 35.184.372.088.832 (3,5×1013) redes /48.
  • Link Local – podendo ser usado apenas no enlace específico onde a interface está conectada, o endereço link local é atribuído automaticamente utilizando o prefixo FE80::/64. Os 64 bits reservados para a identificação da interface são configurados utilizando o formato IEEE EUI-64. Vale ressaltar que os roteadores não devem encaminhar para outros enlaces, pacotes que possuam como origem ou destino um endereço link-local
  • Unique Local Address (ULA) – endereço com grande probabilidade de ser globalmente único, utilizado apenas para comunicações locais, geralmente dentro de um mesmo enlace ou conjunto de enlaces. Um endereço ULA não deve ser roteável na Internet global. Um endereço ULA, criado utilizando um ID global e alocado pseudo-randomicamente, é composto das seguintes partes:
    • Prefixo: FC00::/7.
    • Flag Local (L): se o valor for 1 (FD) o prefixo é atribuído localmente. Se o valor for 0 (FC), o prefixo deve ser atribuído por uma organização central (ainda a definir).
    • Identificador global: identificador de 40 bits usado para criar um prefixo globalmente único.
    • Identificador da Interface: identificador da interface de 64 bits.

    Deste modo, a estrutura de um endereço ULA é FDUU:UUUU:UUUU:: onde U são os bits do identificador único, gerado aleatoriamente por um algoritmo específico.
    Sua utilização permite que qualquer enlace possua um prefixo /48 privado e único globalmente. Deste modo, caso duas redes, de empresas distintas por exemplo, sejam interconectadas, provavelmente não haverá conflito de endereços ou necessidade de renumerar a interface que o esteja usando. Além disso, o endereço ULA é independente de provedor, podendo ser utilizado na comunicação dentro do enlace mesmo que não haja uma conexão com a Internet. Outra vantagem, é que seu prefixo pode ser facilmente bloqueado, e caso um endereço ULA seja anunciado acidentalmente para fora do enlace, através de um roteador ou via DNS, não haverá conflito com outros endereços.

Identificadores de interface

Os identificadores de interface (IID), utilizados para distinguir as interfaces dentro de um enlace, devem ser únicos dentro do mesmo prefixo de sub-rede.O mesmo IID pode ser usado em múltiplas interfaces em um único nó, porém, elas dever estar associadas a deferentes sub-redes.

Normalmente utiliza-se um IID de 64 bits, que pode ser obtido de diversas formas. Ele pode ser configurado manualmente, a partir do mecanismo de autoconfiguração stateless do IPv6, a partir de servidores DHCPv6 (stateful), ou formados a partir de uma chave pública (CGA). Estes métodos serão detalhados no decorrer deste curso.

Embora eles possam ser gerados randomicamente e de forma temporária, recomenda-se que o IID seja construído baseado no endereço MAC da interface, no formato EUI-64.

Um IID baseado no formato EUI-64 é criado da seguinte forma:

  • Caso a interface possua um endereço MAC de 64 bits (padrão EUI-64), basta complementar o sétimo bit mais a esquerda (chamado de bit U/L – Universal/Local) do endereço MAC, isto é, se for 1, será alterado para 0; se for 0, será alterado para 1. Caso a interface utilize um endereço MAC de 48 bits (padrão IEEE 802), primeiro adiciona-se os dígitos hexadecimais FF-FE entre o terceiro e quarto Byte do endereço MAC (transformando no padrão EUI-64), e em seguida, o bit U/L é complementado. Por exemplo:
    • Se endereço MAC da interface for:
      • 48-1E-C9-21-85-0C
      • adiciona-se os dígitos FF-FE na metade do endereço:
      • 48-1E-C9-FF-FE-21-85-0C
      • complementa-se o bit U/L:
      • 48 = 01001000
      • 01001000 → 01001010
      • 01001010 = 4A
      • IID = 4A-1E-C9-FF-FE-21-85-0C

Um endereço link local atribuído à essa interface seria FE80::4A1E:C9FF:FE21:850C.

Endereços especiais

Existem alguns endereços IPv6 especiais utilizados para fins específicos:

  • Endereço Não-Especificado (Unspecified): é representado pelo endereço 0:0:0:0:0:0:0:0ou ::0 (equivalente ao endereço IPv4 unspecified 0.0.0.0). Ele nunca deve ser atribuído a nenhum nó, indicando apenas a ausência de um endereço. Ele pode, por exemplo, ser utilizado no campo Endereço de Origem de um pacote IPv6 enviado por um host durante o processo de inicialização, antes que este tenha seu endereço exclusivo determinado. O endereço unspecified não deve ser utilizado como endereço de destino de pacotes IPv6;
  • Endereço Loopback: representado pelo endereço unicast 0:0:0:0:0:0:0:1 ou ::1 (equivalente ao endereço IPv4 loopback 127.0.0.1). Este endereço é utilizado para referenciar a própria máquina, sendo muito utilizado para teste internos. Este tipo de endereço não deve ser atribuído a nenhuma interface física, nem usado como endereço de origem em pacotes IPv6 enviados para outros nós. Além disso, um pacote IPv6 com um endereço loopback como destino não pode ser enviado por um roteador IPv6, e caso um pacote recebido em uma interface possua um endereço loopback como destino, este deve ser descartado;
  • Endereços IPv4-mapeado: representado por 0:0:0:0:0:FFFF:wxyz ou ::FFFF:wxyz, é usado para mapear um endereço IPv4 em um endereço IPv6 de 128-bit, onde wxyzrepresenta os 32 bits do endereço IPv4, utilizando dígitos decimais. É aplicado em técnicas de transição para que nós IPv6 e IPv4 se comuniquem. Ex. ::FFFF:192.168.100.1.

Algumas faixas de endereços também são reservadas para uso específicos:

  • 2002::/16: prefixo utilizado no mecanismo de transição 6to4;
  • 2001:0000::/32: prefixo utilizado no mecanismo de transição TEREDO;
  • 2001:db8::/32: prefixo utilizado para representar endereços IPv6 em textos e documentações.

Outros endereços, utilizados no início do desenvolvimento do IPv6 tornaram-se obsoletos e não devem mais ser utilizados:

  • FEC0::/10: prefixo utilizado pelos endereços do tipo site local, desenvolvidos para serem utilizados dentro de uma rede específica sem a necessidade de um prefixo global, equivalente aos endereços privados do IPv4. Sua utilização foi substituída pelos endereços ULA;
  • ::wxyz: utilizado para representar o endereço IPv4-compatível. Sua função é a mesma do endereço IPv4-mapeado, tornando-se obsoleto por desuso;
  • 3FFE::/16: prefixo utilizado para representar os endereços da rede de teste 6Bone. Criada para ajudar na implantação do IPv6, está rede foi desativada em 6 de junho de 2006 (06/06/06).

Endereços Anycast

Um endereço IPv6 anycast é utilizado para identificar um grupo de interfaces, porém, com a propriedade de que um pacote enviado a um endereço anycast é encaminhado apenas a interface do grupo mais próxima da origem do pacote.

Os endereços anycast são atribuídos a partir da faixa de endereços unicast e não há diferenças sintáticas entre eles. Portanto, um endereço unicast atribuído a mais de uma interface transforma-se em um endereço anycast, devendo-se neste caso, configurar explicitamente os nós para que saibam que lhes foi atribuído um endereço anycast. Além disso, este endereço deve ser configurado nos roteadores como uma entrada separada (prefixo /128 – host route).

Este esquema de endereçamento pode ser utilizado para descobrir serviços na rede, como servidores DNS e proxies HTTP, garantindo a redundância desses serviços. Também pode-se utilizar para fazer balanceamento de carga em situações onde múltiplos hosts ou roteadores provem o mesmo serviço, para localizar roteadores que forneçam acesso a uma determinada sub-rede ou para localizar os Agentes de Origem em redes com suporte a mobilidade IPv6.

Todos os roteadores devem ter suporte ao endereço anycast Subnet-Router. Este tipo de endereço é formado pelo prefixo da sub-rede e pelo IID preenchido com zeros (ex.: 2001:db8:cafe:dad0::/64). Um pacote enviado para o endereço Subnet-Router será entregue para o roteador mais próximo da origem dentro da mesma sub-rede.

Também foi definido um endereço anycast para ser utilizado no suporte a mobilidade IPv6. Este tipo de endereço é formado pelo prefixo da sub-rede seguido pelo IID dfff:ffff:ffff:fffe (ex.:2001:db8::dfff:ffff:ffff:fffe). Ele é utilizado pelo Nó Móvel, quando este precisar localizar um Agente Origem em sua Rede Original.

Endereços Multicast

Endereços multicast são utilizados para identificar grupos de interfaces, sendo que cada interface pode pertencer a mais de um grupo. Os pacotes enviados para esses endereço são entregues a todos as interfaces que compõe o grupo.

No IPv4, o suporte a multicast é opcional, já que foi introduzido apenas como uma extensão ao protocolo. Entretanto, no IPv6 é requerido que todos os nós suportem multicast, visto que muitas funcionalidades da nova versão do protocolo IP utilizam esse tipo de endereço.

Seu funcionamento é similar ao do broadcast, dado que um único pacote é enviado a vários hosts, diferenciando-se apenas pelo fato de que no broadcast o pacote é enviado a todos os hosts da rede, sem exceção, enquanto que no multicast apenas um grupo de hosts receberá esse pacote.

Deste modo, a possibilidade de transportar apenas uma cópia dos dados a todos os elementos do grupo, a partir de uma árvore de distribuição, pode reduzir a utilização de recurso de uma rede, bem como otimizar a entrega de dados aos hosts receptores. Aplicações como videoconferência, distribuição de vídeo sob demanda, atualizações de softwares e jogos on-line, são exemplos de serviços que vêm ganhando notoriedade e podem utilizar as vantagens apresentadas pelo multicast.

Os endereços multicast não devem ser utilizados como endereço de origem de um pacote. Esses endereços derivam do bloco FF00::/8, onde o prefixo FF, que identifica um endereço multicast, é precedido por quatro bits, que representam quatro flags, e um valor de quatro bits que define o escopo do grupo multicast. Os 112 bits restantes são utilizados para identificar o grupo multicast.

As flags são definidas da seguinte forma:

O primeiro bit mais a esquerda é reservado e deve ser marcado com 0;

  • Flag R: Se o valor for 1, indica que o endereço multicast “carrega” o endereço de um Ponto de Encontro (Rendezvous Point). Se o valor for 0, indica que não há um endereço de Ponto de Encontro embutido;
  • Flag P: Se o valor for 1, indica que o endereço multicast é baseado em um prefixo de rede. Se o valor for 0, indica que o endereço não é baseado em um prefixo de rede;
  • Flag T: Se o valor for 0, indica que o endereço multicast é permanente, ou seja, é atribuído pela IANA. Se o valor for 1, indica que o endereço multicast não é permanente, ou seja, é atribuído dinamicamente.

Os quatro bits que representam o escopo do endereço multicast, são utilizados para delimitar a área de abrangência de um grupo multicast. Os valores atribuídos a esse campo são o seguinte:

  • 1 – abrange apenas a interface local;
  • 2 – abrange os nós de um enlace;
  • 3 – abrange os nós de uma sub-rede
  • 4 – abrange a menor área que pode ser configurada manualmente;
  • 5 – abrange os nós de um site;
  • 8 – abrange vários sites de uma mesma organização;
  • E – abrange toda a Internet;
  • 0, F – reservados;
  • 6, 7, 9, A, B, C, D – não estão alocados.

Deste modo, um roteador ligado ao backbone da Internet não encaminhará pacotes com escopo menor do que 14 (E em hexa), por exemplo. No IPv4, o escopo de um grupo multicast é especificado através do campo TTL do cabeçalho.
A lista abaixo apresenta alguns endereços multicast permanentes:

O endereço multicast solicited-node identifica um grupo multicast que todos os nós passam a fazer parte assim que um endereço unicast ou anycast lhes é atribuído. Um endereço solicited-node é formado agregando-se ao prefixo FF02::1:FF00:0000/104 os 24 bits mais a direita do identificador da interface, e para cada endereço unicast ou anycast do nó, existe um endereço multicast solicited-node correspondente.

Em redes IPv6, o endereço solicited-node é utilizado pelo protocolo de Descoberta de Vizinhança para resolver o endereço MAC de uma interface. Para isso, envia-se uma mensagem Neighbor Solicitation para o endereço solicited-node. Com isso, apenas as interfaces registradas neste grupo examinam o pacote. Em uma rede IPv4, para se determinar o endereço MAC de uma interface, envia-se uma mensagem ARP Request para o endereço broadcast da camada de enlace, de modo que todas as interfaces do enlace examinam a mensagem.

Com o intuito de reduzir o número de protocolos necessários para a alocação de endereços multicast, foi definido um formato estendido de endereço multicast, que permite a alocação de endereços baseados em prefixos unicast e de endereços SSM (source-specific multicast).

Em endereços baseados no prefixo da rede, a flag P é marcada com o valor 1. Neste caso, o uso do campo escopo não altera, porém, o escopo deste endereço multicast não deve exceder o escopo do prefixo unicast “carregado” junto a ele. Os 8 bits após o campo escopo, são reservados e devem ser marcados com zeros. Na sequência, há 8 bits que especificam o tamanho do prefixo da rede indicado nos 64 bits que os seguem. Caso o prefixo da rede seja menor que 64 bits, os bits não utilizados no campo tamanho do prefixo, devem ser marcados com zeros. O campo identificador do grupo utiliza os 32 bits restantes. Note que, em um endereço onde a flag P é marcada com o valor 1, a flag T também deve ser marcada com o valor 1, pois este não representa um endereço definido pela IANA.

No modelo tradicional de multicast, chamado de any-source multicast (ASN), o participante de um grupo multicast não controla de que fonte deseja receber os dados. Com o SSM, uma interface pode registrar-se em um grupo multicast e especificar as fontes de dados. O SSM pode ser implementado utilizando o protocolo MLDv2 (Multicast Listener Discovery version 2).

Para um endereço SSM, as flags P e T são marcadas com o valor 1. Os campos tamanho do prefixo e o prefixo da rede são marcados com zeros, chegando ao prefixo FF3X::/32, onde X é o valor do escopo. O campo Endereço de Origem do cabeçalho IPv6 identifica o dono do endereço multicast. Todo endereço SSM tem o formato FF3X::/96.

Os métodos de gerenciamento dos grupos multicast serão abordados no próximo módulo deste curso.

Também é importante destacar algumas características relacionadas ao endereço apresentadas pela nova arquitetura do protocolo IPv6. Assim como no IPv4, os endereços IPv6 são atribuídos às interfaces físicas, e não aos nós, de modo que cada interface precisa de pelo menos um endereço unicast. No entanto, é possível atribuir a uma única interface múltiplos endereços IPv6, independentemente do tipo (unicast, multicast ou anycast) ou sub-tipo (loopbacklink local6to4, etc.). Deste modo um nó pode ser identificado através de qualquer endereço das suas interfaces, e com isso, torna-se necessário escolher entre seus múltiplos endereços qual utilizará como endereço de origem e destino ao estabelecer uma conexão.

Para resolver esta questão, foram definidos dois algoritmos, um para selecionar o endereço de origem e outro para o de destino. Esses algoritmos, que devem ser implementados por todos os nós IPv6, especificam o comportamento padrão desse nós, porém não substituem as escolhas feitas por aplicativos ou protocolos da camada superior.

Entre as regras mais importantes destacam-se:

  • Pares de endereços do mesmo escopo ou tipo têm preferência;
  • O menor escopo para endereço de destino tem preferência (utiliza-se o menor escopo possível);
  • Endereços cujo tempo de vida não expirou tem preferência sobre endereços com tempo de vida expirado;
  • Endereços de técnicas de transição (ISATAP, 6to4, etc.) não podem ser utilizados se um endereço IPv6 nativo estiver disponível;
  • Se todos os critérios forem similares, pares de endereços com o maior prefixo comum terão preferência;
  • Para endereços de origem, endereços globais terão preferência sobre endereços temporários;
  • Em um Nó Móvel, o Endereço de Origem tem preferência sobre um Endereço Remoto.

Estas regras devem ser utilizadas quando não houver nenhuma outra especificação. As especificações também permitem a configuração de políticas que possam substituir esses padrões de preferências com combinações entre endereços de origem e destino.

3. Políticas de alocação e designação

Na hierarquia das políticas de atribuição, alocação e designação de endereços, cada RIR recebe da IANA um bloco /12 IPv6.

Antes da alocação dos /12 para os RIRs houve também algumas alocações menores. O LACNIC, por exemplo recebeu em 01/11/2002 o bloco 2001:1200::/23, e depois o bloco 2800:0000::/23, em 17/11/2005 (este último incorporado posterormente ao 2800::/12). O NIC.br trabalha também com blocos menores, provenientes dessas alocações antigas, o 2001:1280::/25 e o 2801:0080::/26.

A alocação mínima para ISPs é um bloco /32, no entanto, alocações maiores podem ser feitas mediante apresentação de justificativa de utilização. Um aspecto importante que merece destaque é que diferente do IPv4, com IPv6 a utilização é medida em relação ao número de designações de blocos de endereços para usuários finais, e não em relação ao número de endereços designados aos usuários finais.

Criando Classe usando métodos contruct,destruct e toString no PHP

<?php

class Endereco{

private $logradouro;
private $numero;
private $cidade;
private $estado;
private $pais;

public function __construct($a, $b, $c, $d, $e){

$this->logradouro = $a;
$this->numero = $b;
$this->cidade = $c;
$this->estado = $d;
$this->pais = $e;
}

public function __destruct(){

var_dump(“Destruir”);
}

public function __toString(){
return $this->logradouro.”, “.$this->numero.”, “.$this->cidade.”, “.$this->estado.”, “.$this->pais;
}

}

$meuEndereco = new Endereco(“Rua Santos Machado”, “123”, “Santos”, “São Paulo”, “Brasil”);

echo $meuEndereco;
echo “<br>”;

?>

Classe validar CPF no PHP

<?php  //inicio php

class Documento {  ///criando classe documento onde armazena as informações

private $numero;  //criando atributo privado com o número
public function getNumero(){   //criando método para pegar o atributo privado

return $this->numero; //retornando o método

}

public function setNumero($numero){   //criando método para inserir valor no atributo privado

$resultado = Documento::validarCPF($numero);   //variável que válida o número informado

if($resultado == false){     //Se resultado da Validação ser falso
throw new Exception(“CPF Informado não é válido”, 1);    //Encaminha um erro ao usuário
}
$this->numero = $numero; //Insere no atributo dentro da classe o valor da variável informada pelo usuário
}

public static function validarCPF($cpf){   //Criando método que válida o documento
if(empty($cpf)) {
return false;
}

$cpf = preg_match(‘/[0-9]/’, $cpf)?$cpf:0;

$cpf = str_pad($cpf, 11, ‘0’, STR_PAD_LEFT);

if (strlen($cpf) != 11) {
echo “length”;
return false;
}

else if ($cpf == ‘00000000000’ ||
$cpf == ‘11111111111’ ||
$cpf == ‘22222222222’ ||
$cpf == ‘33333333333’ ||
$cpf == ‘44444444444’ ||
$cpf == ‘55555555555’ ||
$cpf == ‘66666666666’ ||
$cpf == ‘77777777777’ ||
$cpf == ‘88888888888’ ||
$cpf == ‘99999999999’) {
return false;

} else {

for ($t = 9; $t < 11; $t++) {

for ($d = 0, $c = 0; $c < $t; $c++) {
$d += $cpf{$c} * (($t + 1) – $c);
}
$d = ((10 * $d) % 11) % 10;
if ($cpf{$c} != $d) {
return false;
}
}

return true;
}
}
}

$cpf = new Documento();
$cpf->setNumero(“Número do documento”);

var_dump($cpf->getNumero());
echo “</br>”;

?>