Communication inter-processus Linux # # # socket (socket)

Douille (douille) est un mécanisme de communication, en vertu de ce mécanisme, client / serveur (qui est, pour mener à bien le processus de communication) développement du système peut être effectuée à la fois sur un stand-alone locale, peut également être effectuée à travers le réseau. Ce qui signifie qu'il ne peut pas permettre aux mêmes processus informatiques sur l'ordinateur pour communiquer, mais reliés par un réseau. Pour cette raison, la prise de distinguer clairement le client et la zone du serveur.

Une douille peut être considéré comme point final inter-processus (point final) de communication, le nom de chaque douille est unique (le seul sens va de soi), d'autres procédés peuvent découvrir, connecter et de communiquer. Domaine pour expliquer un protocole de communication de la communication socket, différents domaines de communication ont différents protocoles de communication et adresses des structures de prise, etc., par conséquent, lors de la création d'une prise, pour indiquer qu'un domaine de communication. Plus commun est le socket de domaine Unix (en utilisant le mécanisme de prise pour réaliser une communication inter-processus dans une seule machine) et le domaine de communication Internet.

Le côté client et côté service. Lorsque la nécessité d'une communication entre deux applications SOCKET, entre deux applications doivent d'abord (sur la même machine peut également être situé sur différentes machines) connexion établie SOCKET.

  • La partie à l'origine de la demande de connexion d'appel du côté client: côté client avant que la demande de connexion d'appel, il doit savoir où la partie de service. Il est donc nécessaire de connaître l'adresse IP ou le nom de la machine où le côté service de la machine, si le côté client et côté le service il y a un accord préalable comme cet accord est PORT (numéro de port). En d'autres termes, le côté client peut être une adresse IP ou le nom de la machine de la machine par le côté service et la seule façon de déterminer le numéro de port pour appeler le côté service.

  • Partie accepte la demande de connexion d'appel pour devenir le côté service: Avant d'appeler le côté client et côté service doit être dans un état d'écoute, s'il écoute les besoins du client pour établir une connexion. Lorsqu'il reçoit la demande de connexion, le service ou refuser la connexion peut être établie en fonction de la situation. Lorsqu'un message arrive sur le côté du service à la clientèle du port latéral, il déclenche automatiquement un événement (événement), tant que le côté service de prendre en charge l'événement, peut accepter un message du côté client.

 

processus de communication Socket: commencer à démarrer le serveur. Serveur initialisé Socket, le port de liaison (bind), écoute le port (écouter), accepter les appels bloqués, en attente pour les connexions client. À ce stade, si vous avez un client ouvre une socket, puis se connecter au serveur (connexion), si la connexion est réussie, puis connecter le client et le serveur est établie. Le client envoie une demande de données, le serveur reçoit la demande et traite la demande et envoie ensuite les données de réponse au client, le client lit les données, et enfin fermer la connexion, les extrémités d'une interaction.

 

Il y a trois caractéristiques de la prise de détermination d'attribut, ils sont les suivants: domaine (Domain), le type (type), et un protocole (protocole). Socket également utilisé l'adresse comme son nom. Avec le format du champ d'adresse (suite de protocoles également connu, la famille de protocole) diffère. Chaque suite de protocoles et peuvent utiliser une ou plusieurs adresses format d'adresse définie de la famille.

 

