domingo, 16 de febrero de 2014

Leyes de Lehman

Cuando hablamos de la Ingeniería de Software, las Leyes de Evolución de Software se refieren a los términos que Lehman y Belady formularon a partir de 1974 con respecto a la Evolución del Software. 
Estas leyes describen el balance que deberá existir entre el desarrollo de nuevo software y el evitar un desgasto al momento de hacerlo.

Al analizar los problemas experimentados, los autores de estas leyes, determinaron que los siguientes software podrían y/o deberían regirse por ciertos métodos, por lo que en 1980 Lehman publicó un artículo en el que afirmo que había que definir 3 categorías de software:

  • S-Program: creado en base a la especificación (Specification) de lo que el programa debe hacer.
  • P-Program: creado en base a la implementación de los procesos (Procedures) que el programa puede cumplir.
  • E-Program: creado para actividades reales correspondientes al mundo y por lo tanto, la forma en que se diseñan esta bastante relacionado con su relación con el entorno (Environment), y en consecuencia este debe adaptarse a las condiciones y requerimientos necesarios para un buen funcionamiento.
En el periodo de 1974 a 1996 se formularon las siguientes 8 reglas, las cuales solo son aplicables a la categoría E:

  1. Cambio continuo (1974): un sistema de tipo E deberá ser modificado continuamente o sera cada vez menos usable.
  2. Complejidad Incrementable (1974): mientras un sistema E evolucione, su complejidad deberá incrementar a menos que haya sido previsto para mantenerse o reducirse.
  3. Auto-Regulación (1974): el crecimiento es auto-regulado, y por tanto, sus atributos como lo son el tiempo de entregas, tamaño, y errores encontrados son invariantes a cada entrega.
  4. Estabilidad Organizacional (1978): durante el tiempo de uso funcional de un programa, su tiempo de desarrollo evolutivo debe ser invariante.
  5. Conservación de la familiaridad (1978): a medida que un sistema evoluciona, todo el personal relacionado con este, debe mantener un dominio y comportamiento para lograr el éxito evolutivo del mismo; el crecimiento desmedido, puede dar como resultado la perdida de domino, sin embargo, el crecimiento incremental lo puede mantener constante.
  6. Crecimiento continuo (1991): el contenido usable de un sistema E deberá ser actualizado constantemente para mantener la satisfacción del usuario a lo largo del tiempo de vida del sistema.
  7. Decremento de calidad (1996): la calidad correspondiente a un sistema de tipo E empezara a reducirse a menos que sea rigurosamente adaptada a cambios en el entorno operacional.
  8. Retroalimentación del Sistema (1996, aunque fue dicha primeramente en 1974, fue formalizada como ley en 1996): el proceso de evolución de un sistema E, consta de retroalimentación por medio de multi-niveles y multi-iteraciones que deben ser tratados como base para terminar un producto totalmente funcional.
Al haber analizado las leyes anteriores y los tipos de sistema que se pueden desarrollar, podemos concluir que para realizar un buen sistema, es necesario delimitar de una manera adecuada el tipo de sistema, a quien se dirigirá éste mismo, y que funcionalidad deberá tener; en caso de realizar un sistema de tipo "E" debemos cumplir con las 8 reglas, si queremos un producto funcional y completo en el cual podamos confiar para realizar otras actividades relacionadas con un entorno real y variante.


Bibliografía

Lehman, M. M. (1980). On Understanding Laws, Evolution, and Conservation in the Large-Program Life Cycle. NA: NA.
Lehman, M. M. (1980). Programs, Life Cycles, and Laws of Software Evolution. NA: NA.
Lehman, M. M., & J. F. Ramil, P. D. (1997). Metrics and Laws of Software Evolution-ninentees view. NA: NA.


domingo, 2 de febrero de 2014

Mantenimiento de Software

Primero que nada, debemos saber que es el mantenimiento de software:

  • "El proceso de modificar un sistema de software o sus componentes, para prevenir fallos,  mejorar el desempeño u otros atributos, así como adaptarse a los cambios en su ambiente"

Por lo tanto, podemos decir que el mantenimiento de software concierne a:

  • Corregir errores descubiertos posteriormente a la entrega del software.
  • Adaptar al software a un cambio en los requerimientos,  un cambio en su ambiente.
El éxito en el mantenimiento depende en el desarrollo, por las siguientes razones:

  1. Mayor calidad = menor mantenimiento (correctivo).
  2. Anticipar cambios = menor mantenimiento (adaptativo y perfectivo).
  3. Mejor ajuste a las necesidades del usuario = menos mantenimiento (perfectivo).
  4. Menos código = menos mantenimiento.
