#import "@preview/mitex:0.2.5": mitex
#let bem-md-hash = "db392e9"
#let bem-page-path = "book:ja"
#set page(paper: "a4", margin: (x: 18mm, y: 18mm), foreground: place(top + left, dx: 8mm, dy: 7mm)[#text(size: 7pt, fill: luma(120))[#bem-page-path]], footer: context align(right)[#text(size: 7pt, fill: luma(120))[md #bem-md-hash #h(1em)p. #counter(page).display("1")]])
#let bem-ruby-color = luma(120)
#let bem-ruby-reserve = 0.45em
#let bem-anno-reserve = 0.45em
#let bem-anno-gap = bem-anno-reserve
#let bem-anno-area = bem-anno-reserve + bem-anno-gap
#set text(font: ("Yu Mincho", "MS Mincho"), size: 10.5pt, lang: "ja", fill: black, top-edge: 1em + bem-ruby-reserve, bottom-edge: -bem-anno-area)
#set par(justify: true, leading: 0.18em)
#set block(spacing: 1.12em)
#set heading(numbering: "1.1.1")
#let bem-heading-accent = rgb("2b155f")
#let bem-heading-line = rgb("58b7ff")
#let bem-ruby(rt, body) = context {
  let rt-body = text(size: bem-ruby-reserve, fill: bem-ruby-color, top-edge: "bounds", bottom-edge: "bounds")[#rt]
  let bw = measure(body).width
  let rw = measure(rt-body).width
  let w = calc.max(bw, rw)
  box(width: w, baseline: bem-anno-area)[
    #align(center)[#body]
    #place(top + left, dx: (w - rw) / 2, rt-body)
  ]
}
#let bem-anno(note, body) = context {
  let note-body = text(size: bem-anno-reserve, fill: bem-ruby-color, top-edge: "bounds", bottom-edge: "bounds")[#note]
  let bw = measure(body).width
  let nw = measure(note-body).width
  let w = calc.max(bw, nw)
  box(width: w, baseline: bem-anno-area)[
    #align(center)[#body]
    #place(bottom + left, dx: (w - nw) / 2, note-body)
  ]
}
#let bem-heading-number() = {
  let nums = counter(heading).get().slice(1)
  if nums.len() == 0 { [] } else { numbering("1.1.1", ..nums) }
}
#show heading: it => {
  if it.level == 1 {
    block(above: 0.35em, below: 1.85em, width: 100%)[
      #align(center)[#text(size: 18pt, weight: 700)[#it.body]]
    ]
  } else {
    let shown = bem-heading-number()
    let size = if it.level == 2 { 13.2pt } else if it.level == 3 { 11.6pt } else { 10.8pt }
    let above = if it.level == 2 { 1.4em } else { 1.12em }
    let below = if it.level == 2 { 1.22em } else { 1.02em }
    block(above: above, below: below, width: 100%)[
      #box(width: 100%, inset: (left: 7pt, right: 6pt, top: 9pt, bottom: 12pt), stroke: (left: 2.4pt + bem-heading-accent, bottom: 0.55pt + bem-heading-line), radius: 1.5pt)[
        #text(size: size, weight: 700)[#if shown != [] [#shown #h(0.45em)]#it.body]
      ]
    ]
  }
}
#set document(title: "計算機ネットワークポータル")

#align(center + horizon)[
#block(width: 82%)[
#text(size: 24pt, weight: 700)[計算機ネットワークポータル]

#text(size: 8pt, fill: luma(120))[5 pages]
]
]

#pagebreak()

#block(above: 0pt, below: 0.55em)[#text(size: 14pt, weight: 700)[Table of Contents]]
#outline(title: none, depth: 3)

#pagebreak()


#block(above: 0.1em, below: 0.45em, width: 100%)[#text(size: 7pt, fill: luma(125))[data/lecture/information/networks/computer-networks-portal.lecture.n.md#h(0.7em)md a56019c]]


= #bem-ruby("けいさんき")[計算機]ネットワークポータル


#block(above: 1.35em, below: 1.0em, width: 100%)[
#link("https://study.bem130.com/lecture/information/systems/computer-systems-basics.lecture/")[#box(width: 100%, inset: (x: 7pt, y: 5pt), stroke: 0.55pt + rgb("d8dee8"), radius: 3pt, fill: rgb("fbfcfe"))[
#set par(justify: false, leading: 0.35em)
#text(size: 7pt, fill: rgb("5d7796"))[→]#h(0.32em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("f4f6f9"), stroke: 0.45pt + rgb("d7dde6"))[#text(size: 6.8pt, fill: rgb("54657a"))[basics.lecture]]#h(0.32em)#text(size: 9.2pt, weight: 700, fill: rgb("182232"))[computer-systems]#h(0.5em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[lecture]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[information]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[systems]]#h(0.24em) \
#text(size: 7pt, fill: rgb("5d7796"))[https://study.bem130.com/lecture/information/systems/computer-systems-basics.lecture/]
]]
]


== #bem-ruby("どうにゅう")[導入]


このポータルでは、#bem-ruby("ふくすう")[複数]の#bem-ruby("けいさんき")[計算機]がデータを#bem-ruby("こうかん")[交換]するための#bem-ruby("しく")[仕組]みを#bem-ruby("まな")[学]ぶ。#bem-ruby("せんこう")[先行]する#bem-ruby("けいさんき")[計算機]システムの#bem-ruby("こうぎ")[講義]では、ネットワークインタフェースを#bem-ruby("にゅうしゅつりょくそうち")[入出力装置]の#bem-ruby("いっしゅ")[一種]として#bem-ruby("いち")[位置]づけた。ここでは、#bem-ruby("そうしんもと")[送信元]から#bem-ruby("あてさき")[宛先]までデータを#bem-ruby("てんそう")[転送]し、その#bem-ruby("うえ")[上]でアプリケーションが#bem-ruby("つうしん")[通信]する#bem-ruby("かてい")[過程]を#bem-ruby("せつめい")[説明]する。


== #bem-ruby("がくしゅうけいろ")[学習経路]


+ #bem-ruby("つうしん")[通信]を#bem-ruby("かいそうか")[階層化]し、アドレス、プロトコル、#bem-ruby("けいろ")[経路]の#bem-ruby("やくわり")[役割]を#bem-ruby("くべつ")[区別]する。

+ IPによるパケット#bem-ruby("てんそう")[転送]と、TCPによる#bem-ruby("しんらいせい")[信頼性]のあるバイト#bem-ruby("れつてんそう")[列転送]を#bem-ruby("くべつ")[区別]する。

+ DNSによってドメイン#bem-ruby("めい")[名]から#bem-ruby("つうしんさき")[通信先]の#bem-ruby("じょうほう")[情報]を#bem-ruby("けんさく")[検索]する。

+ HTTPによってWebの#bem-ruby("ようきゅう")[要求]と#bem-ruby("おうとう")[応答]を#bem-ruby("こうかん")[交換]する。


#block(above: 1.35em, below: 1.0em, width: 100%)[
#link("https://study.bem130.com/lecture/information/networks/computer-network-basics.lecture/")[#box(width: 100%, inset: (x: 7pt, y: 5pt), stroke: 0.55pt + rgb("d8dee8"), radius: 3pt, fill: rgb("fbfcfe"))[
#set par(justify: false, leading: 0.35em)
#text(size: 7pt, fill: rgb("5d7796"))[→]#h(0.32em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("f4f6f9"), stroke: 0.45pt + rgb("d7dde6"))[#text(size: 6.8pt, fill: rgb("54657a"))[basics.lecture]]#h(0.32em)#text(size: 9.2pt, weight: 700, fill: rgb("182232"))[ネットワークの基本]#h(0.5em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[lecture]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[information]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[networks]]#h(0.24em) \
#text(size: 7pt, fill: rgb("5d7796"))[https://study.bem130.com/lecture/information/networks/computer-network-basics.lecture/]
]]
]


#block(above: 1.35em, below: 1.0em, width: 100%)[
#link("https://study.bem130.com/lecture/information/networks/tcp-and-ip-basics.lecture/")[#box(width: 100%, inset: (x: 7pt, y: 5pt), stroke: 0.55pt + rgb("d8dee8"), radius: 3pt, fill: rgb("fbfcfe"))[
#set par(justify: false, leading: 0.35em)
#text(size: 7pt, fill: rgb("5d7796"))[→]#h(0.32em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("f4f6f9"), stroke: 0.45pt + rgb("d7dde6"))[#text(size: 6.8pt, fill: rgb("54657a"))[basics.lecture]]#h(0.32em)#text(size: 9.2pt, weight: 700, fill: rgb("182232"))[TCPとIPの基本]#h(0.5em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[lecture]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[information]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[networks]]#h(0.24em) \
#text(size: 7pt, fill: rgb("5d7796"))[https://study.bem130.com/lecture/information/networks/tcp-and-ip-basics.lecture/]
]]
]


#block(above: 1.35em, below: 1.0em, width: 100%)[
#link("https://study.bem130.com/lecture/information/networks/dns-basics.lecture/")[#box(width: 100%, inset: (x: 7pt, y: 5pt), stroke: 0.55pt + rgb("d8dee8"), radius: 3pt, fill: rgb("fbfcfe"))[
#set par(justify: false, leading: 0.35em)
#text(size: 7pt, fill: rgb("5d7796"))[→]#h(0.32em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("f4f6f9"), stroke: 0.45pt + rgb("d7dde6"))[#text(size: 6.8pt, fill: rgb("54657a"))[basics.lecture]]#h(0.32em)#text(size: 9.2pt, weight: 700, fill: rgb("182232"))[DNSの基本]#h(0.5em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[lecture]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[information]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[networks]]#h(0.24em) \
#text(size: 7pt, fill: rgb("5d7796"))[https://study.bem130.com/lecture/information/networks/dns-basics.lecture/]
]]
]


