RFC 1939 번역본- POP3

정보 2016. 3. 4. 21:54

// 직접 번역한 내용이라 오역 및 의역이 있을 수 있습니다. 다만 각 문장은 RFC 1939문서의 문장을 직역한 것이기 때문에 비교하면서 보면 의미 전달이 더 명확할 것입니다. 



1.Introduction 

 

인터넷의 더 작은 노드들 중 어떤 특정한 타입의 경우, message transport system(MTS)를 유지하는데 비실용적이다. 예를 들어서 workstation에 SMTP 서버를 허용하기 위해서 [RFC821], 혹은 연관되어 있는 로컬 mail delivery system이 계속해서 실행되도록 하기 위해서 필요한 cycle이나 disk space와 같은 충분한 자원이 없을 수도 있다. 비슷하게, 개인 컴퓨터를 IP-style 네트워크로 오랫동안 서로 연결된 상태로 유지하는 것은 비쌀 수도(혹은 불가능할 수도) 있다. (노드-로컬 클라이언트-가 "연결성"으로 알려진 자원을 부족하게 하고 있다)

그럼에도 불구하고 메일을 이러한 작은 노드(로컬 클라이언트)에서 관리하는 것은 매우 유용하고, 그들은 종종 메일을 핸들링하기 위해서 user agent(UA)라고 하는 것도 지원한다. 이러한 문제를 해결하기 위해서 MTS를 지원할 수 있는 로컬 클라이언트들은 maildrop 서비스를 지원한다. POP3는 동적이면서 유용한 방법으로 workstation에 서버에 있는 메일 드롭에 접근하는 것을 허가하기 위해 고안되었다. 보통, 이것은 원래 POP3 프로토콜이 서버에서 가지고 있는 메일을 워크스테이션에 가지고 오는 것을 허용하는 것이었다는 것을 의미한다.

POP3는 서버의 메일을 대량으로 조작하는 운영을 제공하기 위해서 고안되지 않았다; 일반적으로 메일은 다운받은 후에 지워진다. 더 발전한, 그리고 복잡한 프토토콜인 IMAP4는 RFC1730에서 논의되고 있다.

이 문서는 이제부터 "클라이언트 호스트"라는 용어는 POP3 서비스를 사용하는 쪽을 지칭하고, "서버 호스트"는 POP3 서비스를 제공하는 쪽을 지칭할 것이다.

 

2.A Short Digression

 


이 문서는 클라이언트 호스트가 메일을 어떻게 transport system에 보내는지 구체적으로 알아보지 않을 것이다. 하지만 그 방법은 아래와 같이 이 문서의 철학과 맥락을 같이 한다.

 

 user agent가 클라이언트 호스트에서 transport system에서 메세지를 보내면, SMTP 커넥션을 맺고 그것의 relay host에 메일을 보낸다. 이 릴레이 호스트는 클라이언트 호스트를 위한 POP3 서버 호스트일 수 있지만, 반드시 그래야 하는 것은 아니다. 물론, 그 릴레이 호스트는 배달을 위해서 임의의 수신자 주소로 반드시 메일을 받아들여야 하지만 이것은 모든 SMTP 서버에 요구되는 기능은 아니다.

 


3.Basic Operation

  •  최초에, 서버 호스트는 POP3서비스를 TCP 포트 110에서 리스닝하는 것으로 시작한다. 
  •  클라이언트 호스트가 서비스를 사용하려고 할 때, 그것은 서버호스트와 TCP 커넥션을 맺는다.
  •  커넥션이 맺어지고 나면 POP3 서버는 greeting을 보낸다.
  •  그 후에 클라이언트와 POP3서버는 커넥션이 끝나거나 혹은 파기될 때까지 서로 commands 와 responses를 주고 받는다.
  • POP3에서의 command는 대소문자를 구분하지 않으며, 하나 이상의 argument를 받을 수 있다.
  • 모든 커맨드는 CRLF pair에 의해서 끝난다.
  • keyword와 argument는 인쇄 가능한 ASCII 문자로 구성되어 있다.
  • keyword와 arguments는 공백 문자(space)로 각각 구분된다.
  • keyword는 3~4개의 캐릭터 문자이다. 
  • 각각의 argument는 최대 40개의 캐릭터 문자까지 가능하다.
  • POP3에서의 응답은 하나의 상태 지시자와 하나의 keyword, 그리고 뒤에 추가정보를 덧붙일 수 있도록 구성되어 있다.
  • 모든 응답은 CRLF 페어에 의해서 끝난다. 
  • 응답은 제일 끝에 있는 CRLF 문자를 포함해서 최대 512자의 캐릭터 길이가 가능하다.
  • 응답에는 두개의 상태 지시자가 있다. positive:("+OK") / negative: ("-ERR")
  • 서버는 반드시 "+OK"와 "-ERR"를 대문자로 보내야 한다.
  • 어떤 커맨드에 대한 응답은 여러 줄일 수 있다.
  • 첫번째 줄의 응답과 개행문자를 받은 후에도 각각의 개행 문자 페어에 의해서 끝나는 추가된 줄이 더 들어오는 경우와 같이 명확하게 아래를 가리키고 있을 경우에는 응답이 여러줄 일 수 있다.
  • 모든 라인의 응답이 보내지고 난 후, termination 옥텟(decimal code 046, ".")과 CRLF pair를 포함하고 있는 마지막 줄이 보내진다.
  • 만약 여러 줄의 응답이 터미네이션 옥텟(".")으로 시작한다면 그 라인은 미리 해당 라인의 시작 부분에 터미네이션 옥텟을 덧붙여서 보내어 행이 "byte-stuffed" 된다. 
  • 그러므로 여러줄의 응답은 "CRLF.CRLF"로 끝난다.
  • 여러 줄의 응답을 검증해 볼 때 클라이언트는 한 줄의 시작이 터미네이션 옥텟으로 시작하는지 확인한다.
  • 만약 한 줄의 시작이 터미네이션 옥텟으로 시작하고, 옥텟 뒤에 CRLF가 따라붙는다면, 그 줄의 첫번째 옥텟(터미네이션)은 없앨 것이다.
  • 만약 CRLF가 즉시 터미네이션 캐릭터에 따라오면 POP 서버로부터 온 그 응답은 끝난 것이고,".CRLF"를 포함하고 있는 라인은 여러줄로 구성된 응답의 일부로 고려되지 않을 것이다.
  • POP3 세션은 그것의 생명주기 동안 몇 가지의 상태를 통해 진행된다.
  • 일단 TCP 커넥션이 맺어지고 POP3 서버가 greeting을 보내면 세션은 'AUTHORIZATION'상태로 들어간다.
  • 이 상태에서 클라이언트는 반드시 스스로 POP3 서버에 인증을 해야 한다.
  • 일단 클라이언트가 이 과정을 성공적으로 넘어가면, 서버는 클라이언트의 메일드롭과 연관된 자원을 얻고, 세션은 TRANSACTION 상태로 진입한다.
  • 이 상태에서는 클라이언트는 POP3 서버의 일부에 대해서 동작을 요청한다.
  • 클라이언트가 QUIT 커맨드를 보내고 나면 세션은 UPDATE 상태로 진입한다.
  • 이 상태에서 POP3 서버는 TRANSACTION 상태인 동안 얻었던 모든 자원을 release하고 goodbye 하고 말한다.
  • 그 후에 TCP 커넥션은 닫힌다.
  • 서버는 '반드시' 인정되지 않거나, 제대로 실행되지 않거나, 혹은 문법적으로 옳지 않은 커맨드에도 네거티브 상태 지시자와 함께 응답을 보내줘야 한다.
  • 서버는 세션이 옳지 않은 상태에서 발행된 커맨드에도 반드시 네거티브 상태 지시자와 함께 응답해야 한다.
  • 클라이언트는 서버가 추가적인 커맨드를 지원하지 않는 것과 서버가 원하지 않거나 커맨드를 수행할 수 없는 것을 구분할 방법이 없다.
  • POP3 서버는 비활성화된 자동 로그아웃 타이머를 가질 수도 있다.
  • 이러한 타이머는 최소 10분동안 반드시 지속 가능해야 한다.
  • 클라이언트로부터 어떠한 커맨드라도 그 시간 사이에 온 것이 있다면 자동 로그아웃 타이머를 리셋하도록 해야 한다.
  • 타이머가 만료되고 나면, 세션은 UPDATE 상태로 진입하지 않는다.-- 서버는 클라이언트에 어떤 메세지도 지우거나 어떠한 응답도 보내지 않고 TCP커넥션을 닫는다.

