ホームページ  >  記事  >  php教程  >  ソケットの簡単な理解

ソケットの簡単な理解

高洛峰
高洛峰オリジナル
2016-12-13 09:53:011275ブラウズ

ソケットの簡単な理解

ソケットを理解するには、まず ソケットの簡単な理解 (伝送制御プロトコル/インターネット プロトコル) は、ホストの接続方法を定義する伝送制御プロトコル/インターネット プロトコルについて理解する必要があります。インターネットとそれらの間のデータ伝送の規格については、

文字通り、ソケットの簡単な理解 は TCP と IP プロトコルの総称ですが、実際には、ソケットの簡単な理解 プロトコルは、ソケットの簡単な理解 プロトコル ファミリ全体を指します。インターネット。 ISO モデルの 7 つの層とは異なり、ソケットの簡単な理解 プロトコル参照モデルは、すべての ソケットの簡単な理解 シリーズ プロトコルを 4 つの抽象層に分類します

アプリケーション層: TFTP、HTTP、SNMP、FTP、SMTP、DNS、Telnet Wait

Transport層: TCP、UDP

ネットワーク層: IP、ICMP、OSPF、EIGRP、IGMP

データリンク層: SLIP、CSLIP、PPP、MTU

各抽象化層は提供される下位層上に構築され、サービス上で提供されます上位レベルへのサービスはこんな感じです

ソケットの簡単な理解

ソケットの簡単な理解

この記事を開いて興味を持っている学生さんはある程度理解していると思いますし、私も少しは知っているので、ここでは紹介しません興味のある学生は、インターネット上の情報を検索できます。ソケットの簡単な理解 プロトコルでは、2 つのインターネット ホストが 2 つのルーターと対応する層を介して接続されます。各ホスト上のアプリケーションは、いくつかのデータ チャネルを通じて相互に読み取り操作を実行します

ソケットの簡単な理解协议ソケット

2 つのプロセスが通信する必要がある場合、最も基本的な前提は、ローカル プロセスでプロセスを一意に識別できることです。通信では、PID を使用してプロセスを一意に識別できますが、PID はローカルでのみ一意であるため、ネットワーク内の 2 つのプロセス間で PID が競合する可能性が非常に高いことがわかります。 IP 層の IP アドレスはホストを一意に識別できます。TCP 層のプロトコルとポート番号はホスト上のプロセスを一意に識別できるため、IP アドレス + プロトコル + ポート番号を使用してネットワーク上のプロセスを一意に識別できます。

ネットワーク内のプロセスを一意に識別できるようになると、ソケットを使用して通信できるようになります。ソケットとは何ですか?ソケットは、アプリケーション層とトランスポート層の間の抽象化層であり、アプリケーション層がネットワーク上に実装されたプロセスを呼び出すためのいくつかの単純なインターフェイスに抽象化されます。コミュニケーション。

ソケットの簡単な理解ソケットは、すべてがファイルであるという Unix の哲学に基づいて、サーバーとクライアントがそれぞれ「ファイル」を維持します。接続が開かれると、相手が読み取れるように自分のファイルにコンテンツを書き込んだり、相手のコンテンツを読み取ったりすることができ、通信が終了したらファイルを閉じることができます。

ソケット通信プロセス

ソケットは、「オープン-読み取り/書き込み-クローズ」モードの実装です。例としてTCPプロトコル通信を使用するソケットの対話プロセスは次のようになります。

ソケットの簡単な理解サーバー。ソケットを作成するためのアドレス タイプ (ipv4、ipv6)、ソケット タイプ、プロトコルによって異なります

サーバーは IP アドレスとポート番号をソケットにバインドします

サーバー ソケットはポート番号リクエストをリッスンし、からの接続を受信する準備ができています現時点では、サーバーのソケットは開いていません

クライアントはソケットを作成します

クライアントはソケットを開き、サーバーのIPアドレスとポート番号に従ってサーバーソケットへの接続を試みます

サーバーソケットはクライアントソケットリクエストを受信し、それを受動的に開き、クライアントが接続情報を返すまでクライアントリクエストの受信を開始します。このとき、ソケットはブロッキング状態に入ります。いわゆるブロッキングとは、クライアントが接続情報を返し、次のクライアントの理解リクエストの受信を開始するまで、accept() メソッドが返らないことを意味します

クライアントは正常に接続し、送信します。サーバーへの接続ステータス情報

サーバー受け入れ メソッドが戻り、接続が成功します

クライアントがソケットに情報を書き込む

サーバーが情報を読み取る

クライアントが閉じる

サーバーが閉じる

