ネットワーク プログラミング - ソケットの定義とアドレス形式

ネットワーク プログラミング - ソケットの定義とアドレス形式


目次

  1. ソケットとは?
  2. ソケットアドレス形式

1. ソケットとは

ここに画像の説明を挿入

  1. ネットワークプログラミングでは、ソケットはソケットまたはソケットインターフェースとして翻訳されます。これは、ネットワーク接続とデータの送受信がソケットアクセスメソッドを介して迅速に完了することができることを意味します。
  2. 上の図は、ネットワーク プログラミングにおけるクライアントとサーバーの作業のコア ロジックを示しています。
  3. サーバー側では、クライアントが接続要求を開始する前に、サーバー側を初期化する必要があります。
    1. ソケットを初期化します。
    2. bind 関数を実行して、サービス機能を既知のアドレスとポートにバインドします。
    3. 次に、リッスン操作を実行して、元のソケットをサーバー側のソケットに変換します。
    4. サーバーは最終的に受け入れをブロックし、クライアントの要求を待ちます。
  4. サーバーの準備ができたら、クライアントはまずソケットを初期化し、次に connect を実行してサーバーのアドレスとポートへの接続要求を開始する必要があります。アドレスとポートはクライアントが事前に知っている必要があります。接続要求はTCP スリーウェイ ハンドシェイク(Three-way Handshake) です。
  5. スリーウェイ ハンドシェイクが完了すると、クライアントとサーバーは接続を確立し、データ転送プロセスに入ります。
    1. クライアント プロセスはオペレーティング システム カーネルへの書き込みバイト ストリーム操作を開始し、カーネル プロトコル スタックはネットワーク デバイスを介してサーバーにバイト ストリームを送信します。サーバーはカーネルから情報を取得し、カーネルからプロセスにバイト ストリームを読み取ります。ビジネスロジックの処理を開始し、完了後、サーバーは取得した結果を同様にクライアントに書き込みます。
    2. そのため、接続が確立されると、データの送信は一方向ではなく双方向になります
  6. クライアントが Telnet 操作や HTTP 要求の実行など、サーバーとの対話を完了し、サーバーから切断する必要がある場合、close 関数が実行されます。
    1. このとき、オペレーティング システム カーネルは、元の接続リンクを介してサーバーに FIN パケットを送信し、サーバーはそれを受信した後にパッシブ シャットダウンを実行します.このとき、リンク全体が半閉鎖状態になります。
    2. その後、サーバーも close 関数を実行し、リンク全体が完全に閉じられます。
    3. セミクローズ状態では、クローズ要求を発行した側は、相手から FIN パケットを受信するまでは接続が正常であると見なします。
    4. 完全に閉じた状態では、両者は接続が閉じられたことを認識します。
  7. 上記の操作はすべてソケットを介して行われます。クライアントの接続であれ、サーバーの受け入れであれ、読み取り/書き込み操作であれ、ソケットは接続を確立してデータを送信する唯一の方法です

2. ソケットアドレス形式

  1. ソケットを使用する場合, 両方の通信当事者のアドレス指定の問題を最初に解決する必要があります. 接続を確立するにはソケットのアドレスが必要です. ソケットのアドレスの形式は次のとおりです.

1. 一般的なソケットアドレス形式

  1. ソケットの一般的なアドレス構造:
/* POSIX.1g 规范规定了地址族为 2 字节的值.  */
typedef unsigned short int sa_family_t;
/* 描述通用套接字地址  */
struct sockaddr{
    
    
    sa_family_t sa_family;  /* 地址族.  16-bit*/
    char sa_data[14];   /* 具体的地址值 112-bit */
}; 
  1. 最初のフィールドはアドレス ファミリで、アドレスを解釈して保存する方法を示します。glibc には多くのアドレス ファミリの定義があり、一般的に使用されるものは次のとおりです。
    • AF_LOCAL: Unix ソケットに対応するローカル アドレスを示します。通常、ローカル ソケット通信に使用され、AF_UNIX、AF_FILE と記述することもできます。
    • AF_INET: インターネットで使用される IPv4 アドレス。
    • AF_INET6: インターネットで使用される IPv6 アドレス。
  2. 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
  1. sockaddr は、多くのアドレスファミリに適用可能な一般的なアドレス構造です。

2. IPv4 ソケット形式のアドレス

  1. 一般的に使用される IPv4 アドレス ファミリ構造:
//IPV4 套接字地址,32bit 值.
typedef uint32_t in_addr_t; 
struct in_addr
  {
    
    
    in_addr_t s_addr;
  };
  