4. The AUTHORIZATION state

  • 일단 POP3 클라이언트에 의해서 TCP 커넥션이 맺어지면, pop3 서버는 한 줄의 greeting을 보낸다.
  • 이것은 어떠한 positive 응답이든 상관없다.
  • 예를 들어 아래와 같은 것도 가능하다.
S: +OK POP3 server ready
  • POP3 세션은 이제 AUTHORIZATION 상태이다. 클라이언트는 이제 반드시 POP3 서버에 자신을 밝히고 인증을 받아야 한다.
  • 이 문서에서는 그 인증을 받기 위해 사용 가능한 두가지 매커니즘을 서술하고 있다.
  • User and PASS 커맨드 조합과 APOP command이다.
  • 두 매커니즘 다 이 문서의 아래에 서술되어 있다.
  • 추가적인 인증을 받는 매커니즘은 [RFC1734]에 서술되어 있다.
  • 반면, 모든 POP3 서버에서 필수적인 하나의 인증 매커니즘도 없으므로 POP3 서버는 최소한 하나의 인증 매커니즘을 반드시 제공해야 한다.
  • 일단 POP3서버가 클라이언트가 적절한 메일드랍에 접근하기 위해 받아야 하는 어떠한 인증 커맨드를 사용할 것을 결정하면 그 POP3 서버는 세션이 UPDATE 상태에 들어가기 전에 메세지가 수정되거나 지워지는 것을 막기 위해 그 메일드랍에 대해 배타적 접근 락을 획득한다.
  • 만약 락이 얻는데 성공하면 POP3서버는 positive 상태지시자와 함께 응답을 보낸다.
  • POP3 세션은 이제 어떤 메세지도 deleted 표시가 되지 않은 채로 TRANSACTION 상태에 들어간다.
  • 만약 메일드랍이 어떠한 이유들로 인해 열리지 않는다면(예를 들어 락을 획득하지 못했거나 클라이언트가 적합한 메일드랍에 접근하는 것을 거부당했거나 메일드립을 파싱할 수 없을 때) POP3 서버는 negative 상태 지시자를 이용하여 응답한다.
  • (만약 락을 획득했지만 POP3서버가 negative 상태 지시자를 보내는 것을 의도한다면, POP3 서버는 반드시 커맨드를 거부하기 전에 락을 먼저 해제해야 한다.)
  • negative 상태 지시자를 보낸 후에 서버는 커넥션을 끊을 수 있다.
  • 만약 서버가 커넥션을 끊지 않는다면 클라이언트는 새로은 인증 커맨드를 발행해서 다시 시작할 수 있고, 혹은 클라이언트에서 QUIT 커맨드를 날릴 수도 있다.
  • POP3서버가 메일드랍을 열고 난 후에, 서버는 각각의 메세지에 메세지 넘버를 할당하고 각 메세지의 크기를 옥텟에 기록한다.
  • 메일드랍의 첫번째 메세지에는 "1"을 할당하고, 두번째에는 "2"를 할당하는 식으로, n번째 메세지는 "n"번의 메세지 넘버를 할당한다.
  • POP3 커맨드와 응답에서는 모든 메세지 넘버와 메세지 사이즈가 base-10(i.e., decimal) 형식으로 표현된다.
  • 여기에 AUTHORIZATION 상태일 때 간단한 QUIT 커맨드에 대한 요약이 있다.
QUIT
QUIT
Arguments: none
Restrictions: none
Possible Responses:
 +OK
Examples:
 C: QUIT
 S: +OK dewey POP3 server signing off

 

5. The TRANSACTION State

  • 일단 클라이언트가 성공적으로 POP3서버에서 인증되고 POP3 서버가 적합한 메일드랍을 락을 걸고 열었다면 POP3 세션은 이제 TRANSACTION 상태가 된 것이다. 클라이언트는 이제 아래에 나온 어떠한 POP3 커맨드든 반복적으로 보낼 수 있다.
  • 각각의 커맨드를 보낸 후에는 POP3 서버가 응답을 보낸다.
  • 마침내는 클라이언트는 QUIT 커맨드를 보내고, POP3세션은 UPDATE 상태에 접어든다.
  • 아래에 TRANSACTION 상태에서 사용 가능한 POP3 커맨드가 있다.
STAT

STAT

Arguments: 없음

Restrictions: TRANSACTION 상태에서만 사용할 수 있음

Discussion:
POP3 서버는 메일드랍에 대한 정보를 포함한 라인과 함께 positive 응답을 발행한다.
이 라인은 그 메일드랍에 대한 "drop listing"이라고 부른다.

파싱을 간편하게 하기 위해서 모든 POP3 서버는 drop listing들에 대해서 특정한 포맷을 사용할 것을 요구받는다.positive 응답의 경우 "+OK" 뒤에 스페이스 한칸, 메일드랍의 메세지 개수, 스페이스 한칸, 메일드랍의 사이즈가 들어있는 옥텟들을 포함한다. 이 문서는 메일드롭의 사이즈 뒤에 추가적인 정보가 덧붙여서 와야 할 필요가 없다는 것을 명시한다. 최소한의 완성을 위해서 개행문자 페어가 응답하는 라인의 마지막에 반드시 들어가야 한다. 더 advanced하게 덧붙여온 내용은 다른 정보를 담고 있을 수 있다. 

 NOTE: 이 문서는 drop listing에 추가적인 정보를 넣는 것을 비추한다. 다른 선택적인 편의는 후에 클라이언트가 메일드랍에서 메세지를 파싱하는 것을 허용하는 부분에서 논의된다.

 

지워진 것으로 표시된 메세지들은 전체 개수에 포함되지 않는다는 것을 기억하라.

Possible Responses:
+OK nn mm
+OK (메일 드랍의 메세지 개수) (메일드랍의 사이즈가 들어있는 옥텟)

Examples:
C: STAT
S: +OK 2 320

LIST [msg]

LIST [msg]

Arguments:
만약 존재한다면 메세지 넘버(선택), 삭제된 것으로 표시되어 있을 경우 언급하지 않을 수도 있다.

Restrictions:
TRANSACTION 상태에서만 사용 가능

Discussion:

  • 만약 하나의 인자가 주어질 경우, POP3 서버가 그 메세지에 대한 정보를 포함한 positive 응답을 발행한다.
  • 이 라인은 해당 메세지에 대한 "스캔 리스팅"이라고 한다.
  • 만약 어떤 인자도 주어지지 않을 경우, POP3 서버가 positive 응답을 발행하는데, 이 때의 응답은 여러 줄이다.
  • 최초의 +OK 이후, 메일드랍 안에 있는 각각의 메세지에 대해서 POP3 서버는 그 메세지의 정보를 라인에 포함해서 응답한다.
  • 이 라인 역시 "scan listing"이라고 한다.
  • 만약 메일 드랍 안에 메세지가 하나도 없을 경우, POP3서버는 스캔리스팅 없이 응답한다.
  • 즉, POP3 서버는 positive 응답 뒤에 termination octet과 CRLF 페어를 덧붙여 발행한다.
  • 파싱을 쉽게 하기 위해서, 모든 POP3 서버들은 스캔 리스팅을 위한 특정한 포맷을 사용해야 한다.
  • 스캔 리스팅은 메세지의 메세지 번호(message-number)와 띄어쓰기 한 칸, 그 메세지 사이즈의 정확한 옥텟으로 구성되어있다. (+OK 1 1234)
  • 메세지의 정확한 사이즈 계산 방법은 아래의 "Message Format" 부분에 상술되어 있다.
  • 이 문서는 스캔 리스팅에서 메세지 사이즈에 무엇이 들어가든 요구하지 않는다.
  • 최소한의 실행 조건은 응답의 마지막이 CRLF pair로 이루어져야 한다는 정도이다.
  • 더 advanced한 실행 조건은 그 메세지에서 해석된 다른 정보에 포함되어 있을 것이다.

