-
Notifications
You must be signed in to change notification settings - Fork 4
/
86.txt
42 lines (34 loc) · 2.72 KB
/
86.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
[11] [DFN[[RUBYB[TCP リセット問題]@en[TCP reset problem]]]]は、
[[HTTPパイプライン]]と [[TCP]] の動作に関する問題です。
* 仕様書
[REFS[
- [1] '''[CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#page-57>'''
- [8] [CITE@en[RFC 7230 - Hypertext Transfer Protocol (HTTP/1.1): Message Syntax and Routing]] ([TIME[2014-06-07 01:59:35 +09:00]] 版) <https://tools.ietf.org/html/rfc7230#section-6.3.2>
]REFS]
* 説明
[2] [[鯖]]が [[TCP]] [[接続]]をすぐに閉じると、
[[クライアント]]が最後の[[要求]]と読めない可能性があります。
[[鯖]]が完全に閉じた[[接続]]に対して[[クライアント]]が新しいデータ
([[パイプライン]]化された次の[[要求]]) を送信して[[鯖]]が受信すると、
[[鯖]]の [[TCPスタック]]がリセット ([CODE[[[RST]]]])
を[[クライアント]]に送信します。これを[[クライアント]]が受信すると、
[[クライアント]]側の [[HTTP]] [[応用]]が読んで解釈する前に[[クライアント]]の
[[ack]] されていないデータを消してしまうことになります。 [SRC[>>1]]
[3] この問題を回避するため、[[鯖]]は[[接続]]を次の手順で閉じます。 [SRC[>>1]]
[FIG(steps)[
= [4] 書き込み側だけ閉じます。
= [5] [[クライアント]]側から閉じられるか、[[鯖]]の最後の[[応答]]を含んだ[[パケット]]の [[ack]]
を[[鯖]]の[[TCPスタック]]が受信したと考えられる時点まで、[[クライアント]]からのデータを読み続けます。
= [6] 完全に閉じます。
]FIG]
[7] この問題が [[TCP]] のみか、他の[[トランスポート層プロトコル]]にもあるのかは不明です [SRC[>>1]]。
[9] [[クライアント]]は、失敗した[[接続]]
[WEAK[([[鯖]]が最後の[[完全]]な[[応答]]で明示的に閉じたのでない[[接続]])]]
の後に[[パイプライン]]化された[[要求]]を再試行する場合には、
[[接続]]を確立した直後に[[パイプライン]]化しては[['''なりません''']]。
[SRC[>>8]]
;; [10] [[パイプライン]]で送信していてまだ[[応答]]が返ってきていない最初の[[要求]]は、
その処理で何らかのエラーが発生し、[[接続]]が閉じられ、
[[パイプライン]]の続きの[[要求]]によって[[TCPリセット問題]]が発生したのかもしれません。
そうだとすると、再度[[パイプライン]]化して[[要求]]を送信すると、
再度同じように[[接続]]が閉じられ、エラーもまた受け取れないかもしれません。