#block(above: 1.35em, below: 1.0em, width: 100%)[
#link("https://study.bem130.com/lecture/information/networks/http-basics.lecture/")[#box(width: 100%, inset: (x: 7pt, y: 5pt), stroke: 0.55pt + rgb("d8dee8"), radius: 3pt, fill: rgb("fbfcfe"))[
#set par(justify: false, leading: 0.35em)
#text(size: 7pt, fill: rgb("5d7796"))[→]#h(0.32em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("f4f6f9"), stroke: 0.45pt + rgb("d7dde6"))[#text(size: 6.8pt, fill: rgb("54657a"))[basics.lecture]]#h(0.32em)#text(size: 9.2pt, weight: 700, fill: rgb("182232"))[HTTP の基本]#h(0.5em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[lecture]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[information]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[networks]]#h(0.24em) \
#text(size: 7pt, fill: rgb("5d7796"))[https://study.bem130.com/lecture/information/networks/http-basics.lecture/]
]]
]


== #bem-ruby("かいそう")[階層]を#bem-ruby("くべつ")[区別]する


ネットワークの#bem-ruby("かくかいそう")[各階層]は、#bem-ruby("こと")[異]なる#bem-ruby("せきむ")[責務]を#bem-ruby("たんとう")[担当]する。DNSとHTTPはアプリケーション#bem-ruby("そう")[層]に#bem-ruby("ぞく")[属]し、DNSは#bem-ruby("なまえかいけつ")[名前解決]、HTTPはWebリソースに#bem-ruby("たい")[対]する#bem-ruby("そうさ")[操作]という#bem-ruby("こと")[異]なる#bem-ruby("せきむ")[責務]を#bem-ruby("にな")[担]う。TCPはトランスポート#bem-ruby("そう")[層]で#bem-ruby("じゅんじょ")[順序]を#bem-ruby("たも")[保]つバイト#bem-ruby("れつてんそう")[列転送]を#bem-ruby("ていきょう")[提供]し、IPはネットワーク#bem-ruby("そう")[層]でアドレス#bem-ruby("してい")[指定]とデータグラム#bem-ruby("てんそう")[転送]を#bem-ruby("ていきょう")[提供]する。#bem-ruby("じっさい")[実際]の#bem-ruby("つうしん")[通信]ではこれらが#bem-ruby("れんけい")[連携]するが、#bem-ruby("もんだい")[問題]を#bem-ruby("ぶんせき")[分析]するときは#bem-ruby("せきむ")[責務]を#bem-ruby("こんどう")[混同]しないことが#bem-ruby("じゅうよう")[重要]である。


#pagebreak()


#block(above: 0.1em, below: 0.45em, width: 100%)[#text(size: 7pt, fill: luma(125))[data/lecture/information/networks/computer-network-basics.lecture.n.md#h(0.7em)md afd1c13]]


= ネットワークの#bem-ruby("きほん")[基本]


#block(above: 1.35em, below: 1.0em, width: 100%)[
#link("https://study.bem130.com/lecture/information/networks/computer-networks-portal.lecture/")[#box(width: 100%, inset: (x: 7pt, y: 5pt), stroke: 0.55pt + rgb("d8dee8"), radius: 3pt, fill: rgb("fbfcfe"))[
#set par(justify: false, leading: 0.35em)
#text(size: 7pt, fill: rgb("5d7796"))[→]#h(0.32em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("f4f6f9"), stroke: 0.45pt + rgb("d7dde6"))[#text(size: 6.8pt, fill: rgb("54657a"))[portal.lecture]]#h(0.32em)#text(size: 9.2pt, weight: 700, fill: rgb("182232"))[計算機ネットワークポータル]#h(0.5em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[lecture]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[information]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[networks]]#h(0.24em) \
#text(size: 7pt, fill: rgb("5d7796"))[https://study.bem130.com/lecture/information/networks/computer-networks-portal.lecture/]
]]
]


== #bem-ruby("どうにゅう")[導入]


この#bem-ruby("こうぎ")[講義]では、#bem-ruby("ふくすう")[複数]の#bem-ruby("けいさんき")[計算機]が#bem-ruby("つうしんかいせん")[通信回線]を#bem-ruby("かい")[介]してデータを#bem-ruby("こうかん")[交換]する#bem-anno("Computer network")[#bem-ruby("けいさんき")[計算機]ネットワーク]の#bem-ruby("きほんこうぞう")[基本構造]を#bem-ruby("せつめい")[説明]する。#bem-ruby("つうしんしゅたい")[通信主体]を#bem-ruby("しきべつ")[識別]するアドレス、#bem-ruby("つうしんてじゅん")[通信手順]を#bem-ruby("きてい")[規定]するプロトコル、パケットを#bem-ruby("あてさき")[宛先]へ#bem-ruby("てんそう")[転送]する#bem-ruby("けいろ")[経路]を#bem-ruby("くべつ")[区別]し、#bem-ruby("こうぞく")[後続]の TCP、IP、DNS、HTTP を#bem-ruby("りかい")[理解]するための#bem-ruby("きそ")[基礎]を#bem-ruby("こうせい")[構成]する。


== #bem-ruby("こうせいようそ")[構成要素]と#bem-ruby("かいそう")[階層]


ネットワークは、#bem-ruby("りようしゃ")[利用者]のプログラムを#bem-ruby("じっこう")[実行]する#bem-anno("End system")[エンドシステム]、#bem-ruby("りんせつきき")[隣接機器]を#bem-ruby("せつぞく")[接続]する#bem-anno("Link")[リンク]、リンク#bem-ruby("かん")[間]でパケットを#bem-ruby("ちゅうけい")[中継]する#bem-anno("Router")[ルータ]などから#bem-ruby("こうせい")[構成]される。エンドシステムの#bem-ruby("れい")[例]には、クライアント、サーバ、スマートフォンがある。


#bem-ruby("つうしんきのう")[通信機能]は#bem-ruby("やくわり")[役割]ごとの#bem-anno("Layer")[#bem-ruby("そう")[層]]に#bem-ruby("ぶんかつ")[分割]される。#bem-ruby("かくそう")[各層]は#bem-ruby("かいそう")[下位層]の#bem-ruby("きのう")[機能]を#bem-ruby("りよう")[利用]し、#bem-ruby("じょういそう")[上位層]へ#bem-ruby("きのう")[機能]を#bem-ruby("ていきょう")[提供]する。この#bem-ruby("かいそうか")[階層化]により、たとえばアプリケーションの#bem-ruby("つうしんきそく")[通信規則]と、パケットをネットワーク#bem-ruby("ない")[内]で#bem-ruby("てんそう")[転送]する#bem-ruby("きそく")[規則]を#bem-ruby("ぶんり")[分離]できる。


#bem-anno("Internet Protocol")[IP]はネットワーク#bem-ruby("そう")[層]でパケットを#bem-ruby("てんそう")[転送]するプロトコル、#bem-anno("Hypertext Transfer Protocol")[HTTP]はアプリケーション#bem-ruby("そう")[層]で#bem-ruby("ようきゅう")[要求]と#bem-ruby("おうとう")[応答]の#bem-ruby("いみ")[意味]を#bem-ruby("きてい")[規定]するプロトコルである。この#bem-ruby("だんかい")[段階]では#bem-ruby("かいそうか")[階層化]の#bem-ruby("れい")[例]として#bem-ruby("いち")[位置]づけ、#bem-ruby("しょうさい")[詳細]は#bem-ruby("こうぞく")[後続]の#bem-ruby("こうぎ")[講義]で#bem-ruby("せつめい")[説明]する。


== #bem-ruby("きほんようご")[基本用語]


#bem-anno("Protocol")[プロトコル]とは、#bem-ruby("つうしんしゅたい")[通信主体]が#bem-ruby("こうかん")[交換]するメッセージの#bem-ruby("こうぶん")[構文]と#bem-ruby("いみ")[意味]、および#bem-ruby("こうかんじゅんじょ")[交換順序]を#bem-ruby("きてい")[規定]する#bem-ruby("きそくぐん")[規則群]である。


#bem-anno("Address")[アドレス]とは、ある#bem-ruby("そう")[層]で#bem-ruby("つうしんしゅたい")[通信主体]または#bem-ruby("せつぞくてん")[接続点]を#bem-ruby("しきべつ")[識別]する#bem-ruby("じょうほう")[情報]である。アドレスの#bem-ruby("たいしょう")[対象]と#bem-ruby("ゆうこうはんい")[有効範囲]は#bem-ruby("そう")[層]によって#bem-ruby("こと")[異]なる。たとえば、IP アドレスはネットワーク#bem-ruby("そう")[層]のインタフェースを#bem-ruby("しきべつ")[識別]し、その#bem-ruby("あてさき")[宛先]プレフィックスはルータの#bem-ruby("てんそうはんだん")[転送判断]に#bem-ruby("りよう")[利用]される。


#bem-anno("Packet")[パケット]とは、ネットワークが#bem-ruby("てんそう")[転送]する#bem-ruby("ゆうげんちょう")[有限長]のデータ#bem-ruby("たんい")[単位]である。パケットは、#bem-ruby("せいぎょじょうほう")[制御情報]を#bem-ruby("かくのう")[格納]するヘッダと、#bem-ruby("じょういそう")[上位層]から#bem-ruby("う")[受]け#bem-ruby("と")[取]ったデータを#bem-ruby("ふく")[含]む。


