Sep 202012
 

java로 whois 클라이언트를 하나 만들었습니다.
기존의 UNIX 환경에서 사용하던 whois와 유사한 기능으로 구현을 했습니다.

http://blog.sukmoonlee.com/jWhois/jWhois.jar

자바의 문자열이 유니코드로 처리되는 특징을 이용해서, 로컬문자로 제공되는 WHOIS 서비스를 자바의 유니코드로 변환해서 읽은 다음에 사용자의 환경에 따라서 결과를 출력하도록 되어 있습니다.
그래서 UTF-8 환경에서 다양한 WHOIS 서버의 문자를 처리해서 결과를 아래와 같이 얻을수 있습니다.
(일단 현재 버전에서는 kr과 jp만 지원합니다. 나머지 서버들은 대부분 영문으로 제공을 하더군요.)

[smlee@localhost jWhois]$ java -jar jWhois.jar --help
jWhois version 0.9.1-20120918, Copyright (C) 2012 SukmoonLee.

Usage: java -jar jWhois.jar  [OPTIONS] [QUERY]
          --version                  display version number and patch level
          --help                     display this help
          -h HOST, --host=HOST       explicitly query HOST
          -n, --no-redirect          disable content redirection
          -i, --display-redirections display all redirects instead of hiding them
          -p PORT                    use port number PORT (in conjunction with HOST)


        Report bugs to smlee@sukmoonlee.com


[smlee@localhost jWhois]$ java -jar jWhois.jar netpia.com
[Querying netpia.com]
[Redirected to whois.verisign-grs.com] - 330 msec
[Querying netpia.com]
[Redirected to whois.ibi.net] - 621 msec
[Querying netpia.com]
[whois.ibi.net] - 2177 msec
Welcome to NETPIA.COM's WHOIS Server


# ENGLISH

