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