1. Syntax of Http/1.0

1.1. History of Http

1.1.1. terminology for http protocol

  • IETF (The internet Engineering Task Force)

    인터넷의 접속성을 향상시키는 것을 목적으로 만들어진 임의 단체

  • RFC (Request For Comments)

    IETF가 만든(접속성을 위한) 프로토콜(데이터 형식) 규약 문서

  • IANA (Internet Assigned Numbers Authority)

    Web database (well-known port number, content-type, 등) 관리단체

  • W3C (World Wide World Consortium)

    웹 관련 표준화를 담당하는 비영리 단체 (통신 프로토콜/알고리즘)

  • WHATTWG (Web Hypertext Application Technology Working Group)

    웹 관련 규격을 논의하는 단체

1.2. HTTP/0.9

HTTP/0.9

매우 단순한 프로토콜, 해당 경로의 서버에 해당 문서를 가져오는 프로토콜

Note

0.9 버전은 gohttp에서 지원하지 않고 1.x 이상 버전과 해과 하위 호환성이 없으므로 송수신 모두 0.9버전을 다룰 수 없기 때문에 1.0으로 테스트합니다.

 1package main
 2
 3import (
 4	"fmt"
 5	"log"
 6	"net/http"
 7	"net/http/httputil"
 8)
 9
10func handler(writer http.ResponseWriter, request *http.Request) {
11	dump, err := httputil.DumpRequest(request, true)
12	if err != nil {
13		http.Error(writer, fmt.Sprint(err), http.StatusInternalServerError)
14		return
15	}
16	fmt.Println(string(dump))
17	fmt.Fprintf(writer, "<html><body>hello</body></html>\n")
18}
19
20func main() {
21	var httpServer http.Server
22	http.HandleFunc("/", handler)
23	log.Println("start http listening :18888")
24	httpServer.Addr = ":18888"
25	log.Println(httpServer.ListenAndServe())
26}
$curl --http1.0 --verbose http://127.0.0.1:18888/greeting

