ネットワーク プログラミング - ソケットの定義とアドレス形式
目次
- ソケットとは?
- ソケットアドレス形式
1. ソケットとは
- ネットワークプログラミングでは、ソケットはソケットまたはソケットインターフェースとして翻訳されます。これは、ネットワーク接続とデータの送受信がソケットアクセスメソッドを介して迅速に完了することができることを意味します。
- 上の図は、ネットワーク プログラミングにおけるクライアントとサーバーの作業のコア ロジックを示しています。
- サーバー側では、クライアントが接続要求を開始する前に、サーバー側を初期化する必要があります。
- ソケットを初期化します。
- bind 関数を実行して、サービス機能を既知のアドレスとポートにバインドします。
- 次に、リッスン操作を実行して、元のソケットをサーバー側のソケットに変換します。
- サーバーは最終的に受け入れをブロックし、クライアントの要求を待ちます。
- サーバーの準備ができたら、クライアントはまずソケットを初期化し、次に connect を実行してサーバーのアドレスとポートへの接続要求を開始する必要があります。アドレスとポートはクライアントが事前に知っている必要があります。接続要求はTCP スリーウェイ ハンドシェイク(Three-way Handshake) です。
- スリーウェイ ハンドシェイクが完了すると、クライアントとサーバーは接続を確立し、データ転送プロセスに入ります。
- クライアント プロセスはオペレーティング システム カーネルへの書き込みバイト ストリーム操作を開始し、カーネル プロトコル スタックはネットワーク デバイスを介してサーバーにバイト ストリームを送信します。サーバーはカーネルから情報を取得し、カーネルからプロセスにバイト ストリームを読み取ります。ビジネスロジックの処理を開始し、完了後、サーバーは取得した結果を同様にクライアントに書き込みます。
- そのため、接続が確立されると、データの送信は一方向ではなく双方向になります。
- クライアントが Telnet 操作や HTTP 要求の実行など、サーバーとの対話を完了し、サーバーから切断する必要がある場合、close 関数が実行されます。
- このとき、オペレーティング システム カーネルは、元の接続リンクを介してサーバーに FIN パケットを送信し、サーバーはそれを受信した後にパッシブ シャットダウンを実行します.このとき、リンク全体が半閉鎖状態になります。
- その後、サーバーも close 関数を実行し、リンク全体が完全に閉じられます。
- セミクローズ状態では、クローズ要求を発行した側は、相手から FIN パケットを受信するまでは接続が正常であると見なします。
- 完全に閉じた状態では、両者は接続が閉じられたことを認識します。
- 上記の操作はすべてソケットを介して行われます。クライアントの接続であれ、サーバーの受け入れであれ、読み取り/書き込み操作であれ、ソケットは接続を確立してデータを送信する唯一の方法です。
2. ソケットアドレス形式
- ソケットを使用する場合, 両方の通信当事者のアドレス指定の問題を最初に解決する必要があります. 接続を確立するにはソケットのアドレスが必要です. ソケットのアドレスの形式は次のとおりです.
1. 一般的なソケットアドレス形式
- ソケットの一般的なアドレス構造:
typedef unsigned short int sa_family_t;
struct sockaddr{
sa_family_t sa_family;
char sa_data[14];
};
- 最初のフィールドはアドレス ファミリで、アドレスを解釈して保存する方法を示します。glibc には多くのアドレス ファミリの定義があり、一般的に使用されるものは次のとおりです。
- AF_LOCAL: Unix ソケットに対応するローカル アドレスを示します。通常、ローカル ソケット通信に使用され、AF_UNIX、AF_FILE と記述することもできます。
- AF_INET: インターネットで使用される IPv4 アドレス。
- AF_INET6: インターネットで使用される IPv6 アドレス。
- AF_ は Address Family を意味し、PF_ は Protocol Family プロトコル ファミリー (PF_INET、PF_INET6 など) を意味します。AF_xxx の値を使用してソケット アドレスを初期化し、PF_xxx の値を使用してソケットを初期化します。<sys/socket.h> ヘッダー ファイルでわかるように、これら 2 つの値は 1 対 1 で対応しています。
#define AF_UNSPEC PF_UNSPEC
#define AF_LOCAL PF_LOCAL
#define AF_UNIX PF_UNIX
#define AF_FILE PF_FILE
#define AF_INET PF_INET
#define AF_AX25 PF_AX25
#define AF_IPX PF_IPX
#define AF_APPLETALK PF_APPLETALK
#define AF_NETROM PF_NETROM
#define AF_BRIDGE PF_BRIDGE
#define AF_ATMPVC PF_ATMPVC
#define AF_X25 PF_X25
#define AF_INET6 PF_INET6
- sockaddr は、多くのアドレスファミリに適用可能な一般的なアドレス構造です。
2. IPv4 ソケット形式のアドレス
- 一般的に使用される IPv4 アドレス ファミリ構造:
typedef uint32_t in_addr_t;
struct in_addr
{
in_addr_t s_addr;
};
struct sockaddr_in
{
sa_family_t sin_family;
in_port_t sin_port;
struct in_addr sin_addr;
unsigned char sin_zero[8];
};
- sockaddr と同様に、16 ビットの sin_family フィールドがあり、値は IPv4 の AF_INET です。
- ポート番号、ポート番号は最大 16 ビット、つまりサポートされる最大値は 2 の 16 乗 (65535) です。
- 予約済みポートは慣習によって確立され、ftp のポート 21、ssh のポート 22、http のポート 80 などの対応するサービスによって使用されています。
- 通常、5000 を超えるポートは、独自のアプリケーションのポートとして使用できます。
- 以下は、glibc によって定義された予約済みポートです。
enum
{
IPPORT_ECHO = 7,
IPPORT_DISCARD = 9,
IPPORT_SYSTAT = 11,
IPPORT_DAYTIME = 13,
IPPORT_NETSTAT = 15,
IPPORT_FTP = 21,
IPPORT_TELNET = 23,
IPPORT_SMTP = 25,
IPPORT_TIMESERVER = 37,
IPPORT_NAMESERVER = 42,
IPPORT_WHOIS = 43,
IPPORT_MTP = 57,
IPPORT_TFTP = 69,
IPPORT_RJE = 77,
IPPORT_FINGER = 79,
IPPORT_TTYLINK = 87,
IPPORT_SUPDUP = 95,
IPPORT_EXECSERVER = 512,
IPPORT_LOGINSERVER = 513,
IPPORT_CMDSERVER = 514,
IPPORT_EFSSERVER = 520,
IPPORT_BIFFUDP = 512,
IPPORT_WHOSERVER = 513,
IPPORT_ROUTESERVER = 520,
IPPORT_RESERVED = 1024,
IPPORT_USERRESERVED = 5000
- IPv4 アドレスは 32 ビット フィールドであり、サポートされるアドレスの最大数は 2 の 32 乗、約 42 億です。
3. IPv6 ソケットアドレス形式
- IPv6 のアドレス構造:
struct sockaddr_in6
{
sa_family_t sin6_family;
in_port_t sin6_port;
uint32_t sin6_flowinfo;
struct in6_addr sin6_addr;
uint32_t sin6_scope_id;
};
- 構造体全体の長さは 28 バイトで、うちフロー制御情報とドメイン IP は glibc の公式 Web サイトには表示されず、もう 1 つは現在未使用のフィールドです。アドレス ファミリーは AF_INET6、ポートは IPv4 アドレスと同じ、キー アドレスは 32 ビットから 128 ビットにアップグレードされ、不十分なアドレス番号の問題を完全に解決します。
- IPv4 と IPv6 の両方のアドレス形式はインターネット ソケットの形式であり、ローカル プロセス間の通信用のローカル ソケット形式、つまり AF_LOCAL もあります。
struct sockaddr_un {
unsigned short sun_family;
char sun_path[108];
};
4. いくつかのソケットアドレス形式の比較
- いくつかのアドレスの比較を下の図に示します. IPv4 および IPv6 ソケット アドレス構造の長さは固定ですが、ローカル アドレス構造の長さは可変です.