NOTE: 이 문서는 스캔리스팅에서 추가적인 정보를 제공하는 것을 무척 비추한다. 다른 추가적인 역할은 뒤에 있는 메일드랍에 있는 메세지를 파싱하기 위해 클라이언트에게 허가하는 부분에서 논의된다.

 

  • 삭제 표시가 된 메세지들은 리스트에 올라오지 않는다는 것을 기억하라.

Possible Responses:
+OK (drop listing을 스캔한 결과 출력)
-ERR no such message

Examples:
C: LIST
S: +OK 2 messages (320 octets)
S: 1 120

S: 2 200
S: .
...
C: LIST 2
S: +OK 2 200
...
C: LIST 3
S: -ERR no such message, only 2 messages in maildrop

 

RETR msg

RETR msg

Arguments:
메세지 번호(필수). 그러나 삭제된 것으로 표시되어있는 경우 언급하지 않을 수도 있다.

Restrictions:

TRANSACTION state 에서만 사용 가능

Discussion:
만약 POP3 서버가 positive 응답을 보낸다면 응답은 여러줄이 된다. 최초의 +OK를 보낸 후에 POP3서버는 메세지 번호를 응답으로 보내고, (모든 여러줄의 응답에 있어서 그렇듯)byte-stuff가 되지 않게 조심해서 termination 문자를 보낸다.

Possible Responses:
+OK message follows
-ERR no such message

Examples:
C: RETR 1
S: +OK 120 octets
S: <the POP3 server sends the entire message here>
S: .

DELE msg

DELE msg

Arguments:
메세지 번호(필수). 그러나 삭제된 것으로 표시될 경우 언급하지 않을 수 있음.

Restrictions:
TRANSACTION state 에서만 사용가능

Discussion:
POP3 서버는 해당 메세지를 지워진 것으로 표시한다. 이후로 이 메세지 번호와 관계가 있는 메세지에 대한 POP3 커맨드에 대한 참조도 에러를 낸다. POP3 서버는 세션이 UPDATE 상태로 진입하기 전까지 실제로 메세지를 지우지 않는다.

Possible Responses:
+OK message deleted
-ERR no such message

Examples:
C: DELE 1
S: +OK message 1 deleted
...
C: DELE 2
S: -ERR message 2 already deleted

NOOP

NOOP

Arguments: none

Restrictions:
TRANSACTION state 에서만 사용가능

Discussion:
POP3 서버는 아무 것도 하지 않는다. 그저 positive 응답을 보낼 뿐.

Possible Responses:
+OK

Examples:
C: NOOP
S: +OK

RSET

RSET

Arguments: none

Restrictions:
TRANSACTION state 에서만 사용가능

Discussion:
만약 어떤 메세지가 POP3 서버에서 삭제된 것으로 표시되었을 경우, 삭제 표시를 지운다. 그 후에 POP3 서버는 positive 응답을 보낸다.

Possible Responses:
+OK

Examples:
C: RSET
S: +OK maildrop has 2 messages (320 octets)

 

6. The UPDATE state

  • 클라이언트가 TRANSACTION 상태에서 QUIT 커맨드를 보내면 POP3 세션은 UPDATE 상태로 진입한다. (만약 클라이언트가 AUTHORIZATION 상태에서 QUIT 커맨드를 발행하면 POP3 세션은 파기되지만 UPDATE 상태로 진입하지는 않는다.)
  • 만약 세션이 QUIT 커맨드를 날리지 않았는데 어떠한 이유에서든 간에 파기되었을 경우, POP3 세션은 UPDATE상태로 진입하지 않고, 메일드랍의 어떤 메세지도 지우지 않아야 한다.

 

QUIT

QUIT

Arguments: none

Restrictions: none

Discussion:
POP3 서버는 메일드랍에서 삭제 표시된 모든 메세지를 삭제하고, 이 작업의 상태를 응답으로 보낸다. 만약 자원 부족이나 메세지를 삭제 중에 요청이 충돌하는 등의 이유로 에러가 발생한다면, 메일드랍은 삭제 표시가 되어있었던 메세지들을 가지고 있거나 그러한 표시가 되지 않은 메일들을 가지고 있어서 그러한 메일을 삭제하는 결과를 낼 수도 있다. 이외에 어떤 케이스에서도 서버는 삭제 표시가 되지 않은 메세지를 삭제하지 않는다.

삭제가 성공적이건 그렇지 않건, 서버는 메일드랍에 대한 배타적 점유 락을 해제하고 TCP 커넥션을 끊는다.

Possible Responses:
+OK
-ERR some deleted messages not removed

Examples:
C: QUIT
S: +OK dewey POP3 server signing off (maildrop empty)
...
C: QUIT
S: +OK dewey POP3 server signing off (2 messages left)
...

 

7. Optional POP3 Commands

  • 위에서 논의된 POP3 커맨드는 POP3서버의 모든 실행에 의해서 지원되어야 한다.
  • 아래에 서술된 선택적인 POP3 커맨드들은 간단한 POP3 서버에 실행을 보류하고 있는 동안 POP3 클라이언트들이 메세지 핸들링에 있어서 더 큰 자유를 누릴 수 있게 허용한다.

NOTE: 이 문서는 이러한 커맨드들을 지원할 것을 강하게 추천한다.

 

  • 즉, 이 메모의 철학은 POP3 클라이언트가 정보를 갖기를 바라는 것이지, 서버가 갖기를 바라는 것이 아니다.

 

TOP msg n

TOP msg n

Arguments:
삭제 표시된 메세지는 표시되지 않을 수 있는(선택) 메세지 넘버(필수), 음수가 아닌 줄의 숫자(필수)

Restrictions:
TRANSACTION 상태에서만 가능

Discussion:
만약 POP3 서버가 positive 응답을 보낸다면, 그 응답은 멀티 라인일 것이다. 최초의 +OK응답 이후에 POP3서버는 빈 줄로 메세지의 바디와 구분되는 그 메세지의 헤더를 보낸다. 그리고 명시된 메세지의 바디의 줄 숫자만큼 종료 캐릭터를 byte-stuff하지 않기 위해 조심하면서 (모든 멀티라인 응답일 경우 그렇듯이)

만약 POP3 클라이언트에 의해 보내진 숫자가 바디에 들어있는 숫자보다 더 크다면 POP3 서버는 전체 메세지를 보낸다는 것을 기억하라.

Possible Responses:
+OK top of message follows
-ERR no such message

Examples:
C: TOP 1 10
S: +OK
S: <the POP3 server sends the headers of the message, a blank line, and the first 10 lines of the body of the message>
S: .
...
C: TOP 100 3
S: -ERR no such message

UIDL [msg]

UIDL [msg]

Arguments:
만약 존재하는 메세지 넘버일 경우(선택), 그러나 삭제 표시가 되어있을 경우에는 참조하지 않는다. 
a message-number (optional), which, if present, may NOT
refer to a message marked as deleted

Restrictions:
TRANSACTION 상태일 때만
may only be given in the TRANSACTION state.

