전자메일은 비동기적인 통신 매체 → 상대방 스케줄과 상관없이 자신이 편할 때 메시지를 보내거나 읽는다.
전자 메일은 분배가 쉽고, 빠르고, 저렴함
전자메일은 HTML 포맷 텍스트, 첨부 메시지, 하이퍼링크, 내장된 사진 등의 특성을 지님
인터넷 메일 시스템의 상위 레벨 개념
3개의 주요 요소가 존재 → 사용자 에이전트, 메일 서버, SMTP
사용자 에이전트(user agent)
사용자가 메시지의 응답, 읽기, 전달, 저장, 구성을 가능하게 함
대표적인 사용자 에이전트의 예시
마이크로소프트 아웃룩, 애플 메일, G-Mail 등
사용자가 메시지를 쓰면, 메시지를 메일 서버로 보냄 → 메시지는 메일 서버의 출력 메시지 큐에 들어감
수신자가 메시지를 읽고 싶은 경우 → 수신자 에이전트는 메일 서버에 있는 메일박스에서 메시지를 가져옴
메일 서버(mail server)
각 수신자는 메일서버 안에 메일 박스를 가지고 있음
메일 박스(mail box) : 수신자에게 온 메시지를 유지하고 관리
메시지 전송 경로
송신자의 사용자 에이전트 → 송신자의 메일 서버 → 수신자의 메일 서버
이때 수신자의 메일 박스 안에 저장된다.
전자 메일 박스에 있는 메시지를 확인하는 법 → 메일 서버는 사용자 계정과 비밀번호를 이용하여 사용자(수신자)를 인증
메시지를 전송할 수 없는 경우
송신자의 메일 서버는 수신자의 메일 서버 고장에 대처해야 한다.
송신자 서버가 수신자 서버로 전달할 수 없는 경우
해당 메시지를 메시지 큐에 보관하고 나중에 메시저 전달을 시도한다.
재시도는 약 30분마다 일어난다.
여러 날 시도해도 성공하지 못하면, 서버는 그 메시지를 제거
메시지 제거 후 송신자에게 전자메일로 이를 통보
SMTP(Simple Mail Transfer Protocol)
인터넷 전자 메일을 위한 주요 애플리케이션 계층 프로토콜
HTTP 보다 훨씬 오래됨
메일을 송신자의 메일 서버 → 수신자의 메일 서버로 전송하는데 TCP를 이용
TCP의 신뢰적인 데이터 전송 서비스를 이용하기 위해
SMTP의 구성
송신자 메일 서버에서 수행하는 클라이언트
수신자 메일 서버에서 수행되는 서버
SMTP의 클라이언트와 서버 모두가 모든 메일 서버에서 수행됨
메일 서버가 상대 메일 서버로 메일을 보낼 경우 → SMTP 클라이언트로 동작
메일 서버가 상대 메일 서버로부터 메일을 받는 경우→ SMTP 서버로 동작
SMTP의 단점
모든 메일 메시지의 몸체는 단순한 7비트 ASCII여야 한다. → 전송용량이 제한되고 커다란 첨부파일이나 이미지, 오디오/비디오 파일 전송 x
SMTP를 통해 이진 멀티미디어 데이터를 전송 전에 ASCII로, 전송 후에 다시 원래 메시지로 변환해야 함.
cf ) HTTP는 전송 전에 멀티미디어 데이터를 ASCII로 변환 필요 없음
SMTP의 기본동작
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의 신뢰적 데이터 전송 서비스에 의존
서버에 보낼 다른 메시지가 있다면, 클라이언트는 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?”