#bem-anno("Route")[#bem-ruby("けいろ")[経路]]とは、#bem-ruby("そうしんもと")[送信元]から#bem-ruby("あてさき")[宛先]までパケットが#bem-ruby("つうか")[通過]するリンクとルータの#bem-ruby("けいれつ")[系列]である。


== パケット#bem-ruby("てんそう")[転送]


エンドシステムは、データをパケットとしてリンクへ#bem-ruby("そうしゅつ")[送出]する。ルータは、#bem-ruby("じゅしん")[受信]したパケットの#bem-ruby("あてさきじょうほう")[宛先情報]と#bem-anno("Forwarding table")[#bem-ruby("てんそうひょう")[転送表]]を#bem-ruby("さんしょう")[参照]し、#bem-ruby("つぎ")[次]に#bem-ruby("そうしゅつ")[送出]するインタフェースまたは#bem-anno("Next hop")[#bem-ruby("つぎ")[次]ホップ]を#bem-ruby("せんたく")[選択]する。この#bem-ruby("しょり")[処理]を#bem-anno("Forwarding")[#bem-ruby("てんそう")[転送]]という。#bem-ruby("かく")[各]ルータが#bem-ruby("てんそう")[転送]を#bem-ruby("はんぷく")[反復]することにより、パケットは#bem-ruby("あてさきほうこう")[宛先方向]へ#bem-ruby("てんそう")[転送]される。


#bem-anno("Routing")[ルーティング]は、ルータが#bem-ruby("りよう")[利用]する#bem-ruby("けいろじょうほう")[経路情報]を#bem-ruby("けいせい")[形成]する#bem-ruby("しょり")[処理]である。したがって、ルーティングは#bem-ruby("けいろじょうほう")[経路情報]の#bem-ruby("けいせい")[形成]、#bem-ruby("てんそう")[転送]は#bem-ruby("ここ")[個々]のパケットに#bem-ruby("たい")[対]する#bem-ruby("つぎ")[次]ホップの#bem-ruby("せんたく")[選択]として#bem-ruby("くべつ")[区別]される。


パケット#bem-ruby("こうかん")[交換]ネットワークでは、#bem-ruby("ふくすう")[複数]の#bem-ruby("つうしん")[通信]がリンクを#bem-ruby("きょうゆう")[共有]する。このため、パケットの#bem-ruby("ちえん")[遅延]、#bem-ruby("じゅんじょ")[順序]の#bem-ruby("へんか")[変化]、または#bem-ruby("そんしつ")[損失]が#bem-ruby("はっせい")[発生]し#bem-ruby("う")[得]る。どの#bem-ruby("せいしつ")[性質]をネットワーク#bem-ruby("そう")[層]または#bem-ruby("じょういそう")[上位層]が#bem-ruby("ほしょう")[保証]するかは、#bem-ruby("さいよう")[採用]するプロトコルによって#bem-ruby("こと")[異]なる。


== #bem-ruby("かいそうか")[階層化]とカプセル#bem-ruby("か")[化]


#bem-ruby("そうしんがわ")[送信側]では、#bem-ruby("かくそう")[各層]が#bem-ruby("じょういそう")[上位層]から#bem-ruby("う")[受]け#bem-ruby("と")[取]ったデータへ#bem-ruby("せいぎょじょうほう")[制御情報]を#bem-ruby("ふか")[付加]し、#bem-ruby("かいそう")[下位層]へ#bem-ruby("わた")[渡]す。この#bem-ruby("しょり")[処理]を#bem-anno("Encapsulation")[カプセル#bem-ruby("か")[化]]という。#bem-ruby("じゅしんがわ")[受信側]では、#bem-ruby("たいおう")[対応]する#bem-ruby("かくそう")[各層]が#bem-ruby("せいぎょじょうほう")[制御情報]を#bem-ruby("かいしゃく")[解釈]し、データを#bem-ruby("じょういそう")[上位層]へ#bem-ruby("わた")[渡]す。


たとえば、HTTP のメッセージはトランスポート#bem-ruby("そう")[層]へ#bem-ruby("わた")[渡]され、さらに IP のパケットとしてネットワーク#bem-ruby("ない")[内]を#bem-ruby("てんそう")[転送]される。#bem-ruby("かいそうか")[階層化]は、HTTP が#bem-ruby("ようきゅう")[要求]と#bem-ruby("おうとう")[応答]の#bem-ruby("いみ")[意味]を#bem-ruby("きてい")[規定]し、IP が#bem-ruby("あてさき")[宛先]へのパケット#bem-ruby("てんそう")[転送]を#bem-ruby("たんとう")[担当]するという#bem-ruby("やくわりぶんたん")[役割分担]を#bem-ruby("かのう")[可能]にする。


== #bem-ruby("やくわり")[役割]の#bem-ruby("くべつ")[区別]


- アドレスは、#bem-ruby("そう")[層]ごとの#bem-ruby("つうしんしゅたい")[通信主体]または#bem-ruby("せつぞくてん")[接続点]を#bem-ruby("しきべつ")[識別]する。

- プロトコルは、メッセージの#bem-ruby("けいしき")[形式]、#bem-ruby("いみ")[意味]、および#bem-ruby("こうかんてじゅん")[交換手順]を#bem-ruby("きてい")[規定]する。

- ルーティングは#bem-ruby("けいろじょうほう")[経路情報]を#bem-ruby("けいせい")[形成]し、#bem-ruby("てんそう")[転送]はその#bem-ruby("じょうほう")[情報]に#bem-ruby("もと")[基]づいて#bem-ruby("かく")[各]パケットの#bem-ruby("つぎ")[次]ホップを#bem-ruby("せんたく")[選択]する。

- #bem-ruby("かいそうか")[階層化]は、アプリケーションの#bem-ruby("いみ")[意味]とデータ#bem-ruby("てんそう")[転送]の#bem-ruby("きこう")[機構]を#bem-ruby("ぶんり")[分離]する。


== #bem-ruby("ようてん")[要点]


- #bem-ruby("けいさんき")[計算機]ネットワークは、エンドシステム、リンク、ルータ、および#bem-ruby("かいそうか")[階層化]されたプロトコルから#bem-ruby("こうせい")[構成]される。

- パケットは、#bem-ruby("かく")[各]ルータによる#bem-ruby("きょくしょてき")[局所的]な#bem-ruby("つぎ")[次]ホップ#bem-ruby("せんたく")[選択]を#bem-ruby("はんぷく")[反復]して#bem-ruby("あてさきほうこう")[宛先方向]へ#bem-ruby("てんそう")[転送]される。

- アドレス、プロトコル、ルーティング、#bem-ruby("てんそう")[転送]の#bem-ruby("やくわり")[役割]を#bem-ruby("くべつ")[区別]すると、#bem-ruby("こうぞく")[後続]の TCP と IP の#bem-ruby("やくわりぶんたん")[役割分担]を#bem-ruby("りかい")[理解]できる。


== #bem-ruby("つぎ")[次]に#bem-ruby("すす")[進]む#bem-ruby("こうぎ")[講義]


#block(above: 1.35em, below: 1.0em, width: 100%)[
#link("https://study.bem130.com/lecture/information/networks/tcp-and-ip-basics.lecture/")[#box(width: 100%, inset: (x: 7pt, y: 5pt), stroke: 0.55pt + rgb("d8dee8"), radius: 3pt, fill: rgb("fbfcfe"))[
#set par(justify: false, leading: 0.35em)
#text(size: 7pt, fill: rgb("5d7796"))[→]#h(0.32em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("f4f6f9"), stroke: 0.45pt + rgb("d7dde6"))[#text(size: 6.8pt, fill: rgb("54657a"))[basics.lecture]]#h(0.32em)#text(size: 9.2pt, weight: 700, fill: rgb("182232"))[TCPとIPの基本]#h(0.5em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[lecture]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[information]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[networks]]#h(0.24em) \
#text(size: 7pt, fill: rgb("5d7796"))[https://study.bem130.com/lecture/information/networks/tcp-and-ip-basics.lecture/]
]]
]


#pagebreak()


#block(above: 0.1em, below: 0.45em, width: 100%)[#text(size: 7pt, fill: luma(125))[data/lecture/information/networks/tcp-and-ip-basics.lecture.n.md#h(0.7em)md a1d8315]]


= TCPとIPの#bem-ruby("きほん")[基本]


#block(above: 1.35em, below: 1.0em, width: 100%)[
#link("https://study.bem130.com/lecture/information/networks/computer-network-basics.lecture/")[#box(width: 100%, inset: (x: 7pt, y: 5pt), stroke: 0.55pt + rgb("d8dee8"), radius: 3pt, fill: rgb("fbfcfe"))[
#set par(justify: false, leading: 0.35em)
#text(size: 7pt, fill: rgb("5d7796"))[→]#h(0.32em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("f4f6f9"), stroke: 0.45pt + rgb("d7dde6"))[#text(size: 6.8pt, fill: rgb("54657a"))[basics.lecture]]#h(0.32em)#text(size: 9.2pt, weight: 700, fill: rgb("182232"))[ネットワークの基本]#h(0.5em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[lecture]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[information]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[networks]]#h(0.24em) \
#text(size: 7pt, fill: rgb("5d7796"))[https://study.bem130.com/lecture/information/networks/computer-network-basics.lecture/]
]]
]


