호우동의 개발일지

Today :

article thumbnail

인터넷 전자메일

  • 오늘날 인터넷의 가장 중요하고 널리 사용되는 애플리케이션 중 하나
  • 전자메일은 비동기적인 통신 매체
    → 상대방 스케줄과 상관없이 자신이 편할 때 메시지를 보내거나 읽는다.

  • 전자 메일은 분배가 쉽고, 빠르고, 저렴함
  • 전자메일은 HTML 포맷 텍스트, 첨부 메시지, 하이퍼링크, 내장된 사진 등의 특성을 지님

 

 


인터넷 메일 시스템의 상위 레벨 개념

  • 3개의 주요 요소가 존재
    → 사용자 에이전트, 메일 서버, SMTP

 


사용자 에이전트(user agent)

  • 사용자가 메시지의 응답, 읽기, 전달, 저장, 구성을 가능하게 함
  • 대표적인 사용자 에이전트의 예시
    • 마이크로소프트 아웃룩, 애플 메일, G-Mail 등
    • 사용자가 메시지를 쓰면, 메시지를 메일 서버로 보냄
      → 메시지는 메일 서버의 출력 메시지 큐에 들어감

    • 수신자가 메시지를 읽고 싶은 경우
      → 수신자 에이전트는 메일 서버에 있는 메일박스에서 메시지를 가져옴

 


메일 서버(mail server)

  • 각 수신자는 메일서버 안에 메일 박스를 가지고 있음
    • 메일 박스(mail box) : 수신자에게 온 메시지를 유지하고 관리

  • 메시지 전송 경로
    • 송신자의 사용자 에이전트 → 송신자의 메일 서버 → 수신자의 메일 서버
    • 이때 수신자의 메일 박스 안에 저장된다.

  • 전자 메일 박스에 있는 메시지를 확인하는 법
    → 메일 서버는 사용자 계정과 비밀번호를 이용하여 사용자(수신자)를 인증

 

메시지를 전송할 수 없는 경우

  • 송신자의 메일 서버는 수신자의 메일 서버 고장에 대처해야 한다.
    • 송신자 서버가 수신자 서버로 전달할 수 없는 경우
      1. 해당 메시지를 메시지 큐에 보관하고 나중에 메시저 전달을 시도한다.
        • 재시도는 약 30분마다 일어난다.

      2. 여러 날 시도해도 성공하지 못하면, 서버는 그 메시지를 제거
      3. 메시지 제거 후 송신자에게 전자메일로 이를 통보

 

 


SMTP(Simple Mail Transfer Protocol)

  • 인터넷 전자 메일을 위한 주요 애플리케이션 계층 프로토콜
    • HTTP 보다 훨씬 오래됨

  • 메일을 송신자의 메일 서버 → 수신자의 메일 서버로 전송하는데 TCP를 이용
    • TCP의 신뢰적인 데이터 전송 서비스를 이용하기 위해

 


SMTP의 구성

  • 송신자 메일 서버에서 수행하는 클라이언트
  • 수신자 메일 서버에서 수행되는 서버
  • SMTP의 클라이언트와 서버 모두가 모든 메일 서버에서 수행됨
    • 메일 서버가 상대 메일 서버로 메일을 보낼 경우 → SMTP 클라이언트로 동작
    • 메일 서버가 상대 메일 서버로부터 메일을 받는 경우→ SMTP 서버로 동작

 


SMTP의 단점

  • 모든 메일 메시지의 몸체는 단순한 7비트 ASCII여야 한다.
    → 전송용량이 제한되고 커다란 첨부파일이나 이미지, 오디오/비디오 파일 전송 x
    • SMTP를 통해 이진 멀티미디어 데이터를 전송 전에 ASCII로,
      전송 후에 다시 원래 메시지로 변환해야 함.
      • cf ) HTTP는 전송 전에 멀티미디어 데이터를 ASCII로 변환 필요 없음

 


SMTP의 기본동작

