プロセス間通信のLinux ###ソケット(ソケット)

ソケット(ソケット)(通信の処理を行うこと、である)は、クライアント/サーバ、この機構のおかげで、通信機構であるシステムの開発は、ローカルスタンドアロンで行うことができ、また、ネットワークを介して行うことができます。それは、コンピュータ上の同じコンピュータのプロセスが通信できるようにすることができないことを意味しますが、ネットワークを介して接続されています。このため、ソケットは明らかに、クライアントとサーバエリアを区別する。

ソケットは、プロセス間のエンドポイント(エンドポイント)通信のように見ることができ、各ソケットの名前は(唯一の意味は自明である)で一意である、他のプロセスは、発見Connectと通信することができます。ソケット通信の通信プロトコルを説明するためのドメインは、異なる通信ドメインは、ソケットを作成するときに、したがって、通信ドメインことを示すために、等の異なる通信プロトコル及びアドレスソケット構造を有します。より一般的には、(単一のマシン内のプロセス間通信を実現するためにソケット機構を使用して)は、UNIXドメインソケットとインターネット通信ドメインです。

顧客側とサービス側。2つのアプリケーション間の二つのアプリケーションソケットとの間の通信の必要性は、最初の(同じマシン上でも異なるマシン上に位置することができる)する必要があるときにソケット接続を確立しました。

  • クライアント側への呼接続要求を開始するパーティ:呼接続要求の前にクライアント側では、それはどこのサービスパーティを知っている必要があります。この協定のような事前合意がある顧客側とサービス側ならば、機械のサービス側IPアドレスまたはマシン名を知る必要がある、それはそうと、PORT(ポート番号)です。言い換えれば、クライアント側には、サービス側を通してマシンのIPアドレスまたはマシン名とサービス側を呼び出すために、ポート番号を決定する唯一の方法にすることができます。

  • 党はサービス側になるための呼接続要求を受け付けます。顧客側とサービス側を呼び出す前に接続を確立するために、顧客の要件にあっ聞いているかどうか、リスニング状態でなければなりません。接続要求を受信すると、サービング又は状況に応じて設定することができる接続を拒否する。メッセージは、サイドポートの顧客サービス側に到着すると、それは自動的にイベントを引き継ぐために長いサービス側などとして、イベント(イベント)をトリガする、クライアント側からのメッセージを受け入れることができます。

 

ソケット通信プロセス:サーバーを起動するために開始します。サーバーは、クライアント接続を待って、ブロックされたコールを受け入れ、ポートをリッスン(聞く)、(バインド)結合、ポート、ソケットを初期化します。あなたは、クライアントが開始ソケットを持っている場合は、この時点では、接続が成功した場合、クライアントを接続し、サーバーが確立され、サーバー(接続)に接続します。クライアントがデータ要求を送信し、サーバは要求を受け取り、要求を処理し、クライアントに応答データを送信し、クライアントがデータを読み込み、そして最終的に密接な接続、相互作用の両端。

 

ソケットを決定する属性の三つの特徴がありますが、それらは:ドメイン(ドメイン)、タイプ(タイプ)、およびプロトコル(プロトコル)。ソケットにもその名などのアドレスを使用しました。アドレスフィールド(も知られているプロトコルスイート、プロトコルファミリ)異なっのフォーマットに。各プロトコル・スイートと1つまたは複数のアドレスファミリ定義されたアドレス形式を使用することができます。

 

プロトコルフィールド(ドメイン): また、プロトコルファミリ(家族)として知られています。一般的なプロトコルファミリAF_INET、AF_INET6、AF_LOCAL(も知られているAF_UNIX、Unixドメインソケット)など(AFアドレスファミリが短い)があります。

  • AF_INET: IPv4アドレス(32ビット)とポート番号(16ビット)。それはインターネットを指します。顧客がネットワークを介してソケット接続を使用している場合、それはとても通信のエンドポイントとしてソケットを使用して、ネットワークコンピュータ上の特定のサービスを指定するには、サーバーコンピュータのIPアドレスとポートを使用して、サーバーアプリケーションポートは、サーバーが待機指定したポートでクライアント接続のために、通信の開始前にバインドする必要があります。AF_INETドメインソケットは、そのアドレスの構造は、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;
};

