[Linux] ネットワークプログラミング入門 (TCP + UDP)

カタログの簡単な説明:

序文:

1. ネットワーク通信の概要

第二に、ネットワークプログラミングの主な機能

(1) ソケット機能

(2)バインド機能

(3)バインド機能

(4) アクセプト機能

(5) コネクト機能

(6) 送信機能

(7)recv関数

(8)recvform関数

(9) sendto関数


序文:

最初のリンク:次の質問を使用して対象を絞った読書練習を行うと、より深く理解することが容易になります。

(1) ネットワーク通信とは何ですか?

  • ①ネットワークにおけるデータ伝送の基本要素は何ですか?
  • ②一般的なネットワークプロトコルは5層構造になっていますが、各層はどのような役割を果たしているのでしょうか?
  • ③トランスポート層プロトコルのTCPとUDPの特徴は何ですか?応用シナリオ?
  • ④TCP/UDPネットワークの通信プロセスはどのようなものですか?

(2) ネットワークプログラミングの主な機能の紹介

次の記事の内容は、上記の質問に詳しく答えます。助けがあれば、三回注意してみると良いかもしれません( ^_^ )。

1. ネットワーク通信の概要

ネットワーク通信とは何ですか?

ネットワーク通信とは、ネットワーク サービスのプロセスを完了するための 2 つ以上のコンピュータ間の接続通信を指します。これはインターネットの重要な部分であり、ユーザーにあるコンピュータから別のコンピュータへのリモート接続を提供するコンピュータ ネットワーク通信の方法です。

ネットワーク通信で最も重要なのは、ネットワーク通信プロトコルです。一般的に使用される通信プロトコルには、TCP/IP プロトコル、IPX/SPX プロトコル、NetBEUI プロトコルなどがあります。

①ネットワークにおけるデータ伝送の基本要素は何ですか?

すべてのデータ送信には、送信元、宛先、長さの 3 つの要素があります。ネットワーク伝送では、送信元または宛先を示すために「IP とポート」が使用されます。以下に示すように:

 トランスポートには、サーバーとクライアントという 2 つのオブジェクトがあります。クライアントはアクティブにリクエストを開始し、サーバーはリクエストにパッシブに応答します。

②ネットワークプロトコルは非常に重要ですが、一般的なネットワークプロトコルは5層構造になっており、各層はどのような役割を果たしているのでしょうか?

  • アプリケーション層:アーキテクチャの最上位層であり、電子メール、ファイル転送、端末エミュレーションなどのサービスをユーザーのアプリケーション プロセスに直接提供します。
  • トランスポート層: 2 つのホストのプロセス間の通信のためのサービスの提供を担当します。トランスポート層で使用される 2 つの主なプロトコルは、TCP と UDP です。
  • ネットワーク層: データグラムと呼ばれるネットワーク層パケットをあるホストから別のホストに移動する責任を負います。
  • リンク層: インターネットのネットワーク層は、送信元と宛先の間の一連のルーターを介してデータグラムをルーティングします。
  • 物理層: 物理層で送信されるデータの単位はビットです。物理層の役割は、ビット ストリームを透過的に送信することです。

ここで、アプリケーションを作成するには「トランスポート層」が必要で、アプリケーションは「アプリケーション層」にあります。

③TCP、UDPとは何ですか?彼らの特徴は何でしょうか?応用シナリオ?

(1) 伝送制御プロトコル TCP (Transmission Control Protocol) : コネクション指向であり、データ伝送の単位はメッセージセグメントであり、信頼性の高い配信が可能です。

TCP は、アプリケーションに接続指向のサービスを提供します。このサービスには、信頼性の高い伝送、フロー制御 (つまり、送信者/受信者のレート マッチング)という2 つの特徴があります。これには、アプリケーション層パケットの短いパケットへの分割が含まれており、輻輳制御メカニズムが提供されます。

(2) ユーザー データグラム プロトコル UDP (User Datagram Protocol) : コネクションレス型で、データ送信の単位はユーザー データグラムであり、確実な配信を保証するものではなく、「 ベスト エフォート配信 」のみを提供できます
UDP プロトコルは、アプリケーションにコネクションレス型サービスを提供します。信頼性、フロー制御、輻輳制御はありません。
UDP に は次の特徴があります。
  • いつどのデータを送信するかをより詳細に制御
  • UDPを使用する場合、アプリケーション プロセスがデータをUDPに渡す限りUDPはそれをすぐにネットワーク層に渡します。また、TCP には、信頼性の高い配信にどれだけの時間がかかるかに関係なく、再送信メカニズムが備わっています。ただし、リアルタイム アプリケーションは通常、メッセージ セグメントの送信を過度に遅らせることを望まないため、ある程度のデータ損失は許容できます。
  • 接続を確立する必要はなく、接続の確立中に遅延が発生することもありません。
  • 接続状態はありません。よりアクティブなクライアントをサポートできます。
  • パケットヘッダーのオーバーヘッドは小さいです。
多くのシナリオでは、時折のパケット損失は許容され、ビデオ言語通話など、UDP を使用する効果がより良くなります。
④TCP/UDPネットワークの通信プロセスはどのようなものですか?