Contamos con 4 tipos de mantenimiento:
  • Correctivo: como el nombre lo dice, corrige los errores.
  • Adaptativo: adaptarse al cambio del ambiente (tanto hardware como software).
  • Perfectivo: adaptación al cambio en las necesidades del usuario.
  • Preventivo: incrementar la mantenibilidad del sistema.


Después de todo lo dicho, podemos determinar que simplemente por haber entregado un software 100% funcional al cliente no implica que no se le debe dar seguimiento, sino todo lo contrario, se le debe mejorar, corregir e incluso perfeccionar, esto eventualmente nos dará un sistema cercano a la perfección requerida previamente por los usuarios.


Bibliografía


Amsterdan, U. (s.f.). Faculty Sciences. Obtenido de Department of Computer Sciences: https://www.google.com.mx/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&cad=rja&ved=0CCoQFjAA&url=http%3A%2F%2Fwww.cs.vu.nl%2F~hans%2FSEslides%2Fmaint.ppt&ei=hGMBU47RGISiyAGGkoDYAw&usg=AFQjCNEu6TpvFtE_U0RANCqMtJ_GY1zi8w&sig2=LJulSW5jT1ECAMgzXQr6AQ&bvm=bv.61535280,d.aWc


viernes, 29 de noviembre de 2013

Destination Finder == Sistema Distribuido

  • El sitio web Destination Finder, diseñado por la empresa SoftCake Inc. puede ser considerado como un sistema distribuido por lo siguiente: cada "modulo" que integra la pagina web, fue distribuida en diferentes equipos y funciono de manera exitosa, haciendo uso de los protocolos TCP/IP, logramos hacer una distribución de recursos, permitiendo una comunicación estable y eficiente entre todos los equipos, permitiendo el acceso a una sola base de Datos y coordinando el orden de ejecución de las acciones de cada parte, logramos una interfaz simple, comprensible y rápida.
  • Cumpliendo con las siguientes características podemos asegurar que este proyecto si es un sistema distribuido:


    1. Transparencia: la mayoría de los usuarios que usen nuestra plataforma web, percibirán a esta como un solo objeto, y no un "rompecabezas" que esta hecho por partes.
    2. Concurrencia: el sistema esta habilitado para la realización de multiples tareas de procesamiento y fue comprobado por medio del JMeter.
    3. Escalable: fue diseñado de tal manera que pueda seguir siendo desarrollado posteriormente sin necesidad de realizar muchos ajustes para permitir la "expansión" de su funcionalidad.
    4. Fallos independientes: al ser un proyecto integrado por partes, el fallo de un modulo, no podrá afectar el desempeño de los otros.
El sitio web esta disponible en este link "Destination Finder"

domingo, 24 de noviembre de 2013

Cliente V2.0



import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.Timer;
import java.net.URL;
import javax.swing.*;
import javax.sound.sampled.*;
/**
 *
 * @author Eduardo Yair-
 */
public class Cliente extends JLabel implements Juego{
    JFrame frm=new JFrame("Speed Racer GT");
    Socket sokete;
    ArrayList<Enemigo> racerx=new ArrayList<Enemigo>();
    ArrayList<Auto> speedr=new ArrayList<Auto>();
    Timer t;
    ObjectInputStream entradaOBJ;
    ObjectOutputStream objSaliente;
    Image track=new ImageIcon(getClass().getResource("media/fondo.png")).getImage();
    Image autoi=new ImageIcon(getClass().getResource("media/carpot.png")).getImage();
    Image enemyi=new ImageIcon(getClass().getResource("media/enemy.png")).getImage();
    Image enemyj=new ImageIcon(getClass().getResource("media/enemy1.png")).getImage();
    Image enemyk=new ImageIcon(getClass().getResource("media/enemy2.png")).getImage();
    Image enemyl=new ImageIcon(getClass().getResource("media/ship.png")).getImage();

