https://lwn.net/Articles/644906/
http://comments.gmane.org/gmane.linux.kernel.api/10603 - patch & discussion
http://permalink.gmane.org/gmane.linux.kernel.api/10636 - example(?)
http://coffeenix.net/doc/security/STACK_fingerprinting.txt
http://www.packetinside.com/2010/08/%ED%8C%A8%ED%82%B7%EC%A0%95%EB%B3%B4%EB%A1%9C-%EC%9B%90%EA%B2%A9%EC%A7%80-%EC%8B%9C%EC%8A%A4%ED%85%9C%EC%9D%98-%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C%EB%A5%BC-%EC%B6%94%EC%A0%95%ED%95%9C%EB%8B%A4-p0f.html
TCP 연결의 초기 packet에는 해당 IP를 운영하는 system의 정보를 많이 담고 있습니다. 문제는 그 정보는 kernel 내부에 있다는 점. 그 정보를 user-space에 있는 server들이 얻을 수 있도록 해주는 patch가 최근 merge되었다고 합니다.
setsockopt() 함수를 TCP_SAVE_SYN option과 같이 listen() 함수 이전에 호출한 다음, accept()로 얻은 socket에 대해서 getsockopt() 함수를 TCP_SAVED_SYN option으로 얻은 TCP/IP header를 통해서 정보를 얻을 수 있다고 합니다.