ホームページ  >  記事  >  バックエンド開発  >  Python サーバー開発 -- ネットワークの基礎

Python サーバー開発 -- ネットワークの基礎

高洛峰
高洛峰オリジナル
2016-10-18 10:52:461103ブラウズ

ネットワークは下から上に物理層、データリンク層、ネットワーク層、トランスポート層、セッション層、プレゼンテーション層、アプリケーション層に分かれています。

HTTP は高レベルのプロトコルであるのに対し、TCP/IP は多くのサブプロトコルを含むプロトコル セットです。これには、FTP、UDP、トランスポート層の TCP プロトコル、ネットワーク層の IP プロトコルなど、HTTP、Telnet プロトコルなどの高レベルのプロトコルが含まれます。HTTP は、TCP/IP のサブプロトコルです。

ソケットは、(プログラマレベルでの) TCP/IP プロトコルのカプセル化とアプリケーションです。 TPC/IP プロトコルは、主にネットワーク内でデータが送信される方法を解決するトランスポート層プロトコルであるのに対し、HTTP は主にデータをパッケージ化する方法を解決するアプリケーション層プロトコルであるとも言えます。

データを送信する場合、(トランスポート層) TCP/IP プロトコルのみを使用できますが、その場合、送信されたデータを意味のあるものにしたい場合は、アプリケーション層がなければデータの内容を識別することができません。アプリケーションを使用する HTTP、FTP、TELNET など、多くのアプリケーション層プロトコルがあります。独自のアプリケーション層プロトコルを定義することもできます。 WEB は、アプリケーション層プロトコルとして HTTP プロトコルを使用して HTTP テキスト情報をカプセル化し、トランスポート層プロトコルとして TCP/IP を使用してそれをネットワークに送信します。

私たちがよく話すソケットとは何ですか? 実際、ソケットは TCP/IP プロトコルのカプセル化です。ソケット自体はプロトコルではなく、ソケットを通じて TCP/IP を使用できます。プロトコル。実際、Socket は必ずしも TCP/IP プロトコルに関連しているわけではありません。 Socket プログラミング インターフェイスが設計されたとき、他のネットワーク プロトコルにも適応できることが期待されました。したがって、ソケットの出現により、プログラマは TCP/IP プロトコル スタックを簡単に使用できるようになります。これは、TCP/IP プロトコルの抽象化であり、作成、リッスン、接続、受け入れ、送信、読み取り、書き込みなど。

TCP/IP は単なるプロトコル スタックであり、オペレーティング システムの動作メカニズムと同様に、具体的に実装する必要があり、外部操作インターフェイスも提供する必要があります。オペレーティング システムが win32 プログラミング インターフェイスなどの標準プログラミング インターフェイスを提供するのと同じように、TCP/IP もプログラマーがネットワーク開発に使用できるインターフェイスを提供します。これがソケット プログラミング インターフェイスです。

もっと鮮明な説明があります: HTTP はデータのカプセル化または表示の特定の形式を提供する自動車であり、ソケットはネットワーク通信機能を提供するエンジンです。

実際、トランスポート層の TCP はネットワーク層の IP プロトコルに基づいており、アプリケーション層の HTTP プロトコルはトランスポート層の TCP プロトコルに基づいています。前述したように、ソケット自体はプロトコルではありません。上記では、TCP または UDP プログラミング用のインターフェイスのみを提供します。

ソケットを使用してネットワーク接続を確立する手順:

ソケット接続を確立するには、少なくとも 1 組のソケットが必要です。そのうちの 1 つはクライアント上で実行される ClientSocket と呼ばれ、もう 1 つはサーバー上で実行される ServerSocket と呼ばれます。

ソケット間の接続プロセスは、サーバー監視、クライアント要求、接続確認の 3 つのステップに分かれています。

1.サーバー監視: サーバー側ソケットは特定のクライアント ソケットを見つけませんが、接続を待機している状態にあり、ネットワークの状態をリアルタイムで監視し、クライアントの接続要求を待ちます。

2.クライアントリクエスト: 接続リクエストを行うクライアントのソケットを指し、接続対象はサーバーのソケットです。これを行うには、クライアントのソケットは、まず接続先のサーバーのソケットを記述し、サーバー側のソケットのアドレスとポート番号を指定して、サーバー側のソケットに接続要求を行う必要があります。

3.接続確認: サーバー側ソケットは、クライアント ソケットからの接続要求をリッスンまたは受信すると、クライアント ソケットの要求に応答し、新しいスレッドを確立し、サーバー側ソケットの説明をクライアントに送信します。クライアントがこの説明を確認すると、両者の間で接続が正式に確立されます。サーバー側ソケットは引き続き待機状態にあり、他のクライアント ソケットからの接続要求を受信し続けます。