    int pos=0;
    public static void main(String args[]) throws Exception{
        new Cliente();
    }
    public void bkgrndmsk()throws Exception {
        URL url = new URL(  "https://dl.dropboxusercontent.com/u/96424843/hocus.wav");      
        //String strFilename = "media/hocus.wav";
        //File sound=new File(strFilename);
        //InputStream in = ClassLoader.getSystemResourceAsStream("media/hocus.wav");
        //URL urlToClip = this.getClass().getResource("media/hocus.wav");
        Clip clip = AudioSystem.getClip();
        // getAudioInputStream() also accepts a File or InputStream
        AudioInputStream ais = AudioSystem.getAudioInputStream(url);
        clip.open(ais);
        clip.loop(Clip.LOOP_CONTINUOUSLY);
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                JOptionPane.showMessageDialog(null, "La música se terminara cuando acabe el juego");
            }
        });
    }
    public Cliente() throws Exception{
        super();
        bkgrndmsk();
        conectar();
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Dimension pantalla=Toolkit.getDefaultToolkit().getScreenSize();
        frm.setSize(pantalla);
        frm.setUndecorated(true);
        frm.add(this);
        frm.setVisible(true);
        this.setFocusable(true);
        this.addKeyListener(error85);
        setBackground(Color.BLACK);
        t=new Timer(5,updater);
       
        t.start();
    }
    public void dibujarAuto(Auto c,Graphics2D g2d){
        if(!c.perder){
            g2d.drawImage(autoi,c.posx,c.posy,c.ancho,c.alto , null);
        }
    }
     public void paint(Graphics g){
        super.paint(g);
        Graphics2D g2d=(Graphics2D)g;
        g2d.setColor(Color.white);
        g2d.drawImage(track, 0, pos,frm.getWidth() ,frm.getHeight() , null);
        g2d.drawImage(track, 0, 0-frm.getHeight()+pos,frm.getWidth() , frm.getHeight() , null);
        for(Auto a:speedr){
            dibujarAuto(a,g2d);
        }
        dibujarEnemigos(racerx,g2d);
    }
    public void dibujarEnemigos(ArrayList<Enemigo> enem,Graphics2D g2d){
        for(int i=0;i<enem.size();i++){
            int r=i%3;
            if(r==0){
                g2d.drawImage(enemyi,enem.get(i).posx,enem.get(i).posy,enem.get(i).ancho,enem.get(i).alto , null);
            }else if(r==1){
                g2d.drawImage(enemyj,enem.get(i).posx,enem.get(i).posy,enem.get(i).ancho,enem.get(i).alto , null);
            }else if(Math.random()*2<=4){
                g2d.drawImage(enemyk,enem.get(i).posx,enem.get(i).posy,enem.get(i).ancho,enem.get(i).alto , null);
            }else if(Math.random()*2>=4){
                g2d.drawImage(enemyl,enem.get(i).posx,enem.get(i).posy,enem.get(i).ancho,enem.get(i).alto , null);}
        }
    }
    public void recibirEnemigos(){
        try{
            //s.setSoTimeout(5);
            Mensaje mensaje=(Mensaje)entradaOBJ.readObject();
           
            racerx=mensaje.enemigos;
            speedr=mensaje.autos;
            pos=mensaje.fondo;
            //imprimirEnemigos();
        }catch(IOException e ){
            //e.printStackTrace();
            //System.exit(0);
        }
        catch(Exception e ){
            //e.printStackTrace();
        }
    }
    @Override
    public void conectar() {
        try{
            //System.out.println("Estableciendo Conexión");
            InetAddress ad=InetAddress.getByName(JOptionPane.showInputDialog("IP (Server): "));
            sokete=new Socket(ad,Integer.parseInt(JOptionPane.showInputDialog("Puerto: ")));
            entradaOBJ=new ObjectInputStream(sokete.getInputStream());
            objSaliente=new ObjectOutputStream(sokete.getOutputStream());
        }catch(Exception e){
            //e.printStackTrace();
        }
    }
    public void mover(Movimiento m) {
        try{
            objSaliente.writeObject(m);
            //ois.readInt();
            //Thread.sleep(200);
            objSaliente.flush();
            //sokete.getOutputStream().flush();
            //ooo.reset();
           
        }catch(Exception e){
            //e.printStackTrace();
        }
    }

    @Override
    public void actualizar() {
            recibirEnemigos();
            repaint();
    }

    @Override
    public void ganar() {
    }

    @Override
    public void perder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }
    ActionListener updater=new ActionListener(){
        public void actionPerformed(ActionEvent ae) {
            actualizar();
        }
       
    };
    KeyListener error85=new KeyListener(){
        public void keyTyped(KeyEvent ke) {
        }
        public void keyPressed(KeyEvent ke) {
            if(ke.getKeyCode()==KeyEvent.VK_ESCAPE){
                System.exit(0);
            }
            Movimiento m=new Movimiento(ke,true);
            mover(m);
        }
        public void keyReleased(KeyEvent ke) {
            Movimiento m=new Movimiento(ke,false);
            mover(m);
        }
    };
}

