socket ソケット通信 TCP/IP HTTP

Python学習【365日チャレンジ!】161日目のマスターU(@Udemy11)です。

物欲真っ盛りを過ぎたと思っていたのですが、どんどん欲しい物がでてきて困っています。

欲しい物といっても必ず必要かと言われるとそうでもないものばかりで、すでにフィッシング関連のアイテムは青物からアジングまでひととおり揃ってるはずなんですけどね。

どうして今あるもので満足できないんでしょうか? 物欲を抑え込める方法があれば教えて下さい。

それでは今日もPython学習を始めましょう。

昨日の復習

昨日は、requestsパッケージの使い方について学習しました。

サードパーティーのパッケージだけあって、urllibに比べると非常にシンプルなコードでHTTPメソッドのリクエストをサーバーに送信することができましたし、POST、PUT、DELETEを使うときのコードはほぼ同じでしたね。

実際に使うにはさらに踏み込んで学習する必要がありましたが、導入部分を理解しておけば、あとの飲み込みも早くなると思います。

requestsの使い方の詳細については、昨日の記事をごらんください。

今日は、socket通信について学習しましょう。

socket通信とは

酒井さんの講座って、それなりの知識がある前提でレクチャーが進んでいくので、いきなりわからないことが出てくるときがあります。

Udemy講師 酒井さん プログラミング Python

今回のsocket通信についても、まずは自分で調べて予備知識を入れる必要がありました。

ソケットって言われると、電球のソケットしか思いつかなかったので、一体なんだろな?ということで調べてみました。

ソケット通信とは

ソケットとは、通信するアプリケーション同士の出入り口のことで、IPアドレスとポート番号の組み合わせで表現できます。Javaでは、このソケットに対するデータの入出力をストリームを利用して行います。 ソケット通信では、TCP(Transmission Control Protocol)、UDP(User Diagram Protocol)のいずれかを利用します。両者の違いは、前者が信頼性を重視するのに対して、後者が高速性を重視する点です。

インターネットは、TCP/IPと呼ばれる通信プロトコルを使用しますが、このTCP/IP通信をソケット通信と呼ぶこともあります。

まー、簡単にいうと【プログラム(Pythonなど)とネットワークをつなげるもの】ということです。

電球で使われるソケットも、電球と送電線をつなげるものなので、これと同じようなイメージで捉えておけば問題ないでしょう。

TCPとHTTP

突然ですが、通信機器の製造元がそれぞれ独自の規格で製品開発をしていたのでは、テクノロジーの進化のスピードは加速しません。

統一の規格にすることで、多くのエンジニアの知恵と技術が集約されたものができるわけですが、そんな通信の統一規格をしたのが【OSI(Open System Interconnection)参照モデル】です。

そのため、ネットワークエンジニアは、この【OSI参照モデル】のことを知っておかないと、業界内で村八分にされるらしい。。。

私はネットワークエンジニアではないので、もちろんそんな詳しいことは知りません。

ちなみに、必要な約束事(プロトコル)を階層構造(レイヤー)に分けてモデル化したものが【OSI参照モデル】で、TCP/IPも同じように階層構造になっていますが、4階層に分けられています。

この2つの違いは、こちらの記事がわかりやすいと思いますので、ご覧になってみてください。

現在は、TCP/IPがネットワークモデルのグローバルスタンダードになっています。

TCP/IPとは

「TCP/IP」はコンピュータネットワークを支えるための最も重要な要素と技術と言っていい。TCP「Transmission Control Protocol」とIP「Internet Protocol」を組み合わせたものだ。
コンピュータネットワークやインターネットを動かしている通信技術を一式として総称したものを「TCP/IP」ということが一般的だろう。TCPとIPだけではなく、ICMPとかTCPとかHTTPとか色々ある。とにかくネットワーク越しに何かを送るときに必要なプロトコルだと思えば良い。

HTTPは、Hyper Text Transfer Protocolの略で、インターネットでWebサーバーとクライアントが情報をやり取りするためのプロトコルです。

基本的には、1回のコマンドリクエストに対して1回のレスポンスで終了しますが、cookieなどを使うことで、サーバーとクライアントで複数回のやり取りを実現しています。

また、HTTPは暗号化されていないため、Googleが暗号化された通信ができるHTTPSを推奨し、検索結果に反映させるようになった影響で、HTTPSが使われるサイトが多くなっています。

