【ネットワーク基礎】ソケット通信とは | 若手エンジニアのブログ

若手エンジニアのブログ

文系出身の若手女子エンジニアによる技術ブログ。
日々の経験や学びをアウトプットするためにブログを書いています。
バックエンド(Java+SpringFramework)を経てインフラエンジニアになりました。
今は育休中につき、本で勉強したことを中心にアウトプットしています。

久しぶりの技術ブログのテーマは、ネットワーク!

ソケット通信についてまとめます。

 

※この記事は、前提として以下の知識がある方(何となく知っているでOK)を対象としています。

 ・OSI基本参照モデルの階層をイメージできる

 ・プロトコル

 ・TCP、UDP

 ・サーバ/クライアントの通信(サーバとクライアントの関係性)がイメージできる

 

追記

2年位前にも、TCPの類似記事をまとめていたのを忘れてた(;^ω^)

以下2つもよろしければどうぞ↓

 

 

 

 

もくじ

1.ソケットとは

 ・概要

 ・ソケット通信の特徴

 ・余談

2.TCP通信の流れ

 ・概要

 ・実装方法

3.UDP通信の流れ

4.まとめ

参考文献

 

1.ソケットとは

◎概要

ソケット(socket)は、通信の出入り口となるドアのようなもの。

ソケットを利用した通信をソケット通信と呼び、サーバとクライアントの二者間通信となる。

 

※抽象的で分かりにくいなあと思った方へ

要は「ソケット通信」と呼ばれる通信手段があり、

ソケット通信においては、通信されるデータが「ソケット」という名前の出入り口を通るんだと考えればOKです。

 

◎ソケット通信の特徴

ソケット通信は、OSI基本参照モデルでいうと「トランスポート層」にあたる。

ソケット通信の具体的なプロトコルには、TCP/IPやUDP/IPがある。

 

ソケット通信は、各種OS(オペレーティングシステム)で標準的に利用できるようになっている。

各種OSは「ソケットライブラリ」を持っており、
ソケットライブラリにあるプログラムを呼び出すことで、
Webブラウザや各種アプリケーションは簡単にソケット通信を実現できるのである。

 

◎余談

HTTP通信も、ソケットライブラリを利用してソケット通信していることで有名である。

 

HTTP通信についても、OSI基本参照モデルで考えると分かりやすい。

つまり、アプリケーション層のプロトコルであるHTTPは、

下位に位置するトランスポート層のプロトコルである、TCP/IPによって支えられている。

 

 

 

2.TCP通信の流れ

◎概要

ソケットライブラリのプログラムを利用して、TCP通信をする場合の流れは以下の通り。

  1. ソケットの作成
  2. リッスン/接続
  3. メインの通信(データの送信/受信)
  4. 切断(ソケットの削除)
順に説明する。

 

①ソケットの作成

ソケットは「通信の出入り口」であると、1.ソケットにて記載した。

ソケット通信をしたいなら、出入り口であるソケットを作らないと始まらない。

そこで、通信に先立ち、出入り口=ソケットの作成が必要となる。

 

 

②リッスン/接続

サーバ側ではリッスン(=クライアントからの接続要求を監視)し、
接続の受け入れ態勢を作る。

その後クライアント側から、サーバに対して接続を要求する。

 

ちなみに接続要求においては、いわゆる3ウェイハンドシェイクが行われるのだが、

3ウェイハンドシェイクの詳しいことは以前の記事をご確認いただきたい。

 

 

③メインの通信(データの送信/受信)

サーバとクライアントの双方で、ソケット=通信の出入り口を無事に設定出来たら、

いよいよ実際にデータをやりとりする。

データのやりとりとは、例えば

「このページを見せて」というクライアント→サーバへの要求や、

その要求に対する、サーバ→クライアントへの応答(ページの中身)などである。

 

 

④切断(ソケットの削除)

メインの通信を終えたら、後処理を行う。

具体的には、通信のために作成したソケットは不要になるので、ソケットを削除する。

ソケット削除によって接続が切断される。

 

 

 

◎TCP通信の実装方法

ソケットの作成~切断までの流れを呼び出す機能は、以下が一般的である。

  1. ソケットの作成=socket()関数
  2. リッスン/接続=listen()関数、connect()関数/connect()関数
  3. メインの通信(データの送信/受信)=write()関数/read()関数
  4. 切断(ソケットの削除)=close()関数

ただ、OSのソケットライブラリを直接呼び出すようなことは、通常ないと思われる。

 

というのも、ソケットライブラリを呼び出すような関数が、

たいていのプログラミング言語には用意されているためである。

 

従って、ソケット通信を実装する場合、PythonであればPythonの、JavaであればJavaの、

ソケット通信用の関数を呼び出すことになる。

 

ご参考:Javaでソケット通信(TCP)を実装してみたときの記事はこちら↓

 

 

3.UDP通信の流れ

UDPはTCPと異なり、相手にデータが届いているかをいちいちチェックしない。

そのためTCPよりも簡易的な通信となる。流れは以下の通り。

  1. ソケットの作成(socket()関数)
  2. メインの通信(データの送信)(sendto()関数)
  3. 切断(ソケットの削除)(close()関数)

ソケットの作成と切断はTCPに同じだが、ソケット作成後、

いきなりメインの通信を行うところが特徴的である。

 

また、TCP通信の実装に同じく、UDP通信も、

通常は各プログラミング言語にて用意されている、
UDP通信用の関数を使用して実装することになる。

 

4.まとめ

今回はソケット通信の概要を説明した。

ポイントは以下の通り。

  • ソケット通信は、OSI基本参照モデルのトランスポート層に属する通信。

  • ソケット通信には、ソケットというデータの出入り口が必要である。
    出入り口の作成はsocket関数、削除(切断)にはclose関数が用いられる。

  • ソケット通信はOSのソケットライブラリ利用によって実現される。
    ただし、通常のアプリケーションなどの実装には、各プログラミング言語が用意するソケット通信用の関数・ライブラリを呼び出すことになる。

 

今回は以上!

 

参考文献

※リンクはAmazonです

戸根勤『ネットワークはなぜつながるのか 第2版

ネットワークはなぜつながるのか 第2版