== #bem-ruby("どうにゅう")[導入]


この#bem-ruby("こうぎ")[講義]では、#bem-anno("Internet Protocol")[IP]によるデータグラム#bem-ruby("てんそう")[転送]と、#bem-anno("Transmission Control Protocol")[TCP]によるバイトストリーム#bem-ruby("てんそう")[転送]の#bem-ruby("せきむ")[責務]を#bem-ruby("くべつ")[区別]する。IPが#bem-ruby("ていきょう")[提供]するサービスの#bem-ruby("げんかい")[限界]を#bem-ruby("かくにん")[確認]したうえで、TCPが#bem-ruby("じゅんじょせいぎょ")[順序制御]と#bem-ruby("さいそう")[再送]によってどのような#bem-ruby("しんらいせい")[信頼性]を#bem-ruby("ふか")[付加]するかを#bem-ruby("せつめい")[説明]する。


== ネットワーク#bem-ruby("そう")[層]とトランスポート#bem-ruby("そう")[層]


IPはネットワーク#bem-ruby("そう")[層]のプロトコルである。#bem-anno("IP address")[IPアドレス]はネットワーク#bem-ruby("そう")[層]のインタフェースを#bem-ruby("しきべつ")[識別]し、ルータは#bem-ruby("あてさき")[宛先]IPアドレスのプレフィックスに#bem-ruby("もと")[基]づいてデータグラムを#bem-ruby("つぎ")[次]ホップへ#bem-ruby("てんそう")[転送]する。#bem-ruby("けいろじょうほう")[経路情報]を#bem-ruby("けいせい")[形成]することを#bem-anno("Routing")[ルーティング]、その#bem-ruby("じょうほう")[情報]に#bem-ruby("したが")[従]って#bem-ruby("ここ")[個々]のデータグラムを#bem-ruby("てんそう")[転送]することを#bem-anno("Forwarding")[フォワーディング]という。


TCPはトランスポート#bem-ruby("そう")[層]のプロトコルであり、IPの#bem-ruby("うえ")[上]に#bem-ruby("こうせい")[構成]される。TCPは#bem-ruby("こうじゅつ")[後述]するポート#bem-ruby("ばんごう")[番号]とIPアドレスを#bem-ruby("く")[組]み#bem-ruby("あ")[合]わせて#bem-ruby("つうしんたんてん")[通信端点]を#bem-ruby("しきべつ")[識別]し、アプリケーション#bem-ruby("かん")[間]のデータ#bem-ruby("てんそう")[転送]を#bem-ruby("しえん")[支援]する。


== IPのベストエフォート#bem-ruby("てんそう")[転送]


IPは、#bem-ruby("じょういそう")[上位層]から#bem-ruby("う")[受]け#bem-ruby("と")[取]ったデータを#bem-anno("IP datagram")[IPデータグラム]として#bem-ruby("あてさき")[宛先]へ#bem-ruby("てんそう")[転送]する。ただし、IPが#bem-ruby("ていきょう")[提供]するサービスは#bem-anno("Best-effort service")[ベストエフォート]である。ネットワークの#bem-ruby("こんざつ")[混雑]や#bem-ruby("きき")[機器]の#bem-ruby("しょうがい")[障害]などにより、データグラムが#bem-ruby("けつらく")[欠落]することも、#bem-ruby("そうしんじゅんじょ")[送信順序]と#bem-ruby("こと")[異]なる#bem-ruby("じゅんじょ")[順序]で#bem-ruby("とうちゃく")[到着]することも、#bem-ruby("じゅうふく")[重複]して#bem-ruby("とうちゃく")[到着]することもある。IPは、#bem-ruby("とうたつ")[到達]、#bem-ruby("とうちゃくじゅんじょ")[到着順序]、#bem-ruby("じゅうふくはいじょ")[重複排除]を#bem-ruby("ほしょう")[保証]しない。


== TCPの#bem-ruby("しんらいせい")[信頼性]のあるバイトストリーム


TCPは、#bem-ruby("せつぞく")[接続]の#bem-ruby("りょうたん")[両端]に#bem-anno("Ordered byte stream")[#bem-ruby("じゅんじょづ")[順序付]きバイトストリーム]を#bem-ruby("ていきょう")[提供]する。TCPはデータへ#bem-ruby("とお")[通]し#bem-ruby("ばんごう")[番号]を#bem-ruby("ふよ")[付与]し、#bem-ruby("じゅしんがわ")[受信側]からの#bem-anno("Acknowledgment; ACK")[#bem-ruby("かくにんおうとう")[確認応答]]によって#bem-ruby("じゅしんじょうきょう")[受信状況]を#bem-ruby("かくにん")[確認]する。#bem-ruby("かくにんおうとう")[確認応答]が#bem-ruby("え")[得]られないデータを#bem-ruby("さいそう")[再送]し、#bem-ruby("じゅんじょ")[順序]が#bem-ruby("い")[入]れ#bem-ruby("か")[替]わったデータを#bem-ruby("せいれつ")[整列]することにより、アプリケーションへ#bem-ruby("じゅんじょづ")[順序付]きのデータ#bem-ruby("れつ")[列]を#bem-ruby("わた")[渡]す。


TCPは#bem-anno("Full-duplex communication")[#bem-ruby("ぜんにじゅうつうしん")[全二重通信]]を#bem-ruby("しえん")[支援]するため、#bem-ruby("りょうほうこう")[両方向]へ#bem-ruby("どうじ")[同時]にバイトストリームを#bem-ruby("てんそう")[転送]できる。ただし、TCPはアプリケーションが#bem-ruby("そうしん")[送信]した#bem-ruby("ここ")[個々]のメッセージの#bem-ruby("きょうかい")[境界]を#bem-ruby("ほぞん")[保存]しない。アプリケーションは、データの#bem-ruby("なが")[長]さや#bem-ruby("くぎ")[区切]りを#bem-ruby("どくじ")[独自]のプロトコルで#bem-ruby("ひょうげん")[表現]する#bem-ruby("ひつよう")[必要]がある。


== ポート#bem-ruby("ばんごう")[番号]とTCP#bem-ruby("せつぞく")[接続]


IPアドレスがネットワーク#bem-ruby("そう")[層]のインタフェースを#bem-ruby("しきべつ")[識別]するのに#bem-ruby("たい")[対]し、#bem-anno("Port number")[ポート#bem-ruby("ばんごう")[番号]]はTCPなどの#bem-ruby("とくてい")[特定]のトランスポートプロトコルとIPアドレスの#bem-ruby("ぶんみゃく")[文脈]で#bem-ruby("つうしんたんてん")[通信端点]を#bem-ruby("しきべつ")[識別]する。TCP#bem-ruby("せつぞく")[接続]は、#bem-ruby("そうしんもと")[送信元]IPアドレス、#bem-ruby("そうしんもと")[送信元]ポート#bem-ruby("ばんごう")[番号]、#bem-ruby("あてさき")[宛先]IPアドレス、#bem-ruby("あてさき")[宛先]ポート#bem-ruby("ばんごう")[番号]の#bem-ruby("く")[組]みによって#bem-ruby("がいねんてき")[概念的]に#bem-ruby("しきべつ")[識別]できる。


クライアントは#bem-ruby("いっぱん")[一般]に#bem-ruby("いちじてき")[一時的]なポート#bem-ruby("ばんごう")[番号]を#bem-ruby("しよう")[使用]し、サーバは#bem-ruby("ていきょう")[提供]するサービスに#bem-ruby("たいおう")[対応]するポート#bem-ruby("ばんごう")[番号]で#bem-ruby("せつぞく")[接続]を#bem-ruby("ま")[待]つ。ポート#bem-ruby("ばんごう")[番号]があるため、#bem-ruby("どういつ")[同一]のIPアドレスを#bem-ruby("も")[持]つ#bem-ruby("けいさんき")[計算機]で#bem-ruby("ふくすう")[複数]のアプリケーションが#bem-ruby("つうしん")[通信]できる。


== カプセル#bem-ruby("か")[化]と#bem-ruby("つうしんてじゅん")[通信手順]


アプリケーションのデータはTCPセグメントに#bem-ruby("かくのう")[格納]され、TCPセグメントはIPデータグラムのペイロードに#bem-ruby("かくのう")[格納]される。このように、#bem-ruby("じょういそう")[上位層]のデータへ#bem-ruby("かいそう")[下位層]の#bem-ruby("せいぎょじょうほう")[制御情報]を#bem-ruby("ふか")[付加]することを#bem-anno("Encapsulation")[カプセル#bem-ruby("か")[化]]という。


#align(center)[#mitex("\\text{アプリケーションデータ}\n\\longrightarrow \\text{TCPセグメント}\n\\longrightarrow \\text{IPデータグラム}")]


たとえば、HTTP/1.1またはHTTP/2の#bem-ruby("つうしん")[通信]では、HTTPのデータをTCPがバイトストリームとして#bem-ruby("てんそう")[転送]し、そのTCPセグメントをIPがデータグラムとして#bem-ruby("あてさき")[宛先]へ#bem-ruby("てんそう")[転送]する。


== #bem-ruby("ほしょうはんい")[保証範囲]


