[ft_irc] 3. IRC 프로토콜

aqualung·2023년 6월 25일
0

🖥 IRC 프로토콜

IRC서버와 클라이언트는 약속된 프로토콜에 따라 메세지를 주고 받고 해석한다.
오늘날의 IRC서버는 전통적인 IRC보다 많은 기능을 제공하기 때문에 RFC만을 참고해서 프로그램을 만드는데에는 무리가 있을 수 있다.

IRC 메세지 형식

IRC메시지의 기본적인 형태는 이러하다.

'prefix' 'command' 'params' 'crlf'

각 필드는 space로 구분되면 마지막에 crlf("\r\n")이 붙는 형태이다.

command와 crlf는 반드시 메세지에 존재해야 하며 params는 필요에 따라 여러 개일 수 있고 아예 없을 수 있다. params의 마지막에는 ':'로 시작하는 trailing이 붙을 수 있다.

prefix는 서버에서 클라이언트로 보내는 메세지에만 쓰인다.

클라이언트의 요청 메세지

예를 들어 amy라는 클라이언트가 JOIN message를 보낼 때는 이런 형식이다.

PRIVMSG mick :hello!\r\n
  • PRIVMSG -> 'command'
  • mick :hello! -> 'params'
    -> ':'(콜론) 뒤에 따라 오는 "hello"는 trailing이 된다.
  • \r\n -> 'crlf'

서버는 각 필드들을 파싱하여 해석하고 응답 메세지를 만들어 클라이언트에게 보내주면 된다.

서버의 응답 메세지

위와 같은 메세지를 받았다면 서버에서는 amy가 mick에게 "hello!"라고 private message를 보내려 한다고 해석한다.

그렇다면 mick이라는 닉네임을 가지고 있는 또다른 클라이언트에게 적절한 메세지를 보내주어야 한다.

서버는 아래의 메세지를 mick에게 보내준다.

:amy!q@127.0.0.1 PRIVMSG mick :hello!\r\n
  • :amy!amy@127.0.0.1 -> 메세지를 보내려는 amy의 정보 (prefix)
  • PRIVMSG -> 'command'
  • mick :hello! -> 'params'

이와 같은 메세지를 받은 mick의 클라이언트 프로그램은 다시 이 메세지를 해석해 사용자에게 보여줄 수 있다.

만약 amy가 메세지를 보내려는 mick이 없는 사용자라면 서버는 어떻게 동작할까?
서버는 amy에게 mick이 없는 사용자라는 것을 알려주어야 한다.

:ft_irc 401 amy mick :No such nick/channel\r\n
  • :ft_irc -> 서버의 정보 (prefix)
  • 401
    -> IRC프로토콜 요청에 따른 응답을 세자리 숫자로 정의하고 있다. 401은 ERR_NOSUCHNICK로 대상으로하는 유저나 채널이 없을 때 사용된다. 메세지 형식에서 'command'에 해당한다.
  • amy mick :No such nick/channel -> 'params'

위의 메세지를 amy에게 보내주어 mick이라는 대상이 없다고 알려줄 수 있다. 이러한 메세지를 reply라고 한다.

서버 접속

클라이언트가 서버에 접속하기 위해서는 반드시 보내야 하는 메세지가 있는데 바로 NICKUSER 메세지이다. 서버에 password가 있다면 추가적으로 PASS메세지를 보내야 할 수도 있다.

NICK

NICK amy

NICK은 해당 서버에서 사용할 닉네임이다. 닉네임은 서버에서 사용자를 식별 기준이기 때문에 중복될 수 없다.

NICK은 하나의 파라미터만 받는다.

이미 존재하는 닉네임이라면 433 ERR_NICKNAMEINUSE reply를 돌려준다.

USER

USER amy * * :Amy Pond

USER는 클라이언트의 정보를 서버에 알려준다.
4개의 파라미터를 받는데 그 중 첫번째와 네번째만 사용된다.

  • amy -> 'username'
  • :Amy Pond -> 'realname'

replies

NICK과 USER 메세지를 성공적으로 받았다면 접속에 성공했다는 reply를 클라이언트에게 돌려줘야 한다.

다음 네 가지 reply를 클라이언트에게 전송한다.

001 RPL_WELCOME
002 RPL_YOURHOST
003 RPL_CREATED
004 RPL_MYINFO

자주 쓰이는 명령어

PRIVMSG

다른 유저 또는 해당 채널의 모든 사용자에게 채팅을 보낼 때 사용된다.

JOIN

채널에 들어갈 때 사용되는 명령어

PART

채널을 나올 때 사용되는 명령어

QUIT

서버 접속을 종료할 때 사용되는 명령어

0개의 댓글

관련 채용 정보