Python: TCP protocol
TCP プロトコル
TCP プロトコル (Transmission Control Protocol、伝送制御プロトコル、略称:TCP) は、接続指向型で信頼性の高い、バイトストリームベースのトランスポートレイヤー通信プロトコルであり、IETF の RFC 793 で定義されています。
TCP 通信は、接続の確立、データ送信、接続の切断の 3 つのステップを経る必要があります。
TCP 通信モデルでは、通信を開始する前に、関連するリンクを確立してからデータを送信する必要があります。これは日常生活における「電話をかける」ことに似ています。
TCP の特徴
接続指向型
通信を行う双方は、まず接続を確立してからデータを送信する必要があり、双方とも接続状態の管理と接続上での伝送のために、必要なシステムカーネルリソースを割り当てる必要があります。
双方のデータ送信は、この 1 つの接続を通じて行われます。
データ交換を完了した後、双方は接続を切断してシステムリソースを解放する必要があります。
この接続は 1 対 1 であるため、TCP はブロードキャスト用途には適していません。ブロードキャストベースのアプリケーションには UDP プロトコルを使用してください。
信頼性のある伝送
1) TCP は応答確認メカニズムを採用しています
TCP が送信した各メッセージセグメントは、受信者からの応答確認を得てから成功とみなされます。
2) タイムアウト再送
送信者はメッセージセグメントを送信した後にタイマーを開始し、制限時間内に応答がない場合はそのメッセージセグメントを再送します。
パケット損失を防ぐため、TCP は各パケットにシーケンス番号を付与し、この番号によって受信側エンティティに順番通りにパケットが渡されることも保証されます。受信側エンティティは、正常に受信したパケットに対して対応する応答確認 (ACK) を送り返します。送信側エンティティが合理的なラウンドトリップ遅延 (RTT) 内に応答確認を受け取らなかった場合、該当パケットは失われたとみなされ、再送されます。
3) エラーチェック
TCP はチェックサム関数を使用してデータのエラーをチェックします。チェックサムは送信時と受信時の両方で計算されます。
4) フロー制御と輻輳制御
フロー制御は、ホストが受信側の処理能力を超えて送信するのを防ぐために使用されます。
TCP と UDP の違い
接続指向型 (3 ウェイハンドシェイクにより、伝送前に接続を確立します)
順序通りのデータ転送
損失パケットの再送
重複パケットの破棄
エラーのないデータ伝送
ブロック / フロー制御
TCP 通信モデル
TCP 通信モデルでは、通信を開始する前に、関連するリンクを確立してからデータを送信できます
image.png
サーバーとクライアント
サーバーとは、コンピューティングサービスを提供するデバイスです。サーバーはサービス要求に応答して処理する必要があるため、一般的にサービスを引き受け、保証する能力を備えている必要があります。クライアントとは、サーバーに対応し、ローカルサービスを提供するプログラムを指します。クライアントサーバーアーキテクチャはマスター・スレーブアーキテクチャとも呼ばれ、C/S 構造と略されます。これはクライアントとサーバーを分離するネットワークアーキテクチャです。クライアントソフトウェアのインスタンスは、サーバーまたはアプリケーションサーバーにリクエストを送信できます。
image.png
TCP クライアント
TCP サーバーに比べると、TCP クライアントははるかにシンプルです。サーバーが携帯電話を購入し、SIM カードを確認し、着信音を設定して、他人からの着信を待つ必要があるとすれば、クライアントは公衆電話を見つけて電話をかけるだけでよく、その手順ははるかに少なくなります。
import socket
# TCP プロトコルに基づくソケット接続
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# データを送信する前に、まずサーバーとの接続を確立する必要があります
s.connect(('192.168.31.199', 9090)) # connect メソッドを呼び出してサーバーに接続
s.send('hello'.encode('utf8'))
# UDP は sendto を使用して直接データを送信します
# s.sendto('hello'.encode('utf8'),('192.168.31.199',9090))
s.close()
TCP サーバー
プログラムで TCP サーバーの機能を実現するには、以下の手順が必要です。
socket でソケットを作成
bind で IP とポートをバインド
listen でソケットを受信可能な状態にする
accept でクライアントからの接続を待つ
recv/send でデータを受信および送信
import socket
# ソケット接続を作成
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('192.168.31.199', 9090))
s.listen(128) # ソケットをパッシブなリッスン状態にする
#(
#,
# ('192.168.31.185', 38096)
# )
# 受信結果は 2 つの要素を持つタプルです
# 0 番目の要素はクライアントのソケット接続、1 番目の要素はクライアントの IP アドレスとポート番号です
# x = s.accept() # クライアントからのリクエストを受け取る
client_socket, client_addr = s.accept()
# UDP でデータを受信する場合は recvfrom を使用します
data = client_socket.recv(1024) # TCP でデータを受信する場合は recv を使用します
print('{} クライアント {} ポート番号から送信されたデータを受信しました。内容:{}'.format(client_addr[0], client_addr[1], data.decode('utf8')))
TCP の注意事項
一般的に、TCP サーバーはバインドする必要があります。そうでなければクライアントはサーバーを見つけられません
TCP クライアントは一般的にバインドしません。サーバーにアクティブに接続するため、サーバーの IP、ポートなどの情報が決まっていれば、ローカルクライアントは任意に接続できます
TCP サーバーでは、socket() で作成したアクティブなソケットを listen() によってパッシブな状態に変更できます。TCP サーバーを実装する場合は必ずこれを行う必要があります
クライアントがサーバーに接続する際は、connect() を使用して接続する必要があります。UDP は接続せずに直接送信しますが、TCP はまず接続してからでないと通信できません
TCP クライアントがサーバーに接続すると、サーバー側に新しいソケットが作成されます。このソケットはクライアントを識別し、そのクライアントに専用のサービスを提供するために使用されます
listen() 後のソケットはパッシブソケットで、新しいクライアントからの接続要求を受信するために使用されます。accept() が返す新しいソケットは、新しいクライアントを識別します
リッスン中のソケットを閉じることはパッシブソケットを閉じることを意味し、新しいクライアントがサーバーに接続できなくなりますが、既に正常に接続しているクライアントとの通信は正常に継続されます
accept() が返したソケットを閉じることは、そのクライアントへのサービス提供が完了したことを意味します
クライアントのソケットが close() を呼び出すと、サーバー側の recv() のブロックが解除され、戻り値の長さは 0 になるため、サーバーは返されたデータの長さによってクライアントがオフラインになったかどうかを判別できます
TCP プロトコル (Transmission Control Protocol、伝送制御プロトコル、略称:TCP) は、接続指向型で信頼性の高い、バイトストリームベースのトランスポートレイヤー通信プロトコルであり、IETF の RFC 793 で定義されています。
TCP 通信は、接続の確立、データ送信、接続の切断の 3 つのステップを経る必要があります。
TCP 通信モデルでは、通信を開始する前に、関連するリンクを確立してからデータを送信する必要があります。これは日常生活における「電話をかける」ことに似ています。
TCP の特徴
接続指向型
通信を行う双方は、まず接続を確立してからデータを送信する必要があり、双方とも接続状態の管理と接続上での伝送のために、必要なシステムカーネルリソースを割り当てる必要があります。
双方のデータ送信は、この 1 つの接続を通じて行われます。
データ交換を完了した後、双方は接続を切断してシステムリソースを解放する必要があります。
この接続は 1 対 1 であるため、TCP はブロードキャスト用途には適していません。ブロードキャストベースのアプリケーションには UDP プロトコルを使用してください。
信頼性のある伝送
1) TCP は応答確認メカニズムを採用しています
TCP が送信した各メッセージセグメントは、受信者からの応答確認を得てから成功とみなされます。
2) タイムアウト再送
送信者はメッセージセグメントを送信した後にタイマーを開始し、制限時間内に応答がない場合はそのメッセージセグメントを再送します。
パケット損失を防ぐため、TCP は各パケットにシーケンス番号を付与し、この番号によって受信側エンティティに順番通りにパケットが渡されることも保証されます。受信側エンティティは、正常に受信したパケットに対して対応する応答確認 (ACK) を送り返します。送信側エンティティが合理的なラウンドトリップ遅延 (RTT) 内に応答確認を受け取らなかった場合、該当パケットは失われたとみなされ、再送されます。
3) エラーチェック
TCP はチェックサム関数を使用してデータのエラーをチェックします。チェックサムは送信時と受信時の両方で計算されます。
4) フロー制御と輻輳制御
フロー制御は、ホストが受信側の処理能力を超えて送信するのを防ぐために使用されます。
TCP と UDP の違い
接続指向型 (3 ウェイハンドシェイクにより、伝送前に接続を確立します)
順序通りのデータ転送
損失パケットの再送
重複パケットの破棄
エラーのないデータ伝送
ブロック / フロー制御
TCP 通信モデル
TCP 通信モデルでは、通信を開始する前に、関連するリンクを確立してからデータを送信できます
image.png
サーバーとクライアント
サーバーとは、コンピューティングサービスを提供するデバイスです。サーバーはサービス要求に応答して処理する必要があるため、一般的にサービスを引き受け、保証する能力を備えている必要があります。クライアントとは、サーバーに対応し、ローカルサービスを提供するプログラムを指します。クライアントサーバーアーキテクチャはマスター・スレーブアーキテクチャとも呼ばれ、C/S 構造と略されます。これはクライアントとサーバーを分離するネットワークアーキテクチャです。クライアントソフトウェアのインスタンスは、サーバーまたはアプリケーションサーバーにリクエストを送信できます。
image.png
TCP クライアント
TCP サーバーに比べると、TCP クライアントははるかにシンプルです。サーバーが携帯電話を購入し、SIM カードを確認し、着信音を設定して、他人からの着信を待つ必要があるとすれば、クライアントは公衆電話を見つけて電話をかけるだけでよく、その手順ははるかに少なくなります。
import socket
# TCP プロトコルに基づくソケット接続
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# データを送信する前に、まずサーバーとの接続を確立する必要があります
s.connect(('192.168.31.199', 9090)) # connect メソッドを呼び出してサーバーに接続
s.send('hello'.encode('utf8'))
# UDP は sendto を使用して直接データを送信します
# s.sendto('hello'.encode('utf8'),('192.168.31.199',9090))
s.close()
TCP サーバー
プログラムで TCP サーバーの機能を実現するには、以下の手順が必要です。
socket でソケットを作成
bind で IP とポートをバインド
listen でソケットを受信可能な状態にする
accept でクライアントからの接続を待つ
recv/send でデータを受信および送信
import socket
# ソケット接続を作成
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('192.168.31.199', 9090))
s.listen(128) # ソケットをパッシブなリッスン状態にする
#(
#
# ('192.168.31.185', 38096)
# )
# 受信結果は 2 つの要素を持つタプルです
# 0 番目の要素はクライアントのソケット接続、1 番目の要素はクライアントの IP アドレスとポート番号です
# x = s.accept() # クライアントからのリクエストを受け取る
client_socket, client_addr = s.accept()
# UDP でデータを受信する場合は recvfrom を使用します
data = client_socket.recv(1024) # TCP でデータを受信する場合は recv を使用します
print('{} クライアント {} ポート番号から送信されたデータを受信しました。内容:{}'.format(client_addr[0], client_addr[1], data.decode('utf8')))
TCP の注意事項
一般的に、TCP サーバーはバインドする必要があります。そうでなければクライアントはサーバーを見つけられません
TCP クライアントは一般的にバインドしません。サーバーにアクティブに接続するため、サーバーの IP、ポートなどの情報が決まっていれば、ローカルクライアントは任意に接続できます
TCP サーバーでは、socket() で作成したアクティブなソケットを listen() によってパッシブな状態に変更できます。TCP サーバーを実装する場合は必ずこれを行う必要があります
クライアントがサーバーに接続する際は、connect() を使用して接続する必要があります。UDP は接続せずに直接送信しますが、TCP はまず接続してからでないと通信できません
TCP クライアントがサーバーに接続すると、サーバー側に新しいソケットが作成されます。このソケットはクライアントを識別し、そのクライアントに専用のサービスを提供するために使用されます
listen() 後のソケットはパッシブソケットで、新しいクライアントからの接続要求を受信するために使用されます。accept() が返す新しいソケットは、新しいクライアントを識別します
リッスン中のソケットを閉じることはパッシブソケットを閉じることを意味し、新しいクライアントがサーバーに接続できなくなりますが、既に正常に接続しているクライアントとの通信は正常に継続されます
accept() が返したソケットを閉じることは、そのクライアントへのサービス提供が完了したことを意味します
クライアントのソケットが close() を呼び出すと、サーバー側の recv() のブロックが解除され、戻り値の長さは 0 になるため、サーバーは返されたデータの長さによってクライアントがオフラインになったかどうかを判別できます
Related Articles
-
A detailed explanation of Hadoop core architecture HDFS
Knowledge Base Team
-
What Does IOT Mean
Knowledge Base Team
-
6 Optional Technologies for Data Storage
Knowledge Base Team
-
What Is Blockchain Technology
Knowledge Base Team
Explore More Special Offers
-
Short Message Service(SMS) & Mail Service
50,000 email package starts as low as USD 1.99, 120 short messages start at only USD 1.00