champ Protocole (domaine):  également connu sous le nom de famille de protocole (famille). Il existe des protocoles communs AF_INET famille, AF_INET6, AF_LOCAL (également connu AF_UNIX, Unix socket de domaine) et similaires (famille d'adresse AF est courte).

  • AF_INET: adresse IPv4 (32 bits) et le numéro de port (16 bits). Il fait référence à l'Internet. Lorsqu'un client utilise une connexion socket à travers le réseau, il utilise une adresse IP et le port de l'ordinateur serveur pour spécifier un service particulier sur une machine en réseau, si la prise d'utilisation en tant que critère d' évaluation de la communication, les applications serveur un port doit être lié avant le début de la communication, le serveur attend pour une connexion client dans le port spécifié. socket AF_INET, sa structure d'adresse décrite par sockaddr_in.
struct sockaddr_in {
  __kernel_sa_family_t	sin_family;	/* Address family		*/
  __be16		sin_port;	/* Port number			*/
  struct in_addr	sin_addr;	/* Internet address		*/

  /* Pad to size of `struct sockaddr'. */
  unsigned char		__pad[__SOCK_SIZE__ - sizeof(short int) -
			sizeof(unsigned short int) - sizeof(struct in_addr)];
};
/* Internet address. */
struct in_addr {
	__be32	s_addr;
};

Le AF_INET6 : adresse IPv6 ( 128 bits ) et le numéro de port (16 bits). En plus des différences sur l'adresse, l'autre compatible avec AF_INET. prises de domaine AF_INET6, la structure est décrite par son adresse à sockaddr_in6. 

struct sockaddr_in6 {
	unsigned short int	sin6_family;    /* AF_INET6 */
	__be16			sin6_port;      /* Transport layer port # */
	__be32			sin6_flowinfo;  /* IPv6 flow information */
	struct in6_addr		sin6_addr;      /* IPv6 address */
	__u32			sin6_scope_id;  /* scope id (new in RFC2553) */
};
  • AF_LOCAL : également connu sous le nom AF_UNIX, représente le système de fichiers UNIX, il est l'entrée / sortie de fichier et son adresse est le nom du fichier. prises de domaine AF_UNIX, son adresse est décrite par des structures sockaddr_un.
struct sockaddr_un {
	__kernel_sa_family_t sun_family; /* AF_UNIX */
	char sun_path[UNIX_PATH_MAX];	/* pathname */
};

domaine Protocole (domaine) version Linux5.4.6 est définie comme suit:

/* Supported address families. */
#define AF_UNSPEC	0
#define AF_UNIX		1	/* Unix domain sockets 		*/
#define AF_LOCAL	1	/* POSIX name for AF_UNIX	*/
#define AF_INET		2	/* Internet IP Protocol 	*/
#define AF_AX25		3	/* Amateur Radio AX.25 		*/
#define AF_IPX		4	/* Novell IPX 			*/
#define AF_APPLETALK	5	/* AppleTalk DDP 		*/
#define AF_NETROM	6	/* Amateur Radio NET/ROM 	*/
#define AF_BRIDGE	7	/* Multiprotocol bridge 	*/
#define AF_ATMPVC	8	/* ATM PVCs			*/
#define AF_X25		9	/* Reserved for X.25 project 	*/
#define AF_INET6	10	/* IP version 6			*/
#define AF_ROSE		11	/* Amateur Radio X.25 PLP	*/
#define AF_DECnet	12	/* Reserved for DECnet project	*/
#define AF_NETBEUI	13	/* Reserved for 802.2LLC project*/
#define AF_SECURITY	14	/* Security callback pseudo AF */
#define AF_KEY		15      /* PF_KEY key management API */
#define AF_NETLINK	16
#define AF_ROUTE	AF_NETLINK /* Alias to emulate 4.4BSD */
#define AF_PACKET	17	/* Packet family		*/
#define AF_ASH		18	/* Ash				*/
#define AF_ECONET	19	/* Acorn Econet			*/
#define AF_ATMSVC	20	/* ATM SVCs			*/
#define AF_RDS		21	/* RDS sockets 			*/
#define AF_SNA		22	/* Linux SNA Project (nutters!) */
#define AF_IRDA		23	/* IRDA sockets			*/
#define AF_PPPOX	24	/* PPPoX sockets		*/
#define AF_WANPIPE	25	/* Wanpipe API Sockets */
#define AF_LLC		26	/* Linux LLC			*/
#define AF_IB		27	/* Native InfiniBand address	*/
#define AF_MPLS		28	/* MPLS */
#define AF_CAN		29	/* Controller Area Network      */
#define AF_TIPC		30	/* TIPC sockets			*/
#define AF_BLUETOOTH	31	/* Bluetooth sockets 		*/
#define AF_IUCV		32	/* IUCV sockets			*/
#define AF_RXRPC	33	/* RxRPC sockets 		*/
#define AF_ISDN		34	/* mISDN sockets 		*/
#define AF_PHONET	35	/* Phonet sockets		*/
#define AF_IEEE802154	36	/* IEEE802154 sockets		*/
#define AF_CAIF		37	/* CAIF sockets			*/
#define AF_ALG		38	/* Algorithm sockets		*/
#define AF_NFC		39	/* NFC sockets			*/
#define AF_VSOCK	40	/* vSockets			*/
#define AF_KCM		41	/* Kernel Connection Multiplexor*/
#define AF_QIPCRTR	42	/* Qualcomm IPC Router          */
#define AF_SMC		43	/* smc sockets: reserve number for
				 * PF_SMC protocol family that
				 * reuses AF_INET address family
				 */
#define AF_XDP		44	/* XDP sockets			*/

#define AF_MAX		45	/* For now.. */

Type (type):  spécifie le type de support. Généralement les types de socket utilisé, SOCK_STREAM, SOCK_DGRAM, SOCK_RAW etc.

  • SOCK_STREAM : sockets de flux (stream) spécifié par type SOCK_STREAM, qui sont connectés en œuvre via TCP / IP dans AF_INET domaine, mais aussi couramment utilisé type socket AF_UNIX. Est un flux ordonné, connexion fiable, prise flux d'octets bidirectionnel fourni, de sorte que la transmission de données peut être garantie pas perdu, en double ou arriver en dehors de l' ordre, mais il a aussi un certain mécanisme de retransmission d'erreur.
  • SOCK_DGRAM : prise datagrammes (Datagram) spécifié par type SOCK_DGRAM, il n'a pas besoin d'établir une connexion et maintenir une connexion, ils sont généralement atteints par le protocole UDP / IP dans le AF_INET. Sa longueur des données qui peuvent être transmises est limitée, le paquet de données est transmis en tant que réseau de message distinct, il peut être perdu, copié ou l' arrivée de désordre, UDP n'est pas un protocole fiable, mais sa vitesse relativement élevée, parce qu'il fait toujours , nous devons établir et maintenir une connexion.
  • Le SOCK_RAW : support brut (RAW) spécifié par le type SOCK_RAW, différente d'une douille SOCK_STREAM, SOCK_DGRAM, qui met en oeuvre le système de base de. Cependant, ce que les prises premières faire à ce sujet? Tout d'abord, les prises générales ne peuvent pas gérer ICMP, IGMP et d' autres paquets réseau et SOCK_RAW peut, d' autre part, SOCK_RAW peut également gérer les paquets IPv4 spéciaux; En outre, l'utilisation des sockets raw, option de socket peut IP_HDRINCL tête IP construit par l'utilisateur. Outre l' ensemble, le réseau SOCK_RAW peut gérer les paquets normaux peuvent également gérer certains paquets de protocole IP d'exploitation spéciales et la couche de données et au- dessus.

Type (type) version Linux5.4.6 est définie comme suit:

enum sock_type {
	SOCK_STREAM	= 1,
	SOCK_DGRAM	= 2,
	SOCK_RAW	= 3,
	SOCK_RDM	= 4,
	SOCK_SEQPACKET	= 5,
	SOCK_DCCP	= 6,
	SOCK_PACKET	= 10,
};

Protocole (protocole): protocoles communs ont, IPPROTO_TCP, IPPTOTO_UDP similaires, qui correspondent au protocole TCP, le protocole de transport UDP. ne peut pas être de type combiné librement et protocole, de même que les liens SOCK_SEQPACKET SOCK_STREAM et protocole de type orienté devraient être sélectionnés protocole de liaison tcp si orienté. Lorsque le protocole est 0, il sélectionne automatiquement un type de protocole par défaut correspondant.

  • IPPROTO_TCP : protocole de transport TCP.
  • SOCK_DGRAM : protocole de transport UDP.

Protocole (protocole) version Linux5.4.6 est définie comme suit:

/* Standard well-defined IP protocols.  */
enum {
  IPPROTO_IP = 0,		/* Dummy protocol for TCP		*/
#define IPPROTO_IP		IPPROTO_IP
  IPPROTO_ICMP = 1,		/* Internet Control Message Protocol	*/
#define IPPROTO_ICMP		IPPROTO_ICMP
  IPPROTO_IGMP = 2,		/* Internet Group Management Protocol	*/
#define IPPROTO_IGMP		IPPROTO_IGMP
  IPPROTO_IPIP = 4,		/* IPIP tunnels (older KA9Q tunnels use 94) */
#define IPPROTO_IPIP		IPPROTO_IPIP
  IPPROTO_TCP = 6,		/* Transmission Control Protocol	*/
#define IPPROTO_TCP		IPPROTO_TCP
  IPPROTO_EGP = 8,		/* Exterior Gateway Protocol		*/
#define IPPROTO_EGP		IPPROTO_EGP
  IPPROTO_PUP = 12,		/* PUP protocol				*/
#define IPPROTO_PUP		IPPROTO_PUP
  IPPROTO_UDP = 17,		/* User Datagram Protocol		*/
#define IPPROTO_UDP		IPPROTO_UDP
  IPPROTO_IDP = 22,		/* XNS IDP protocol			*/
#define IPPROTO_IDP		IPPROTO_IDP
  IPPROTO_TP = 29,		/* SO Transport Protocol Class 4	*/
#define IPPROTO_TP		IPPROTO_TP
  IPPROTO_DCCP = 33,		/* Datagram Congestion Control Protocol */
#define IPPROTO_DCCP		IPPROTO_DCCP
  IPPROTO_IPV6 = 41,		/* IPv6-in-IPv4 tunnelling		*/
#define IPPROTO_IPV6		IPPROTO_IPV6
  IPPROTO_RSVP = 46,		/* RSVP Protocol			*/
#define IPPROTO_RSVP		IPPROTO_RSVP
  IPPROTO_GRE = 47,		/* Cisco GRE tunnels (rfc 1701,1702)	*/
#define IPPROTO_GRE		IPPROTO_GRE
  IPPROTO_ESP = 50,		/* Encapsulation Security Payload protocol */
#define IPPROTO_ESP		IPPROTO_ESP
  IPPROTO_AH = 51,		/* Authentication Header protocol	*/
#define IPPROTO_AH		IPPROTO_AH
  IPPROTO_MTP = 92,		/* Multicast Transport Protocol		*/
#define IPPROTO_MTP		IPPROTO_MTP
  IPPROTO_BEETPH = 94,		/* IP option pseudo header for BEET	*/
#define IPPROTO_BEETPH		IPPROTO_BEETPH
  IPPROTO_ENCAP = 98,		/* Encapsulation Header			*/
#define IPPROTO_ENCAP		IPPROTO_ENCAP
  IPPROTO_PIM = 103,		/* Protocol Independent Multicast	*/
#define IPPROTO_PIM		IPPROTO_PIM
  IPPROTO_COMP = 108,		/* Compression Header Protocol		*/
#define IPPROTO_COMP		IPPROTO_COMP
  IPPROTO_SCTP = 132,		/* Stream Control Transport Protocol	*/
#define IPPROTO_SCTP		IPPROTO_SCTP
  IPPROTO_UDPLITE = 136,	/* UDP-Lite (RFC 3828)			*/
#define IPPROTO_UDPLITE		IPPROTO_UDPLITE
  IPPROTO_MPLS = 137,		/* MPLS in IP (RFC 4023)		*/
#define IPPROTO_MPLS		IPPROTO_MPLS
  IPPROTO_RAW = 255,		/* Raw IP packets			*/
#define IPPROTO_RAW		IPPROTO_RAW
  IPPROTO_MAX
};

 

Publié 170 articles originaux · louange gagné 207 · Vues 4,59 millions +

Je suppose que tu aimes

Origine blog.csdn.net/xiaoting451292510/article/details/103731076
conseillé
Classement