• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Sockets ipv4
 

Sockets ipv4

on

  • 513 views

 

Statistics

Views

Total Views
513
Views on SlideShare
513
Embed Views
0

Actions

Likes
1
Downloads
3
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

CC Attribution-ShareAlike LicenseCC Attribution-ShareAlike License

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Sockets ipv4 Sockets ipv4 Presentation Transcript

    • Sockets IPv4en Linux2013/04Dani Gutiérrez Porsetprofesor asociadode Ing. de ComunicacionesEman ta zabal zazu
    • 22Sockets IPv4 en LinuxFuentes y Referencias● man● Wikipedia● Fuentes del kernel● http://www.advancedlinuxprogramming.com/
    • 33Sockets IPv4 en LinuxLicencia, Agradecimientos yHerramientas● Agradecimientos a todas las personas que hanparticipado en los proyectos GNU y Linux. Gracias a lacompartición libre de ese conocimiento es que estapresentación existe.● Úsala, cópiala, difúndela, mejórala según los términosde la licencia: CC BY-SA 3.0 EShttp://creativecommons.org/licenses/by-sa/3.0/es/● Esta presentación ha sido realizada íntegramente conKDE, LibreOffice y Chromium
    • 44Sockets IPv4 en LinuxÍndice● Familias y tipos de sockets.● Sockets IPv4. TCP vs UDP. Diagrama de estados TCP.● Sesiones. Puertos.● Secuencias para servidor/cliente TCP/UDP.● Modelos de Servidor.● Funciones C.● Interfaces de consola, utilidades, procfs.● Anexo: Orden de bytes, Direcciones IPv4 y resolución denombres
    • 55Sockets IPv4 en LinuxClasificación de sockets:Familias y tipos● Familias o Dominios: AF_... (AF = Address Family)● Tipos: SOCK_...● Cada familia tiene tipos. A veces un tipo corresponde a más deuna familia, ej. SOCK_RAW en AF_INET y AF_PACKET● Más info en:– man: socket(2), socket(7),...– Fichero socket.h
    • 66Sockets IPv4 en LinuxEjemplos de usos de socketssegún familias● IPv4: AF_INET.● Sockets Unix (también llamados sockets IPC): AF_UNIX o AF_LOCAL. Ver man unix(7)– Para comunicación local (en un solo equipo)– Conllevan un archivo en el sistema de ficheros, ej: sudo find / -type s -ls– También pueden verse con netstat -xapn● IPv6: AF_INET6. Ver man ipv6().● Comunicación entre kernel y espacio de usuario:AF_NETLINK. Ver man netlink(7).● Paquetes a nivel de dispositivo (nivel OSI 2):AF_PACKET. Ver man packet(7).● Otras: Novell IPX, X.25, radio AX.25, AppleTalk, ATM PVCs,... Ver man ddp(7), x25(7).● (Lista completa en fichero socket.h)
    • 77Sockets IPv4 en LinuxSockets IPv4● Familia: AF_INET● Tipos:– SOCK_STREAM para TCP (ver man 7 tcp).– SOCK_DGRAM para UDP (ver man 7 udp).– SOCK_RAW para desarrollar nuevos protocolos o hacer usode funcionalidades internas de los existentes (ver man 7raw).● Ver man 7 ip
    • 88Sockets IPv4 en LinuxTCP vs UDP● Orientado a conexión: TCP sí, UDP no.● Longitud de mensajes: mayor en TCP que enUDP.● Gestión de errores:– TCP: desde el protocolo. Mayor sobrecarga.– UDP: externo al protocolo. Ej. reenvíos por timeout(alarmas).
    • 99Sockets IPv4 en LinuxSesiones● Hay una (y sólo una) sesión entre dos IPs y dos puertos (uno en cada IP).● Roles de cada IP para cada sesión: si al inicio de la sesión escucha es servidor(el proceso está dormido hasta que atienda una petición); si envía es cliente.● Ej. de combinaciones y casos particulares:– Que una IP1 haga de servidor con una IP2 y de cliente con otra IP3– Que una IP1 haga de servidor con una IP2 y de cliente con la misma IP2 por otro puerto.– Que ambas IPs estén en un mismo equipo.
    • 1010Sockets IPv4 en LinuxPuertos● Listado de puertos y servicios estándares (“well-known”)de capas por encima de 4 en /etc/services (ver anexos)–– No confundir con /etc/protocols● Importante: byte order (ver más adelante).● Para abrir un puerto < 1024 hay que tener privilegios deroot o CAP_NET_BIND_SERVICE. Ej:$nc -l -p 1023$Cant grab 0.0.0.0:1023 with bind : Permission denied
    • 1111Sockets IPv4 en LinuxDiagrama de estados de TCP
    • 1212Sockets IPv4 en LinuxEn general,Envío y RecepciónSecuencias paraservidor/cliente TCP/UDPs = socketbindlistenfd = acceptreadwriteclose (fd)close (s)s = socketconnectwritereadclose (s)s = socketbindrecvfromsendtoclose (s)s = socketbindsendtorecvfromclose (s)TCPserverTCPclientUDPserverUDPclientEstado:listeningOpcionalEn TCP hay 2 sockets en servidor; hay que cerrar ambos al finalconnect connectOpcionalOpcional
    • 1313Sockets IPv4 en LinuxModelos de Servidor● Iterativo: un solo servidor atiende a un único cliente, y cuandoéste acaba se atiende a otro. Se puede acelerar multiplexandolas peticiones de clientes mediante:– Funciones select(2) o poll(2).– Señal SIGIO.● Múltiples servidores o servidores concurrentes: un servidor hacefork(2) para atender a cada cliente con un proceso separado.Ej: openssh-server
    • 1414Sockets IPv4 en LinuxFunciones C:Ficheros include● sys/socket.h● sys/types.h: no es obligatorio según POSIX peroes conveniente por compatibilidad ej. con BSD
    • 1515Sockets IPv4 en LinuxFunciones C:Tipos de datosSe emplean descriptores de sockets (tipo int) semejantes a los descriptores de ficherosstruct sockaddr {sa_family_t sin_family;char sa_data[14]; /* contenido según el uso */};struct sockaddr_in {sa_family_t sin_family; /* 16 bits, address family: AF_INET */in_port_t sin_port; /* 16 bits, port in network byte order */struct in_addr sin_addr; /* 32 bits, internet address */};struct in_addr {uint32_t s_addr; /* address in network byte order */};
    • 1616Sockets IPv4 en LinuxFunciones C:socket(2)int socket (int domain, int type, int ip_protocol)● Se usa para crear un socket, de tipo IPv4 ocualquiera.● Valor de ip_protocol:– Uno de /etc/protocols– Si sólo es posible un valor para la combinación dedominio y tipo, se puede indicar 0.
    • 1717Sockets IPv4 en LinuxFunciones C:bind(2)int bind (int sockfd, conststruct sockaddr_in *addr, socklen_t addrlen);● Asocia el socket con una (o todas) dirección IP y unpuerto del equipo local.● Necesario en servidor TCP y UDP. En el cliente UDPes opcional si sólo envía pero no recibe.● Si addr.sin_addr es INADDR_ANY hace que se usecualquier interface de red.
    • 1818Sockets IPv4 en LinuxFunciones C:listen(2)int listen(int sockfd, int backlog);● Pone a un socket del servidor TCP en estado deescucha tras el bind.● backlog: relacionado con conexiones que puedeaceptar. Ver ref:http://www.linuxjournal.com/files/linuxjournal.com/linuxjournal/articles/023/2333/2333s2.html
    • 1919Sockets IPv4 en LinuxFunciones C:accept(2)int accept(int sockfd, struct sockaddr *addr, socklen_t*addrlen);● Obtiene un nuevo socket para recepción y transmisión en el servidorTCP para la primera conexión pendiente (connect del lado cliente), apartir de un socket en escucha.● La llamada queda bloqueada hasta que haya una conexión.● addr se rellena en la llamada con la información de la conexión(dirección IP y nº de puerto en el servidor). Si es NULL no se hacenada.
    • 2020Sockets IPv4 en LinuxFunciones C:connect(2)int connect(int sockfd, const struct sockaddr*addr, socklen_t addrlen);● Conecta el socket indicado con una dirección ypuerto. Usos en:– Cliente TCP. La llamada espera a que se complete laconexión.– Cliente o Servidor UDP: Necesaria si las funciones de envíoy recepción no especifican el otro extremo. La llamadavuelve inmediatamente.
    • 2121Sockets IPv4 en LinuxFunciones C:Envío● Sin indicar la dirección/puerto remoto (en UDP habríaque usar antes connect(2)):– Funciones I/O estándar sin flags de sockets: write(2),writev(2), sendfile(2).– Funciones con flags de sockets: send(2).● Indicando la dirección/puerto remoto:– sendto(2).– sendmsg(2): con estructuras específicas msghdr y iovec.
    • 2222Sockets IPv4 en LinuxFunciones C:Recepción● Sin obtener la dirección/puerto remoto (en UDPhabría que usar antes connect(2)):– Funciones I/O estándar sin flags de sockets:read(2), readv(2).– Funciones con flags de sockets: recv(2).● Obteniendo la dirección/puerto remoto:– recvfrom(2).– recvmsg(2): con estructuras específicas msghdr y iovec.
    • 2323Sockets IPv4 en LinuxFunciones C:Bloqueos en envío y recepción● Las funciones anteriores se quedan en esperahasta enviar o recibir.● Gestión de bloqueos y esperas mediante:– Disponibilidad de datos: select(2) y poll(2).– No espera: flag O_NONBLOCK mediante fcntl(2).– Uso de la señal SIGIO, usando el flag O_ASYNCmediante fcntl(2).
    • 2424Sockets IPv4 en LinuxFunciones C:Cierre● int close(int fd);Cierre en ambos sentidos.● int shutdown(int sockfd, int how);Cierre en uno o ambos sentidos.
    • 2525Sockets IPv4 en LinuxFunciones C:Otras funciones● Opciones de sockets: getsockopt(2),setsockopt(2). Ej. SO_REUSEADDR para evitarproblemas de TIME_OUT en socket TCP del ladoservidor tras el close.● Dirección IP local del socket (útil si ej. el socket sehereda): getsockname(2)● Dirección IP remota del socket TCP:getpeername(2)
    • 2626Sockets IPv4 en LinuxInterface de consola:netstat(1)● Da información sobre:– Sockets TCP, UDP, raw, Unix.● Si escucha por * o 0.0.0.0 significa que escucha por todas las interfaces.● Puede mostrar procesos, usuarios, nombres o números, funcionar en modocontinuo (-c),...– Rutas– Grupos multicast– Interfaces– Estadísticas sobre protocolos IP, ICMP, TCP, UDP, UDP lite,...
    • 2727Sockets IPv4 en LinuxInterface de consola:nc(1) o netcat(1)● Establece conexiones TCP, UDP y Unix sockets, funcionando enmodos cliente o servidor.● Muestra en stdout lo que recibe y envía lo que lee de stdin.● En modo servidor termina cuando el cliente cierra la conexión(no ej. con carácter EOF).● Ejemplos de uso:– Proxys TCP, http (socks)– Clientes y servidores http, smtp,... basados en scripts de shell
    • 2828Sockets IPv4 en LinuxInterface de consola:nc(1) o netcat(1)● Versiones: original (v1.10 de 1996) y GNU (v0.7.1 de2004). Compatible con la original, con másprestaciones ej. tunneling, y con licencia GPL.● Es distinto de telnet, el cual:– No puede estar en modo escucha.– No funciona sobre UDP.– No transfiere cualquier secuencia binaria porque algunasse consideran como opciones de telnet y se eliminan.
    • 2929Sockets IPv4 en LinuxInterface de consola:nc(1) o netcat(1) – Ejemplos de uso● Talk. Ej. en servidor:nc -vvl -p puerto <fich_banner_inicial● Envío de ficheros. Ej. con compresión y encriptación:gzip -c fich | openssl enc -des | nc ip puerto● Ejecutar comandos:– Modo servidor: cuando alguien se conecta. Ej:nc -l -p puerto -e comando– Modo cliente: al hacer la conexión. Ej:nc -e /bin/bash ip_srv puerto● Escaneo de puertos. Ej:nc -zvvw 2 ip 1-1024 2>&1 | grep open
    • 3030Sockets IPv4 en LinuxInterface de consola:nc(1) o netcat(1) – Ejemplos de uso● Captura hexadecimal de comunicación. Ej:nc -v -o captura servidor_mail 25● Túneles y reenvío de puertos:– TCP sobre UDP. Lo que se envíe a un puerto TCP va hacia otro equiposobre UDP:mkfifo /tmp/fnc -l -p p_tcp </tmp/f | nc -u ip p_udp >/tmp/f– UDP sobre TCP. Lo que se envíe a un puerto UDP va hacia otro equiposobre TCP:mkfifo /tmp/fnc -l -u -p p_udp </tmp/f | nc ip p_tcp >/tmp/f– Otros: TCP sobre TCP, UDP sobre UDP
    • 3131Sockets IPv4 en LinuxUtilidades● netcat6, socat● netsed● nmap● tcpdump, wireshark
    • 3232Sockets IPv4 en LinuxInterface procfs del kernel● Algunas entradas son de sólo lectura y otraspermiten modificar límites.● Otros ficheros:– /proc/net/tcp, /proc/net/udp– /proc/sys/net/ipv4/● Se pueden configurar parámetros mediante/etc/sysctl.conf y /etc/sysctl.d/*● Más información en man 5 proc
    • 33Anexo: Direcciones IPv4 yResolución de nombres
    • 3434Sockets IPv4 en LinuxOrden de bytes● Aplica a valores binarios de direcciones de red y números de puertosque se transmiten. Posibilidades:– Según la red: Big endian (primero Most Significant Byte). Ej: 2.0.0.1 = 0x2001– Según host, ej: en x86_64 es Little Endian (primero Least Significant Byte).Ej: 2.0.0.1 = 0x1002● A nivel de bytes, no de bits.● Grupos de funciones para conversión de orden:– byteorder(3): htonl(3), htons(3), ntohl(3), ntohs(3).– endian(3): …– Para direcciones de red: inet(3).
    • 3535Sockets IPv4 en LinuxDirecciones IPv4:Bits y Evolución● Grupos de bits:– De red:● N bits más significativos.● Máscara de red (en general, bits contiguos).– De equipo.● 16 – N bits menos significativos.● Especiales:– Todos los bits a 0 = dirección de la red.– Todos los bits a 1 = dirección de broadcast.
    • 3636Sockets IPv4 en LinuxDirecciones IPv4:Bits y Evolución● Evolución de la división de bits para red yequipo:– 8 bits para la red y 24 para el equipo.– División en clases: unicast (A, B, C), multicast (D),reservadas (E). Problema: si hay que gestionar más de255 equipos pero una red B es excesiva.– CIDR.
    • 3737Sockets IPv4 en LinuxDirecciones IPv4:Formatos y Tipos● Formatos de notación:– Números y puntos, ej. 192.168.2.13– Binario; importante orden de bytes.● Tipos:– Públicas.– Privadas. NAT.– Multicast.– Reservadas, ej. loopback, link-local para zeroconf (169.254.1.0),...http://en.wikipedia.org/wiki/List_of_assigned_/8_IPv4_address_blocks
    • 3838Sockets IPv4 en LinuxDirecciones IPv4:Funciones C● Grupo de funciones inet(3):– Conversión entre notación de puntos o binaria: inet_aton (reemplazaa inet_addr), inet_network, inet_ntoa.– Separación partes de red y equipo: inet_makeaddr, inet_lnaof,inet_netof– Tipos usados para indicar el orden:● De red: struct in_addr (único campo s_addr de 32 bits), menos en inet_addr● De equipo: int o in_addr_t● Extensiones para IPv6: inet_pton(3), inet_ntop(3)
    • 3939Sockets IPv4 en LinuxNombres de equipos,protocolos y servicios● Distinción:– Nombres y direcciones de equipos.– Nombres y números de protocolos:● De capa de transporte o inferior: “protocolos”.● Por encima de la capa de transporte: “servicios”.● Especificación y orden de métodos para resolver nombres en fichero/etc/nsswitch.conf:– Nombres de equipos, de protocolos y de servicios, pero también otros (ej. Usuarios).– Métodos: ficheros (ej. /etc/hosts), DNS y multicast DNS (para equipos), LDAP,Winbind, base de datos (Berkeley, PostgreSQL, My SQL), antiguo NIS,...
    • 4040Sockets IPv4 en LinuxNombres de equipos● Ficheros:– Según el método:● Si es por fichero: /etc/hosts● Si es por DNS (en el cliente): /etc/resolv.conf– El orden de ambos se puede indicar con/etc/host.conf pero es preferible usar/etc/nsswitch.conf por ser más moderno.
    • 4141Sockets IPv4 en LinuxNombres de equipos● Funciones:– Grupo gethostbyname(3):● Usa una estructura hostent para gestionar nombres, alias de nombres y una ovarias direcciones.● Usa /etc/nsswitch.conf y quizás /etc/hosts, /etc/resolv.conf,...● Reemplazada por getaddrinfo(3).– Funciones para cliente DNS (no /etc/hosts): grupo resolver(3).– Nombre del equipo local: gethostname(2), sethostname(2).
    • 4242Sockets IPv4 en LinuxNombres de protocolos● Fichero /etc/protocols.● Funciones: getprotobyname(3), ...
    • 4343Sockets IPv4 en LinuxNombres de protocolos: ejemplos● Transporte: (ver http://en.wikipedia.org/wiki/Transport_layer)– Más empleados: tcp, udp, udplite, sctp, dccp, ddp– Menos empleados: rsvp, iso-tp4, xtp, fc, rdp● Nivel de red:– IPv4 (ip, icmp)– IPv6 (ipv6, ipv6-route, ipv6-frag, ipv6-icmp, ipv6-nonxt, ipv6-opts, mobility-header, shim6).– Multicast (ver http://en.wikipedia.org/wiki/IP_multicast): igmp, pim– Rutado (ver http://en.wikipedia.org/wiki/Routing_protocol): ospf, isis, eigrp, vrrp, igp. Antiguos: ggp, egp– Otros: ddp, vmtp, ipcomp● Encapsulamiento y tunelado: esp, ah, gre, ipencap, ipip, etherip, encap, l2tp, wesp● Otras redes: ax.25, fc, mpls-in-ip● Otros: st, pup, hmp, xns-idp, idpr-cmtp, idrp, skip, rspf, vmtp, hip, rohc
    • 4444Sockets IPv4 en LinuxNombres de servicios● Fichero /etc/services.Cada línea especifica:– El nombre y los posibles alias.– El número y si va sobre TCP, UDP, DDP,...– Posibles alias.● Funciones:– getservbyname(3): a partir de un nombre de servicio, proporcionasu nº de puerto, protocolo y alias mediante una estructura servent– ...
    • 4545Sockets IPv4 en LinuxNombres de equipos y de servicios● Funciones que combinan ambas búsquedas:– getaddrinfo(3): combina las búsquedas de nombresde equipos y de servicios.– getnameinfo(3): inversa de getaddrinfo(3), buscanombre a partir de dirección.