Registrant:
    Netpia
    Gangseo-gu 16F, WoolimBlue9 Bldg. A, 240-21, Yeomchang-dong, Seoul

    Domain Name: netpia.com
    Registrar: NETPIA.COM, INC.(http://www.ibi.net)

    Administrative Contact:
        Netpia     webmaster@ibi.net
        Gangseo-gu 16F, WoolimBlue9 Bldg. A, 240-21, Yeomchang-dong, Seoul,  KR
        +82.0236651233

    Technical Contact:
        Netpia     webmaster@ibi.net
        Gangseo-gu 16F, WoolimBlue9 Bldg. A, 240-21, Yeomchang-dong, Seoul,  KR
        +82.0236651233

     Billing Contact:
        Netpia     webmaster@ibi.net
        Gangseo-gu 16F, WoolimBlue9 Bldg. A, 240-21, Yeomchang-dong, Seoul,  KR
        +82.0236651233

     Record created on........: 31-Mar-1998 EDT.
     Record expires on........: 31-Mar-2013 EDT.
     Record last updated on...: 10-Mar-2012 EDT.

     Domain Name Servers in listed order:
     NS.NETPIA.COM      61.82.71.230
     NS2.NETPIA.COM

# KOREAN(UTF-8)

등록인:
    Netpia
    Gangseo-gu 16F, WoolimBlue9 Bldg. A, 240-21, Yeomchang-dong, Seoul

    도메인이름: netpia.com
    등록대행자: NETPIA.COM, INC.(http://www.ibi.net)

    관리담당자:
        Netpia     webmaster@ibi.net
        Gangseo-gu 16F, WoolimBlue9 Bldg. A, 240-21, Yeomchang-dong, Seoul,  KR
        +82.0236651233

    기술담당자:
        Netpia     webmaster@ibi.net
        Gangseo-gu 16F, WoolimBlue9 Bldg. A, 240-21, Yeomchang-dong, Seoul,  KR
        +82.0236651233

    과금담당자:
        Netpia     webmaster@ibi.net
        Gangseo-gu 16F, WoolimBlue9 Bldg. A, 240-21, Yeomchang-dong, Seoul,  KR
        +82.0236651233

     등록일........: 31-Mar-1998 EDT.
     사용 종료일...: 31-Mar-2013 EDT.
     최근 변경일...: 10-Mar-2012 EDT.

     네임서버 정보:
     NS.NETPIA.COM      61.82.71.230
     NS2.NETPIA.COM



Please register domain name at www.ibi.net [smlee@localhost jWhois]$ java -jar jWhois.jar netpia.kr [Querying netpia.kr] [Redirected to whois.kr] - 364 msec [Querying netpia.kr] [whois.kr] - 126 msec query: netpia.kr # KOREAN 도메인이름 : netpia.kr 등록인 : 김태영 책임자 : 김태영 책임자 전자우편 : tim@solf.co.kr 등록일 : 2007. 02. 28. 최근 정보 변경일 : 2008. 04. 12. 사용 종료일 : 2013. 02. 28. 정보공개여부 : N 등록대행자 : (주)아이네임즈(http://www.inames.co.kr) 1차 네임서버 정보 호스트이름 : ns1.uhost.co.kr IP 주소 : 202.31.186.220 2차 네임서버 정보 호스트이름 : ns2.uhost.co.kr IP 주소 : 118.129.168.68 네임서버 이름이 .kr이 아닌 경우는 IP주소가 보이지 않습니다. # ENGLISH Domain Name : netpia.kr Registrant : TAE YEONG KIM Administrative Contact(AC) : TAE YEONG KIM AC E-Mail : tim@solf.co.kr Registered Date : 2007. 02. 28. Last updated Date : 2008. 04. 12. Expiration Date : 2013. 02. 28. Publishes : N Authorized Agency : Inames Co., Ltd.(http://www.inames.co.kr) Primary Name Server Host Name : ns1.uhost.co.kr IP Address : 202.31.186.220 Secondary Name Server Host Name : ns2.uhost.co.kr IP Address : 118.129.168.68 - KISA/KRNIC Whois Service - [smlee@localhost jWhois]$ java -jar jWhois.jar netpia.jp [Querying netpia.jp] [Redirected to whois.jprs.jp] - 365 msec [Querying netpia.jp] [whois.jprs.jp] - 178 msec [ JPRS database provides information on network administration. Its use is ] [ restricted to network administration purposes. For further information, ] [ use 'whois -h whois.jprs.jp help'. To suppress Japanese output, add'/e' ] [ at the end of command, e.g. 'whois -h whois.jprs.jp xxx/e'. ] Domain Information: [ドメイン情報] [Domain Name] NETPIA.JP [登録者名] (有)ハンドインハンド [Registrant] Hand in Hand Inc. [Name Server] m1.stage21.net [Name Server] y2.netpia.ne.jp [Signing Key] [登録年月日] 2001/03/26 [有効期限] 2013/03/31 [状態] Active [最終更新] 2012/04/01 01:05:00 (JST) Contact Information: [公開連絡窓口] [名前] (有)ハンドインハンド [Name] Hand in Hand Inc. [Email] kanri-domain@netpia.jp [Web Page] [郵便番号] 242-0018 [住所] 神奈川県大和市深見西2-1-1 [Postal Address] 2-1-1, Fukami-Nishi, Yamato-City, Kanagawa [電話番号] 046-265-1700 [FAX番号] 020-4622-6502
Sep 192012
 

DNS 관련일을 하게 되면 자연적으로 도메인과 많은 관련성이 있습니다.

특히 도메인을 이해하기 위해서는 Registry-Registrar 개념과 DNS 위임구조를 알아야 합니다.
도메인의 위임정보를 알기 위해서 WHOIS라는 서비스를 제공하고 있습니다.

아주 오래된 프로토콜로 TCP 43번 포트로 제공하고 있는 프로토콜입니다.
(DNS가 53번이므로 외우기도 쉽습니다.)

해당 프로토콜에 대해서는 영문위키를 보면 금방 이해를 할수 있으며, 간단히 telnet 으로도 확인이 가능합니다.
Socket에서 TCP Client 정도만 제작가능하시면 바로 제작이 가능합니다.

http://en.wikipedia.org/wiki/Whois

이러한 WHOIS 정보는 TLD별로 제공이 되고 있으며, 아래와 같은 규칙을 가지고 있습니다.

whois-servers.net provides DNS alias records (CNAME) for TLD WHOIS servers of the form .whois-servers.net.

[stone@localhost ~]$ telnet com.whois-servers.net 43
Trying 199.7.49.74...
Connected to com.whois-servers.net (199.7.49.74).
Escape character is '^]'.
netpia.com

Whois Server Version 2.0

Domain names in the .com and .net domains can now be registered
with many different competing registrars. Go to http://www.internic.net
for detailed information.

   Domain Name: NETPIA.COM
   Registrar: NETPIA.COM, INC.
   Whois Server: whois.ibi.net
   Referral URL: http://www.ibi.net
   Name Server: NS.NETPIA.COM
   Name Server: NS2.NETPIA.COM
   Status: clientDeleteProhibited
   Status: clientTransferProhibited
   Updated Date: 10-mar-2012
   Creation Date: 01-apr-1998
   Expiration Date: 31-mar-2013

>>> Last update of whois database: Mon, 17 Sep 2012 15:01:00 UTC <<<

NOTICE: The expiration date displayed in this record is the date the
registrar's sponsorship of the domain name registration in the registry is
currently set to expire. This date does not necessarily reflect the expiration
date of the domain name registrant's agreement with the sponsoring
registrar.  Users may consult the sponsoring registrar's Whois database to
view the registrar's reported date of expiration for this registration.

TERMS OF USE: You are not authorized to access or query our Whois
database through the use of electronic processes that are high-volume and
automated except as reasonably necessary to register domain names or
modify existing registrations; the Data in VeriSign Global Registry
Services' ("VeriSign") Whois database is provided by VeriSign for
information purposes only, and to assist persons in obtaining information
about or related to a domain name registration record. VeriSign does not
guarantee its accuracy. By submitting a Whois query, you agree to abide
by the following terms of use: You agree that you may use this Data only
for lawful purposes and that under no circumstances will you use this Data
to: (1) allow, enable, or otherwise support the transmission of mass
unsolicited, commercial advertising or solicitations via e-mail, telephone,
or facsimile; or (2) enable high volume, automated, electronic processes
that apply to VeriSign (or its computer systems). The compilation,
repackaging, dissemination or other use of this Data is expressly
prohibited without the prior written consent of VeriSign. You agree not to
use electronic processes that are automated and high-volume to access or
query the Whois database except as reasonably necessary to register
domain names or modify existing registrations. VeriSign reserves the right
to restrict your access to the Whois database in its sole discretion to ensure
operational stability.  VeriSign may restrict or terminate your access to the
Whois database for failure to abide by these terms of use. VeriSign
reserves the right to modify these terms at any time.

The Registry database contains ONLY .COM, .NET, .EDU domains and
Registrars.Connection closed by foreign host.
[stone@localhost ~]$

보다 확실한 방법은 IP와 주소 정보를 관할하는 IANA의 WHOIS 서버를 통해서 확인을 하면 보다 확실합니다.

The IANA whois server at whois.iana.org provides information on each TLD including the whois server.

[stone@localhost~]$ telnet whois.iana.org 43
Trying 192.0.47.59...
Connected to whois.iana.org (192.0.47.59).
Escape character is '^]'.
kr
% IANA WHOIS server
% for more information on IANA, visit http://www.iana.org
% This query returned 1 object

domain:       KR

organisation: Korea Internet & Security Agency (KISA)
address:      12F, Daedong Bldg, 109 Jungdae-ro, Songpa-gu
address:      Seoul  138-950
address:      Korea, Republic Of

contact:      administrative
name:         Kilnam Chon
organisation: Korea Network Information Center (KRNIC)
address:      12F, Daedong Bldg, 109 Jungdae-ro, Songpa-gu
address:      Seoul  138-950
address:      Korea, Republic Of
phone:        +82 10 8581 3514
fax-no:       +82 2 405 5419
e-mail:       chonkn@gmail.com

contact:      technical
name:         Director of Internet Technology Team
organisation: Korea Internet & Security Agency (KISA)
address:      12F, Daedong Bldg
address:      109 Jungdae-ro, Songpa-gu
address:      Seoul 138-950
address:      Korea, Republic Of
phone:        +82 2 405 6470
fax-no:       +82 2 405 5119
e-mail:       techc@kisa.or.kr

nserver:      B.DNS.KR 61.74.75.1
nserver:      C.DNS.KR 203.248.246.220
nserver:      D.DNS.KR 203.83.159.1
nserver:      E.DNS.KR 2001:dcc:5:0:0:0:0:100 202.30.124.100
nserver:      F.DNS.KR 218.38.181.90
nserver:      G.DNS.KR 2001:dc5:a:0:0:0:0:1 202.31.190.1
ds-rdata:     17625 7 2 FB939059F4B67BBA1E8AC37E35811E506488B2D8CFF807AF873B2116B5676B5C

whois:        whois.kr

status:       ACTIVE
remarks:      Registration information: http://www.nic.or.kr/

created:      1986-09-29
changed:      2011-11-23
source:       IANA

Connection closed by foreign host.
[stone@localhost ~]$
Sep 172012
 

DNS는 HTML과 달리 정해진 형식으로 구성된 프로토콜입니다.

워낙 작은 데이타로 값을 요청하고, 응답해야 하기 때문에 나름대로의 규칙이 있습니다.

특히 응답값을 패킷 캡쳐를 해서 보면 재미있는 현상이 있습니다.
실제 결과를 nslookup이나 dig를 통해서 결과를 보면 데이타의 양이 많습니다. 하지만 많은 양에 비해서 패킷의 수치는 그리 많지 않습니다.

이를 처리하는 부분이 도메인 데이타에 대해서 압축(?)을 하는 방법을 사용합니다. 우리가 일반적으로 알고 있는 압축이 아니고, 이미 사용했던 패킷의 데이타를 재사용함으로써 데이타 압축을 한 효과를 내고 있습니다.

RFC에서 DNS 프로토콜에서 데이타 압축 기법에 대한 설명 자료

http://tools.ietf.org/html/rfc1035#section-4.1.4

이러한 기법에 대해서 설명한 자료를 찾지 못해서 RFC와 패킷 캡쳐한 결과로만 알고 있다가 예전에 인터넷으로 검색해서 찾은 자료입니다. 예전같으면 원서라도 구입해서 보겠지만, 요새는 인터넷에서 원서를 공개하고 있어서 원하는 부분만 쉽게 볼수 있어서 좋은것 같습니다.

http://www.tcpipguide.com/free/t_DNSNameNotationandMessageCompressionTechnique.htm

위의 TCP/IP Guide 책을 보면 RFC보다 쉽게 이해가 가능합니다.

하지만 이러한 사실을 눈으로는 쉽게 이해가 되지만, 이를 구현을 하다 보면 여러가지 문제점이 있다는 것을 알수 있습니다.
구현에 대해서는 다음에 다시 한번 정리를 해보도록 하겠습니다.

Sep 172012
 

대부분 개발자들은 개발을 하면서 HTML 파서를 각자 만들어서 사용을 하고 있습니다.
특히 검색 로봇을 만들어서 사용할 경우에는 HTML을 읽어서 파서를 만들어서 사용하는 경우가 많습니다.
그래서 저는 HTML 문법을 기반으로 하는 라인단위로 분리를 해서 사용하는 방법을 많이 사용했습니다.
(대부분 로봇을 Perl을 사용해서 만들었기 때문에 10라인 정도 되는 함수로 만들어서 잘 사용했으며, 대규모 분석시 적은 메모리로 빠른 처리가 가능합니다.)

하지만 최근 HTML 구조가 CSS 기반으로 이루어지다 보니 좀 더 복잡하게 구성되는 경우가 많습니다.
대신 HTML5의 경우에는 문서가 구조적으로 되어 있기 때문에 라인단위로 분석보다는 html을 parser해서 DOM과 같은 객체에 넣어 두고 분석을 하면 훨씬 편리하다.

물론 라인단위로 처리하거나, SAX로 처리하는 것보다 메모리나, 속도 측면에서는 문제가 많겠지만, 변경된 HTML구조에 빠르게 대응을 하고, 간단하게 개발할때에는 효과적인것 같아서 HTML parser 프로그램을 하나 소개합니다.

PHP로 되어 있으며, 간단히 라이브러리 파일만 include를 하고, 아래와 같이 사용하면 된다.
(PHP 기본 함수가 아니므로 아래 참고 URL에 있는 소스를 다운받아서 PHP 프로그램을 사용할때 추가해야 합니다.)

    include_once('simple_html_dom.php');
 
    $html = file_get_html("http://blog.sukmoonlee.com");
 
    foreach($html->find('ul') as $element) {
        foreach($element->find('a') as $e) {
            echo $e->href."\n";        
        }
    }
 
 
[smlee@localhost ~]$ php test.php
/wordpress/
/env.php
/geshi/contrib/example.php

참고URL: http://simplehtmldom.sourceforge.net/

Sep 132012
 

자바를 이용해서 네트워크 프로그램을 작성하면서 자바의 데이타 형태 때문에 고생을 했다.
그래서 한번 확인을 하고 정리를 해봤습니다.

네트워크에서 받은 데이타들을 대부분 byte[]로 처리를 하고 있는데, 이를 숫자로 변환하기 위해서는 byte 2개 혹은 4개를 조합해서 사용하면 된다.

여기서 문제가 발생이 되는데, java의 대부분의 data type은 signed type으로 되어 있다.
(제가 사용하는 네트워크 데이타는 비트 단위로 연산을 하기 때문에 binary type으로 데이타를 조작을 해야 하는 경우가 대부분입니다.)

byte는 signed type으로 되어 있으며, 이를 short로 casting을 하고, << 8과 같이 연산을 하더라도 음수가 발생이 될수 있다. 이런 경우에는 (short)(byte[] & 0xFF) 형태로 먼저 & 연산을 처리후에 casting을 해서 연산을 처리하면 해결이 가능하다.
하지만 2 byte 데이타를 숫자로 변환을 하면, short type에 담을수가 없다. short type도 signed data 이기 때문에 char type 혹은 int type에 데이타를 저장해야 한다.

그래서 여러번의 테스트를 해보면서 data type을 이해를 하면서 만든 코드가 아래 1줄이다. -_-

 
int id=(int)((int)(data[0] & 0xFF) << 8) + (short)(data[1] & 0xFF);

* byte (1 byte, -128~127)
* char (2 byte, 0~65535)
* short (2 byte, -32768~32767)
* int (4 byte, -2147483648~2147483647)
* long (8 byte, -9223372036854775808 ~ 9223372036854775807)

* float (4 byte)
* double (8 byte)

참고URL : http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

Plugin from the creators of Brindes :: More at Plulz Wordpress Plugins