Linuxソケットの使い方

  
 

Eメール、Web、インスタントメッセージングなど、多くのアプリケーションがWebに依存していることがわかっています。これらの各アプリケーションは特定のネットワークプロトコルに依存しますが、各プロトコルは同じ一般的なネットワーク転送方法を使用します。多くの人々は、ネットワークプロトコル自体に抜け穴があることに気付いていません。この記事では、ソケットを使用してアプリケーションがネットワークにアクセスする方法と、一般的なネットワークの脆弱性への対処方法について説明します。

1.ソケット

ソケットは、 OS (OS)を介してネットワーク通信を行うための標準的な方法です。ソケットは、操作パネルのソケットのように、接続に接続された端末と見なすことができます。しかし、これらのソケットはプログラマーのための単なる抽象名であり、それらは本文で説明されているOSIモデルのすべての基本的な詳細に責任があります。プログラマにとっては、ソケットを使ってネットワークを介してデータを送受信することができます。このデータは、ルーティングを担当するセッション層(5)の下位層(オペレーティングシステム
によって処理される)で送信されます。トランスポート層の構造を決定するいくつかの異なるソケットがあります。最も一般的なタイプはストリームソケットとデータグラムソケットです。

ストリーミングソケットは、信頼性の高い双方向通信を提供します。これは、あなたや他の人に電話をかけるのと同じです。一方の当事者が他方の当事者への接続を開始し、接続を確立した後、どちらの当事者も他方の当事者と通信できます。さらに、あなたが実際に目的地に着くものを言うならば、あなたは迅速な確認を得ることができます。ストリームソケットは、OSIモデルのトランスポート層(4)に存在する伝送制御プロトコル(TCP)と呼ばれる標準通信プロトコルを使用する。コンピュータネットワークでは、データは通常、パケットと呼ばれるものの大きなブロックの形で送信されます。 TCPは、パケットが順番に着信先に到着し、電話で話しているときと同じようにエラーが発生しないように設計されています。 Webサーバー、メールサーバー、およびそれぞれのクライアントアプリケーションは、TCPソケットとストリーミングソケットを使用して通信します。

もう一つの一般的なソケットの種類はデータグラムソケットです。データグラムソケット通信の使用は、電話をかけるのではなく、手紙を郵送するのに似ています。接続は単方向で信頼性が低いです。あなたが少数の手紙を送るならば、あなたは彼らが彼らが送られたのと同じ順序で彼らの目的地に到着することを確信できないでしょう、そして彼らが彼らの目的地に配達されたとしても保証はありません。郵便サービスはかなり信頼できますが、インターネットは信頼できません。データグラムソケットは、トランスポート層でTCPの代わりにUDPと呼ばれる標準プロトコルを使用します(4)。 UDPはUser Datagram Protocolの略で、カスタムプロトコルを作成するために使用できることを意味します。このプロトコルは非常に基本的で軽量です。それにはいくつかの保護が組み込まれているだけです。これは実際の接続ではなく、データを一方から他方へ送信するための基本的な方法です。データグラムソケットを使用すると、プロトコルのオーバーヘッドは非常に小さくなりますが、プロトコルには多くの機能がありません。プログラムが相手方がパケットを受信したことを確認する必要がある場合は、相手方に確認応答パケットを送り返すようにプログラムする必要があります。場合によっては、パケット損失が許容されることがあります。データグラムソケットとUDPは、開発者がTCPの固有のオーバーヘッドなしに必要に応じて通信を正確に調整できるため、オンラインゲームやストリーミングメディアで一般的に使用されています。

2.ソケット関数

Cでは、ソケットはファイル記述子を使用して自分自身を識別するため、ファイルのように動作します。ソケットの振る舞いはファイルの振る舞いと非常によく似ていますが、実際にはソケットファイル記述子を使用すると、read()およびwrite()関数を使用してデータを送受信できます。ただし、ソケットを処理するために特別に設計された機能がいくつかあります。 /usr/include/sys/socket.hファイルにこれらの関数プロトタイプの定義があります。