TCPとHTTPについては少し理解が進んだかと思いますが、ごく簡単にまとめると、

  • TCPは【通信デバイス(サーバーとクライアント)の通信を確実に送受信するためのルール
  • HTTPは【TCPにルールを追加して、データの形式や送受信のタイミングを細かく定めて、Webを利用するために最適化されたルール

と理解すればいいでしょう。

UDPとは

UDP(User Datagram Protocol)は、TCPと同様に、インターネットで使用されている通信プロトコルです。

UDPとは

UDPは、インターネットで標準的に使われているプロトコルの一種で、 「User Datagram Protocol」の略です。 インターネット・プロトコル(IP)を使ったネットワークにおいて、 アプリケーション同士が最小限の仕組みでデータを送受信できるように考案された、 シンプルなプロトコルです。

TCPがきちんと通信が確立されているかを確認する状態があるのに対して、UDPは通信が確立されているかどうかを確認しませんし、送受信されるデータの誤りや順序をチェックする機能がありません。

なので、TCPに比べると信頼性が低くなりますが、処理が速いという優位性があるため、音楽や動画のストリーミングなどのリアルタイム性が求められる通信で使われています。

ただ、送信者のアドレスを偽装することが簡単で、DNSなどを利用したDDos攻撃に使われることが多いプロトコルでもあります。

ソケット通信で使われるポート

ソケットは、ネットワークを介してコンピューターをつなげる役割を持っているので、わかりやすいものでいうと、電話や郵便ポストに例えることができます。

電話は電話番号をダイアルすれば、話したい相手につなげることができるし、手紙を郵便ポストに投函すれば、相手の郵便受けに手紙を届けてくれます。

電話であれば、電話番号・内線番号、手紙であれば住所・部屋番号と同じものが、ソケット通信の場合は、IPアドレスとポート番号に当たります。

同じIPアドレスでも使われるサービス(FTP、SMTP、HTTPなど)によってポート番号が決められていますが、この取り決めは絶対ルールではないため、全く違うポートを使っても構いません。

とはいえ、ほとんどの人は、決められたルールに従って運用しているので、決まっているポートを使ったほうがいいでしょう。

使用するポート番号は、南カリフォルニア大学情報科学研究所(ISI)のJon Postel教授が中心となって始めたプロジェクトグループIANA(Internet Assigned Numbers Authority)が管理していて、こちらのページですべて見ることができます。

現在、ポート番号は、次のように振り分けられています。

  • 0〜1023:ウェルノウンポート番号
  • 1024〜49151:登録済みポート番号
  • 49152〜65535:動的・プライベートポート番号

ちなみに65535という数字に反応する人がいると思いますが、これは、2バイトで表すことができる最大の数字です。

古いゲームでは、ドラクエの各種パラメータが最大255だったり、所持できるゴールドの上限が65535だったり、エクセルの古いバージョンは最大65535行までしかありませんでした。

ちょっとこの数字をひも解いてみましょう。

コンピューターが扱う最小単位が1ビットで、扱える数字は0と1の2つです。

そして、次の大きい単位が1バイトですが、1バイト=8ビットなので、扱える数字は2の8乗で、256になります。

ただし、プログラムは0からスタートするので、表現できる数字は0から255までになります。

ここでドラクエのパラメータの最大値255が登場しました。
なので、ドラクエの各種パラメータは1バイトのデータで処理していた結果ということです。

次に、65535ですが、2バイトは、256×256=65536なので、表現できる数字が0から65535となるので、2バイトで表現できる最大の数字が65535ということです。

ドラクエのゴールドや古いエクセルの行は、2バイトで処理できる最大の数字だったということですね。

頭がオーバーヒート

ちょっと寄り道してしまいましたが、いろいろと理解しなければならないことが多くて頭が若干オーバーヒートしてしまっています。

ほんと年とともに、記憶力も弱っていくので、この弱った記憶力に知識を詰め込むのはかなり骨が折れる作業です。

とはいっても少しずつ分かることが増えていくと楽しいもので、毎日のPython学習をなんとか継続できています。

明日は、実際にsocketパッケージを使ってサーバーとのやり取りをPythonでやりたいと思います。

それでは明日もGood Python!