/
875.txt
211 lines (146 loc) · 11.7 KB
/
875.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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
[32] [DFN[[[名前解決]]]]は、[[ドメイン名]]等の名前から[[ネットワーク]]上の[[アドレス]]を得る操作です。
多くの [[OS]] や[[プログラミング言語]]の標準ライブラリー等は、
[[DNSドメイン名]]等から[[IPアドレス]]等を取得できる[[名前解決]]の仕組みを提供しています。
* プロトコル
[11] [[名前解決]]は、 [[OS]]、[[ライブラリー]]、あるいは個別の[[アプリケーション]]のいずれか、あるいはその組み合わせにより実装されており、
その実装方法は様々です。従って同じ環境でも[[アプリケーション]]によって動作が異なることがあります。
[[名前解決]]における [[DNSキャッシュ]] (や [[DNS]] 以外の方法で得られた[[名前解決]]結果の[[キャッシュ]])
の動作も違いがあります。
;; [[DNSキャッシュ]]も参照。
[12] [[名前解決]]には、次のような手段が使われます。どれを使うか、どのような優先順位とするか、
失敗した場合他の方法を試すか、[[キャッシュ]]を適用するかなどは実装により異なります。
[FIG(short list)[
- [[DNS]] ([[DNS解決器]])
- [CODE(file)[[[/etc/hosts]]]]
- [[NetBIOS名前解決]]
]FIG]
;; [13] 実装によっては通常と異なる [CODE(file)[[[/etc/hosts]]]] を使えるものもあります。
;; [14] 設定により動作を変更できる実装もあります。
[15] 入力として [[IPアドレス]] (のようなもの) を与えた場合、 [[IPアドレス]]として解釈した結果を返す実装もあります。
[[十六進数]]表記の [[IPv4アドレス]]など、標準的でない [[IPアドレス]]の指定方法を認めている実装もあります。
[16] [[IDN]] に対応する実装もあります。
;; [17] [[IDN]] の [[RFC]] の趣旨に従うなら[[アプリケーション]]側で[[Aラベル]]に変換してから[[名前解決]]するべきなのでしょうが、
[[DNS]] 以外の方法で[[名前解決]]する可能性を考慮すると、[[名前解決]]側で処理するのが適切にも思われます。
[20] 解決する名前のパターンその他で解決方法を切り替えたり、 [[Aラベル]]への変換を行うかどうか決定したり、
[[DNSサーバー]]を切り替えたりする実装や設定もあります。
[21] [[名前解決]]や [[DNS]] の実装によっては、指定された通りの名前を解決するだけでなく、
指定された名前の後に予め設定された文字列
(所属するネットワークに割り振られた[[ドメイン名]]など) を結合した名前を解決しようとすることがあります。
所属ネットワークの[[ドメイン名]]を省略した[[ホスト名]] ([[計算機名]])
のみで名前解決できるようにするために用意されている機能です。
解決したい名前の末尾に[[根ドメイン]]を表す [CODE[[[.]]]] を明記することでこの挙動を防ぐことができます。
[22] いわゆる [[alternative root]] や、組織内ネットワーク等の [[DNSサーバー]]を一部または全部の名前を解決するように設定されていることがあり、その場合[[インターネット]]の
[[DNS]] で用いられている[[ドメイン名]]の体系に属さない[[ドメイン名]]で[[名前解決]]されることがあります。
[25] [[DNSラウンドロビン]]の実装方法や [[IPv4]] と [[IPv6]] の選択など、
[[DNS解決器]]の実装の詳細や動作モードにも様々なバリエーションがあります。
* 出力
[28] 名前解決が成功した場合は、アドレスが返されます。一般的には、 [[IPv4アドレス]]または
[[IPv6アドレス]]が返されます。
[29] [[DNSラウンドロビン]]などで複数のアドレスが得られた場合、
アドレスのリストが返される実装もあります。
[30] [[OS]] 等が提供する名前解決では、 [[DNS]] における [[TTL]] など名前に付随するその他の情報にはアクセスできないのが一般的です。
これを理由にアプリケーション側で独自に名前解決を実装することもあります。
[31] 名前解決は失敗することがあります。アプリケーションは失敗時の処理も実装しておく必要があります。
* 串による間接的名前解決
[9] [[SOCKS]] では接続先として[[IPアドレス]]ではなくサーバー名を指定することもできますので、
これは[[名前解決]]を [[SOCKS]] [[サーバー]]に委ねていることになります。
[10] [[HTTP]] [CODE(HTTP)@en[[[CONNECT]]]] では接続先の[[ホスト]]を[[要求対象]]として指定することになるので、
[[名前解決]]を [[HTTPサーバー]] ([[串]]) に委ねていることになります。
[23] [CODE[[[.onion]]]] のように、 [[DNS]] 等通常の方法で[[名前解決]]することは想定せず、
[[SOCKS]] など[[串]]を通した[[名前解決]]に限って用いられる[[ドメイン名]]も存在します。
;; [24] そのような[[ドメイン名]]であっても [[URL]] の [[authority]] に使われるなど、
[[名前解決]]以外の使われ方では通常の[[ドメイン名]]と区別がつきません。
[27] こうした形の間接的な[[名前解決]]では、[[クライアント]]は解決結果のアドレスを知ることはできませんし、その必要もありません。
([[クライアント]]が直接アクセスできないアドレスに解決されている可能性も強いです。)
* 解決時間
[33] [[名前解決]]は、 [[DNS]] 等ネットワークにより問い合わせる場合には相応の時間を必要とします。
そのためアプリケーションの処理内容や解決する名前の量によっては、
できるだけ名前解決が発生するのを避けるべきとされていることもあります。
[35] [[DNS Prefetching]] のような、必要になりそうな[[名前解決]]を予め行い結果を[[キャッシュ]]する仕組みが利用されることもあります。
* 実装
[FIG(quote)[
[FIGCAPTION[
[1] [CITE@en[Windows 名前解決の順序 - Ask the Network & AD Support Team - Site Home - TechNet Blogs]]
([TIME[2015-03-21 19:13:48 +09:00]] 版)
<http://blogs.technet.com/b/jpntsblog/archive/2009/07/13/windows.aspx>
]FIGCAPTION]
>
> 1) DNS リゾルバーキャッシュ (*1) を確認して、指定された名前に対応するレコードがキャッシュされている場合は、そのアドレスを返します。
> 2) HOSTSファイル (*2) を参照し、指定された名前に対応するレコードが登録されている場合はそのアドレスを返します。
> 3) 登録されている DNS サーバーに問い合わせを行い、受領したアドレスを返します。
> 4) 上記 1 ~ 3 で名前解決に成功しない場合は、NetBIOS 名前解決を行います。
]FIG]
[2] [CITE@en-us[Microsoft TCP/IP のホスト名解決の順序]]
([TIME[2015-03-21 19:15:29 +09:00]] 版)
<https://support.microsoft.com/en-us/kb/172218/ja>
[3] [CITE@ja[Microsoft ネットワークを解剖する 第1回「NetBIOSでの通信と名前解決の仕組み」 -- Microsoftネットワークの混迷 --]]
([TIME[2006-07-12 00:00:19 +09:00]] 版)
<http://www.monyo.com/technical/windows/msnet/msnet1.html>
[FIG(quote)[
[FIGCAPTION[
[4] [CITE[Postfix Configuration Parameters]]
([TIME[2015-02-08 21:38:00 +09:00]] 版)
<http://www.postfix.org/postconf.5.html#smtp_host_lookup>
]FIGCAPTION]
> smtp_host_lookup (default: dns)
> :dns:Hosts can be found in the DNS (preferred).
> :native:Use the native naming service only (nsswitch.conf, or equivalent mechanism).
> :dns, native:Use the native service for hosts not found in the DNS.
]FIG]
[FIG(quote)[
[FIGCAPTION[
[5] [CITE[Man page of NSSWITCH.CONF]]
([TIME[2015-02-06 06:34:01 +09:00]] 版)
<http://linuxjm.sourceforge.jp/html/LDP_man-pages/man5/nsswitch.conf.5.html>
]FIGCAPTION]
> ネームサービススイッチ (Name Service Switch; NSS) の設定ファイル /etc/nsswitch.conf は、 GNU C ライブラリが いろいろなカテゴリーの名前サービス情報を、どの情報源から どの順序で取得するかを判断するのに使用される (情報の各カテゴリーはデータベース名で識別される)。
]FIG]
[6] [CITE@en[Check /etc/hosts first · Issue #2 · potyl/perl-AnyEvent-CacheDNS]]
([TIME[2015-03-21 19:25:21 +09:00]] 版)
<https://github.com/potyl/perl-AnyEvent-CacheDNS/issues/2>
[FIG(quote)[
[FIGCAPTION[
[7] [CITE[AnyEvent::Socket - search.cpan.org]]
([TIME[2015-03-21 19:26:56 +09:00]] 版)
<http://search.cpan.org/dist/AnyEvent/lib/AnyEvent/Socket.pm>
]FIGCAPTION]
> For internet addresses, $node is either an IPv4 or IPv6 address, an internet hostname (DNS domain name or IDN)
> If a host cannot be found via DNS, then it will be looked up in /etc/hosts (or the file specified via $ENV{PERL_ANYEVENT_HOSTS}). If they are found, the addresses there will be used. The effect is as if entries from /etc/hosts would yield A and AAAA records for the host name unless DNS already had records for them.
> For UNIX domain sockets, $node must be the string unix/
]FIG]
[FIG(quote)[
[FIGCAPTION[
[8] [CITE@en[dex4er/perl-AnyEvent-DNS-EtcHosts]]
([TIME[2015-03-21 19:31:10 +09:00]] 版)
<https://github.com/dex4er/perl-AnyEvent-DNS-EtcHosts>
]FIGCAPTION]
> AnyEvent::DNS::EtcHosts changes AnyEvent::DNS behavior. The /etc/hosts file is searched before DNS, so it is possible to override DNS entries.
]FIG]
[FIG(quote)[
[FIGCAPTION[
[18] [CITE@ja[idn wrapper - JPNIC]]
([[Japan Network Information Center]] 著, [TIME[2015-03-21 20:33:19 +09:00]] 版)
<https://www.nic.ad.jp/ja/idn/mdnkit/download/documents/idnkit-1.0pr1-doc/ja/guide/wrapper.html>
]FIGCAPTION]
> Windows では、DNS だけではなく、WINSやLMHOSTS によってもドメイン名、 ホスト名の解決が行われます。 idn wrapper を使った場合には、これらのすべての方式について、 国際化ドメイン名への対応のためのエンコーディング変換が行われることになります。
> このため、Windows が、WINSやLMHOSTS を使っている場合には、予期しない 問題が発生する可能性があります。 idn wrapper を使う場合には、名前解決にDNS だけを使用することをお勧めします。
]FIG]
[FIG(quote)[
[FIGCAPTION[
[19] [CITE@ja[<idn> 要素 (Uri 設定)]]
([TIME[2015-03-21 20:34:42 +09:00]] 版)
<https://msdn.microsoft.com/ja-jp/library/bb882553(v=vs.110).aspx>
]FIGCAPTION]
> idn enabled = AllExceptIntranet
> この値は、ローカルなイントラネット以外のすべての Unicode ドメイン名を、等価の Punycode (IDN 名) を使用するように変換します。 このように、ローカルなイントラネットで国際名を処理する場合、このイントラネットで使用する DNS サーバーは Unicode の名前解決をサポートしている必要があります。
]FIG]
[FIG(quote)[
[FIGCAPTION[
[26] [CITE[Network Stack - The Chromium Projects]]
([TIME[2015-03-21 10:14:33 +09:00]] 版)
<https://www.chromium.org/developers/design-documents/network-stack>
]FIGCAPTION]
> Note that, as of time of writing, we cap the number of concurrent host resolutions to 8, but are looking to optimize this value. HostResolverImpl also contains a HostCache which caches up to 1000 hostnames.
]FIG]
* 関連
[34] [[名前]]から[[アドレス]]への変換を[[正引き]]、[[アドレス]]から[[名前]]への変換を[[逆引き]]と呼ぶことがあります。