miércoles, 20 de noviembre de 2013

Juego Distribuido ("Speed Racer 2049")

Juego.java


/**
 *
 * @author Eduardo Yair-
 */
import java.awt.Graphics2D;
import java.util.ArrayList;
import javax.swing.JPanel;

public interface Juego{
public void conectar();
public void mover(Movimiento m);
public void actualizar();
public void ganar();
public void perder();
public void recibirEnemigos();
public void dibujarAuto(Auto a,Graphics2D g2d);
public void dibujarEnemigos(ArrayList<Enemigo> enem,Graphics2D g2d);
}


Cliente.java



import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.InetAddress;
import java.net.Socket;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.Timer;
/**
 *
 * @author Eduardo Yair-
 */
public class Cliente extends JLabel implements Juego{
    JFrame ventana=new JFrame("Speed Racer 2049");
    Socket s;
    ArrayList<Enemigo> enemigos=new ArrayList<Enemigo>();
    ArrayList<Auto> autos=new ArrayList<Auto>();
    Timer t;
    ObjectInputStream ois;
    Image fondo=new ImageIcon(getClass().getResource("img/fondo.png")).getImage();
    Image autoi=new ImageIcon(getClass().getResource("img/carpot.png")).getImage();
    Image enemyi=new ImageIcon(getClass().getResource("img/enemy.png")).getImage();
    Image enemyj=new ImageIcon(getClass().getResource("img/enemy1.png")).getImage();
    Image enemyk=new ImageIcon(getClass().getResource("img/enemy2.png")).getImage();
    Image enemyl=new ImageIcon(getClass().getResource("img/ship.png")).getImage();
    
    ObjectOutputStream ooo;
    int pos=0;
    public static void main(String args[]){
        new Cliente();
    }
    public Cliente(){
        super();
        conectar();
        ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Dimension pantalla=Toolkit.getDefaultToolkit().getScreenSize();
        ventana.setSize(pantalla);
        ventana.setUndecorated(true);
        ventana.add(this);
        ventana.setVisible(true);
        this.setFocusable(true);
        this.addKeyListener(teclado);
        setBackground(Color.BLACK);
        t=new Timer(5,escuchador);
        
        t.start();
    }
    public void recibirEnemigos(){
        try{
            //s.setSoTimeout(5);
            Mensaje mensaje=(Mensaje)ois.readObject();
            enemigos=mensaje.enemigos;
            autos=mensaje.autos;
            pos=mensaje.fondo;
            //imprimirEnemigos();
        }catch(IOException e ){
            //e.printStackTrace();
            //System.exit(0);
        }
        catch(Exception e ){
            //e.printStackTrace();
        }
    }
    public void dibujarAuto(Auto c,Graphics2D g2d){
        if(!c.perder){
            g2d.drawImage(autoi,c.posx,c.posy,c.ancho,c.alto , null);
        }
    }
    ActionListener escuchador=new ActionListener(){
        public void actionPerformed(ActionEvent ae) {
            actualizar();
        }
        
    };
    public void paint(Graphics g){
        super.paint(g);
        Graphics2D g2d=(Graphics2D)g;
        g2d.setColor(Color.white);
        g2d.drawImage(fondo, 0, pos,ventana.getWidth() ,ventana.getHeight() , null);
        g2d.drawImage(fondo, 0, 0-ventana.getHeight()+pos,ventana.getWidth() , ventana.getHeight() , null);
        for(Auto a:autos){
            dibujarAuto(a,g2d);
        }
        dibujarEnemigos(enemigos,g2d);
    }
    public void dibujarEnemigos(ArrayList<Enemigo> enem,Graphics2D g2d){
        for(int i=0;i<enem.size();i++){
            int r=i%3;
            if(r==0){
                g2d.drawImage(enemyi,enem.get(i).posx,enem.get(i).posy,enem.get(i).ancho,enem.get(i).alto , null);
            }else if(r==1){
                g2d.drawImage(enemyj,enem.get(i).posx,enem.get(i).posy,enem.get(i).ancho,enem.get(i).alto , null);
            }else if(Math.random()*2<=4){
                g2d.drawImage(enemyk,enem.get(i).posx,enem.get(i).posy,enem.get(i).ancho,enem.get(i).alto , null);
            }else if(Math.random()*2>=4){
                g2d.drawImage(enemyl,enem.get(i).posx,enem.get(i).posy,enem.get(i).ancho,enem.get(i).alto , null);}
        }
    }
     KeyListener teclado=new KeyListener(){
        public void keyTyped(KeyEvent ke) {
        }
        public void keyPressed(KeyEvent ke) {
            if(ke.getKeyCode()==KeyEvent.VK_ESCAPE){
                System.exit(0);
            }  
            Movimiento m=new Movimiento(ke,true);
            mover(m);
        }
        public void keyReleased(KeyEvent ke) {
            Movimiento m=new Movimiento(ke,false);
            mover(m);
        }
    };
    @Override
    public void conectar() {
        try{
            System.out.println("Estableciendo Conexión");
            InetAddress ad=InetAddress.getByName(JOptionPane.showInputDialog("Inserte IP del servidor: "));
            s=new Socket(ad,Integer.parseInt(JOptionPane.showInputDialog("Inserte Puerto: ")));
            ois=new ObjectInputStream(s.getInputStream());
            ooo=new ObjectOutputStream(s.getOutputStream());
        }catch(Exception e){
            //e.printStackTrace();
        }
    }
    public void mover(Movimiento m) {
        try{
            ooo.writeObject(m);
            Thread.sleep(200);
            
            //ooo.flush();
            //s.getOutputStream().flush();
            ooo.reset();
            
        }catch(Exception e){
            //e.printStackTrace();
        }
    }

