1. Introdução ao TCP/IP
A família TCP/IP Protocol é um protocolo usado pela Internet e também pode ser usado em redes privadas independentes.
A família TCP/IP Protocol inclui protocolo IP, protocolo TCP e protocolo UDP.
O protocolo IP usa endereços IP para distribuir pacotes, mas é um serviço de melhor esforço, e os pacotes podem ser perdidos, fora de ordem ou repetidos. Os protocolos TCP e UDP adicionam números de porta ao protocolo IP, estabelecendo assim uma conexão transparente entre os aplicativos dos dois hosts.
A diferença é que o protocolo TCP corrige os erros da camada IP, que estabelecem conexões entre os hosts através de mensagens de handshake.
Em seguida, os erros na mensagem são restaurados adicionando um número de série à mensagem. O UDP simplesmente estende o protocolo IP.
Permitir que ele funcione entre aplicativos, não entre os hosts.
Em relação aos endereços IP, um host pode ter várias interfaces de rede e uma interface pode ter vários endereços.
Alguns endereços IP têm usos especiais:
A. Endereço de loopback: 127.0.0.1, é sempre atribuído a uma interface de loopback, usada principalmente para teste.
B. Endereço privado: começando com 10, 192.168, 172. (16-31), usado para redes privadas. Quando um dispositivo NAT encaminha uma mensagem, ele mapeia o par de portas de endereço privado da mensagem em uma interface no par de porta de endereço público em outra interface. Isso permite que um pequeno grupo de hosts compartilhe um par de endereços IP.
C. Endereço multicast: O primeiro número está entre 224 e 239.
2. Bastos do soquete
1. Obtenção de endereço
public static void main (string [] args) {try {enumeração <networkInterface> interfaces = networkInterface.getNetworkInterfaces (); while (interfaces.hasMoreElements ()) {NetworkInterface iface = interfaces.nextElement (); System.out.println ("interface:" + iface.getName ()); Enumeração <iNetAddress> addrlist = iface.getinetaddresses (); if (! addrlist.hasmoreElements ()) System.out.println ("sem endereço"); while (addrlist.hasMoreElements ()) {inetAddress endereço = addrlist.nextElement (); System.out.println ("endereço:" + endereço.gethostaddress ()); }}} catch (SockeTexception e) {e.printStackTrace (); }}2. Programa de instância TCP
Deve -se notar que, embora apenas um método Write () seja usado para enviar strings no lado do cliente, o lado do servidor também pode receber essas informações de vários blocos. Mesmo que a sequência de feedback seja armazenada em um bloco quando o servidor retornar, pode ser TCP
O protocolo é dividido em várias partes.
TcPechoclienttest.java
public static void main (string [] args) lança IoException {string server = args [0]; byte [] dados = args [1] .getBytes (); int porta = 7; Soquete soquete = novo soquete (servidor, porta); System.out.println ("conectado ao servidor ..."); InputStream in = socket.getInputStream (); OutputStream out = Socket.getOutputStream (); out.write (dados); int totalbytesrcvd = 0; int bytesrcvd; while (totalbytesrcvd <data.length) {if ((bytesrcvd = in.read (dados, totalbytesrcvd, data.length - totalbytesrcvd)) == -1) lançar uma nova soneta ("conexão fechada"); totalBytesrcvd += bytesrcvd; } System.out.println ("Recebido:" + new String (Data)); Socket.Close (); }TcPechoservertest.java
private estático final int bufsize = 32; public static void main (string [] args) lança IoException {ServerSocket ServerSocket = new ServerSocket (7); int recvmsgSize; byte [] recebaBuf = novo byte [bufsize]; while (true) {soquete de soquete = serversocket.accept (); System.out.println ("Handling Client" + "de Remote" + Socket.getRemoteSocketAddress () + "AT LOCAL" + Socket.getLocalsocketAddress ()); InputStream in = socket.getInputStream (); OutputStream out = Socket.getOutputStream (); while ((RecvmsgSize = in.read (RecendBuf))! = -1) {out.Write (RecendBuf, 0, RecvmsgSize); } soket.close (); }}Observe que o novo soquete especifica o número da porta que o servidor remoto ouve sem especificar a porta local; portanto, o endereço padrão e o número da porta disponível serão usados. Na minha porta da minha máquina, a porta está 4593, conectada à porta 7 do servidor.
3. Programa de instância UDP
Por que usar o protocolo UDP? Se o aplicativo trocar apenas uma pequena quantidade de dados, a fase de estabelecimento da conexão TCP transmitirá pelo menos o dobro de suas informações (e duas vezes o tempo de ida e volta).
UdPechoclienttest.java
public static void main (string [] args) lança IoException {inetAddress serverAddress = inetaddress.getByName (args [0]); byte [] bytestosend = args [1] .getBytes (); Datagramsocket soquete = new Datagramsocket (); Socket.SetSotimeout (3000); Datagropgheet sendpacket = new DatagRampacket (bytestosend, bytestosend.length, serverAddress, 7); DataGRAPLACET REINGPACKET = new DatagRampacket (novo byte [bytestosend.length], bytestosend.length); // Os pacotes podem ser perdidos, então temos que continuar tentando intries = 0; boolean recebeuSponse = false; do {Socket.send (sendpacket); tente {socket.receive (recebapacket); if (! Receberpacket.getAddress (). Iguals (serverAddress)) lança uma nova ioexception ("Receba da fonte desconhecida"); recebeuSponse = true; } catch (ioexception e) {tenta ++; System.out.println ("Tempo limite, tente novamente"); }} while (! RecebidoResponse && tenta <5); if (recebeu (RecebSponse) System.out.println ("Recebido:" + new String (Receberpacket.getData ())); else System.out.println ("sem resposta"); Socket.Close (); } UdPechoservertest.java
private estático final int echomax = 255; public static void main (string [] args) lança IoException {datagramsocket soket = new Datagramsocket (7); Pacote de datagropgacket = novo datagroftacket (novo byte [echomax], echomax); while (true) {socket.receive (pacote); System.out.println ("Handling Client em" + packet.getAddress ()); Socket.send (pacote); packet.setLength (Echomax); }}Comparando este exemplo com a instância anterior do TCP, existem as seguintes diferenças:
O A.DatagramSocket não precisa especificar o endereço de destino quando for criado, porque o UDP não precisa estabelecer uma conexão e cada pacote de dados pode ser enviado ou recebido de um endereço de destino diferente.
B. Se você bloquear e esperar em Read () como o TCP, ele poderá estar bloqueado lá para sempre, porque o protocolo UDP simplesmente estende o protocolo IP e os pacotes UDP podem ser perdidos. Portanto, você deve definir o tempo de tempo limite para bloquear a espera.
O protocolo c.UDP mantém as informações de limite da mensagem, e cada chamada RECET () pode receber apenas os dados enviados pela chamada do método send () uma vez.
D. Os dados máximos que um pacote UDP pode transmitir é de 65507 bytes. O excesso de bytes será descartado automaticamente e não há prompt para o programa de recebimento. Portanto, é seguro definir a matriz de cache para cerca de 65.000 bytes.
E. Se o método REPEPT () for chamado repetidamente com a mesma instância do DatagRampacket, o comprimento interno da mensagem deverá ser reiniciado explicitamente para o comprimento real do cache antes de cada chamada.