【TCP】 3Way Handshake
参考資料
3Way Handshake とは
TCPプロトコル通信を利用してデータ通信する前に、Syn/Ackパケットを用いて、通信相手とコネクションを確立させる。
通信イメージ図
機器情報とソースコード
◇機器
クライアント / サーバ
LinuxOS & Python3.0以上導入済み
◇ソースコード(Python)
https://github.com/tango3304/t_3wayhandshake
※Manjaroで実行確認
検証
◇実行するソースコード(Python)
事前に以下の情報を調べる必要あり
※LinuxOSの場合
・自身のMACアドレス (ip address)
・相手のMACアドレス (arp -a)
・自身のIPアドレス (ip address)
・相手のIPアドレス (arp -a)
・送受信する自身のインターフェース (ip address)
・通信相手のポート番号
from t_3wayhandshake.t_3wayhandshake import HandshakeSend, HandshakeReceive, HandshakeSend
from datetime import datetime
my_macaddress = '' # 自身のMACアドレス (文字列)
otherperson_macaddress = '' # 相手のMACアドレス (文字列)
my_ipaddress = '' # 自身のIPアドレス (文字列)
otherperson_ipaddress = '' # 相手のIPアドレス (文字列)
my_interface = '' # 自身のインターフェース (文字列)
otherperson_port = # 相手の通信ポート番号 (整数)
# Argument ([0]:My MACaddress [1]:The OtherPerson MACaddress [2]:My IPaddress [3]:The OtherPerson IPaddress [4]:My Interface [5]:The OtherPerson Port)
# Return Value: Syn IntegerID
# 引数 ([0]:自身のMACアドレス [1]:相手のMACアドレス [2]:自身のIPアドレス [3]:相手のIPアドレス [4]:自身のインターフェース [5]:相手のポート)
# 戻り値: Syn 整数ID
syn_id_int = HandshakeSend(my_macaddress, otherperson_macaddress, my_ipaddress, otherperson_ipaddress, my_interface, otherperson_port).send_syn()
print(f'\nSyn Send Time :{datetime.now()}')
# Argument ([0]:The OtherPerson MACaddress [1]:The OtherPerson IPaddress [2]:The OtherPerson Port [3]:My Interface)
# Return Value: Receive IP/TCP header, Receive Source MACaddress
# 引数 ([0]:相手のMACアドレス [1]:相手のIPアドレス [2]:相手のポート [3]自身のインターフェース)
# 戻り値: 受信_IP/TCPヘッダ, 受信_送信元MACアドレス
recv_iptcp_header, recv_src_mac = HandshakeReceive(otherperson_macaddress, otherperson_ipaddress, otherperson_port, my_interface).receive_synack()
print(f'Syn/Ack Receive Time:{datetime.now()}')
# Argument ([0]:Receive IP/TCP header [1]:My MACaddress [2]:Receive Source MACaddress [3]:Syn packet IntegerID [4]:My InterfaceSend)
# Return Value: Ack IntegerID
# 引数 ([0]:受信_IP/TCPヘッダ [1]:自身のMACアドレス [2]:受信_送信元MACアドレス [3]:Synパケットの整数ID [4]:自身のインターフェース)
# 戻り値: Ack 整数ID
ack_id_int = HandshakeSend(recv_iptcp_header, my_macaddress, recv_src_mac, syn_id_int, my_interface).send_ack()
print(f'Ack Send Time :{datetime.now()}\n')
◇実行結果
◆ 3Way handshake できるパターン
◆ 3Way handshake できないパターン