Nmap
write()システムコールを用いてUDP送信、recvfrom()システムコールを用いてUDP受信を行う手法である。通常、UDP送信を行う際はsendto()システムコールを用いるのが一般的であるが、NetcatなどのUDPを取り扱う他のツール同様、nmapでもwrite()システムコールを用いている。
今日では、IP通信の大半はTCPであり、UDPは使用比率上はかなりTCPに劣る。DNS、SNMP、DHCPなどのようにUDPを使用するプロトコルがないわけではないが、一部のセキュリティ専門家(監査や攻撃の立場にある人)はこれらに気を配る必要がないとすら述べているほどである。しかし、それは間違いであると、nmap作者は語っている。例えばrpcbindが用いる(公式文書などで解説されていない)高い番号のポート番号などは、興味深いものであるとnmap作者は例示している。
UDPはコネクションレスなプロトコルであるがために、TCPにくらべると判定が難しいものとなる。openポートからの応答は(相手のサービスに対して適切なリクエストを行っていないという理由から)大抵の場合期待できず、filteredポートは当然ながら破棄されるため、これらの場合にはタイムアウトまで待たされることとなる。closedポートはICMP port unreachableなどを受信することで判別可能であるが、これらの応答パケットは送信レートや一定時間辺りの送信可能パケット数が制限されていることが多いため、複数のUDPポートをスキャンする際には、これらの理由からスキャンに時間がかかることになる。
nmapの誕生は、作者のGordon Lyon(当時はFyodorという名前を使っていた)がPhrackにポートスキャナを投稿するところから始まる。Fyodorは当時、ポートスキャナーを探していたが、当時のポートスキャナーはどれも自分に合わないものばかりであったことから、自分が使いたいものを作ろうと考え、そうして出来上がったものがnmapの初期版である。そして作成後、自分以外にもこのツールを使いたい人がいれば使って欲しいという想いでPhrackに投稿、そのツールが1997年にPhrack 51号にソースコード付きで掲載され、nmapが世界に知れ渡ることになった。Phrack 51号への投稿の段階で、その時点で発見されていた複数のポートスキャン方法(TCP SYNスキャン、TCP FINスキャン、タイニーIPフラグメントなど)に対応していた。
その後、FyodorはPhrack 54号でOSおよびそのバージョンを検出するアイデアを発表する。もちろんnmapに実装の上である。この発表までは、OSの検出手法といえば、サービスプログラムから返される文字列タイプのバナーを確認するというものであった。例えば、対象サーバーにtelnet接続した場合に表示される
といった文字列である。このバナー表示を信じればこのシステムはFreeBSDということになる。