본문 바로가기
연구_고민

IRC

by DevG 2008. 5. 20.
IRC 프로토콜(RFC 1459)

  • 메시지 포맷
      <message>    ::= [':' <prefix> <SPACE> ] <command> <params> <crlf>
      <prefix>     ::= <servername> | <nick> [ '!' <user> ] [ '@' <host> ]
      <command>    ::= <letter> { <letter> } | <number> <number> <number>
      <SPACE>      ::= ' ' { ' ' }
      <params>     ::= <SPACE> [ ':' <trailing> | <middle> <params> ]
      <middle>     ::= <Any *non-empty* sequence of octets not including SPACE or NUL or CR or LF, the first of which may not be ':'>
      <trailing>   ::= <Any, possibly *empty*, sequence of octets not including NUL or CR or LF>
      <crlf>       ::= CR LF
      <target>     ::= <to> [ "," <target> ]
      <to>         ::= <channel> | <user> '@' <servername> | <nick> | <mask>
      <channel>    ::= ('#' | '&') <chstring>
      <servername> ::= <host>
      <host>       ::= see RFC 952 [DNS:4] for details on allowed hostnames
      <nick>       ::= <letter> { <letter> | <number> | <special> }
      <mask>       ::= ('#' | '$') <chstring>
      <chstring>   ::= <any 8bit code except SPACE, BELL, NUL, CR, LF and comma (',')>
      <user>       ::= <nonwhite> { <nonwhite> }
      <letter>     ::= 'a' ... 'z' | 'A' ... 'Z'
      <number>     ::= '0' ... '9'
      <special>    ::= '-' | '[' | ']' | '\' | '`' | '^' | '{' | '}'
      <nonwhite>   ::= <any 8bit code except SPACE (0x20), NUL (0x0), CR(0xd), and LF (0xa)>
      
  • 접속 과정
      • PING <msg>
        • PONG <msg> 로 보내주면 된다
    • 로그인
      • USER <name> <host> <user> :<Real Name>
        • name : 접속하는 사용자의 이름(사용자 정보에서 이메일 형식으로 나옴)
        • host, user : 호스트와 유저 이름이지만 실제 영향력은 없는듯..
        • Real Name : 사용자 정보에서 나오는 이름
      • NICK <nick>
        • nick : 실제 대화명(닉네임)
    • 보통 위의 과정을 거치면 환영 메시지가 나옴
  • 대화
    • PRIVMSG <nick|channel>[,<nick|channel>...] <message>
      • 수신자
        • channel : 채널명
      • message : 대화 내용
    • NOTICE 상동
    • PRIVMSG와 NOTICE의 차이점 확인할것
  • 채널 입장
    • JOIN <channel>
      • 471 ERR_CHANNELISFULL "<channel> :Cannot join channel (+l)"
      • 473 ERR_INVITEONLYCHAN "<channel> :Cannot join channel (+i)"
      • 474 ERR_BANNEDFROMCHAN "<channel> :Cannot join channel (+b)"
      • 475 ERR_BADCHANNELKEY "<channel> :Cannot join channel (+k)"
      • 465 ERR_YOUREBANNEDCREEP ":You are banned from this server"
      • 464 ERR_PASSWDMISMATCH ":Password incorrect"
  • 채널 퇴장
    • PART <channel>
  • 채널 관리(채널 오퍼레이터용)
    • MODE <channel> <mode> <nick|params>
      • params : 파라메터
      • (+|-)mode
        • o : 채널의 오퍼레이터 권한을 주거나 뺏는다
        • p : 비공개채널
        • s : 비밀채널
        • i : 초대만 가능한 채널
        • m : 제한된 채널
        • t : 오퍼레이터만 방제를 바꿀수있게한다
        • n : 밖에서 온 클라이언트의 메세지는 채널에 전달되지않는다
        • l : 채널에 들어올수있는 사용자의 수를 제한한다
        • b : 사용자를 계속 내보낼수있게 금지하는마스크
        • v : 제한된 채널에서 말할수있는 권한을 주거나 뺐는다
        • k : 채널에 비밀번호를 지정해놓는다
      • 324 RPL_CHANNELMODEIS "<channel> <mode> <mode params>"
      • 482 ERR_CHANOPRIVSNEEDED "<channel> :You're not channel operator"
      • 472 ERR_UNKNOWNMODE "<char> :is unknown mode char to me"
      • 467 ERR_KEYSET "<channel> :Channel key already set"
  • 토픽 변경
    • TOPIC <params>
      • 331 RPL_NOTOPIC "<channel> :No topic is set"
      • 332 RPL_TOPIC "<channel> :<topic>"
  • 목록 얻기
    • NAMES [<channel>[,<channel>]]
      • 채널명과 그 채널의 사용자 목록을 얻음
        • 353 RPL_NAMREPLY "<channel> :[[@|+]<nick> [[@|+]<nick> [...]]]"
        • 366 RPL_ENDOFNAMES "<channel> :End of /NAMES list"
    • LIST [<channel>[,<channel>]]
      • 채널명과 토픽명을 얻음
        • 비공개 채널일 경우 토픽명을 얻을수 없음
        • 비밀 채널일 경우 목록에 추가되지 않음
          • 321 RPL_LISTSTART "Channel :Users Name"
          • 322 RPL_LIST "<channel> <# visible> :<topic>"
          • 323 RPL_LISTEND ":End of /LIST"
  • 접속 종료
    • QUIT [message]
      • message : 종료시 표시될 메시지