TCP ネットワークの通信プロセスを次の図に示します (例としてサーバー)。

  • ソケット(ソケット)を作成する
  • アドレスをソケットにバインドする (バインド)
  • サーバーが接続リクエストを受け入れることができることをアナウンスします (リッスン)
  • 接続要求を取得し、接続を確立(承諾)します。
  • データの送受信(送信、受信)
  • 接続を終了(閉じる)

 UDP ネットワークの通信プロセスを次の図に示します (例としてサーバー)。

  • ソケット(ソケット)を作成する
  • アドレスをソケットにバインドする (バインド)
  • データの送受信 (sendto、receiveform)
  • 接続を終了(閉じる)

第二に、ネットワークプログラミングの主な機能

(1) ソケット機能

int socket(int domain, int type,int protocol);

  1. ドメイン:ネットワーク プログラムが配置されているホストで採用されている通信プロトコル ファミリ(AF_UNIX AF_INETなど)

  2.type: ネットワーク プログラムで使用される通信プロトコル(SOCK_STREAM、SOCK_DGRAMなど)

  • SOCK_STREAMに対応するTCP。
  • SOCK_DGRAMに対応するUDP

プロトコル:  タイプが指定されており、通常、この場所は 0 に置き換えるだけで済みます。

(2)バインド機能

int bind(int sockfd, struct sockaddr *my_addr, int addrlen);

  1.sockfd: ソケット関数呼び出しによって返されるファイル記述子です。

  2.my_addr: sockaddr へのポインタです。

  3.addrlen: sockaddr 構造体の長さです。

(3)バインド機能

int listen(int sockfd,int backlog);

listen 関数は、bind のファイル記述子を listen ソケットに変換します。戻り値は、bind の場合と同じです。

  1.sockfd: バインド後のファイル記述子です。

  2.backlog: リクエストキューの最大長を設定します。サーバーに複数のクライアント プログラムが接続されている場合、導入できるキューの長さを示すためにこれを使用します。

(4) アクセプト機能

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

accept が呼び出されると、クライアント プログラムが接続を送信するまでサーバー側プログラムはブロックされます。accept が成功すると、最後のサーバー側ファイル記述子が返されます。この時点で、サーバー側は記述子に情報を書き込むことができます。失敗すると、-1 が返されます。

  1.sockfd: listen後のファイル記述子です。

  2. addr、addrlen: クライアントのプログラムを埋めるために使用され、サーバーはポインターを渡すだけで済みます。bind、listen、accept はサーバーによって使用される関数です。

(5) コネクト機能

int connect(int sockfd, struct sockaddr * serv_addr,int addrlen);

connect を使用して接続を確立できます。connect で指定されたアドレスは、通信するサーバーのアドレスです。

  1.sockfd: ソケット関数によって返されるファイル記述子。

  2. serv_addr: サーバーの接続情報を保存します。sin_add はサーバーのアドレスです。

  3. addrlen: serv_addr の長さ

connet 関数はクライアントがサーバーに接続するために使用され、成功すると 0 を返し、sockfd はサーバーと通信するためのファイル記述子で、失敗すると -1 を返します。

(6) 送信機能

ssize_t send(int sockfd, const void *buf, size_t len, int flags);

クライアント アプリケーションとサーバー アプリケーションは両方とも送信関数を使用して、TCP 接続の相手側にデータを送信します。

  1.sockfd は送信側ソケット記述子を指定します。

  2.buf はアプリケーションが送信するデータを格納するバッファを示します。

  3.len は、送信されるデータの実際のバイト数を示します。

  4. フラグは通常 0 に設定されます。

(7)recv関数

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

クライアント アプリケーションとサーバー アプリケーションはどちらも、recv 関数を使用して TCP 接続の相手側からデータを受信します。

  1. sockfd は受信側ソケット記述子を指定します。

  2.buf は、recv 関数によって受信されたデータを格納するために使用されるバッファーを指定します。

  3.len は buf の長さを指定します。

  4. フラグは通常 0 に設定されます。

(8)recvform関数

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
 struct sockaddr *src_addr, socklen_t *addrlen);

  1.recvfrom: この関数は送信者のアドレスを取得できるため、通常、コネクションレス型ソケットに使用されます。

  2. src_addr: これは、ソース マシンの IP アドレスとポート番号を格納する、struct sockaddr 型の変数です。

  3. addrlen: 常に sizeof (struct sockaddr) に設定されます。

(9) sendto関数

ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
 const struct sockaddr *dest_addr, socklen_t addrlen);

sendto は send と似ていますが、sendto ではコネクションレス型ソケットで宛先アドレスを指定できる点が異なります。

  1.dest_addr: 宛先マシンのIPアドレスとポート番号情報を示します。

  2.addrlen: sizeof (struct sockaddr) として割り当てられることが多いです。

  3.sendto: この関数は、送信されたデータ バイトの実際の長さを返すか、送信エラーが発生した場合は -1 を返します。

おすすめ

転載: blog.csdn.net/weixin_42373086/article/details/130161973