質問: Python3でTCP通信でパケットが「ACK」なのか「PUSH ACK」なのか「SYN ACk」なのかを判断したいと思っております。しかしなにをどの様に判定すれば良いのかが知りたいです。詳しい方居られましたら教えて頂きたく宜しくお願い致します。
回答: PythonでTCPを使う場合、通常はsocketを`socket.socket(socket.AF_INET, socket.SOCK_STREAM)`で作成しますが、その場合は、TCPの接続処理を自動で行うため、`ACK`,`SYN`,`PSH`というフラグを設定・取得することはできません。 もし、フラグ`ACK`,`SYN`,`PSH`を設定・取得したい場合は、パラメータに`socket.SOCK_RAW`を設定してRAWソケットを使います。この場合は、TCPヘッダー及びIPヘッダーを自分で設定し取得することができます。 ``` s = socket.socket(socket.AF_INET, socket.SOCK_RAW) ``` なお、PSH(push)フラグは、オンにすると受信したデータを直ちにアプリケーションに引き渡すように要求するフラグですが、一般的にはオフの場合でもそのようにTCPが実装されているため、通常は使われていません。 本家stackoverflow: How does TCP PSH work?