<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="3" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[3]</anchor-end> <dfn><rubyb xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ポステルの法則<rt xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">Postel's Law</rt></rubyb></dfn> (<dfn>Robustness Principle</dfn>)
は、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">インターネット</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プロトコル</anchor>の実装に関する大原則です。
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">受信</anchor>に関してはより柔軟に、緩めの解釈を求め、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">送信</anchor>に関してはより正確に、厳密な仕様の順守を求めています。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="20" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[20]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">インターネット</anchor>の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">開発者</anchor>であり本原則を確立した <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Jon Postel</anchor> に因んでいます。</p><section><h1>由来</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="4" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[4]</anchor-end> </p><blockquote><p>Be liberal in what you accept, and conservative in what you send</p></blockquote><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><cite xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">RFC 1123 - Requirements for Internet Hosts - Application and Support</cite> (<time xmlns="http://www.w3.org/1999/xhtml">2011-01-08 19:53:59 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://tools.ietf.org/html/rfc1123#page-7">http://tools.ietf.org/html/rfc1123#page-7</anchor-external></comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="7" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[7]</anchor-end> </p><blockquote><p>In general, an implementation must be conservative
in its sending behavior, and liberal in its receiving behavior.</p></blockquote><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><cite xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">RFC 791 - Internet Protocol</cite> (<time xmlns="http://www.w3.org/1999/xhtml">2014-05-01 22:55:17 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://tools.ietf.org/html/rfc791#section-3.2">https://tools.ietf.org/html/rfc791#section-3.2</anchor-external></comment-p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="1" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[1]</anchor-end></p><blockquote><p>TCP implementations will follow a general principle of robustness:  be
conservative in what you do, be liberal in what you accept from
others.</p></blockquote><comment-p xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:10:"><cite xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">RFC 793 - Transmission Control Protocol</cite>
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://tools.ietf.org/html/rfc793#section-2.10">http://tools.ietf.org/html/rfc793#section-2.10</anchor-external></comment-p></section><section><h1>文脈</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="19" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[19]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">インターネット</anchor>の多くの<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">プロトコル</anchor>の設計の基本原則となっています。</p></section><section><h1>批判</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="11" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[11]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ポステルの法則</anchor>に従った実装と、そのような実装の存在に依存して正確な送信を行わない実装が混在する場合、
次第に元々の厳密な仕様の範囲外であっても、正確な送信を行わない実装との<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">相互運用性</anchor>のために特定の受信動作が求められるようになってしまいます (<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バグ互換性</anchor>)。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="12" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[12]</anchor-end> 大抵はおおむね<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">相互運用性</anchor>が保たれているとみなされ放置されるので、
明文化されない暗黙の仕様が生じ、新規参入が困難になったり、
仕様の拡張に支障が生じたりします。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="13" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[13]</anchor-end> これを<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ポステルの法則</anchor>の失敗とみなして <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">draconian</anchor> な受信動作が望ましいと考える人もいます。</p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="14" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[14]</anchor-end> あるいは<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">ポステルの法則</anchor>の精神に従いつつ、受信動作をも厳密に仕様の一部として規定するべきと考える人もいます。</p><example xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:"><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="16" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[16]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTMLの構文解析</anchor>は、元々ほとんど規定と言えるものがありませんでした。
90年代、<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">著者</anchor>は好き勝手な <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTML文書</anchor>を量産し、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webブラウザー</anchor>はどんな入力にもおおらかにできるだけ<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">著者</anchor>の意図 (と推測されるもの)
に沿って処理するようかなりの力を注いでいました。</p><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="17" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[17]</anchor-end> 結果として世間で流通する <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTML文書</anchor>の解釈には明文化されていない相当量の複雑難解な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">バッドノウハウ</anchor>の蓄積が必要となり、
新規参入を著しく阻害していました。</p><p xmlns="http://www.w3.org/1999/xhtml"><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="18" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[18]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTML5</anchor> (現在の <cite>HTML Standard</cite>) はこの状況を改善するため、
既存の<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Webブラウザー</anchor>の動作と膨大な<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTML文書</anchor>の調査を経て、
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">HTML構文解析器</anchor>の動作を完全に文書化しました。</p></example><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="26" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[26]</anchor-end> 
失敗事例:
<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">URL parser</anchor></p></section><section><h1>関連</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="5" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[5]</anchor-end> <anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">日本</anchor>では、しばしば<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">標語</anchor>「<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">人に優しく、自分に厳しく</anchor>」で表現されます。</p></section><section><h1>メモ</h1><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="2" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[2]</anchor-end> <cite>IRC logs: freenode / #whatwg / 20100629</cite>
(<time>2010-07-04 19:10:47 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://krijnhoetmer.nl/irc-logs/whatwg/20100629#l-193">http://krijnhoetmer.nl/irc-logs/whatwg/20100629#l-193</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="6" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[6]</anchor-end> <cite xml:lang="en">RFC 1958 - Architectural Principles of the Internet</cite>
( (<time>2011-06-05 09:19:25 +09:00</time> 版))
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://tools.ietf.org/html/rfc1958#page-5">http://tools.ietf.org/html/rfc1958#page-5</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="8" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[8]</anchor-end> <cite xml:lang="en">RFC 5537 - Netnews Architecture and Protocols</cite> (<time>2014-09-14 17:08:11 +09:00</time> 版) <anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://tools.ietf.org/html/rfc5537#section-3.1">http://tools.ietf.org/html/rfc5537#section-3.1</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="9" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[9]</anchor-end> <cite xml:lang="en">draft-thomson-postel-was-wrong-00 - The Harmful Consequences of Postel's Maxim</cite>
(<time>2015-06-13 20:22:21 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://tools.ietf.org/html/draft-thomson-postel-was-wrong-00">https://tools.ietf.org/html/draft-thomson-postel-was-wrong-00</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="10" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[10]</anchor-end> <cite xml:lang="en">The Robustness Principle Reconsidered | August 2011 | Communications of the ACM</cite>
(<anchor xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:">Eric Allman</anchor> 著, <time>2015-07-03 11:27:00 +09:00</time> 版)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="http://cacm.acm.org/magazines/2011/8/114933-the-robustness-principle-reconsidered/fulltext">http://cacm.acm.org/magazines/2011/8/114933-the-robustness-principle-reconsidered/fulltext</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="15" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[15]</anchor-end> <cite>Users, clients, and servers — Anne’s Blog</cite>
(<time>2016-08-11 18:02:41 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://annevankesteren.nl/2016/05/client-server">https://annevankesteren.nl/2016/05/client-server</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="21" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[21]</anchor-end> <cite xml:lang="en">RFC 4648 - The Base16, Base32, and Base64 Data Encodings</cite>
(<time>2018-01-28 17:12:45 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://tools.ietf.org/html/rfc4648#section-3.3">https://tools.ietf.org/html/rfc4648#section-3.3</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="22" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[22]</anchor-end> <cite xml:lang="en">martinthomson/postel-was-wrong: Tolerance is a bug</cite>
(<time>2018-04-13 01:03:49 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/martinthomson/postel-was-wrong">https://github.com/martinthomson/postel-was-wrong</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="23" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[23]</anchor-end> <cite xml:lang="en">The Harmful Consequences of the Robustness Principle</cite>
(<time>2018-03-05 14:05:27 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://martinthomson.github.io/postel-was-wrong/draft-thomson-postel-was-wrong.html">https://martinthomson.github.io/postel-was-wrong/draft-thomson-postel-was-wrong.html</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="24" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[24]</anchor-end> <cite xml:lang="en">The Harmful Consequences of the Robustness Principle</cite>
(<time>2019-05-07 11:34:25 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://intarchboard.github.io/protocol-maintenance/draft-iab-protocol-maintenance.html">https://intarchboard.github.io/protocol-maintenance/draft-iab-protocol-maintenance.html</anchor-external></p><p><anchor-end xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:anchor="25" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:">[25]</anchor-end> <cite xml:lang="en">intarchboard/protocol-maintenance: Don't apply the robustness principle, look after your protocol instead</cite>
(<time>2019-06-19 15:05:58 +09:00</time>)
<anchor-external xmlns="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resScheme="URI" xmlns:a0="urn:x-suika-fam-cx:markup:suikawiki:0:9:" a0:resParameter="https://github.com/intarchboard/protocol-maintenance">https://github.com/intarchboard/protocol-maintenance</anchor-external></p></section></body></html>