Discussion:

  • 만약 변수가 있다면, POP3 서버가 해당 메세지에 대한 정보를 포함한 라인과 함께 positive 응답을 발행한다.
  • 이 라인은 해당 메세지에 대한 "고유 id listing"이라고 한다.
  • 만약 주어진 변수가 없다면, POP3 서버는 positive응답을 발행한다.
  • 그리고 주어진 그 응답은 멀티라인이다. 최초의 +OK 이후, 메일드랍에 있는 각각의 메세지에 대한 정보를 포함한 라인을 응답으로 전송한다.
  • 이 라인은 해당 메세지에 대한 "unique id listing"이라고 한다.
  • 파싱을 쉽게 하기 위해서 모든 POP3서버들은 고유ID 목록에 대하여 특정한 포맷을 사용해야 한다.
  • 고유 ID목록은 해당 메세지의 메세지 넘버와 그 뒤에 따라오는 공백문자와 메세지의 고유ID로 구성된다.
  • 고유ID 목록에 있는 고유ID 외에 추가 정보는 없다.
  • 메세지의 고유 ID 는 서버에 의해서 임의로 결정된 문자열이다.
  • 이 문자열은 메일드랍 안에 있는 메세지를 고유하게 식별하고, 세션과 관계없이 유지되며, 0x21부터 0x7E사이의 하나에서 70개의 캐릭터들로 구성되어 있다.
  • 이 지속성은 세션이 끝나고 UPDATE state로 진입하더라도 유지되어야 한다.
  • 서버는 특정 고유ID를 사용하고 있는 개체가 있는 한, 절대 메일드랍에 주어진 고유ID를 재사용해서는 안된다.
  • 삭제 표시가 된 메세지는 목록에 들어가지 않는다는 것을 기억하라.
  • 보통 서버가 임의로 메일드랍에 대해 할당된 고유ID를 저장하여 완성하는 것을 선호하는 반면에, 이 명세는 고유 ID를 그 메세지의 계산된 해쉬값을 허가하기 위해서 의도되었다.
  • 클라이언트는 같은 고유ID를 가지고 있는 두개의 동일한 메세지의 복사본이 하나의 메일드랍 안에 있는 상황을 처리할 수 있어야 한다.

Possible Responses:
+OK unique-id listing follows
-ERR no such message

Examples:
C: UIDL
S: +OK
S: 1 whqtswO00WBw418f9t5JxYwZ
S: 2 QhdPYR:00WBw1Ph7x7
S: .
...
C: UIDL 2
S: +OK 2 QhdPYR:00WBw1Ph7x7
...
C: UIDL 3
S: -ERR no such message, only 2 messages in maildrop

USER name

USER name

Arguments:
오직 서버에게만 의미가 있는 메일박스를 식별하는 문자열(필수)

Restrictions:
POP3 greeting을 보내거나 USER 혹은 PASS 커맨드의 실패 후, AUTHORIZATION 상태에서만 사용가능

Discussion:

  • USER와 PASS 커맨드를 사용하는 인증을 하기 위해서, 클라이언트는 반드시 먼저 USER 커맨드를 제일 처음에 보내야 한다.
  • 만약 POP3서버가 positive 상태 지시자 응답("+OK")을 보내오면, 클라이언트는 인증을 마무리 짓기 위해 PASS 커맨드를 발행할 수 있고, 혹은 QUIT 커맨드를 이용해 POP3 세션을 파기할 수도 있다. 
  • 만약 POP3 서버가 negative 상태 지시자("-ERR")를 이용해 응답한다면 클라이언트는 새로운 인증 커맨드를 보내거나 혹은 QUIT 커맨드를 날릴 수 도 있다.
  • 서버는 그런 메일박스가 존재하지 않더라도 positive 응답을 보낼 수도 있다. 서버는 메일박스가 존재하지만 평문(plaintext)를 허용하지 않을 때 negative 응답을 보낼 수도 있다.
  • password 인증방식이다.

Possible Responses:
+OK name is a valid mailbox
-ERR never heard of mailbox name

Examples:
C: USER frated
S: -ERR sorry, no mailbox for frated here
...
C: USER mrose
S: +OK mrose is a real hoopy frood

PASS string

PASS string

Arguments:
서버/메일박스의 구체적인 비밀번호(필수)
a server/mailbox-specific password (required)

Restrictions:
AUTHRIZATION 상태에서 USER 커맨드의 성공 직후에만 가능

Discussion:
- 클라이언트가 PASS 커맨드를 보냈을 때, POP3 서버는 클라이언트가 적합한 메일드랍에 접근할 수 있는지 여부를 결정하기 위해서 USER 와 PASS 커맨드의 변수 짝을 사용한다. 
- PASS 커맨드가 오직 하나의 변수를 가질 수 있기 때문에 POP3 서버는 변수 안에 있는 공백문자(SPACE)들을 변수 분리자로 사용하는 대신 비밀번호의 일부로 처리할 수 있다.

 

Possible Responses:
+OK maildrop locked and ready
-ERR invalid password
-ERR unable to lock maildrop

Examples:
C: USER mrose
S: +OK mrose is a real hoopy frood
C: PASS secret
S: -ERR maildrop already locked
...
C: USER mrose
S: +OK mrose is a real hoopy frood
C: PASS secret
S: +OK mrose's maildrop has 2 messages (320 octets)

APOP name digest

APOP name digest

Arguments:
메일박스를 식별하는 스트링과 MD5 다이제스트 스트링(둘다 필수)

Restrictions:
POP3 greeting 이나 USER / PASS 커맨드의 실패 후의 AUTHORIZATION 상태에서만 사용가능

Discussion:

  • 일반적으로 각각의 POP3 세션은 USER/PASS 커맨드의 교환으로 시작한다. 
  • (in a server/user-id specific password)하는 이 결과는 평문으로 네트워크에서 보내어진다. 
  • POP3 의 간헐적인 사용은 큰 위험을 초래하지 않는다. 
  • 그러나 많은 POP3 클라이언트들 POP3 서버에 연결하려는 정기적인 기초 작업(새로운 메일을 확인하는 것 같은)을 시도한다. 
  • 게다가 세션 인터벌 초기화는 5분에 한번씩 일어나야 한다. 
  • 그러므로 비밀번호가 유출될 위험은 더 커진다. 
  • 인증 대체 방법은 원래의 인증방식과 보호를 다시 하되(replay), 네트워크 상에 평문으로 비밀번호를 노출하지 않는 방식 두가지 다 제공할 것이 요구된다. APOP 커맨드는 이 기능을 제공한다.

 

  • APOP 커맨드를 수행하는 POP3서버는 그것의 banner greeting에 timestamp를 포함해서 보낸다. ??timestamp의 syntax는 [RFC822]의 'msg-id'와 일치하고 반드시 POP3 서버가 banner greeting에서 발행하는 각 시간과 달라야 한다. 예를 들어 UNIX 에서 실행 했을 때 POP3 서버 인스턴스에 대해 각각 다른 UNIX 프로세스가 사용되므로, timestamp의 형식은 이렇게 될 것이다.

<process-ID.clock@hostname>

 

  • 'process-ID'는 프로세스의 PID로, 십진수이고, clock은 시스템 시간의 십진수이다. 그리고 hostname은 POP3 서버가 실행되고 있는 host의 충분히 적합한 도메인 네임을 의미한다.

 

  • POP3 클라이언트가 이 타임스탬프를 만들면 APOP command를 발행한다. 'name'파라미터에는 USER 커맨드에서 사용하는 인자인 'name'을 보내면 된다. 
  • 'digest' 파라미터에는 그 뒤에 공유된 비밀(shared secret)이 따라오는 timestamp(angle-brackets을 포함하는)를 포함한 문자열이 [RFC1321]의 MD5 알고리즘에 의해서 계산되어있다. 
  • 이 공유된 비밀은 POP3 클라이언트와 서버만이 알고 있는 문자열이다. 
  • 이 비밀의 정보는 어떤 개체로든 성공적으로 고유한 사용자인 척 위장하는 것을 허락할 것이기 때문에 이 비밀의 승인되지 않은 노출을 예방하기 위해서 조심스러운 관리가 필요하다. 
  • 'digest' 파라미터는 16진수 형식의 소문자 ASCII 문자의 16-옥텟으로 구성되어 있다. 
  • POP3 서버가 APOP 커맨드를 받으면 그것은 제공된 digest를 확인한다. 
  • 만약 digest가 맞으면 서버는 positive 응답을 보내고 POP3세션은 TRANSACTION 상태로 진입한다. 
  • 반면, negative 응답이 발행되고, POP3세션은 AUTHORIZATION 상태로 남아있는다.
  • 공유된 비밀의 길이가 길어질 수록 그것을 추론하기 위한 난이도가 높아진다는 것을 기억하라. 
  • 그것으로써 공유된 비밀은 긴 문자열(최소한 아래의 예시와 같이 8 캐릭터 이상의)이어야 한다.

