인터넷 전자메일
- 오늘날 인터넷의 가장 중요하고 널리 사용되는 애플리케이션 중 하나
- 전자메일은 비동기적인 통신 매체
→ 상대방 스케줄과 상관없이 자신이 편할 때 메시지를 보내거나 읽는다. - 전자 메일은 분배가 쉽고, 빠르고, 저렴함
- 전자메일은 HTML 포맷 텍스트, 첨부 메시지, 하이퍼링크, 내장된 사진 등의 특성을 지님
인터넷 메일 시스템의 상위 레벨 개념
- 3개의 주요 요소가 존재
→ 사용자 에이전트, 메일 서버, SMTP
사용자 에이전트(user agent)
- 사용자가 메시지의 응답, 읽기, 전달, 저장, 구성을 가능하게 함
- 대표적인 사용자 에이전트의 예시
- 마이크로소프트 아웃룩, 애플 메일, G-Mail 등
- 사용자가 메시지를 쓰면, 메시지를 메일 서버로 보냄
→ 메시지는 메일 서버의 출력 메시지 큐에 들어감 - 수신자가 메시지를 읽고 싶은 경우
→ 수신자 에이전트는 메일 서버에 있는 메일박스에서 메시지를 가져옴
메일 서버(mail server)
- 각 수신자는 메일서버 안에
메일 박스
를 가지고 있음메일 박스(mail box)
: 수신자에게 온 메시지를 유지하고 관리
- 메시지 전송 경로
- 송신자의 사용자 에이전트 → 송신자의 메일 서버 → 수신자의 메일 서버
- 이때 수신자의 메일 박스 안에 저장된다.
- 전자 메일 박스에 있는 메시지를 확인하는 법
→ 메일 서버는 사용자 계정과 비밀번호를 이용하여 사용자(수신자)를 인증
메시지를 전송할 수 없는 경우
- 송신자의 메일 서버는 수신자의 메일 서버 고장에 대처해야 한다.
- 송신자 서버가 수신자 서버로 전달할 수 없는 경우
- 해당 메시지를
메시지 큐
에 보관하고 나중에 메시저 전달을 시도한다.- 재시도는 약 30분마다 일어난다.
- 재시도는 약 30분마다 일어난다.
- 여러 날 시도해도 성공하지 못하면, 서버는 그 메시지를 제거
- 메시지 제거 후 송신자에게 전자메일로 이를 통보
- 해당 메시지를
- 송신자 서버가 수신자 서버로 전달할 수 없는 경우
SMTP(Simple Mail Transfer Protocol)
- 인터넷 전자 메일을 위한 주요 애플리케이션 계층 프로토콜
- HTTP 보다 훨씬 오래됨
- HTTP 보다 훨씬 오래됨
- 메일을 송신자의 메일 서버 → 수신자의 메일 서버로 전송하는데 TCP를 이용
- TCP의 신뢰적인 데이터 전송 서비스를 이용하기 위해
SMTP의 구성
- 송신자 메일 서버에서 수행하는 클라이언트
- 수신자 메일 서버에서 수행되는 서버
- SMTP의 클라이언트와 서버 모두가 모든 메일 서버에서 수행됨
- 메일 서버가 상대 메일 서버로 메일을 보낼 경우 → SMTP 클라이언트로 동작
- 메일 서버가 상대 메일 서버로부터 메일을 받는 경우→ SMTP 서버로 동작
SMTP의 단점
- 모든 메일 메시지의 몸체는 단순한 7비트 ASCII여야 한다.
→ 전송용량이 제한되고 커다란 첨부파일이나 이미지, 오디오/비디오 파일 전송 x- SMTP를 통해 이진 멀티미디어 데이터를 전송 전에 ASCII로,
전송 후에 다시 원래 메시지로 변환해야 함.- cf ) HTTP는 전송 전에 멀티미디어 데이터를 ASCII로 변환 필요 없음
- SMTP를 통해 이진 멀티미디어 데이터를 전송 전에 ASCII로,
SMTP의 기본동작
- 송신자는 전자메일 사용자 에이전트를 수행하고 수신자의 전자메일 주소를 제공
이후, 메시지를 작성하고 사용자 에이전트에게 메시지를 보내라고 명령 - 송신자의 사용자 에이전트는 메시지를 송신자의 메일 서버로 보내고,
메시지는 메시지 큐에 놓인다. - 송신자는 메일 서버에서 동작하는 SMTP의 클라이언트 측은 메시지 큐에 있는 메시지를 확인
수신자의 메일 서버에서 수행되고 있는 SMTP 서버에게 TCP 연결을 설정 - 초기 SMTP 핸드셰이킹 이후 SMTP 클라이언트는 송신자의 메시지를 TCP 연결로 보냄
- 수신자의 메일 서버 호스트에서 SMTP의 서버 측은 메시지를 수신한다.
수신자의 메일 서버는 그 메시지를 수신자의 메일박스에 놓는다. - 수신자는 편한 시간에 그 메시지를 읽기 위해 사용자 에이전트를 시동한다.
SMTP 동작의 이해
- SMTP는 메일을 보낼 때, 중간 메일 서버를 사용하지 않는다.
- 두 메일 서버가 아무리 먼 거리에 있더라도 쓰지 않는다는 것이 중요
- 예시
- 수신자의 서버가 홍콩, 송신자의 서버가 미국일 경우
→ TCP 연결은 홍콩과 미국 서버 사이의 직접 연결
- 수신자의 서버가 홍콩, 송신자의 서버가 미국일 경우
- 수신자의 메일 서버가 죽어있다면, 메시지는 송신자의 메일 서버에서 새로운 시도를 기다림
- SMTP는 지속(persistent) 연결을 사용한다.
- 송신 메일 서버가 같은 수신 메일 서버로 보내는 여러 메시지를 갖는 경우
→ 같은 TCP 연결을 통해 모든 메시지를 전달할 수 있다.
- 송신 메일 서버가 같은 수신 메일 서버로 보내는 여러 메시지를 갖는 경우
SMTP의 구체적인 동작 과정
- 클라이언트 SMTP는 서버 SMTP의 25번 포트로 TCP 연결을 설정
- 클라이언트 SMTP → 송신 메일 서버 호스트에서 수행
- 서버 SMTP → 수신 메일 서버 호스트에서 수행
- 서버가 죽어있는 경우, 클라이언트는 나중에 다시 시도
- 연결이 설정되면, 서버와 클라이언트는 애플리케이션 계층 핸드셰이킹 수행
- SMTP 클라이언트와 서버는 정보를 전송하기 전에 서로를 소개
- 이 과정에서 SMTP 클라이언트는 송신자와 수신자의 전자메일 주소를 제공
- SMTP 클라이언트와 서버가 서로에게 소개를 마치면, 클라이언트는 메시지 전송
- 서버에 오류 없이 메시지 전달하기 위해 TCP의 신뢰적 데이터 전송 서비스에 의존
- 서버에 오류 없이 메시지 전달하기 위해 TCP의 신뢰적 데이터 전송 서비스에 의존
- 서버에 보낼 다른 메시지가 있다면, 클라이언트는 1 ~ 3 과정을 반복
- 더 이상 보낼 메시지가 없다며 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?”
- 메시지 내용 = “Do you like ketchup? How about pickles?”
- 클라이언트 호스트의 이름 : crepes.fr
- 서버 호스트 이름 : hamburger.edu
- 클라이언트는 5개의 명령을 내림
HELO
MAIL FROM
RCPT TO
DATA
QUIT
- ASCII에서 각 메시지는 CRLF. CRLF로 끝난다.
- 각 응답에는 응답 코드와 영문 설명(옵션)이 있다.