52
51

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ステートフルとステートレスの比較

Posted at

ステートフル、ステートレスの詳解は他の記事に譲り、ここでは 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のように複数の 手続き を踏む必要はなく、その時の状態も保持していない。

参考

以上。

52
51
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
52
51

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?