Possible Responses:
+OK maildrop locked and ready
-ERR permission denied

Examples:
S: +OK POP3 server ready <1896.697170952@dbc.mtview.ca.us>
C: APOP mrose c4c9334bac560ecc979e58001b3e22fb
S: +OK maildrop has 1 message (369 octets)

이 예시에서 공유된 비밀은 'tanstaff' 이다. 그러므로 MD5 알고리즘은 아래와 같은 스트링에 적용된다.

이 결과 값은 이와 같다.

c4c9334bac560ecc979e58001b3e22fb

 

8. Scaling and Operational Considerations

  • 위에 서술된 몇몇의 추가적인 커맨드들이 POP3 프로토콜에 덧붙여졌기 때문에, 대부분의 사용자들이 서로 연결되어 있지 않은 큰 규모의 상업적인 post office operation 상에서 이 추가적인 옵션 커맨드들을 사용하는 과정에서 경험이 축적되어왔다.
  • 이러한 상황들에서, 그리고 사용자와 POP3 클라이언트 공급업체들은 UIDL 커맨드를 사용하는 것과 DELE 커맨드를 발행하지 않는 조합이 IMAP과 공조했을 때 약한 버전의 "mail-drop 을 준영구적인 저장소"의 기능으로 제공할 수 있다는 것을 발견했다.
  • 물론 존재하는 커넥션에 대해 새롭게 도착한 메세지를 당겨오거나 서버에 있는 여러개의 폴더를 지원하는 것과 같은 IMAP의 다른 기능들은 POP3에 존재하지 않는다.
  • 이 기능들이 일상적인 유저에 의해 이러한 방법으로 사용될 때, 서버에서 이미 읽은 메세지가 구분없이 다시 쌓이는 경향이 있어왔다.
  • 이것은 서버운영자의 관점에서 보았을 때 명확하게 부적절한 행동 패턴이다.
  • 이 상황은 POP3의 제한적인 기능이 수백 수천개의 메세지를 가지고 있는 메일드랍의 효율적인 핸들링을 허용하지 않는다는 사실에 의해서 악화된다.
  • 결과적으로, 이것은 특히 사용자가 POP3만 통해서 메일드랍에 접근할 수 있을 경우의 큰 규모의 멀티유저 서버의 운영자에게 추천된다. 이 때 고려되어야 할 옵션은 이러하다:

   <사용자 별 메일드랍 저장 용량과 같은 것을 부과할 때>

  • 이 옵션에 대한 불리한 점은 메세지의 축적이 사용자가 메일드랍에 새로운 메세지를 받지 못하는 결과를 초래할 수 있다는 점이다.
  • 이 옵션을 선택한 사이트는 반드시 사용자에게 사용자의 메일드랍이 적합한 메세지의 수신으로 인해 용량이 거의 다 찼거나 현재 꽉 찼다는 것을 알려줄 것을 보장해야 한다.

<사이트의 정책이 서버에서 메일을 보유하는 것 대하여 고려하도록 강제하라>

  • 사이트들은 서버에서 읽은 혹은 읽지 않은 메세지의 저장과 보유에 대한 local policy를 세우는 것이 자유롭다.
  • 예를 들어서 사이트는 서버에서 읽지 않은 메세지를 60일 이후에 지울수 있고 읽은 메세지를 7일 후에 지울 수도 있다.
  • 이러한 메세지 삭제는 POP3프로토콜의 영역 밖에서 벌어지는 일이고, 프로토콜 위반을 고려하지 않는다.
  • 메세지 삭제 정책을 강제하는 서버 운영자들은 반드시 모든 사용자가 이러한 정책이 유효하다는 것을 잘 알고 있도록 신경을 써야 한다.
  • 클라이언트는 절대로 사이트의 정책이 자동적으로 메세지 삭제를 할 것이라고 가정해서는 안되며, 반드시 필요할 때 DELE 커맨드를 사용해서 명시적으로 메세지를 삭제하는 것을 계속해야한다.
  • 이것은 사이트가 강제하는 메세지 삭제 정책이 사용자 커뮤니티에 혼란을 가져올 수도 있다는 것을 주목해야 한다. 왜냐하면 그들의 POP3클라이언트가 실제로 서버에서는 지원하지 않는데도 메일을 서버에 남기는 configuration 옵션을 포함하고 있을 수도 있기 때문이다.
  • 사이트의 정책이 특별한 경우, 메세지들이 서버에서 단 한번만 다운로드되고 다운로드를 마치면 삭제되는 경우도 있다.
  • 이것은 POP3 서버의 소프트웨어에서 아래와 같은 매커니즘에 의해서 수행될 수 있다. : "클라이언트에 의해서 수행되는 QUIT에 의해서 종료되는 POP3 클라이언트의 로그인은 세션이 유지되는 동안 RETR 커맨드에 의해서 다운로드한 모든 메세지를 삭제한다."
  • 비정상적인 커넥션의 종료(예를 들어 QUIT이 클라이언트로부터 수신되지 않았는데)로 인해 메세지를 삭제하지 않는 것은 중요하다.
  • 왜냐하면 클라이언트는 메세지를 성공적으로 받거나 저장하지 못했을 수도 있기 때문이다.
  • 다운로드 후 삭제 정책을 수행하는 서버는 또한 추가적인 TOP 커맨드를 불가능하게 하거나 혹은 제한하도록 원할 수 있다.
  • 왜냐하면 이것은 모든 메세지를 다운로드하는 것의 대안적인 매커니즘으로 사용될 수 있기 때문이다.

9. POP3 Command 요약

최소한의 POP3 커맨드:

USER name AUTHORIZATION state에서 사용 가능
PASS string
QUIT

STAT TRANSACTION state에서 사용 가능
LIST [msg]
RETR msg
DELE msg
NOOP
RSET
QUIT

 

추가적인 POP3 커맨드:

APOP name digest AUTHORIZATION state에서 사용 가능

TOP msg n TRANSACTION state에서 사용가능
UIDL [msg]

 

POP3 응답:

 

+OK
-ERR

  • STAT, LIST, UIDL 커맨드의 예외성을 기억하라.
  • 모든 커맨드에 대해서 POP3 서버에 의해서 주어진 응답은 반드시 "+OK"와 "-ERR"이 명백히 주어져야 한다. 
  • 이 이후에 나오는 응답은 클라이언트에 의해서 무시될 수도 있다. 

 

 


10. POP3 세션 예시

S: <wait for connection on TCP port 110>
C: <open connection>
S: +OK POP3 server ready <1896.697170952@dbc.mtview.ca.us>
C: APOP mrose c4c9334bac560ecc979e58001b3e22fb
S: +OK mrose's maildrop has 2 messages (320 octets)
C: STAT
S: +OK 2 320
C: LIST
S: +OK 2 messages (320 octets)
S: 1 120
S: 2 200
S: .
C: RETR 1
S: +OK 120 octets
S: <the POP3 server sends message 1>
S: .
C: DELE 1
S: +OK message 1 deleted
C: RETR 2
S: +OK 200 octets
S: <the POP3 server sends message 2>
S: .
C: DELE 2
S: +OK message 2 deleted
C: QUIT
S: +OK dewey POP3 server signing off (maildrop empty)
C: <close connection>
S: <wait for next connection>