TCPの#bem-ruby("しんらいせい")[信頼性]は、#bem-ruby("せつぞく")[接続]が#bem-ruby("いじ")[維持]されている#bem-ruby("あいだ")[間]に、#bem-ruby("そうしんがわ")[送信側]のバイト#bem-ruby("れつ")[列]を#bem-ruby("じゅんじょ")[順序]どおりに#bem-ruby("じゅしんがわ")[受信側]へ#bem-ruby("ていきょう")[提供]することを#bem-ruby("たいしょう")[対象]とする。#bem-ruby("しょうがい")[障害]によって#bem-ruby("せつぞく")[接続]が#bem-ruby("しっぱい")[失敗]した#bem-ruby("ばあい")[場合]の#bem-ruby("さいしゅうてき")[最終的]な#bem-ruby("はいそう")[配送]や、#bem-ruby("じゅしんがわ")[受信側]のアプリケーションがデータを#bem-ruby("しょり")[処理]したことまでは#bem-ruby("ほしょう")[保証]しない。「TCPは#bem-ruby("つね")[常]にデータを#bem-ruby("はいそう")[配送]する」と#bem-ruby("かいしゃく")[解釈]してはならない。


== #bem-ruby("ようてん")[要点]


- IPはデータグラムをベストエフォートで#bem-ruby("てんそう")[転送]し、#bem-ruby("とうたつ")[到達]や#bem-ruby("じゅんじょ")[順序]を#bem-ruby("ほしょう")[保証]しない。

- TCPはIPの#bem-ruby("うえ")[上]に#bem-ruby("じゅんじょづ")[順序付]きで#bem-ruby("しんらいせい")[信頼性]のある#bem-ruby("ぜんにじゅう")[全二重]バイトストリームを#bem-ruby("こうせい")[構成]する。

- IPアドレスはネットワーク#bem-ruby("そう")[層]のインタフェースを#bem-ruby("しきべつ")[識別]し、ポート#bem-ruby("ばんごう")[番号]はトランスポートプロトコルとIPアドレスの#bem-ruby("ぶんみゃく")[文脈]で#bem-ruby("つうしんたんてん")[通信端点]を#bem-ruby("しきべつ")[識別]する。

- TCPの#bem-ruby("ほしょう")[保証]は、アプリケーションによる#bem-ruby("しょりかんりょう")[処理完了]の#bem-ruby("ほしょう")[保証]とは#bem-ruby("こと")[異]なる。


== #bem-ruby("つぎ")[次]に#bem-ruby("すす")[進]む#bem-ruby("こうぎ")[講義]


#block(above: 1.35em, below: 1.0em, width: 100%)[
#link("https://study.bem130.com/lecture/information/networks/dns-basics.lecture/")[#box(width: 100%, inset: (x: 7pt, y: 5pt), stroke: 0.55pt + rgb("d8dee8"), radius: 3pt, fill: rgb("fbfcfe"))[
#set par(justify: false, leading: 0.35em)
#text(size: 7pt, fill: rgb("5d7796"))[→]#h(0.32em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("f4f6f9"), stroke: 0.45pt + rgb("d7dde6"))[#text(size: 6.8pt, fill: rgb("54657a"))[basics.lecture]]#h(0.32em)#text(size: 9.2pt, weight: 700, fill: rgb("182232"))[DNSの基本]#h(0.5em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[lecture]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[information]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[networks]]#h(0.24em) \
#text(size: 7pt, fill: rgb("5d7796"))[https://study.bem130.com/lecture/information/networks/dns-basics.lecture/]
]]
]


#pagebreak()


#block(above: 0.1em, below: 0.45em, width: 100%)[#text(size: 7pt, fill: luma(125))[data/lecture/information/networks/dns-basics.lecture.n.md#h(0.7em)md c9d71c2]]


= DNSの#bem-ruby("きほん")[基本]


#block(above: 1.35em, below: 1.0em, width: 100%)[
#link("https://study.bem130.com/lecture/information/networks/tcp-and-ip-basics.lecture/")[#box(width: 100%, inset: (x: 7pt, y: 5pt), stroke: 0.55pt + rgb("d8dee8"), radius: 3pt, fill: rgb("fbfcfe"))[
#set par(justify: false, leading: 0.35em)
#text(size: 7pt, fill: rgb("5d7796"))[→]#h(0.32em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("f4f6f9"), stroke: 0.45pt + rgb("d7dde6"))[#text(size: 6.8pt, fill: rgb("54657a"))[basics.lecture]]#h(0.32em)#text(size: 9.2pt, weight: 700, fill: rgb("182232"))[TCPとIPの基本]#h(0.5em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[lecture]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[information]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[networks]]#h(0.24em) \
#text(size: 7pt, fill: rgb("5d7796"))[https://study.bem130.com/lecture/information/networks/tcp-and-ip-basics.lecture/]
]]
]


== #bem-ruby("どうにゅう")[導入]


この#bem-ruby("こうぎ")[講義]では、#bem-anno("Domain Name System")[DNS]が#bem-ruby("かいそうてき")[階層的]かつ#bem-ruby("ぶんさんてき")[分散的]にドメイン#bem-ruby("めい")[名]の#bem-ruby("じょうほう")[情報]を#bem-ruby("かんり")[管理]する#bem-ruby("しく")[仕組]みを#bem-ruby("せつめい")[説明]する。#bem-ruby("なまえかいけつ")[名前解決]に#bem-ruby("かんよ")[関与]するサーバの#bem-ruby("やくわり")[役割]、#bem-ruby("しげん")[資源]レコード、キャッシュ、DNSが#bem-ruby("りよう")[利用]するトランスポートを#bem-ruby("じゅん")[順]に#bem-ruby("かくにん")[確認]する。


== #bem-ruby("かいそうてき")[階層的]で#bem-ruby("ぶんさんてき")[分散的]な#bem-ruby("なまえくうかん")[名前空間]


#bem-anno("Domain name")[ドメイン#bem-ruby("めい")[名]]は、#raw("www.example.com")のようにラベルを#bem-ruby("かいそうてき")[階層的]に#bem-ruby("れんけつ")[連結]した#bem-ruby("なまえ")[名前]である。DNSの#bem-ruby("なまえくうかん")[名前空間]では、#bem-ruby("さいじょうい")[最上位]にルートがあり、その#bem-ruby("した")[下]に#raw("com")などの#bem-anno("Top-level domain; TLD")[トップレベルドメイン]、#raw("example.com")などの#bem-ruby("かい")[下位]ドメインが#bem-ruby("はいち")[配置]される。


DNSは#bem-ruby("たんいつ")[単一]のサーバがすべての#bem-ruby("じょうほう")[情報]を#bem-ruby("かんり")[管理]する#bem-ruby("ほうしき")[方式]ではない。#bem-ruby("なまえくうかん")[名前空間]の#bem-ruby("かんり")[管理]を#bem-ruby("ふくすう")[複数]の#bem-ruby("そしき")[組織]とサーバへ#bem-ruby("いにん")[委任]する#bem-ruby("ぶんさんがた")[分散型]のシステムである。


== #bem-ruby("しげん")[資源]レコード


DNSが#bem-ruby("ほじ")[保持]する#bem-ruby("じょうほう")[情報]の#bem-ruby("たんい")[単位]を#bem-anno("Resource record")[#bem-ruby("しげん")[資源]レコード]という。#bem-ruby("だいひょうてき")[代表的]な#bem-ruby("しゅるい")[種類]は#bem-ruby("つぎ")[次]のとおりである。


