【TCP】 3Way Handshake



参考資料

ヘッダ情報
チェックサム 計算式
ARP通信


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 できるパターン

Wireshark Packet capture


◆ 3Way handshake できないパターン

Wireshark Packet capture