    @Override
    public void actualizar() {
            recibirEnemigos();
            repaint();
    }

    @Override
    public void ganar() {
    }

    @Override
    public void perder() {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }

}

Acceso.java


import java.awt.Container;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JOptionPane;
/**
 *
 * @author Eduardo Yair-
 */

class Acceso {
    JFrame ven=new JFrame("Speed Racer 2049");
    
    public Acceso() {
        ven.setSize(200, 200);
        ven.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        ven.setLocationRelativeTo(null);
        Container c=ven.getContentPane();
        c.setLayout(null);
        JButton b2=new JButton("Unirse a partida");
        b2.addActionListener(clien);
        
        b2.setBounds(25, 50, 150, 25);
        c.add(b2);
        ven.setVisible(true);
    }
    ActionListener clien=new ActionListener(){
        public void actionPerformed(ActionEvent ae) {
            new Cliente();
            ven.dispose();
        }
    };
}


Auto.java


import java.awt.Dimension;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.Serializable;

public class Auto implements Serializable{
    int dx,dy,posx,posy,alto,ancho;
    int[]teclas=new int[4];
    Control control=new Control();
    boolean perder=false;
    public Auto(int px,int py,int lx,int ly,int nteclas[]){
        
        teclas=nteclas;
        posx=px;
        posy=py;
        alto=ly;
        ancho=lx;
    }
    
    public void mover(Dimension max){
        posx+=dx;
        posy+=dy;
        if(posx<=0){
            posx=0;
        }
        if(posx+ancho+15>max.width){
            posx=max.width-ancho-15;
        }
        if(posy<0){
            posy=0;
        }
        if(posy+alto+35>max.height){
            posy=max.height-alto-35;
        }
    }
    
    public class Control implements Serializable,KeyListener{

        public void keyTyped(KeyEvent ke) {
        }
        public void keyPressed(KeyEvent ke) {
            int tecla=ke.getKeyCode();
            if(tecla==teclas[2]){
                dy=-5;
            }
            if(tecla==teclas[3]){
                dy=5;
            }
            if(tecla==teclas[0]){
                dx=-5;
            }
            if(tecla==teclas[1]){
                dx=5;
            }
            
        }
        public void keyReleased(KeyEvent ke) {
            int tecla=ke.getKeyCode();
            if(tecla==teclas[2]||tecla==teclas[3]){
                dy=0;
            }
            if(tecla==teclas[0]||tecla==teclas[1]){
                dx=0;
            }
        }
        
    }
}


Movimiento.java

import java.awt.event.KeyEvent;
import java.io.Serializable;
public class Movimiento implements Serializable{
    public Movimiento(KeyEvent k,boolean b){
        ke=k;
        presion=b;
    };
    KeyEvent ke;
    boolean presion;
}


Mensaje.java

import java.io.Serializable;
import java.util.ArrayList;

/**
 *
 * @author eduardoyair-
 */
public class Mensaje implements Serializable{
    ArrayList<Enemigo> enemigos=new ArrayList<Enemigo>();
    ArrayList<Auto> autos=new ArrayList<Auto>();
    int fondo;
    int perder=0;
}