11. Message 형식

  • POP3 세션 동안 전송된 모든 메세지들은 RFC822에서 규정된 Internet text messages의 표준 형식과 일치하는 것으로 가정한다.
  • 이것은 서버 호스트에 있는 메세지의 옥텟의 count와 해당 메세지에 할당된 실제 옥텟의 count가 end-of-line에 대한 local 컨벤션의 차이로 인해서 다를 수도 있다는 점에서 중요하다.
  • 일반적으로, POP3 세션의 AUTHORIZATION state에 있는 동안, POP3 서버는 메일드랍에서 각 메세지를 열 때, 그 메세지의 사이즈를 옥텟으로 계산할 수 있다.
  • 예를 들어, 만약 POP3 서버 호스트가 내부적으로 end-of-line을 하나의 캐릭터 문자로 나타내면, POP3 서버는 이 메세지에 들어있는 모든 해당 캐릭터 문자에 대해서 2 옥텟으로 카운트할 것이다.
  • 터미네이션 옥텟으로 시작하는 메세지에 들어있는 줄들은 두번 카운트 될 필요가 없다는(그리고 해서도 안된다는) 점에 주목하라.
  • 왜냐하면 POP3 클라이언트는 멀티라인 응답을 받으면 byte-stuffed된 터미네이션 캐릭터를 삭제할 것이기 때문이다.

12. 참고문헌

[RFC821] Postel, J., "Simple Mail Transfer Protocol", STD 10, RFC821, USC/Information Sciences Institute, August 1982.

[RFC822] Crocker, D., "Standard for the Format of ARPA-Internet Text Messages", STD 11, RFC 822, University of Delaware, August 1982.

[RFC1321] Rivest, R., "The MD5 Message-Digest Algorithm", RFC 1321, MIT Laboratory for Computer Science, April 1992.

[RFC1730] Crispin, M., "Internet Message Access Protocol - Version4", RFC 1730, University of Washington, December 1994.

[RFC1734] Myers, J., "POP3 AUTHentication command", RFC 1734, Carnegie Mellon, December 1994.

 

13. Security Considerations

   It is conjectured that use of the APOP command provides origin
   identification and replay protection for a POP3 session.
   Accordingly, a POP3 server which implements both the PASS and APOP
   commands should not allow both methods of access for a given user;
   that is, for a given mailbox name, either the USER/PASS command
   sequence or the APOP command is allowed, but not both.

   Further, note that as the length of the shared secret increases, so
   does the difficulty of deriving it.

   Servers that answer -ERR to the USER command are giving potential
   attackers clues about which names are valid.

   Use of the PASS command sends passwords in the clear over the
   network.

   Use of the RETR and TOP commands sends mail in the clear over the
   network.

   Otherwise, security issues are not discussed in this memo.

14. Acknowledgements

   The POP family has a long and checkered history.  Although primarily
   a minor revision to RFC 1460, POP3 is based on the ideas presented in
   RFCs 918, 937, and 1081.

   In addition, Alfred Grimstad, Keith McCloghrie, and Neil Ostroff
   provided significant comments on the APOP command.

 

15. Authors' Addresses

   John G. Myers
   Carnegie-Mellon University
   5000 Forbes Ave
   Pittsburgh, PA 15213

   EMail: jgm+@cmu.edu


   Marshall T. Rose
   Dover Beach Consulting, Inc.
   420 Whisman Court
   Mountain View, CA  94043-2186

   EMail: mrose@dbc.mtview.ca.us

 

 
 
 
 
 
 
Appendix A. Differences from RFC 1725

   This memo is a revision to RFC 1725, a Draft Standard.  It makes the
   following changes from that document:

      - clarifies that command keywords are case insensitive.

      - specifies that servers must send "+OK" and "-ERR" in
        upper case.

      - specifies that the initial greeting is a positive response,
        instead of any string which should be a positive response.

      - clarifies behavior for unimplemented commands.

      - makes the USER and PASS commands optional.

      - clarified the set of possible responses to the USER command.

      - reverses the order of the examples in the USER and PASS
        commands, to reduce confusion.

      - clarifies that the PASS command may only be given immediately
        after a successful USER command.

      - clarified the persistence requirements of UIDs and added some
        implementation notes.

      - specifies a UID length limitation of one to 70 octets.

      - specifies a status indicator length limitation
        of 512 octets, including the CRLF.

      - clarifies that LIST with no arguments on an empty mailbox
        returns success.

      - adds a reference from the LIST command to the Message Format
        section

      - clarifies the behavior of QUIT upon failure

      - clarifies the security section to not imply the use of the
        USER command with the APOP command.

      - adds references to RFCs 1730 and 1734

      - clarifies the method by which a UA may enter mail into the
        transport system.
      - clarifies that the second argument to the TOP command is a
        number of lines.

      - changes the suggestion in the Security Considerations section
        for a server to not accept both PASS and APOP for a given user
        from a "must" to a "should".

      - adds a section on scaling and operational considerations

Appendix B. Command Index

       APOP .......................................................   15
       DELE .......................................................    8
       LIST .......................................................    6
       NOOP .......................................................    9
       PASS .......................................................   14
       QUIT .......................................................    5
       QUIT .......................................................   10
       RETR .......................................................    8
       RSET .......................................................    9
       STAT .......................................................    6
       TOP ........................................................   11
       UIDL .......................................................   12
       USER .......................................................   13


Posted by 썬,더 호글
,

지금까지 rm -rf로 욕봤다-는 이야기 전설처럼 들어만 봤지 직접 겪은 일은 처음이다. 

평소에는 내 작업 폴더에서 작업하고 완료 되면 폴더를 만들어서 분류해서 넣었는데....오늘따라 다행히도 성실히 폴더를 만들고 그 안에서 작업을 한게 다행이었다.


짜 놓은 펄 코드 중에(이미 날아가신) >>로 파일을 덧붙여써서 결과 파일이 테스트 하면서 지저분해졌길래 그냥 그 결과로 만드는  파일 명인 result..로 시작하는 여러개의 파일을 다 날려버리고 새로 펄 파일을 실행시켜서 파일을 쓰고 싶었다.  


rm -rf result* 를 하려는게 목적이었지만...

rm -rf result * 를 실행해서 짜던 코드,  파싱해서 저장해놓은 user list, 다 날아가심...


진짜 이런 경험 처음이다. 와우....무섭다 무섭다 말만 들었지.ㅋㅋㅋㅋㅋㅋㅋ조심해야겠다. 


Posted by 썬,더 호글
,

주소록 프로젝트를 잘 돌리고 있는데 갑자기 런이 안됨

- 이 상황은 사실 지난 주 스톤과 함께 있을 때도 발생했던 문제임

- 해결을 새로 깃을 당겨 오는 것으로 함. 원인은 파악되지 않음


문제 현상

- 갑자기 디버거 브렉포인트가 안잡힘

- ??캐시? 하면서 인텔리제이를 껐다 켬

- 안됨

- 프로젝트 리빌드를 해봄

- 안됨

- 메이븐 클린 /빌드를 해봄

- 프로젝트가 깨짐

- 디펜던시 걸려있는 santasource를 찾을 수 없다?고 빨간불로 알려줌. 

- run을 하면 applicationContext.xml어쩌고 하면서 빈 생성에 실패했다고 나옴. 


- 메이븐 빌드 프로파일 문제인 것 같아서 모든 프로파일 버전으로 빌드 후 런해봄

- 안됨


- 짜놓은 코드 복사 해놓고 깃을 새로 당겨서 런해봄

- 됨


이유는 여전히 못찾음....

- Maven 프로파일을 여전히 의심하고 있는데(스톤이랑도 해결할 때 applicationcontext.xml에 대해서 한번 이야기가 있었음 "내가 수정한걸 안 올렸나!?" 이러심...)



Posted by 썬,더 호글
,

