ポート監視とは
あるホストのあるポートに対して、異なるホストからその死活状態、および通信の可否を監視すること。
TCP
TCP においては、3 Way Handshake が成功すれば、通信先ポートは生きており、第 5 層以上のアプリケーションは自由にデータを通信できると言える。
3 Way Handshake にはバークレーソケット API を用いてもいいし、telnet コマンドを用いてもいいだろう。
UDP
UDP はそもそも通信先にデータが届くかどうかを担保せず、考慮もしない。データが届くかを考慮しないのに、データが届くかを監視しようという発想そのものがナンセンスである。
とはいえ、そんな原理主義に基づいていては要件は満たせないので、なんとか方法を考えたいのだが……。
TCP は通信先ポートが開いていなければ SYN の応答として RST が帰ってくるが、UDP では ICMP の Port Unreach パケットが帰ってくる。つまり、適当にパケットを送って ICMP が帰ってこれば、相手のポートは死んでいると言える。
何も帰ってこない場合は、相手Appがパケットを受け取った上で何も返さないのか、パケットがロスしているのか区別がつかない。ping で疎通確認を別途取り、切り分けをするなどの方法も考えられるが、どちらかだけ経路上でロスする可能性も大いにあり、ポートが生きているのか、パケットがロスしただけなのかを正確に判別することは困難。
やはり UDP のポート監視は不可能だし、そもそもナンセンスという結論になってしまうのか……。