Main.java

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author eduardoyair
 */
public class main {
    public static void main(String args[]){
        new Acceso();
    }
}


Enemigo.java


import java.io.Serializable;

class Enemigo  implements Serializable{
    int vel,posx,posy=-200,ancho=100,alto=200;
    public Enemigo(int w,int v){
        posx=(int)(Math.random()*w);
        vel=(int)(Math.random()*v)+1;
    }
    public void mover(){
        posy+=vel;
    }
}

miércoles, 4 de septiembre de 2013

Modelo OSI

Modelo OSI 

 


El Modelo OSI (Open Systems Interconnection) fue desarrollado en 1977 por la ISO (International Standars Organization) y es fundamentalmente el proceso por etapas que deben recorrer los datos a través de cada una de sus 7 capas, de dispositivo a dispositivo, usando una red.

7 capas

Las primeras 4 capas usan hardware:

Capa Física:
  • Se encarga de realizar la transmisión de un flujo de bits a través del medio.
  • Se usan voltajes e impulso eléctricos.
  • Depende de cables, conectores y otros componentes para la conexión con el medio de transmisión.
Capa Enlace de Datos:
  • Le de forma al flujo de bits, usando un formato predeterminado llamado "TRAMA".
  • Para formar una "trama" este nivel agrega una secuencia especial de bits al principio y al final del flujo principal.
  • Usa la MAC (Media Access Control) y la LLC (Logic Link Control).
Capa de Red (Nivel de paquetes):
  • Divide el mensaje en "paquetes".
  • Cada paquete lo encapsula en una "trama".
  • Usa la IP (Internet Protocol).

Capa de Transporte:
  • Establece las conexiones punto con punto, para evitar errores en el envío de los mensajes.
  • Provee el "broadcast" a múltiples destinos.
  • Usa los protocolos TCP (Transmission Control Protocol) y UDP (User Datagram Protocol).
*Las siguientes capas se basan en el software:

Capa de Sesión:
  • Permite a usuarios en diferentes maquinas a crear una sesión.
  • Controla los "diálogos" (quien habla, cuando, cuanto tiempo, half duplex o full duplex).
  • Mantiene la sincronía.
Capa de Presentación:
  • Establece un formato adecuado para la información que sera transmitida.
  • Define la estructura para los datos (Ej. definir campos de un registro).
  • Define una codificación a usar para la representación de la cadena de caracteres (ASCII, etc).
  • Comprime los datos.

Capa de Aplicación:
  • Transferencia de archivos, Login Remoto, Correo Electrónico, Acceso a BD.

Convertir a bits para la transmisión:
  •  En una aplicación se introduce el dato, este lo pasa a través de la interfaz a la presentación, la cual determina el formato usado añadiendolo en los "encabezados" del paquete que se envía a la siguiente capa, llamada sesión, en esta etapa podemos incluir la seguridad (cifrado de los datos, aunque no es la uncia, la seguridad se puede aplicar en cualquiera de estas etapas), posteriormente llegamos a la parte del hardware, el transporte en esta etapa se hacen "pedacitos" los bloques y se determina un protocolo (TCP / UDP). En la eapa de red se decide que ruta se usa para el envio de los datos (IP); al llegar a la parte del enlace se determina la LLC y la MAC (dirección única para el hardware a nivel mundial), por último, estos datos se envían junto con el paquete original usando la tarjeta de red o similares a el receptor que realizara el proceso inverso.
Ejemplo básico del modelo OSI: LogMeInHamachi

Representación gráfica Modelo OSI

Señales analogas-digitales

Ejemplo entre Analogica y Digital usando el Muestreo (rep. gráfica)




El OSI llego a facilitar la comprension del manejo de los datos al momento de que un usuario, por medio de un equipo computacional, emitiera un mensaje destinado a otro usuario. ISO creo el modelo de las 7 capas para describir la forma en que la información se transfiere de una red a otra, al mismo tiempo, lo creo para establecer una guía para la creación posterior de redes y estándares de comunicación. Por lo mismo, el "OSI Manual Assistance" se separo en 7 capas.

Bibliografía

Enterprise, M. (27 de 02 de 2002). The OSI Model's Seven Layers Defined and Functions Explained. Recuperado el 04 de 09 de 2013, de Microsoft Support: http://support.microsoft.com/kb/103884/en
Tyson, J. (No Disponible de No Disponible de 2000). How OSI Works. Recuperado el 04 de 09 de 2013, de How Stuff Works: http://computer.howstuffworks.com/osi1.htm