이글은 공부목적으로 작성된 블로그입니다. 왜곡된 내용이 포함되어 있을 수 있습니다.
e-mail(Electronic mail)은 가장 유명한 응용서비스중 하나이다. 메일은 비동기 방식 의사소통 매체이다.(사람들이 시간을 맞출 필요 없이 원할때 메세지를 보내고 받을 수 있다.) 기존 우편메일 보다 e-mail은 더 장점이 많은데 메세지에 하이퍼링크, HTML text, photo등을 넣을 수 있다.
이번 목차에 Internet e-amil의 application-layer protocols를 알아보고, Internet에 대한 이해를 해보자
위 사진은 Internet mail system에 대한 이해를 돕기 위한 사진이다. user agent, mail servers, SMTP(Simple Mail Transfer Protocol) 총 3개의 component가 Internet mail system의 구성요소이다.
각각의 recipient은 mailbox을 mail server에 위치하여 송수신한 message를 관리한다. user가 message를 보내면 user agent에서 mail server로, mail server에서 recipient mail server로 이동하여 recipient가 확인 할 수 있게 된다.
사용자가 mailbox에 접근하고 싶다면 mail server에서는 인증로직이 실행된다(로그인) 만약 송신자의 server가 수진자의 server에 mail을 보낼 수 없는 상황이라면 송신자는 message queue에 해당 mail을 둔상태로 30분 마다 재시도를 한다.
SMTP는 application-layer protocol로서 mail 전달에 대해서 믿을 수 있는 전송을 지원한다. SMTP는 client, server 2가지로 나누어지고, 이는 모든 mail server에 존재한다.
2.3.1 SMTP
SMTP는 HTTP보다 오래된 lagacy 기술(예를 들어 body의 크기가 제한되어 있음)임에도 오늘날에도 유용하게 사용되고 있다. HTTP와 달리 SMTP는 multimedia data를 encoding 해야한다.
- 송신자가 e-mail을 작성하여 송신자의 user agent에게 e-mail을 넘겨준다
- 송신자의 user agent는 message를 mail server에게 보낸다.(message queue에 위치한다)
- mail server는 message queue에 있는 message를 확인하고 수신자 mail server와 TCP connection을 연다
- SMTP handshaking이후 SMTP client는 TCP connection에 message를 보낸다
- 수신자 mail server에게서 message를 받고 수신자의 mailbox에 message를 저장한다.
- 수신자가 원할때 message를 확인한다.
client SMTP는 TCP connection을 25 port에 연다. 만약 sever가 down되었다면 나중에 다시 시도한다.connection이 열리면, server와 client는 application-layer handshaking을 진행한다.(서로를 소개한다고 표현되어 있다.) handshaking 과정이 끝나면 신뢰할 수 있는 data 전송이 진행된다. 만약 동일한 server에게로 보낼 message가 존재한다면 동일한 TCP connection안에서 진행된다.(persistent connection)
https://en.wikipedia.org/wiki/List_of_SMTP_server_return_codes
위 예시를 보면 HELO, MAIL, FROM, RCPT, TO, DATA, QUIT 총 5가지 command를 확인할 수 있다. message는 CRLF로 끝을 표시한다.
2.3.2 Mail Message Formats
e-mail message는 header와 body로 이루어져있고, CRLF기준으로 나누어진다. HTTP와 동일하게 콜론으로 키워드와 값을 구분한다. From(송신자), To(수신자), Subject(제목)는 필수 성분이고, 다른 부과 정보를 포함시킬 수 있다. SMTP command와 header는 다르다는 것을 주의하자. command는 SMTP handshaking protocol의 일부이고, header는 mail message자체이다.
2.3.3 Mail Access Protocols
SMTP protocol이고 message를 수신자의 mail server에 보내게되면 message는 mailbox에 위치하게된다. 만약 수신자가 user agent, mail server를 본인의 local host에 둔다면 통신에 문제가 없어보이지만, mail server는 SMTP의 client와 server 가 둘다 되야하므로, 언제나 켜져 있어야하고 internet과 연결되어 있어야한다. 따라서 대부분 일반적인 user는 user agent를 실행하고 다른 사용자와 공유된 mail server에 mailbox에 access를 요청하는 형식으로 mail server에 접근한다.
e-mail message는 수신자 mail server에 쌓여야하는데, 일반적으로 송신자와 수신자의 mail server가 direct 하게 연결되어 있지 않기 때문에 송신자는 SMTP 또는 HTTP를 통해 mail-server로 e-mail을 보내고, mail server가 수신자 mail server에 SMTP 통신을 하는, 2가지 단계로 진행된다.(아래 그림)
2단계로 분리하는 경우 장점이 있는데 user agent는 수신 mail server에 대해 resource를 가질 필요가 없고(송신자 mail server의 책임이니까) 수신자의 응답 여부와 상관없이 송신자가 동일한 수신자에게 e-mail을 보낼 수 있다.
수신자는 mail-server로 부터 SMTP protocol를 사용하지 않는데, SMTP는 pull operation이 아니고, push operation이기 때문이다.(메세지를 보내는 protocol라고 이해했다. mail server에서 주기적으로 SMTP를 보내면 되는거 아닌가?)
mail server로 부터 e-mail을 받는 두가지의 대표적인 방법은 Web-based application에 접속하면(인터넷 메일, 앱)user ager가 HTTP를 통해 e-mail을 받아오거나, IMAP(Internet Mail Access Protocol)을 통해 받는 것이다.