スリーウェイ ハンドシェイク

ソケットの簡単な理解 プロトコルでは、TCP プロトコルはスリーウェイ ハンドシェイクを通じて信頼性の高い接続を確立します

ソケットの簡単な理解

最初のハンドシェイク: クライアントはサーバーへの接続を試み、syn パケット (シーケンス番号) をサーバーに同期します)、syn=j、クライアントは SYN_SEND 状態に入り、サーバーの確認を待ちます

2 番目のハンドシェイク: サーバーはクライアントの syn パケットを受信し、それを確認します (ack=j+1)、同時にクライアントに SYN パケット (syn=k)、つまり SYN+ACK パケットを送信します

3 回目のハンドシェイク: 3 回目のハンドシェイク: クライアントが受信します。サーバーからの SYN+ACK パケットを受信し、確認パケット ACK (ack=k+1) をサーバーに送信します。パケットが送信された後、クライアントとサーバーは ESTABLISHED 状態に入り、3 ウェイ ハンドシェイクを完了します。よく見ると、サーバーソケットとクライアントソケットが接続を確立する部分は、実際には有名なスリーウェイハンドシェイクです

 ソケットの簡単な理解编程APIソケットプログラミングAPI

の前提条件です。 さて、そのソケットは「open-read/write」の実装です。 -close" モードを使用して、アプリケーションが使用するためにソケットが提供する API を簡単に理解しましょう。TCP プロトコルを例として、Unix でのソケット API を見てみましょう。他の言語も非常によく似ています (PHP (名前もほとんど同じです)同じ)、ここではメソッドの関数とパラメーターについて簡単に説明します。具体的な使用方法に興味がある学生は、ブログ リファレンスのリンクを確認するか、オンラインで検索してください。

int ソケット (int ドメイン、int 型、int プロトコル)。


指定されたアドレス ファミリ、データ型、プロトコルに基づいて、ソケット記述子とそれが使用するリソースを割り当てます。

domain: プロトコルファミリー、一般的に使用されるものは、AF_INET、AF_INET6、AF_LOCAL、AF_ROUTE です。

type: 一般的に使用されるソケットタイプには、SOCK_STREAM、SOCK_DGRAM、SOCK_PACKET、SOCK_SEQPACKET などが含まれます。 .

プロトコル: プロトコル。一般的に使用されるプロトコルには、IPPROTO_TCP、IPPTOTO_UDP、IPPROTO_SCTP、IPPROTO_TIPC などが含まれます。

int binding(int sockfd, const struct sockaddr *addr, socklen_t addrlen);


アドレス ファミリ内の特定のアドレスをソケットに割り当てます

sockfd:ソケット記述子、つまりソケット参照

addr: sockfd にバインドされるプロトコル アドレス

addrlen: アドレスの長さ

通常、サーバーは既知のアドレス (IP アドレス + ポート番号など) をバインドしますサービスを提供するために使用され、クライアントが指定する必要がなく、システムがポート番号と独自の IP アドレスの組み合わせを自動的に割り当てます。このため、サーバーは通常、リッスンする前にbind()を呼び出しますが、クライアントはそれを呼び出さず、代わりにconnect()のときにシステムがランダムにbind()を生成します。

int listen(int sockfd, int backlog);


ソケットをリッスン

sockfd: 監視されるソケット記述子

backlog: 対応するソケットのキューに入れることができる接続の最大数

int connect( int sockfd, const struct sockaddr *addr, socklen_t addrlen);


ソケットに接続

sockfd: クライアントのソケット記述子

addr: サーバーのソケットアドレス

addrlen: ソケットアドレスの長さ

int accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);


TCP サーバーはクライアントのリクエストを監視した後、accept() 関数を呼び出してリクエストを受け取ります

sockfd: サーバーのソケット記述子

addr: クライアントのソケット アドレス

addrlen: ソケットアドレスの長さ

ssize_t read(int fd, void *buf, size_t count);


ソケットの内容を読み取る

fd: ソケット記述子

buf: バッファ

count: バッファ長

ssize_t write (int fd, const void *buf, size_t count);


ソケットへのコンテンツの書き込みは、実際にはコンテンツの送信です

fd: ソケットの説明単語

buf: バッファ

count: バッファ長

int close (int fd);


ソケットはクローズ済みとしてマークされているため、対応するソケット記述子の参照カウントは -1 になります。参照カウントが 0 の場合、TCP クライアントはサーバーに終了要求を送信します。

リファレンス

Linux ソケット プログラミング (Linux に限定されない)

ソケット プログラミングを明らかにする



声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。