*   Trying 127.0.0.1:18888...
* Connected to 127.0.0.1 (127.0.0.1) port 18888 (#0)
> GET /greeting HTTP/1.0
> Host: 127.0.0.1:18888
> User-Agent: curl/7.82.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
* HTTP 1.0, assume close after body
< HTTP/1.0 200 OK
< Date: Mon, 11 Apr 2022 13:41:58 GMT
< Content-Length: 32
< Content-Type: text/html; charset=utf-8
<
<html><body>hello</body></html>
* Closing connection 0

1.3. HTTP/0.9 to HTTP/1.0

HTTP 0.9의 기능:

- 하나의 문서를 전송하는 기능 밖에 없었다.
- 통신되는 문서는 HTML content만 가능했다.
- 클라이언트 쪽에서 검색 이외의 요청을 보낼  없었다.
- 새로운 문장을 정송하거나 갱신 또는 삭제   없었다.

전자메일, 뉴스그룹 프로토콜의 기능을 도입하면서 업데이트가 이루어 졌습니다.

1.4. 전자메일: HTTP의 기원

MIME-Version: 1.0
Received: by 10.176.69.212 with HTTP; Wed, 6...
From:
Date:
Message-ID: <CAAw3=...>
Subject: hi
To: yoshiki@shibu.jp
Content-Type: text/plain; charst=UTF-8

hello
  • header에 추가된 내용:

    - 송신자
    - 버전
    - 보낸 시간
    
  • HTTP에도 차용된 내용

    • client request

      1. User-Agent

      2. Referer

      3. Authorization

    • server response

      1. Content-Type

      2. Content-Length

      3. Content-Encoding

      4. Date

1#!/bin/sh
2
3curl --http1.0 -H "X-Test: Hello" -H "X-Test: World" http://$1 --verbose

1.6. 뉴스그룹: HTTP의 기원

뉴스 그룹은 분산 아키텍처로 되어 있습니다.

복수의 서버가 master/slave구조로 역할이 분배되어 있습니다.
슬레이브 서버 또한 마스터 서버에 접속해 정보를 *shard db* 같은 개념으로 가져왔던 것으로 보입니다.
 계층구조 서버간의 통신 프로토콜이 *NNTP*\[*]입니다.
뉴스그룹은 method와 status code  기능을 남겨주었습니다.

1.6.1. Method

HTTP의 경우는 파일 시스템 같은 설계철학으로 만들어졌습니다.
GET

Get Request for header, content.

HEAD

Get Request for header.

POST

Post Request for New document create.

PUT

Update Request for existing document on url.

DELETE

Delete Request for document on url and url either.

PUT 과 DELETE는 1.0이후에도 유지되었지만, 구현이 강제되는 메서드는 아닌 옵션기능입니다.
실제 위 메서드로 요청을 놸 수 있게 된 것은 XMLHttpRequest 가 지원되고 나서부터 입니다.

curl --http1.0 -X PUT http://examples.com/document/2324/ -d title="new document title"

1.6.2. Status code

스테이터스 코드도 뉴스그룹에서 가져운 기능 중 하나입니다.
1**

Set status for Keep on processing.

2**

Set status for positive output.

3**

Set status for giving an order to a client like redirect to, or need to be cached.

4**

Set status for negative output mainly originated by client’s request.

5**

Set status for negative output mainly originated by internal server’s process.

1.7. Redirections

300 of Statuscode

Status Code

Method change

Permanent

Cache result

DESC

301 Moved Permanently

Required

Permanent

Yes

domain transport, website moved, https

302 Found

Required

Temporary

Allowed (if)

Temporary managed, mobile based

303 See Other

Allowed (if)

Permanent

No

Redirect after Login

307 Temporary Redirect

Temporary

Allowed

302 with no redirect

300 Multiple Choices

Yes

Recommandations

1.8. Response Request Body

Header fields descripting body

Content-Length

Body byte length

Content-Encoding

사용된 압축 알고리즘(content-type gzip, …)

Content-Type

어떤 형식의 데이터 인가? 해석방식, content-negotiation

curl command body acquiring options

--data-ascii

data url-encoded

--data-urlencode

data non url-encoded

--data-binary

Binary data

-T <filename>

Data input from file

1.9. DNS Server

우리가 주소창에 문자로 구성된 Domain name을 입력했을 때, 먼저 ISP가 가진 DNS resolver를 통해 .com, .org와 같은 도메인의 정보담당하는 서버에게서 해당 domain name정보에 대한 담당주소지를 할당 받을 수 있습니다.

전화번호부가 권역 규모별로 나눠져있는 것과 같습니다.

사용하는 도메인 네임을 구매한 회사가 있다면, ISPN에서 해당 도메인 네임을 관리하는 회사의 서버까지 방문한 뒤, 해당 도메인을 IP주소로 전달 받게 됩니다.

https://d1.awsstatic.com/Route53/how-route-53-routes-traffic.8d313c7da075c3c7303aaef32e89b5d0b7885e7c.png
  1. 브라우저를 열고 주소를 www.example.com으로 입력합니다.

  2. www.example.com 은 DNS resolver에게 향하는데, 주로 ISP가 관리하는 서버입니다.

  3. DNS resolver는 DNS root name server로 향하게 합니다.

  4. 이때 TLD, .com에 대한 name server가 example에 대한 주소를 발견하고 해당 주소가 aws route53 name server과 담당하고 있다는 것으로 응답을 종료합니다.

  5. Route 53 네임 서버가 example.com의 hosted zone을 탐색하고, www.example.com레코드를 발견합니다. 관련 정보, IP주소 같은 정보를 취득 후에 DNS Resolver에게 전달하는 것으로 응답을 종료하고 사용자는 IP주소를 획득하게 됩니다.

*

Network News Transfer Protocol, 네트워크 뉴스 전송 프로토콜