#table(
  columns: 2,
  inset: 5pt,
  stroke: 0.4pt + luma(190),
  [#strong[#bem-ruby("しゅるい")[種類]]],
  [#strong[#bem-ruby("やくわり")[役割]]],
  [A],
  [ドメイン#bem-ruby("めい")[名]にIPv4アドレスを#bem-ruby("たいおう")[対応]づける],
  [#raw("AAAA")],
  [ドメイン#bem-ruby("めい")[名]にIPv6アドレスを#bem-ruby("たいおう")[対応]づける],
  [#raw("CNAME")],
  [#bem-ruby("べつめい")[別名]を#bem-ruby("せいきめい")[正規名]に#bem-ruby("たいおう")[対応]づける],
  [#raw("MX")],
  [メールを#bem-ruby("じゅしん")[受信]するサーバを#bem-ruby("してい")[指定]する],
  [#raw("NS")],
  [ドメインの#bem-ruby("けんい")[権威]DNSサーバを#bem-ruby("してい")[指定]する],
  [#raw("TXT")],
  [#bem-ruby("もじれつ")[文字列]の#bem-ruby("じょうほう")[情報]を#bem-ruby("ほじ")[保持]する],
)


したがって、DNSはドメイン#bem-ruby("めい")[名]をIPアドレスへ#bem-ruby("へんかん")[変換]するだけの#bem-ruby("しく")[仕組]みではない。アドレスの#bem-ruby("しゅとく")[取得]は、#raw("A record")または#raw("AAAA record")を#bem-ruby("しょうかい")[照会]する#bem-ruby("だいひょうてき")[代表的]な#bem-ruby("りようれい")[利用例]である。


== リゾルバと#bem-ruby("けんい")[権威]DNSサーバ


アプリケーションからDNS#bem-ruby("しょうかい")[照会]を#bem-ruby("う")[受]け#bem-ruby("つ")[付]ける#bem-ruby("きのう")[機能]を#bem-anno("Stub resolver")[スタブリゾルバ]という。スタブリゾルバは#bem-ruby("つうじょう")[通常]、#bem-anno("Recursive resolver")[#bem-ruby("さいき")[再帰]リゾルバ]へ#bem-ruby("しょうかい")[照会]を#bem-ruby("いらい")[依頼]する。#bem-ruby("さいき")[再帰]リゾルバは、#bem-ruby("ひつよう")[必要]な#bem-ruby("かいとう")[回答]や#bem-ruby("いにんじょうほう")[委任情報]がキャッシュにない#bem-ruby("ばあい")[場合]、ルートDNSサーバからTLDのDNSサーバ、#bem-anno("Authoritative name server")[#bem-ruby("けんい")[権威]DNSサーバ]へ#bem-ruby("いにん")[委任]を#bem-ruby("がいねんてき")[概念的]にたどる。キャッシュされた#bem-ruby("いにんじょうほう")[委任情報]があれば、#bem-ruby("とちゅう")[途中]の#bem-ruby("だんかい")[段階]から#bem-ruby("しょうかい")[照会]を#bem-ruby("かいし")[開始]できる。


#bem-ruby("けんい")[権威]DNSサーバは、#bem-ruby("いにん")[委任]された#bem-ruby("はんい")[範囲]の#bem-ruby("なまえ")[名前]について#bem-ruby("せいしき")[正式]な#bem-ruby("しげん")[資源]レコードを#bem-ruby("ていきょう")[提供]する。#bem-ruby("さいき")[再帰]リゾルバは、#bem-ruby("ふくすう")[複数]のDNSサーバへの#bem-ruby("はんぷくてき")[反復的]な#bem-ruby("しょうかい")[照会]をクライアントに#bem-ruby("か")[代]わって#bem-ruby("じっこう")[実行]し、#bem-ruby("さいしゅうてき")[最終的]な#bem-ruby("かいとう")[回答]をクライアントへ#bem-ruby("かえ")[返]す。


== #bem-ruby("なまえかいけつ")[名前解決]とキャッシュ


#raw("www.example.com")のアドレスを#bem-ruby("しゅとく")[取得]する#bem-ruby("しょり")[処理]は、#bem-ruby("がいねんてき")[概念的]には#bem-ruby("つぎ")[次]の#bem-ruby("じゅんじょ")[順序]となる。


+ アプリケーションがスタブリゾルバへ#bem-ruby("しょうかい")[照会]を#bem-ruby("いらい")[依頼]する。

+ スタブリゾルバが#bem-ruby("さいき")[再帰]リゾルバへ#bem-ruby("しょうかい")[照会]する。

+ #bem-ruby("さいき")[再帰]リゾルバは、#bem-ruby("ゆうこう")[有効]なキャッシュがあれば、その#bem-ruby("かいとう")[回答]を#bem-ruby("かえ")[返]す。

+ #bem-ruby("ひつよう")[必要]なキャッシュがなければ、ルート、TLD、#bem-ruby("けんい")[権威]DNSサーバの#bem-ruby("いにんかんけい")[委任関係]をたどって#bem-ruby("さんしょうさき")[参照先]と#bem-ruby("かいとう")[回答]を#bem-ruby("しゅとく")[取得]する。キャッシュされた#bem-ruby("いにんじょうほう")[委任情報]があれば、その#bem-ruby("とちゅう")[途中]から#bem-ruby("かいし")[開始]する。

+ #bem-ruby("さいき")[再帰]リゾルバが#bem-ruby("かいとう")[回答]をキャッシュし、スタブリゾルバへ#bem-ruby("かえ")[返]す。


#bem-ruby("しげん")[資源]レコードには#bem-anno("Time to Live")[TTL]が#bem-ruby("ふずい")[付随]する。キャッシュはTTLの#bem-ruby("ゆうこうきかんない")[有効期間内]に#bem-ruby("かいとう")[回答]を#bem-ruby("さいりよう")[再利用]し、#bem-ruby("しょうかいちえん")[照会遅延]とDNSサーバの#bem-ruby("ふか")[負荷]を#bem-ruby("ていげん")[低減]する。その#bem-ruby("いっぽう")[一方]で、レコードを#bem-ruby("へんこう")[変更]しても、#bem-ruby("きそん")[既存]のキャッシュが#bem-ruby("しっこう")[失効]するまでは#bem-ruby("ふる")[古]い#bem-ruby("じょうほう")[情報]が#bem-ruby("しよう")[使用]される#bem-ruby("かのうせい")[可能性]がある。


== DNSのトランスポート


DNSの#bem-ruby("じゅうらいがた")[従来型]の#bem-ruby("つうしん")[通信]は、#bem-ruby("つうじょう")[通常]、ポート53のUDPまたはTCPを#bem-ruby("しよう")[使用]する。#bem-ruby("いっぱんてき")[一般的]な#bem-ruby("しょうかい")[照会]ではUDPが#bem-ruby("ひろ")[広]く#bem-ruby("しよう")[使用]されるが、UDP#bem-ruby("おうとう")[応答]が#bem-ruby("き")[切]り#bem-ruby("つ")[詰]められた#bem-ruby("ばあい")[場合]や、TCPが#bem-ruby("ひつよう")[必要]な#bem-ruby("しょり")[処理]ではTCPを#bem-ruby("しよう")[使用]する。#bem-anno("DNS over TLS")[DoT]や#bem-anno("DNS over HTTPS")[DoH]は、DNS#bem-ruby("つうしん")[通信]を#bem-ruby("あんごうか")[暗号化]する#bem-ruby("べつ")[別]の#bem-ruby("ほうしき")[方式]である。


DNS#bem-ruby("しょうかい")[照会]そのものもIPネットワーク#bem-ruby("じょう")[上]で#bem-ruby("じっこう")[実行]される。したがって、DNSを「TCP/IPより#bem-ruby("まえ")[前]に#bem-ruby("じっこう")[実行]される#bem-ruby("どくりつ")[独立]した#bem-ruby("しょり")[処理]」と#bem-ruby("かいしゃく")[解釈]してはならない。


== #bem-ruby("なまえかいけつ")[名前解決]からWeb#bem-ruby("つうしん")[通信]へ


URLのホストがドメイン#bem-ruby("めい")[名]で#bem-ruby("ひょうき")[表記]されている#bem-ruby("ばあい")[場合]、クライアントはDNSによって#bem-ruby("ひと")[一]つまたは#bem-ruby("ふくすう")[複数]のIPアドレスを#bem-ruby("しゅとく")[取得]し、#bem-ruby("つうしんさき")[通信先]を#bem-ruby("せんたく")[選択]する。その#bem-ruby("ご")[後]、HTTP/1.1またはHTTP/2ではTCP#bem-ruby("せつぞく")[接続]を#bem-ruby("かくりつ")[確立]する。HTTP/3はTCPではなく、UDP#bem-ruby("じょう")[上]の#bem-anno("QUIC")[QUIC]を#bem-ruby("しよう")[使用]する。IPアドレスを#bem-ruby("ちょくせつ")[直接]#bem-ruby("してい")[指定]した#bem-ruby("ばあい")[場合]には、ドメイン#bem-ruby("めい")[名]の#bem-ruby("なまえかいけつ")[名前解決]を#bem-ruby("ひつよう")[必要]としないこともある。


== #bem-ruby("ようてん")[要点]


- DNSは#bem-ruby("かいそうてき")[階層的]かつ#bem-ruby("ぶんさんてき")[分散的]な#bem-ruby("なまえくうかん")[名前空間]と#bem-ruby("しげん")[資源]レコードの#bem-ruby("しょうかい")[照会]システムである。

- #bem-ruby("さいき")[再帰]リゾルバは、キャッシュまたは#bem-ruby("けんい")[権威]DNSサーバなどへの#bem-ruby("しょうかい")[照会]から#bem-ruby("かいとう")[回答]を#bem-ruby("しゅとく")[取得]する。

- キャッシュはTTLの#bem-ruby("きかん")[期間]に#bem-ruby("かいとう")[回答]を#bem-ruby("さいりよう")[再利用]し、#bem-ruby("ちえん")[遅延]と#bem-ruby("ふか")[負荷]を#bem-ruby("ていげん")[低減]する。

- DNS#bem-ruby("つうしん")[通信]はIPネットワーク#bem-ruby("じょう")[上]でUDP、TCP、または#bem-ruby("あんごうか")[暗号化]された#bem-ruby("ほうしき")[方式]を#bem-ruby("しよう")[使用]する。


== #bem-ruby("つぎ")[次]に#bem-ruby("すす")[進]む#bem-ruby("こうぎ")[講義]


#block(above: 1.35em, below: 1.0em, width: 100%)[
#link("https://study.bem130.com/lecture/information/networks/http-basics.lecture/")[#box(width: 100%, inset: (x: 7pt, y: 5pt), stroke: 0.55pt + rgb("d8dee8"), radius: 3pt, fill: rgb("fbfcfe"))[
#set par(justify: false, leading: 0.35em)
#text(size: 7pt, fill: rgb("5d7796"))[→]#h(0.32em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("f4f6f9"), stroke: 0.45pt + rgb("d7dde6"))[#text(size: 6.8pt, fill: rgb("54657a"))[basics.lecture]]#h(0.32em)#text(size: 9.2pt, weight: 700, fill: rgb("182232"))[HTTP の基本]#h(0.5em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[lecture]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[information]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[networks]]#h(0.24em) \
#text(size: 7pt, fill: rgb("5d7796"))[https://study.bem130.com/lecture/information/networks/http-basics.lecture/]
]]
]


#pagebreak()


#block(above: 0.1em, below: 0.45em, width: 100%)[#text(size: 7pt, fill: luma(125))[data/lecture/information/networks/http-basics.lecture.n.md#h(0.7em)md cd65c2e]]


= HTTP の#bem-ruby("きほん")[基本]


#block(above: 1.35em, below: 1.0em, width: 100%)[
#link("https://study.bem130.com/lecture/information/networks/dns-basics.lecture/")[#box(width: 100%, inset: (x: 7pt, y: 5pt), stroke: 0.55pt + rgb("d8dee8"), radius: 3pt, fill: rgb("fbfcfe"))[
#set par(justify: false, leading: 0.35em)
#text(size: 7pt, fill: rgb("5d7796"))[→]#h(0.32em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("f4f6f9"), stroke: 0.45pt + rgb("d7dde6"))[#text(size: 6.8pt, fill: rgb("54657a"))[basics.lecture]]#h(0.32em)#text(size: 9.2pt, weight: 700, fill: rgb("182232"))[DNSの基本]#h(0.5em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[lecture]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[information]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[networks]]#h(0.24em) \
#text(size: 7pt, fill: rgb("5d7796"))[https://study.bem130.com/lecture/information/networks/dns-basics.lecture/]
]]
]


== #bem-ruby("どうにゅう")[導入]


この#bem-ruby("こうぎ")[講義]では、クライアントが#bem-ruby("しげん")[資源]に#bem-ruby("たい")[対]する#bem-ruby("ようきゅう")[要求]を#bem-ruby("そうしん")[送信]し、サーバが#bem-ruby("しょりけっか")[処理結果]を#bem-ruby("おうとう")[応答]するための#bem-anno("Hypertext Transfer Protocol")[HTTP]の#bem-ruby("いみろん")[意味論]を#bem-ruby("せつめい")[説明]する。HTTP の#bem-ruby("ようきゅう")[要求]と#bem-ruby("おうとう")[応答]を、IP によるパケット#bem-ruby("てんそう")[転送]やトランスポート#bem-ruby("そう")[層]の#bem-ruby("きのう")[機能]と#bem-ruby("くべつ")[区別]する。


== #bem-ruby("しげん")[資源]と#bem-ruby("ひょうげん")[表現]


#bem-anno("Resource")[#bem-ruby("しげん")[資源]]とは、HTTP による#bem-ruby("そうさ")[操作]の#bem-ruby("たいしょう")[対象]であり、#bem-anno("Uniform Resource Identifier")[URI]によって#bem-ruby("しきべつ")[識別]される。Web ページ、#bem-ruby("がぞう")[画像]、API が#bem-ruby("かんり")[管理]するデータなどを#bem-ruby("しげん")[資源]として#bem-ruby("あつか")[扱]える。


#bem-anno("Representation")[#bem-ruby("ひょうげん")[表現]]とは、ある#bem-ruby("じてん")[時点]における#bem-ruby("しげん")[資源]の#bem-ruby("じょうたい")[状態]を#bem-ruby("ひょうげん")[表現]するデータである。#bem-ruby("どういつ")[同一]の#bem-ruby("しげん")[資源]が、HTML、JSON、#bem-ruby("がぞうけいしき")[画像形式]などの#bem-ruby("こと")[異]なる#bem-ruby("ひょうげん")[表現]を#bem-ruby("ていきょう")[提供]することもある。この#bem-ruby("こうぎ")[講義]では、#bem-ruby("しげん")[資源]へのアクセスに#bem-ruby("もち")[用]いるURIを#bem-anno("Uniform Resource Locator")[URL]と#bem-ruby("よ")[呼]ぶ。


HTTP では、#bem-anno("Client")[クライアント]が#bem-ruby("ようきゅう")[要求]を#bem-ruby("そうしん")[送信]し、#bem-anno("Server")[サーバ]がその#bem-ruby("ようきゅう")[要求]を#bem-ruby("しょり")[処理]して#bem-ruby("おうとう")[応答]を#bem-ruby("へんそう")[返送]する。この#bem-ruby("やくわり")[役割]は#bem-ruby("ここ")[個々]の#bem-ruby("こうかん")[交換]に#bem-ruby("たい")[対]して#bem-ruby("さだ")[定]まり、ブラウザに#bem-ruby("げんてい")[限定]されない。


== #bem-ruby("ようきゅう")[要求]と#bem-ruby("おうとう")[応答]の#bem-ruby("いみろん")[意味論]


HTTP #bem-ruby("ようきゅう")[要求]は、#bem-ruby("がいねんてき")[概念的]に#bem-ruby("つぎ")[次]の#bem-ruby("ようそ")[要素]から#bem-ruby("こうせい")[構成]される。


- #bem-anno("Method")[メソッド]: #bem-ruby("しげん")[資源]に#bem-ruby("たい")[対]して#bem-ruby("ようきゅう")[要求]する#bem-ruby("いみ")[意味]を#bem-ruby("してい")[指定]する。

- #bem-anno("Request target")[#bem-ruby("ようきゅうたいしょう")[要求対象]]: #bem-ruby("そうさ")[操作]の#bem-ruby("たいしょう")[対象]を#bem-ruby("してい")[指定]する。

- #bem-anno("Field")[フィールド]: #bem-ruby("ひょうげんけいしき")[表現形式]、#bem-ruby("にんしょう")[認証]、キャッシュなどに#bem-ruby("かん")[関]するメタデータを#bem-ruby("でんたつ")[伝達]する。

- #bem-anno("Content")[#bem-ruby("ないよう")[内容]]: #bem-ruby("ひつよう")[必要]な#bem-ruby("ばあい")[場合]に、#bem-ruby("しょりたいしょう")[処理対象]となる#bem-ruby("ひょうげん")[表現]を#bem-ruby("でんたつ")[伝達]する。


HTTP #bem-ruby("おうとう")[応答]は、#bem-ruby("ようきゅう")[要求]の#bem-ruby("しょりけっか")[処理結果]を#bem-ruby("ぶんるい")[分類]する#bem-anno("Status code")[#bem-ruby("じょうたい")[状態]コード]、フィールド、および#bem-ruby("ひつよう")[必要]に#bem-ruby("おう")[応]じた#bem-ruby("ないよう")[内容]から#bem-ruby("こうせい")[構成]される。#bem-ruby("じょうたい")[状態]コードはサーバ#bem-ruby("じたい")[自体]の#bem-ruby("じょうたい")[状態]ではなく、その#bem-ruby("ようきゅう")[要求]に#bem-ruby("たい")[対]する#bem-ruby("しょりけっか")[処理結果]を#bem-ruby("あらわ")[表]す。


== HTTP/1.1 のメッセージ#bem-ruby("れい")[例]


HTTP/1.1 は、#bem-ruby("かいしぎょう")[開始行]とフィールドをテキスト#bem-ruby("けいしき")[形式]で#bem-ruby("ひょうげん")[表現]する。たとえば、#bem-ruby("つぎ")[次]の#bem-ruby("ようきゅうぎょう")[要求行]は #raw("/index.html") を#bem-ruby("ようきゅうたいしょう")[要求対象]とする GET #bem-ruby("ようきゅう")[要求]である。


#block(fill: luma(245), inset: 8pt, radius: 4pt, width: 100%)[
```http
GET /index.html HTTP/1.1
Host: example.com
Accept: text/html
```
]


#bem-ruby("おうとう")[応答]の#bem-ruby("かいしぎょう")[開始行]には、HTTP のバージョン、#bem-ruby("じょうたい")[状態]コード、#bem-ruby("りゆうく")[理由句]が#bem-ruby("ふく")[含]まれる。


#block(fill: luma(245), inset: 8pt, radius: 4pt, width: 100%)[
```http
HTTP/1.1 200 OK
Content-Type: text/html
```
]


このテキスト#bem-ruby("けいしき")[形式]は HTTP/1.1 の#bem-ruby("ひょうげんほうほう")[表現方法]である。HTTP/2 と HTTP/3 は#bem-ruby("ようきゅうぎょう")[要求行]を#bem-ruby("しよう")[使用]せず、HTTP の#bem-ruby("いみ")[意味]をバイナリフレームで#bem-ruby("ふごうか")[符号化]する。


== メソッドの#bem-ruby("せいしつ")[性質]


#bem-anno("GET")[GET]は、#bem-ruby("ようきゅうたいしょう")[要求対象]となる#bem-ruby("しげん")[資源]について、#bem-ruby("せんたく")[選択]された#bem-ruby("げんざい")[現在]の#bem-ruby("ひょうげん")[表現]の#bem-ruby("てんそう")[転送]を#bem-ruby("ようきゅう")[要求]する。GET は#bem-anno("Safe")[#bem-ruby("あんぜん")[安全]]なメソッドとして#bem-ruby("ていぎ")[定義]され、クライアントはサーバの#bem-ruby("じょうたいへんこう")[状態変更]を#bem-ruby("ようきゅう")[要求]しない。また、#bem-ruby("どういつ")[同一]の GET を#bem-ruby("ふくすうかい")[複数回]#bem-ruby("じっこう")[実行]しても、#bem-ruby("いと")[意図]されるサーバ#bem-ruby("じょう")[上]の#bem-ruby("こうか")[効果]は#bem-ruby("いっかい")[一回]の#bem-ruby("じっこう")[実行]と#bem-ruby("おな")[同]じである。この#bem-ruby("せいしつ")[性質]を#bem-anno("Idempotent")[#bem-ruby("べきとう")[冪等]]という。ただし、アクセスログの#bem-ruby("きろく")[記録]などの#bem-ruby("ふずいてき")[付随的]な#bem-ruby("へんか")[変化]は#bem-ruby("きょよう")[許容]される。


#bem-anno("POST")[POST]は、#bem-ruby("ようきゅう")[要求]に#bem-ruby("ふく")[含]まれる#bem-ruby("ひょうげん")[表現]を、#bem-ruby("ようきゅうたいしょう")[要求対象]となる#bem-ruby("しげん")[資源]に#bem-ruby("こゆう")[固有]の#bem-ruby("いみ")[意味]で#bem-ruby("しょり")[処理]するよう#bem-ruby("ようきゅう")[要求]する。フォームの#bem-ruby("そうしん")[送信]、#bem-ruby("あら")[新]たな#bem-ruby("しげん")[資源]の#bem-ruby("せいせい")[生成]、#bem-ruby("しょり")[処理]の#bem-ruby("きどう")[起動]などに#bem-ruby("りよう")[利用]され#bem-ruby("う")[得]るため、POST を#bem-ruby("たん")[単]なるファイル#bem-ruby("そうしん")[送信]と#bem-ruby("ていぎ")[定義]することはできない。POST は#bem-ruby("いっぱん")[一般]に#bem-ruby("あんぜん")[安全]でも#bem-ruby("べきとう")[冪等]でもない。


== #bem-ruby("じょうたい")[状態]コード


#bem-ruby("じょうたい")[状態]コードの#bem-ruby("せんとうけた")[先頭桁]は、#bem-ruby("しょりけっか")[処理結果]を#bem-ruby("つぎ")[次]のように#bem-ruby("ぶんるい")[分類]する。


- #raw("1xx"): #bem-ruby("じょうほうおうとう")[情報応答]

- #raw("2xx"): #bem-ruby("せいこう")[成功]

- #raw("3xx"): リダイレクション

- #raw("4xx"): クライアントエラー

- #raw("5xx"): サーバエラー


#raw("200 OK") は#bem-ruby("ようきゅう")[要求]が#bem-ruby("せいこう")[成功]したことを#bem-ruby("あらわ")[表]す。#raw("404 Not Found") は、サーバが#bem-ruby("ようきゅうたいしょう")[要求対象]の#bem-ruby("げんざい")[現在]の#bem-ruby("ひょうげん")[表現]を#bem-ruby("はっけん")[発見]できない、またはその#bem-ruby("そんざい")[存在]を#bem-ruby("かいじ")[開示]しないことを#bem-ruby("あらわ")[表]す。したがって、#raw("404") だけから#bem-ruby("しげん")[資源]が#bem-ruby("えいきゅう")[永久]に#bem-ruby("そんざい")[存在]しないとは#bem-ruby("だんてい")[断定]できない。


== HTTPS と TLS


#bem-anno("HTTPS")[HTTPS]は、TLSの#bem-ruby("きのう")[機能]によって#bem-ruby("ほご")[保護]されたHTTP#bem-ruby("つうしん")[通信]を#bem-ruby("あらわ")[表]す。HTTP/1.1とHTTP/2では#bem-anno("Transport Layer Security")[TLS]をTCP#bem-ruby("じょう")[上]で#bem-ruby("しよう")[使用]し、HTTP/3ではTLSの#bem-ruby("あんごうきのう")[暗号機能]とハンドシェイクがQUICへ#bem-ruby("とうごう")[統合]される。TLSは#bem-ruby("つうしんないよう")[通信内容]の#bem-ruby("きみつせい")[機密性]と#bem-ruby("かんぜんせい")[完全性]を#bem-ruby("ほご")[保護]し、#bem-ruby("しょうめいしょ")[証明書]の#bem-ruby("けんしょう")[検証]を#bem-ruby("つう")[通]じて#bem-ruby("つうじょう")[通常]はサーバを#bem-ruby("にんしょう")[認証]する。HTTPSはHTTPの#bem-ruby("ようきゅう")[要求]・#bem-ruby("おうとう")[応答]の#bem-ruby("いみ")[意味]を#bem-ruby("へんこう")[変更]しない。また、TLSによる#bem-ruby("にんしょう")[認証]は、サーバが#bem-ruby("ていきょう")[提供]する#bem-ruby("じょうほうないよう")[情報内容]の#bem-ruby("せいかくせい")[正確性]まで#bem-ruby("ほしょう")[保証]するものではない。


== HTTP のバージョンと#bem-ruby("てんそうほうしき")[転送方式]


#table(
  columns: 3,
  inset: 5pt,
  stroke: 0.4pt + luma(190),
  [#strong[バージョン]],
  [#strong[#bem-ruby("おも")[主]な#bem-ruby("かいてんそう")[下位転送]]],
  [#strong[HTTP メッセージの#bem-ruby("ひょうげん")[表現]]],
  [HTTP/1.1],
  [TCP],
  [テキスト#bem-ruby("けいしき")[形式]の#bem-ruby("かいしぎょう")[開始行]とフィールド],
  [HTTP/2],
  [TCP],
  [バイナリフレーム、#bem-ruby("たじゅうか")[多重化]],
  [HTTP/3],
  [UDP #bem-ruby("じょう")[上]の QUIC],
  [バイナリフレーム、QUIC ストリームによる#bem-ruby("たじゅうか")[多重化]],
)


#bem-ruby("しげん")[資源]、メソッド、#bem-ruby("じょうたい")[状態]コードなどの HTTP の#bem-ruby("いみろん")[意味論]は、これらのバージョンで#bem-ruby("おおむ")[概]ね#bem-ruby("きょうつう")[共通]する。#bem-ruby("いっぽう")[一方]、#bem-ruby("ふごうか")[符号化]と#bem-ruby("かい")[下位]の#bem-ruby("てんそうほうしき")[転送方式]は#bem-ruby("こと")[異]なる。したがって、HTTP が#bem-ruby("つね")[常]に TCP を#bem-ruby("りよう")[利用]するとは#bem-ruby("かぎ")[限]らない。


== DNS および#bem-ruby("かいそう")[下位層]との#bem-ruby("かんけい")[関係]


URL にドメイン#bem-ruby("めい")[名]が#bem-ruby("ふく")[含]まれる#bem-ruby("てんけいてき")[典型的]な Web アクセスでは、クライアントは DNS による#bem-ruby("なまえかいけつ")[名前解決]の#bem-ruby("あと")[後]、#bem-ruby("せんたく")[選択]した IP アドレスへ#bem-ruby("せつぞく")[接続]し、HTTP の#bem-ruby("ようきゅう")[要求]を#bem-ruby("そうしん")[送信]する。ただし、DNS は HTTP の#bem-ruby("いみろん")[意味論]の#bem-ruby("いちぶ")[一部]ではなく、キャッシュされた#bem-ruby("けっか")[結果]や IP アドレスを#bem-ruby("ちょくせつ")[直接]#bem-ruby("しよう")[使用]する#bem-ruby("ばあい")[場合]もある。


IP はパケットを#bem-ruby("あてさき")[宛先]へ#bem-ruby("てんそう")[転送]し、TCP または QUIC は HTTP メッセージを#bem-ruby("うんぱん")[運搬]するための#bem-ruby("きのう")[機能]を#bem-ruby("ていきょう")[提供]する。HTTP は、その#bem-ruby("うえ")[上]で#bem-ruby("しげん")[資源]に#bem-ruby("たい")[対]する#bem-ruby("ようきゅう")[要求]と#bem-ruby("おうとう")[応答]の#bem-ruby("いみ")[意味]を#bem-ruby("きてい")[規定]する。


== #bem-ruby("ようてん")[要点]


- HTTP は、URI で#bem-ruby("しきべつ")[識別]される#bem-ruby("しげん")[資源]に#bem-ruby("たい")[対]する#bem-ruby("ようきゅう")[要求]と#bem-ruby("おうとう")[応答]の#bem-ruby("いみろん")[意味論]を#bem-ruby("きてい")[規定]する。

- メソッドは#bem-ruby("ようきゅう")[要求]の#bem-ruby("いみ")[意味]を、#bem-ruby("じょうたい")[状態]コードは#bem-ruby("しょりけっか")[処理結果]の#bem-ruby("ぶんるい")[分類]を#bem-ruby("あらわ")[表]す。

- HTTPS は HTTP を TLS で#bem-ruby("ほご")[保護]する。HTTP/1.1 と HTTP/2 は#bem-ruby("つうじょう")[通常] TCP を、HTTP/3 は QUIC を#bem-ruby("りよう")[利用]する。


== #bem-ruby("つぎ")[次]に#bem-ruby("すす")[進]む#bem-ruby("こうぎ")[講義]


#block(above: 1.35em, below: 1.0em, width: 100%)[
#link("https://study.bem130.com/lecture/information/database/database-portal.lecture/")[#box(width: 100%, inset: (x: 7pt, y: 5pt), stroke: 0.55pt + rgb("d8dee8"), radius: 3pt, fill: rgb("fbfcfe"))[
#set par(justify: false, leading: 0.35em)
#text(size: 7pt, fill: rgb("5d7796"))[→]#h(0.32em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("f4f6f9"), stroke: 0.45pt + rgb("d7dde6"))[#text(size: 6.8pt, fill: rgb("54657a"))[portal.lecture]]#h(0.32em)#text(size: 9.2pt, weight: 700, fill: rgb("182232"))[database]#h(0.5em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[lecture]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[information]]#h(0.24em)#box(inset: (x: 3.8pt, y: 1.5pt), radius: 6pt, fill: rgb("eef6ff"), stroke: 0.45pt + rgb("9cc8f7"))[#text(size: 6.8pt, fill: rgb("215f9f"))[database]]#h(0.24em) \
#text(size: 7pt, fill: rgb("5d7796"))[https://study.bem130.com/lecture/information/database/database-portal.lecture/]
]]
]