extern int socket(int __ domain、int __type、int __protocol)__THROW;

は新しいソケットを作成するために使用され、ソケットが表示された後にファイル記述子を返します。エラーが返されると、-1が返されます。 Extern int connect(int __fd、__ CONST_SOCKADDR_ARG __addr、socklen_t __len);

ソケット(ファイル記述子fdで指定)をリモートホストに接続します。正常に0を返し、エラーは-1を返します。

Listen(int fd、int backlog_queue_size)

着信接続を待機し、接続要求をキューに入れます。この数がbacklog_queue_sizeに達するまで。正常に0を返し、エラーは-1を返します。

extern int accept(int __fd、__SOCKADDR_ARG __addr、socklen_t * __ restrict __addr_len);

着信接続はバインドされたポートで受け付けられます。リモートホストのアドレス情報はremote_host構造体に書き込まれ、アドレス構造体の実際のサイズはaddr_lenに書き込まれます。この関数は、接続されたソケットを識別するための新しいソケットファイル記述子を返し、エラーは-1を返します。

extern ssize_t send(int __fd、__const void * __ buf、size_t __n、int __flags);

* __ bufからnバイトをソケットfdに送信し、戻り値を送信するバイト数、エラーは-1を返します。

extern ssize_t recv(int __fd、void * __ buf、size_t __n、int __flags);

ソケットfdからnバイトを* __ bufに受け取り、戻り値を受け取ります。バイト数、エラーは-1を返します。

socket()関数を使用してソケットを作成するときは、ソケットのドメイン、種類、およびプロトコルを指定する必要があります。ドメインとは、ソケットのプロトコルファミリーのことです。ソケットは、Webを閲覧するときに使用される標準のインターネットプロトコルから、AX.25などのアマチュア無線プロトコル(あなたがラジオ好きなら)まで、さまざまなプロトコルを使用して通信できます。これらのプロトコルファミリはbits /socket.hで定義され、自動的にsys /socket.hに含まれています。

/usr/include/bits/socket.hフラグメント1

/*プロトコルファミリー* /

#define PF_UNSPEC 0 /*未指定* /

#define PF_LOCAL 1 /*ホストローカル(パイプとファイルドメイン)* /

#define PF_UNIX PF_LOCAL /* PF_LOCALの古いBSD名* /

#define PF_FILE PF_LOCAL /* PF_LOCALのもう1つの標準外の名前* /

#define PF_INET 2 /* IPプロトコルファミリ* /

#define PF_AX25 3 /*アマチュア無線AX.25。 * /

#define PF_IPX 4 /* Novellインターネットプロトコル。* /

#define PF_APPLETALK 5 /* Appletalk DDP。* /

#define PF_NETROM 6 /*アマチュアRadio NetROM。* /

#define PF_BRIDGE 7 /*マルチプロトコルブリッジ。* /

#define PF_ATMPVC 8 /* ATM PVC。* /

#define PF_X25 9 /* X.25プロジェクト用に予約されています* /

#define PF_INET6 10 /* IPバージョン6 * * /

前述のとおり、ストリームは金型に接続され、データグラムはソケット化されます。単語は最も頻繁に使用されますが、他の種類のソケットがいくつかあります。ソケットのタイプはbits /socket.hでも定義されています(上のコードの/* comment * /はアスタリスクの間のすべての内容をコメントするコメントの別の形式です)。 /usr/include/bits/socket.hフラグメント2

/*ソケットの種類* /

enum __socket_type

{

SOCK_STREAM = 1 、/*順序付けされた信頼性のあるコネクションベースの

バイトストリーム* /

#define SOCK_STREAM SOCK_STREAM

SOCK_DGRAM = 2、/*コネクションレスで信頼性の低いデータグラム

の最大長は固定です。* /

#define SOCK_DGRAM SOCK_DGRAM

Copyright © Windowsの知識 All Rights Reserved