ステートフル、ステートレスの詳解は他の記事に譲り、ここでは SMTP と HTTP を例にして、
具体的な挙動を比較してみたいと思います。
一般的なお話
##セッションの状態
- 一連のインタラクティブな操作(session)における各状態(state)のこと。
ステートフル
- サーバがクライアントのセッションの状態を保持している、という制約のこと。
- 特徴: セッションの状態によってリクエストに対するレスポンスが変わる。
- 例: FTP, SMTP
ステートレス
- サーバがクライアントのセッションの状態を保持しない、という制約のこと。
- 特徴: リクエストに対するレスポンスが変わらない。
- 例: HTTP
ステートフル と ステートレス の比較
では、サーバが一連のインタラクティブな操作における各状態を保持している・保持していないとはどういうことか、具体的に、
- メールを送信する操作 (SMTP)
- Webページを取得する操作 (HTTP)
を例にして挙動を確認してみます。
SMTP の場合
メールを送信する場合は以下のような 手続き
が必要となる。
(localhost が サーバで、telnet コマンドでセッションを張っている。)
$ telnet localhost 25
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 example.com ESMTP Postfix
helo example.com ★
250 example.com
mail from: sender@example.com ★
250 2.1.0 Ok
rcpt to: recipient@example.com ★
250 2.1.5 Ok
data ★
354 End data with <CR><LF>.<CR><LF>
Message-id: aaaa@bbbbc ★
From: <sender@example.com> ★
To: <recipient@example.com> ★
★
test mail ★
. ★
250 2.0.0 Ok: queued as 89F9E1A0058
exit ★
221 2.0.0 Bye
Connection closed by foreign host.
- ★は手動入力した内容(つまり、クライアントから送信された内容)
- メールの送信には、
helo ...
=>mail from: ...
=>rcpt to: ...
=>data ...
=>. (ドット)
という一連の操作(手続き)を実行する必要がある。 - 各操作には 2XX や 3XX などのサーバからのレスポンスが存在する。
ここで意図的に操作の順番を変更してみる。
例として、rcpt to: ...
を入力せずに data
コマンドを実行すると、
$ telnet localhost 25
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
220 example.com ESMTP Postfix
helo example.com ★
250 example.com
mail from: sender@example.com ★
250 2.1.0 Ok
data ★
554 5.5.1 Error: no valid recipients
554 5.5.1 Error: no valid recipients
のレスポンスが返ってくる。
つまり、サーバが rcpt to: ...
の情報(セッションの状態)を保持しているため、
エラーを返してきたことになる。
HTTP の場合
一方、HTTP の場合、Web ページを取得する場合は、
$ telnet localhost 80
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
GET / HTTP/1.1 ★
Host: localhost ★
HTTP/1.1 200 OK
Server: nginx/1.14.0 (Ubuntu)
(省略)
<!DOCTYPE html>
<html>
(省略)
</html>
- ★は手動入力した内容(つまり、クライアントから送信された内容)
- リクエスト (GET) => レスポンス (200 OK ...) で手続きが完結。
- SMTPのように複数の
手続き
を踏む必要はなく、その時の状態も保持していない。
参考
- Webを支える技術
- HTTP の概要 - HTTP | MDN
- Use Telnet to test SMTP communication on Exchange servers | Microsoft Docs
以上。