[1] [DFN[[[TLS Record Protocol]]]] ([DFN[[RUBYB[[[記録層]]]@en[record layer]]]]) は、 [[TLS]] の下位側の[[プロトコル階層]]です。

* 仕様書

[REFS[
- [2] '''[CITE@en[RFC 5246 - The Transport Layer Security (TLS) Protocol Version 1.2]] ([TIME[2015-02-19 08:58:15 +09:00]] 版) <http://tools.ietf.org/html/rfc5246#section-6>'''
- [17] [CITE[Transport Layer Security (TLS) Parameters]] ([TIME[2015-02-27 12:03:35 +09:00]] 版) <http://www.iana.org/assignments/tls-parameters/tls-parameters.xhtml#tls-parameters-5>
- [18] [CITE@en[RFC 6066 - Transport Layer Security (TLS) Extensions: Extension Definitions]] ([TIME[2015-02-01 18:07:52 +09:00]] 版) <http://tools.ietf.org/html/rfc6066#section-4>
]REFS]

* 記録層データ構造

[9] [[記録層]]では、 2[SUP[14]] [[バイト]][[以下]]のデータに分割して
[CODE[[[TLSPlaintext]]]] として扱います。[[記録層]]データ構造間で分割した境界は意味を持たず、
同じ[[記録内容型]]なら1つの [CODE[[[TLSPlaintext]]]] に結合したり、分解したりできます。 
[SRC[>>2]]

[11] [CODE[[[TLSPlaintext]]]] に[[圧縮アルゴリズム]]を適用した結果が
[CODE[[[TLSCompressed]]]] です。 (ここでいう[[圧縮アルゴリズム]]には、無変換の
「[[null]]」も含まれます。)

[12] [CODE[[[TLSCompressed]]]] に [[MACアルゴリズム]]と[[暗号化アルゴリズム]]を適用した結果が
[CODE[[[TLSCiphertext]]]] です。

[10] [CODE[[[TLSPlaintext]]]] や [CODE[[[TLSCompressed]]]] や
[CODE[[[TLSCiphertext]]]] は、次のもので構成されます [SRC[>>2]]。

;; [20] 含まれるデータの意味 (処理状態) が異なるだけで、[[欄]]の構成は同じです。

[FIG(list members)[
:[CODE[[[type]]]]:含まれているデータを処理する上位層プロトコル ([[記録内容型]] 1バイト)。
:[CODE[[[version]]]]:プロトコルの版 (2バイト)。 3.3 なら [[TLS/1.2]], 3.2 なら [[TLS/1.1]],
3.1 なら [[TLS/1.0]]。
:[CODE[[[length]]]]:データの長さ ([CODE[[[uint16]]]])。
:[CODE[[[fragment]]]]:データ ([CODE[[[length]]]] [[欄]]の値の長さ)。
]FIG]

;; [13] [[TLS]] のプロトコルの版は[[記録層]]のメッセージに記述されるだけでなく、
[[TLS Handshake Protocol]] の [CODE[[[ClientHello]]]] や [CODE[[[ServerHello]]]]
にも記述されます。そちらとこちらの値は異なるかもしれません。

[19] データ ([CODE[[[fragment]]]]) の長さは、
[[TLS拡張]] [CODE[[[max_fragment_length]]]] [SRC[>>18]] により最大値を折衝できます。

[15] [[TLS]] で送受信されるデータはすべて [[TLS Record Protocol]] のメッセージという形で送信されます。
[[TLS]] が開始された当初は暗号化、圧縮などを行わない[[接続状態]]なので、
平文のままのメッセージが送信されます。この状態で上位層プロトコルとして [[TLS Handshake Protocol]]
を用いて新たな[[接続状態]]を折衝し、移行します。これによって [[TLS Record Protocol]]
のメッセージに暗号化、圧縮などが適用された状態になります。これで上位層プロトコルとして[[TLS応用データプロトコル]]を用い、上位[[アプリケーション層プロトコル]]のデータの送受信が行えるようになります。
その後も [[alert protocol]] 等 [[TLS]] の[[メッセージ]]が送受信されることがあります。

* 内容型

[3] [[TLS Record Protocol]] を使って規定される[[プロトコル]]はいくつかあり、
その区別を表す値を[DFN[[RUBYB[[[記録内容型]]]@en[record content type]]]]
([DFN[[CODE[[[ContentType]]]]]]) といいます [SRC[>>2]]。