HTTP リンクの特徴

HTTP プロトコルは、Web ネットワーキングの基礎であり、携帯電話ネットワーキングで一般的に使用されるプロトコルの 1 つであるハイパーテキスト転送プロトコルです。HTTP プロトコルは、TCP プロトコルに基づいて構築されたアプリケーションです。

HTTP 接続の最も注目すべき機能は、クライアントによって送信された各リクエストが、リクエストの完了後にサーバーに応答を返すことを要求することです。コネクションを確立してからコネクションを閉じるまでのことを「コネクション」と呼びます。

インターネット プロトコル

IP は 32 ビットの符号なし整数です。 IP アドレスは、DNS (ドメイン ネーム システム) データベースを通じてドメイン名にマッピングされます

#!/usr/bin/env python
# Foundations of Python Network Programming - Chapter 1 - getname.py
import socket
hostname = 'google.com'
addr = socket.gethostbyname(hostname)
print 'The address of', hostname, 'is', addr
# The address of google.com is 173.194.72.113

Python ネットワーク プログラミング:

Python は、基盤となるオペレーティング システムのソケット インターフェイスにアクセスするためのすべてのメソッドを提供し、暗号化されたソケット インターフェイスのセットも提供します。認証された通信サービス、SSL/TLS 。

ソケットは実際にはファイル記述子であり、ローカルファイルとは異なり、ネットワーク上のファイルに接続します。

1. UDP ローカル接続を作成します:

#!/usr/bin/env python
import socket, sys
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
MAX = 65535
PORT = 1060
if sys.argv[1:] == ['server']:
    s.bind(('127.0.0.1', PORT))
    print 'Listening at', s.getsockname()
    while True:
        data, address = s.recvfrom(MAX)
        print 'The client at', address, 'says', repr(data)             
     s.sendto('Your data was %d bytes' % len(data), address)
elif sys.argv[1:] == ['client']:
        print 'Address before sending:', s.getsockname()
        s.sendto('This is my message', ('127.0.0.1', PORT))
        print 'Address after sending', s.getsockname()
        data, address = s.recvfrom(MAX) # overly promiscuous - see text!
        print 'The server', address, 'says', repr(data)
else:
    print >>sys.stderr, 'usage: udp_local.py server|client'

次のコードを実行します:

python filename.py server
#Listening at ('127.0.0.1', 1060)
#Address before sending: ('0.0.0.0', 0)
#Address after sending ('0.0.0.0', 62892)
#The server ('127.0.0.1', 1060) says 'Your data was 18 bytes'
python filename.py client
#The client at ('127.0.0.1', 62892) says 'This is my message'

2. リモート接続を作成し、受信した情報を確認します:

import random, socket, sys
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
MAX = 65535
PORT = 1060
if 2 <= len(sys.argv) <= 3 and sys.argv[1] == &#39;server&#39;:
    interface = sys.argv[2] if len(sys.argv) > 2 else &#39;&#39;
    s.bind((interface, PORT))
    print &#39;Listening at&#39;, s.getsockname()
    while True:
        data, address = s.recvfrom(MAX)
        if random.randint(0, 1):
            print &#39;The client at&#39;, address, &#39;says:&#39;, repr(data)
            s.sendto(&#39;Your data was %d bytes&#39; % len(data), address)
        else:
            print &#39;Pretending to drop packet from&#39;, address
elif len(sys.argv) == 3 and sys.argv[1] == &#39;client&#39;:
    hostname = sys.argv[2]
    s.connect((hostname, PORT))
    print &#39;Client socket name is&#39;, s.getsockname()
    delay = 0.1
    while True:
        s.send(&#39;This is another message&#39;)
        print &#39;Waiting up to&#39;, delay, &#39;seconds for a reply&#39;
        s.settimeout(delay)
        try:
            data = s.recv(MAX)
        except socket.timeout:
            delay *= 2  # wait even longer for the next request
            if delay > 2.0:
                raise RuntimeError(&#39;I think the server is down&#39;)
        else:
            break   # we are done, and can stop looping
              
    print &#39;The server says&#39;, repr(data)
else:
    print >>sys.stderr, &#39;usage: udp_remote.py server [ <interface> ]&#39;
    print >>sys.stderr, &#39;   or: udp_remote.py client <host>&#39;
    sys.exit(2)

这里的s.connect((hostname, PORT))方法,可以让我们不用每次都调用s.sendto('This is my message', ('127.0.0.1', PORT))。直接调用

s.send('This is another message')。


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