SMTP 기본 동작 방식
SMTP 기본 동작 방식

  1. 송신자는 전자메일 사용자 에이전트를 수행하고 수신자의 전자메일 주소를 제공
    이후, 메시지를 작성하고 사용자 에이전트에게 메시지를 보내라고 명령

  2. 송신자의 사용자 에이전트는 메시지를 송신자의 메일 서버로 보내고,
    메시지는 메시지 큐에 놓인다.

  3. 송신자는 메일 서버에서 동작하는 SMTP의 클라이언트 측은 메시지 큐에 있는 메시지를 확인
    수신자의 메일 서버에서 수행되고 있는 SMTP 서버에게 TCP 연결을 설정

  4. 초기 SMTP 핸드셰이킹 이후 SMTP 클라이언트는 송신자의 메시지를 TCP 연결로 보냄
  5. 수신자의 메일 서버 호스트에서 SMTP의 서버 측은 메시지를 수신한다.
    수신자의 메일 서버는 그 메시지를 수신자의 메일박스에 놓는다.

  6. 수신자는 편한 시간에 그 메시지를 읽기 위해 사용자 에이전트를 시동한다.

 


SMTP 동작의 이해

  • SMTP는 메일을 보낼 때, 중간 메일 서버를 사용하지 않는다.
    • 두 메일 서버가 아무리 먼 거리에 있더라도 쓰지 않는다는 것이 중요
    • 예시
      • 수신자의 서버가 홍콩, 송신자의 서버가 미국일 경우
        → TCP 연결은 홍콩과 미국 서버 사이의 직접 연결

  • 수신자의 메일 서버가 죽어있다면, 메시지는 송신자의 메일 서버에서 새로운 시도를 기다림
  • SMTP는 지속(persistent) 연결을 사용한다.
    • 송신 메일 서버가 같은 수신 메일 서버로 보내는 여러 메시지를 갖는 경우
      → 같은 TCP 연결을 통해 모든 메시지를 전달할 수 있다.

 


SMTP의 구체적인 동작 과정

  1. 클라이언트 SMTP는 서버 SMTP의 25번 포트로 TCP 연결을 설정
    • 클라이언트 SMTP → 송신 메일 서버 호스트에서 수행
    • 서버 SMTP → 수신 메일 서버 호스트에서 수행
    • 서버가 죽어있는 경우, 클라이언트는 나중에 다시 시도

  2. 연결이 설정되면, 서버와 클라이언트는 애플리케이션 계층 핸드셰이킹 수행
    • SMTP 클라이언트와 서버는 정보를 전송하기 전에 서로를 소개
    • 이 과정에서 SMTP 클라이언트는 송신자와 수신자의 전자메일 주소를 제공

  3. SMTP 클라이언트와 서버가 서로에게 소개를 마치면, 클라이언트는 메시지 전송
    • 서버에 오류 없이 메시지 전달하기 위해 TCP의 신뢰적 데이터 전송 서비스에 의존

  4. 서버에 보낼 다른 메시지가 있다면, 클라이언트는 1 ~ 3 과정을 반복

  5. 더 이상 보낼 메시지가 없다며 TCP에게 연결을 닫을 것을 명령

 


SMTP 클라이언트(C)와 SMTP(S) 사이의 메시지 전달 과정

S : 220 hamburger.edu
C : HELO crepes.fr // HELLO의 약자
S : 250 Hello crepes.fr, pleased to meet you
C : MAIL FROM: <alice@crepes.fr> // 메시지 전송 시작
S : 250 alice@crepes.fr ... Sender ok
C : RCPT TO: <bob@hamburger.edu>
S : 250 bob@hamburger.edu ... Recipient ok
C : DATA // 데이터를 보내겠다고 명시
S : 354 Enter mail, end with "." on a line by itself
C : Do you like ketchup?
C : How about pickles?
C : . // 메시지의 끝을 나타냄
S : 250 Message accpeted for delivery
C : QUIT // 메시지 전송 종료
S : 221 hamburger.edu closing connection // TCP 연결을 끊음
  • 클라이언트는 메일 서버 crepes.fr로부터 메일 서버 hamburger.edu에게 메시지를 보냄
    • 메시지 내용 = “Do you like ketchup? How about pickles?”

  • 클라이언트 호스트의 이름 : crepes.fr
  • 서버 호스트 이름 : hamburger.edu
  • 클라이언트는 5개의 명령을 내림
    • HELO MAIL FROM RCPT TO DATA QUIT

  • ASCII에서 각 메시지는 CRLF. CRLF로 끝난다.
  • 각 응답에는 응답 코드와 영문 설명(옵션)이 있다.