Une des idées derrière le Berkley Sockets API était qu'il pouvait utiliser différentes familles de protocoles - pas seulement le Protocole Internet (IP). Mais au lieu de cela, vous aviez une API qui pouvait gérer toutes sortes d'"familles d'adresses", par exemple :
- Version 4 du Protocole Internet (IPv4) :
AF_INET
- IPX/SPX :
AF_IPX
- AppleTalk :
AF_APPLETALK
- NetBIOS :
AF_NETBIOS
- Version 6 du Protocole Internet (IPv6) :
AF_INET6
- Association de Données Infrarouge (IrDA) :
AF_IRDA
- Bluetooth :
AF_BTH
Chaque famille de protocoles a généralement quelques concepts similaires sur la manière dont les données seront traitées sur un socket :
- séquencé, fiable, bidirectionnel, basé sur la connexion, flux d'octets :
SOCK_STREAM
(ce qu'une personne IP appellerait TCP)
- non connecté, non fiable, datagrammes :
SOCK_DGRAM
(ce qu'une personne IP appellerait UDP)
Les différentes familles d'adresses ont différents termes pour ces concepts de base :
╔═══════════╦══════════════════════════╗
║ ║ Type de Socket ║
║ Adresse ╟────────────┬─────────────╢
║ Familia ║ SOCK_DGRAM │ SOCK_STREAM ║
╠═══════════╬════════════╪═════════════╣
║ IPX/SPX ║ SPX │ IPX ║
║ NetBIOS ║ NetBIOS │ n/a ║
║ IPv4 ║ UDP │ TCP ║
║ AppleTalk ║ DDP │ ADSP ║
║ IPv6 ║ UDP │ TCP ║
║ IrDA ║ IrLMP │ IrTTP ║
║ Bluetooth ║ ? │ RFCOMM ║
╚═══════════╩════════════╧═════════════╝
Le point est :
- Si vous voulez des flux d'octets séquencés, fiables, bidirectionnels et basés sur la connexion
- vous en faites la demande en utilisant "SOCK_STREAM"
- et l'API des sockets se chargera de comprendre que vous voulez TCP
De même, si je créais un socket sur Infrarouge (IrDA, AF_IRDA
) :
- je n'ai aucune idée du protocole dans IrDA qui soit fiable, séquencé et basé sur la connexion
- tout ce que je sais, c'est que je veux quelque chose qui soit fiable, séquencé et basé sur la connexion
Donc vous dites :
socket(AF_IRDA, SOCK_STREAM, 0);
Et les Sockets le comprendront pour moi.
En Plus
À l'origine, il n'y avait que deux options de protocole :
- datagrammes non connectés, non fiables (
SOCK_DGRAM
)
- basé sur la connexion, fiable, séquencé, bidirectionnel (
SOCK_STREAM
)
Plus tard, d'autres choix de protocole ont été ajoutés :
- un datagramme de message fiable (
SOCK_RDM
- "Reliable Datagram Multicast" - obsolète ; ne pas utiliser dans de nouveaux programmes)
-
paquets séquencés pseudo-flux basés sur les datagrammes (SOCK_SEQPACKET
)
╔═══════════╦══════════════════════════════════════════════════════╗
║ ║ Type de Socket ║
║ Adresse ╟────────────┬─────────────┬──────────┬────────────────╢
║ Familia ║ SOCK_DGRAM │ SOCK_STREAM │ SOCK_RDM │ SOCK_SEQPACKET ║
╠═══════════╬════════════╪═════════════╪══════════╪══════════════