출처: https://blog.outsider.ne.kr/702


시키는대로 하면된다. tmux를 사용하지 않는 가장 큰 이유였는데 간단하게 해결해서 기쁨. 

-  .tmux.conf 는 존재하지 않아서 임의로 그냥 생성했다. 잘 동작한다. 

'일지' 카테고리의 다른 글

로그가 개떡같다.  (0) 2016.03.08
rm -rf 의 위력이란...  (0) 2016.03.04
정규표현식 관련 자료  (2) 2016.03.03
intelliJ에서 live template 생성할 때 유의해야 하는 점들 정리  (0) 2016.02.23
git remote branch delete  (0) 2016.02.19
Posted by 썬,더 호글
,

https://ko.wikipedia.org/wiki/%EC%A0%95%EA%B7%9C_%ED%91%9C%ED%98%84%EC%8B%9D


일단 기초적인 정리는 위키피디아에 되어있다. 그러나! 나처럼 기초가 1도 없는 상황에서는 예시를 보면서 확인하는게 훨씬 쉽다. 


http://regexr.com/

https://regex101.com/


이 두 사이트에서 실제 예시를 두고 내가 만드는 정규표현식이 적절한지 알 수 있기 때문에 여기를 보면 좋다. 

Posted by 썬,더 호글
,

주로 git을 터미널로 쓰기를 즐겨 하는 나는 일단 깃 폴더에 들어가는 순간 습관적으로 git status를 친다. (물론 터미널 접속해서는 ls를 친다.) 그런데 git add 한번하고 나서 매번 git status를 치는 것보다는 기왕이면 짧게 쓰는게 좋았을텐데 그걸 이제야 눈동냥;으로 알게 되었다. 


git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.br branch
git config --global alias.hist 'log --pretty=format:"%h %ad | %s%d [%an]" --graph --date=short'
git config --global alias.type 'cat-file -t' 

git config --global alias.dump 'cat-file -p'


물론 alias로 전역에 등록해서 더 짧게 사용하는 방법도 있겠지만, git config에이걸 등록해놓을 수도 있다는 것이다. 처음 알았네. alias가 복잡해지는 거....그래, 사실 나는 alias를 등록해서 쓴지 5개월 정도 밖에 안됐다. 모르면 배우면 되지 뭘-_-


정보 출처: alias 등록하는 법도 잘 나와있다. 

https://githowto.com/aliases

'배운 것' 카테고리의 다른 글

[linux command] mkdir -p -m  (0) 2016.03.04
[linux command] cut  (0) 2016.03.04
byte[] 를 String으로 읽어들일 때  (0) 2016.02.01
사소하지만 중요한 리팩토링  (0) 2016.01.28
command pattern  (0) 2016.01.28
Posted by 썬,더 호글
,

지금까지 intelliJ에서 live template을 세개 만들어봤는데, 늘 쉽지가 않아서 정리해둔다. 




1. 반드시 적용가능한 언어를 선택하지 않으면 live template을 생성할 수 없다. 


처음 로거를 템플릿으로 등록하려고 했을 때 문제가 되었던 것이 이 부분이다. 

- 좌측 하단의 빨간 박스에서 적용할 언어를 선택해야 한다. 


2. 우측 빨간 박스 안에 있는 체크 박스 중 Use static import if possible 에 체크한다.

- 늘 그런 것은 아니지만 import를 의도할 때 static import를 필요로 할 때가 있다. 

- 가능한 경우 static import를 한다는 의미이기 때문에 가능하면 체크해두면 임포트가 안돼서 슬퍼할 일을 예방 가능하다.

- 마찬가지로 나는 아예 체크박스를 이제 다 체크하기로 했다. 별 문제 의식 없이 체크해도 아직까지는 큰 문제가 발생하지 않았다. 



live template 예시는 이하에 업로드 한다. 


1. logger



2. junit


3. assertj




'일지' 카테고리의 다른 글

tmux에서 마우스 스크롤이 되지 않는 문제 해결  (0) 2016.03.04
정규표현식 관련 자료  (2) 2016.03.03
git remote branch delete  (0) 2016.02.19
천사소녀 네티 6장  (0) 2016.02.17
천사소녀 네티 2  (0) 2016.02.11
Posted by 썬,더 호글
,

git remote branch delete

일지 2016. 2. 19. 19:19

github 에서 희한하게 브랜치를 생성할 수 있는 방법을 찾았다. 




find  or create branch;;


주소창에 치고 있다고 생각했는데 갑자기 화면 리프레쉬가 된 것 같아서 살펴보니 갑자기 리모트 브랜치를 땄음. 그런데 어떻게 삭제하는지를 몰라서 슬퍼하고 있었다. 로컬에는 리모트의 브랜치가 없기 때문에 풀을 한번 받아서 리프레쉬를 한 후에


git pull origin 

git push origin --delete branchname 


하면 삭제할 수 있다. 풀을 받지 않으면 원격지에서 만든 브랜치를 확인할 수 없기 때문에...풀을 먼저 받아야 한다. 

'일지' 카테고리의 다른 글

정규표현식 관련 자료  (2) 2016.03.03
intelliJ에서 live template 생성할 때 유의해야 하는 점들 정리  (0) 2016.02.23
천사소녀 네티 6장  (0) 2016.02.17
천사소녀 네티 2  (0) 2016.02.11
천사소녀 네티  (0) 2016.02.10
Posted by 썬,더 호글
,

천사소녀 네티 6장

일지 2016. 2. 17. 07:57

네티 6장

자바 NIO 바이트 버퍼: 바이트 데이터를 저장하고 읽는 저장소, 배열을 가지고 읽쓰를 추상화한 메서드를 가지고 있음. 


종류

- ByteBuffer

- CharBuffer

- InteBuffer

- ShortBuffer

- LongBuffer

- FloatBuffer

- DoubleBuffer


 속성  


* capacity: 버퍼에 저장할 수 있는 데이터의 최대 크기. 변경 불가능-

* position : 읽.쓰가 작업 중인 위치. 버퍼 객체가 생성될 때 0으로 초기화되고 get/put 호출되면 증가함. 당연히 capacity와 limit 사이의 값

- flip 메소드를 사용한 후 position이 0이 된다. 

* limit : 버퍼에 저장할 수 있는 공간의 최대치 . capacity보다 작음. (공간의 최대치라고 생각했는데 포인터처럼 11을 가리키고 있는 예시가 있다. 정확한 의미를 모르겠다.)

- flip메소드를 사용한 이후, position값으로 이동한다. 즉, 마지막으로 데이터가 기록된 위치가 됨


** flip 메소드를 사용해서 읽-> 쓰 / 쓰-> 읽 으로 작업 전환이 가능함. 


*  생성

- 팩토리 메소드를 사용해서 생성

- allocate: 힙에 바이트 버퍼를 생성.

- 힙 버퍼: 생성은 빠르지만 읽쓰가 느리다

- allocateDirect: 운영체제의 커널 영역에 생성(다이렉트 버퍼)

- 다이렉트 버퍼: 생성시간은 길지만 빠르다

- wrap: 입력된 바이트 배열을 사용해서 바이트 버퍼를 생성. (힙 버퍼)




<네티 바이트 버퍼>

- 각각의 배열 type에 대한 read~(type) / write~(type)을 지원. 


- readerIndex:

- writeIndex: 

읽쓰가 인덱스를 각각 가지고 잇어서 flip이 필요하지 않음. 

- capacity



* 네티 바이트 버퍼는 풀을 제공한다. 

- ByteBufAllocator 인터페이스를 사용, 하위 추상 구현체를 이용해서 바이트 버퍼를 생성한다. 


* 풀링을 사용할지 

* 힙버퍼를 쓸지 다이렉트 버퍼를 쓸지 

선택할 수 있다. 그래서 2^2 = 4가지 바이트 버퍼 속성이 나온다. 


각각의 속성에 따라 바이트 버퍼를 생성할 때 사용하는 메소드 종류가 다르다. 