[16] 値は1バイトの数値で表されます。

[FIG(table)[
:n:数値
:name:名称
:desc:プロトコル名

:n:[CODE[[[22]]]]
:name:[CODE[[[handshake]]]]
:desc:[[handshake protocol]]

:n:[CODE[[[21]]]]
:name:[CODE[[[alert]]]]
:desc:[[alert protocol]]

:n:[CODE[[[20]]]]
:name:[CODE[[[change_cipher_spec]]]]
:desc:[[change cipher spec protocol]]

:n:[CODE[[[23]]]]
:name:[CODE[[[application_data]]]]
:desc:[[application data protocol]]

:n:[CODE[[[24]]]]
:name:[CODE[[[heartbeat]]]]
:desc:[[Heartbeat protocol]]
]FIG]

[21] [[IANA登録簿]] (>>17) もあります [SRC[>>2]]。

* 接続状態

[4] [[TLS Record Protocol]] の[RUBYB[運用環境]@en[operating environment]]のことを
[RUBYB[[[TLS接続状態]]]@en[TLS connection state]]といい、
次のもので構成されます [SRC[>>2]]。
[FIG(list members)[
:[RUBYB[[[セキュリティー引数]]]@en[security parameter]] ([CODE[[[SecurityParameters]]]]):
[FIG(list members)[
:[RUBYB[[[接続端]]]@en[connection end]] ([CODE[[[entity]]]]):自身が[[クライアント]]か[[鯖]]か。
:[[PRFアルゴリズム]] ([CODE[[[prf_algorithm]]]]):[[master secret]] から[[鍵]]を生成するのに使う[[アルゴリズム]]。
:[[bulk encryption algorithm]]:[[bulk encryption]] に使う[[アルゴリズム]]
([CODE[[[bulk_cipher_algorithm]]]])。
鍵サイズ ([CODE[[[enc_key_length]]]])、
ブロック・ストリーム・[[AEAD]] のいずれであるか ([CODE[[[cipher_type]]]])、
[[cipher]] のブロック長 ([CODE[[[block_length]]]])、
明示的および暗示的な初期化ベクトル ([[nonce]]) ([CODE[[[fixed_iv_length]]]], [CODE[[[record_iv_length]]]])。
:[[MACアルゴリズム]]:[[メッセージ認証]]に使う[[アルゴリズム]] ([CODE[[[mac_algorithm]]]])。
アルゴリズムが返す値の長さ ([CODE[[[mac_length]]]])。
鍵の長さ ([CODE[[[mac_key_length]]]])。
:[[圧縮アルゴリズム]] ([CODE[[[compression_algorithm]]]]):[[データ圧縮]]に使う[[アルゴリズム]]。
:[[master secret]] ([CODE[[[master_secret]]]]):48バイト秘密。
:[[client random]] ([CODE[[[client_random]]]]):[[クライアント]]による32バイト値。
:[[server random]] ([CODE[[[server_random]]]]):[[鯖]]による32バイト値。
]FIG]
:[[client write MAC key]]:
:[[server write MAC key]]:
:[[client write encryption key]]:
:[[server write encryption key]]:
:[[client write IV]]:
:[[server write IV]]:
:[[圧縮状態]]:
:[[cipher state]]:
:[[MAC鍵]]:
:[[シーケンス番号]]:
]FIG]

[5] [[接続状態]]は、現在の読み取り用状態、書き込み用状態と、
pending の読み取り用状態、書き込み用状態の4つがあります [SRC[>>2]]。

[8] [RUBYB[[[記録]]]@en[record]]は、現在の読み取り用状態と書き込み用状態に従い処理されます
[SRC[>>2]]。

[6] 現在の接続状態の初期値は、暗号化、圧縮、MAC のいずれも使用しないものです [SRC[>>2]]。

[7] [[TLS Handshake Protocol]] は pending [[接続状態]]の[[セキュリティー引数]]を設定します。
[[ChangeCipherSpec]] は pending [[接続状態]]を現在の[[接続状態]]とします。 [SRC[>>2]]

[25] [CITE@en[RFC 7983 - Multiplexing Scheme Updates for Secure Real-time Transport Protocol (SRTP) Extension for Datagram Transport Layer Security (DTLS)]]
([TIME[2016-10-03 23:05:12 +09:00]])
<https://tools.ietf.org/html/rfc7983>