AF_INET6 IPv6アドレス(128ビット)とポート番号(16ビット)。AF_INETとアドレス上の違いに加えて、他は一致しています。AF_INET6ドメインソケットは、構造が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 またAF_UNIXとして知られているが、それはファイルの入力/出力され、そのアドレスは、ファイル名で、UNIXのファイルシステムを表します。AF_UNIXドメインソケットは、そのアドレスはsockaddr_un構造によって記述されています。
struct sockaddr_un {
	__kernel_sa_family_t sun_family; /* AF_UNIX */
	char sun_path[UNIX_PATH_MAX];	/* pathname */
};

次のようにプロトコルドメイン(ドメイン)Linux5.4.6バージョンが定義されています。

/* 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.. */

タイプ(タイプ): 指定ソケットタイプ。一般的に使用されるソケットタイプ、SOCK_STREAM、SOCK_DGRAM、SOCK_RAWなど

  • SOCK_STREAM:TCP / IPでAF_INETドメインを介して実現するだけでなく、一般にAF_UNIXソケットタイプを使用接続されSOCK_STREAMタイプによって指定されたストリームソケット(ストリーム)。注文した、信頼性の高い、双方向バイトストリームソケット接続ストリームは、データ送信が、失われていない保証、複製または順不同で到着することができますように、供給が、それはまた、特定のエラー再送信メカニズムを持っています。
  • SOCK_DGRAM:、それは接続を確立し、接続を維持する必要はありませんSOCK_DGRAMタイプによって指定されたデータグラムソケット(データグラム)、それらは一般的にAF_INETでUDP / IPプロトコルによって達成されます。それがないので、送信可能なデータの、その長さが制限されているデータパケットが別のメッセージネットワークとして送信され、それはコピーまたは障害到着、失われる可能性があり、UDPは、比較的高速で、信頼性の高いプロトコルではなく、常に我々は、接続を確立し、維持する必要があります。
  • SOCK_RAW:生ソケット(RAW)は、システムのコアを実装SOCK_STREAM、SOCK_DGRAMソケット、異なる、SOCK_RAWタイプによって指定されました。しかし、rawソケットはそれについて何をするの?まず、一般的なソケットは、ICMP、IGMPおよびその他のネットワークパケットを処理できない、とSOCK_RAWができ、第二に、SOCK_RAWはまた、特別なIPv4パケットを処理することができ、また、rawソケットの使用、ソケットオプションすることができますIP_HDRINCL IPヘッダは、ユーザによって構築しました。全体的な添加、SOCK_RAWネットワークは、通常パケットは、上記のいくつかの特別な動作IPプロトコルパケット及びデータ層とを扱うことができる処理することができます。

次のようにタイプ(型)Linux5.4.6バージョンが定義されます。

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

プロトコル(プロトコル):一般的なプロトコルを有し、IPPROTO_TCP、IPPTOTO_UDP TCPプロトコルに対応し、UDPトランスポートプロトコル、など。自由タイプおよびプロトコルを組み合わせることができない、などのように配向リンクプロトコルTCPを選択しなければならないリンクSOCK_SEQPACKET SOCK_STREAMと指向型のプロトコルです。プロトコルが0であるとき、それは自動的に対応するデフォルトのプロトコルの種類を選択します。

  • IPPROTO_TCP:TCPトランスポートプロトコル。
  • SOCK_DGRAM:UDPトランスポートプロトコル。

次のようにプロトコル(プロトコル)Linux5.4.6バージョンが定義されます。

/* 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
};

 

公開された170元の記事 ウォンの賞賛207 ビュー459万+

おすすめ

転載: blog.csdn.net/xiaoting451292510/article/details/103731076