* 표 정리 


- 바이트 버퍼의 크기를 할당하지 않으면 256바이트가 생성된다. 

- 네티 바이트 버퍼의 크기는 줄였다 늘렸다 할 수 있다. buffer.capacity(int )로 크기를 조정. 



<바이트 버퍼 풀링>

장점

- 버퍼를 할당 해제 하면서 일어나는 GC감소


* release method

- 해당 버퍼에 대한 참조를 --;

*retain method

- 해당 버퍼에 대한 참조를 ++



<음수 입력시 >


- 음수 입력이 들어오면 데이터를 큰 데이터 타입으로 변환해서 리턴한다. 


<빅엔디안 사용>


























'일지' 카테고리의 다른 글

intelliJ에서 live template 생성할 때 유의해야 하는 점들 정리  (0) 2016.02.23
git remote branch delete  (0) 2016.02.19
천사소녀 네티 2  (0) 2016.02.11
천사소녀 네티  (0) 2016.02.10
nerd commenter  (0) 2016.01.28
Posted by 썬,더 호글
,

천사소녀 네티 2

일지 2016. 2. 11. 22:31

3장. 

부트 스트랩: 네티로 작성한 네트워크 애플리케이션의 동작 방식과 환경을 설정하는 도우미 클래스

- 이벤트 루프

- 채널의 전송모드

- 채널 파이프라인


지원하는 설정

- 전송계층(소켓 모드 및 I/O 종류)

- 이벤트 루프(단일 스레드, 다중 스레드)

- 채널 파이프라인 설정

- 소켓 주소와 포트

- 소켓 옵션


부트스트랩의 종류

- ServerBootstrap: for server- 소켓 연결을 대기

- BootStrap: client- 소켓 연결을 요청


서로 API구조는 같지만 소켓 연결에 대한 입장의 차이가 있음.


* 부트스트랩은 빌더 패턴을 사용하면 효율적으로 사용할 수 있음. 

- 설정의 내용이 추가될 때마다 생성자를 추가할 필요가 없기 때문. 


* 부트스트랩에서 사용할 부모 이벤트 루프 그룹과 자식 이벤트 루프 그룹의 수를 인자로 결정할 수 있다. 

- 그룹에서 동작할 스레드 수를 결정하지 않을 경우 하드웨어가 가지고 있는 CPU*2 배의 스레드를 사용한다. 


* 부트스트랩에서 사용할 이벤트루프 그룹의 종류는 생성할 때    NIO/ OIO/ EPOLL  eventgroup 클래스로 생성을 하느냐에 달려있다. 

- NIO:  넌블락

- OIO: 블락

- EPOLL : 이폴 지원 


---

ServerBootstrap의 API


* ServerBootstrap.class - group(eventLoopGroup group);


- 이벤트 루프 그룹을 BootStrap의 변수에 설정하고 Bootstrap 객체 자신을 리턴한다.

- override 한 group(group)의 기능 내에서 사용하는 group(group, group) 기능은 부모와 자식 이벤트 루프를 구분해서 사용할 수 있게 한다. 


* Channel()

- 소켓의 입출력 모드를 설정

- 여~러가지 종류가 있다. 


* ChannelFactory

- 소켓의 입출력 모드를 설정

- ChannelFactory 인터페이스를 구현가능


* Handler

- 이벤트를 처리하는 녀석. 

- 빌더 패턴으로 핸들러 객체를 설정해서 넣으면 이벤트가 발생했을 때 실행될 핸들러를 설정할 수 있다. 

- ChannelHandler 인터페이스 구현체를 인자로 받는다


* ChildHandler

- 클라이언트 소켓 채널로 송수신 되는 데이터를 가공하는 데이터 핸들러 설정할 수 있다.

- 빌더 패턴으로 Handler와 같이 ChannelHandler 인터페이스 구현체를 인자로 받는다

- 예를 들어 Handler 대신 ChildHandler를 사용해서 로그핸들러를 인자로 설정하면 클라이언트에서 발생한 이벤트까지 로그로 찍을 수 있다.(로그 핸들러가 아니면서 양쪽의 이벤트를 모두 필요로 하는 경우는 어떤 것이 있을지 잘 모르겠다.)


* option

- 서버 소켓 채널의 소켓 옵션을 설정하는 API

- 소켓 옵션: 소켓의 동작 방식을 지정하는 거엇.

- 주요 소켓 옵션이 있다~


** ChannelOption.TCP_NODELAY

- 네이글 알고리즘의 비활성화 여부 설정

- 네이글 알고리즘: 가능하면 데이터를 나누어 보내지 말고 한꺼번에 보내라는 원칙을 가진 알고리즘.

- 네트워크 상태가 좋지 않고 대역폭이 좁을 때 헤더로 인한 불필요한 오버헤드를 줄이고 데이터를 모아서 보내라.

- 작은 크기의 데이터는 송신버퍼에서 적당히 모아서 보낸다.

- 이전에 보내내 패킷의 ACK를 받아야 다음 패킷을 전송한다. 

- 이 옵션은 ACK를 받을 떄까지 다음 패킷을 전송하지 않기 때문에 빠른 속도가 필요할 때는 문제가 된다. 


** ChannelOption.SO_REUSEADDR

- TCP 통신을 종료할 때 클라이언트에서 마지막으로 FIN을 보내고 나서 발생하는 타임아웃으로 인해 어플리케이션 서버가 재시작 하려고 하면 bind 실패로 망함.

- 이 옵션을 켜주면 TIME_WAIT에 걸려있더라도 bind 가능함


** ChannelOption.SO_BACKLOG

- 동시에 수용 가능한 클라이언트 연결 요청 개수를 서버 소켓에 설정 가능한 옵션

- 그런데 이 개수가 서버 소켓이 소화가능한 동시 연결수와 동일하지 않다. 

- SYN-ACK상태의 연결요청을 보관하는 큐의 크기를 설정하는 것이 바로 SO_BACKLOG

- 너무 크게 잡으면 연결이 폭주할 때 연결 대기 시간이 길어지는 단점이 있음. 




* childOption

- 클라이언트 소켓 채널에 소켓 옵션을 설정.


**SO_LINGER  

- 소켓 종료 시, close함수가 실행되었는데 아직 커널 버퍼에 전송되지 않은 데이터가 남아있을 경우 이를 처리하는 방법을 지정하는 옵션. 

- 이 옵션의 사용 여부/ 타임아웃 값 설정 가능

- FALSE가 디폴~ㅌ

- 이 옵션을 사용하고 타임아웃값을 0으로 주면 마지막 남은 데이터를 모두 전송하고 연결을 끊어버림. TIMEWAIT 발생하지 않는 장점이 있음. 



---

Bootstrap API


- ServerBootstrap 과 Bootstrap API는 대체로 비슷하다. 

- 그러나 부모-자식 관계에 대한 API 는 없다.(option- childOption)


* group 

- 이벤트 루프 객체를 설정.

- 하나의 이벤트 루프 객체만 설정 가능하다. (부모-자식 설정 불가하기 때문)

- AbstractBootstrap의 그룹 메소드를 고대로 사용.


* channel

- 클라이언트 소켓 채널의 입출력 모드를 설정.

- 요러저러한 클래스 목록이 있다. p94


* channelFactory

- ServerBootstrap의 그것과 같은 역할.


* handler

- 클라이언트 소켓 채널에서 발생하는 이벤트를 수신하여 처리. 

- ChannelInitializer를 구현해서 사용


* option

- 클라이언트의 소켓 설정을 옵션 설정.
























'일지' 카테고리의 다른 글

intelliJ에서 live template 생성할 때 유의해야 하는 점들 정리  (0) 2016.02.23
git remote branch delete  (0) 2016.02.19
천사소녀 네티 6장  (0) 2016.02.17
천사소녀 네티  (0) 2016.02.10
nerd commenter  (0) 2016.01.28
Posted by 썬,더 호글
,