struct sockaddr_in //描述 IPV4 的套接字地址格式
  {
    
    
    sa_family_t sin_family; 	//16-bit */
    in_port_t sin_port;     	//端口口  16-bit
    struct in_addr sin_addr;    //Internet address. 32-bit
 
    unsigned char sin_zero[8]; 	//这里仅仅用作占位符,不做实际用处
  };
  1. sockaddr と同様に、16 ビットの sin_family フィールドがあり、値は IPv4 の AF_INET です。
  2. ポート番号、ポート番号は最大 16 ビット、つまりサポートされる最大値は 2 の 16 乗 (65535) です。
    1. 予約済みポートは慣習によって確立され、ftp のポート 21、ssh のポート 22、http のポート 80 などの対応するサービスによって使用されています。
    2. 通常、5000 を超えるポートは、独自のアプリケーションのポートとして使用できます。
  3. 以下は、glibc によって定義された予約済みポートです。
/* Standard well-known ports.  */
enum
  {
    
    
    IPPORT_ECHO = 7,    /* Echo service.  */
    IPPORT_DISCARD = 9,   /* Discard transmissions service.  */
    IPPORT_SYSTAT = 11,   /* System status service.  */
    IPPORT_DAYTIME = 13,  /* Time of day service.  */
    IPPORT_NETSTAT = 15,  /* Network status service.  */
    IPPORT_FTP = 21,    /* File Transfer Protocol.  */
    IPPORT_TELNET = 23,   /* Telnet protocol.  */
    IPPORT_SMTP = 25,   /* Simple Mail Transfer Protocol.  */
    IPPORT_TIMESERVER = 37, /* Timeserver service.  */
    IPPORT_NAMESERVER = 42, /* Domain Name Service.  */
    IPPORT_WHOIS = 43,    /* Internet Whois service.  */
    IPPORT_MTP = 57,
 
 
 
 
    IPPORT_TFTP = 69,   /* Trivial File Transfer Protocol.  */
    IPPORT_RJE = 77,
    IPPORT_FINGER = 79,   /* Finger service.  */
    IPPORT_TTYLINK = 87,
    IPPORT_SUPDUP = 95,   /* SUPDUP protocol.  */
 
 
    IPPORT_EXECSERVER = 512,  /* execd service.  */
    IPPORT_LOGINSERVER = 513, /* rlogind service.  */
    IPPORT_CMDSERVER = 514,
    IPPORT_EFSSERVER = 520,
 
 
    /* UDP ports.  */
    IPPORT_BIFFUDP = 512,
    IPPORT_WHOSERVER = 513,
    IPPORT_ROUTESERVER = 520,
 
 
    /* Ports less than this value are reserved for privileged processes.  */
    IPPORT_RESERVED = 1024,
 
 
    /* Ports greater this value are reserved for (non-privileged) servers.  */
    IPPORT_USERRESERVED = 5000
  1. IPv4 アドレスは 32 ビット フィールドであり、サポートされるアドレスの最大数は 2 の 32 乗、約 42 億です。

3. IPv6 ソケットアドレス形式

  1. IPv6 のアドレス構造:
struct sockaddr_in6
  {
    
    
    sa_family_t sin6_family; 	//16-bit
    in_port_t sin6_port;  		//传输端口号 # 16-bit 
    uint32_t sin6_flowinfo; 	//IPv6 流控信息 32-bit
    struct in6_addr sin6_addr;  //IPv6 地址 128-bit
    uint32_t sin6_scope_id; 	//IPv6 域 ID 32-bit
  };
  1. 構造体全体の長さは 28 バイトで、うちフロー制御情報とドメイン IP は glibc の公式 Web サイトには表示されず、もう 1 つは現在未使用のフィールドです。アドレス ファミリーは AF_INET6、ポートは IPv4 アドレスと同じ、キー アドレスは 32 ビットから 128 ビットにアップグレードされ、不十分なアドレス番号の問題を完全に解決します。
  2. IPv4 と IPv6 の両方のアドレス形式はインターネット ソケットの形式であり、ローカル プロセス間の通信用のローカル ソケット形式、つまり AF_LOCAL もあります。
struct sockaddr_un {
    
    
    unsigned short sun_family; 	//固定为 AF_LOCAL
    char sun_path[108];   		//路径名
};

4. いくつかのソケットアドレス形式の比較

  1. いくつかのアドレスの比較を下の図に示します. IPv4 および IPv6 ソケット アドレス構造の長さは固定ですが、ローカル アドレス構造の長さは可変です.

画像.png

Supongo que te gusta

Origin blog.csdn.net/weixin_41910694/article/details/127977945
Recomendado
Clasificación