๐ŸŽ๏ธ[C] proxy-lab

์ด๊ฐ•์šฑยท2022๋…„ 11์›” 10์ผ
3

๐ŸŽ๏ธ C

๋ชฉ๋ก ๋ณด๊ธฐ
3/3

Proxy-lab

In this lab, you will write a simple HTTP proxy that caches web objects.
- ์ถœ์ฒ˜ : http://csapp.cs.cmu.edu/3e/proxylab.pdf

ํ”„๋ก์‹œ(Proxy)๋ž€ ๋ธŒ๋ผ์šฐ์ €(Web browser)์™€ ์„œ๋ฒ„(end server) ๊ฐ„์˜ 'middleman'.
๋ธŒ๋ผ์šฐ์ €์˜ ์‘๋‹ต์„ ๋ฐ›์•„ ์„œ๋ฒ„์—๊ฒŒ ๋„˜๊ฒจ์ฃผ๊ณ (forward), ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ๋‹ค์‹œ ๋ธŒ๋ผ์šฐ์ €์—๊ฒŒ ๋ณด๋‚ด์ค€๋‹ค(send).

ํ”„๋ก์‹œ๋Š”,

  1. ์„œ๋ฒ„์— ๋Œ€ํ•œ ๋ฐฉํ™”๋ฒฝ(firewall)์˜ ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์ต๋ช…ํ™”(anonymize)ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋Š” ์ •๋ณด๋ฅผ ์„œ๋ฒ„์—๊ฒŒ ๋„˜๊ธฐ์ง€ ์•Š์Œ์œผ๋กœ์จ.
  3. ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ์บ์‹œ(cache)ํ•จ์œผ๋กœ์จ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

Proxy-lab์—์„œ๋Š” ๊ฐ€์žฅ ์šฐ๋ฆฌ์—๊ฒŒ ๊ฐ€์žฅ basicํ•œ proxy๋ฅผ ๋งŒ๋“ค๊ณ , 2๋‹จ๊ณ„์— ๊ฑธ์ณ ๊ฐœ์„ ํ•˜๋„๋ก ์ฃผ๋ฌธํ•œ๋‹ค.

Part I: Implementing a sequential web proxy

  1. "ํ”„๋ก์‹œ์˜ ๊ธฐ๋ณธ ์ •์˜ : ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ์‚ฌ์ด์˜ ์š”์ฒญ/์‘๋‹ต์„ ๋งค๊ฐœํ•˜๋Š” ์—ญํ• . ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์„œ๋ฒ„์—๊ฒŒ ์ „๋‹ฌํ•˜๊ณ , ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋˜๋Œ๋ ค์ค€๋‹ค."
    ์— ์ถฉ์‹คํ•œ ๊ตฌํ˜„์„ ์ผ๋‹จ ํ•˜๋ฉด ๋œ๋‹ค. HTTP/1.0 ๋ฒ„์ „์˜ GET method ์š”์ฒญ๋งŒ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ๋œ๋‹ค. ๋‚˜๋จธ์ง€(POST method ๋“ฑ)๋Š” optional.

  2. ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์ด validํ•œ์ง€๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ์ž์„ธํ•˜๊ฒŒ ์„ค๋ช…๋˜์–ด ์žˆ์ง€๋Š” ์•Š์œผ๋‚˜, ๊ตฌ์ฒด์ ์œผ๋กœ๋Š” ์š”์ฒญ ๋ผ์ธ, ํ—ค๋”๊ฐ€ HTTP ํ”„๋กœํ† ์ฝœ์˜ ํฌ๋งท์— ๋งž๋Š”์ง€๋ฅผ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค
    : ์š”์ฒญ ๋ผ์ธ(method, URI, version), ํ—ค๋”(header-name: header-data).

Part II: Dealing with multiple concurrent requests

  1. ๊ธฐ์กด์˜ sequential proxy๋Š” iterative server ์ฒ˜๋Ÿผ ํ•˜๋‚˜์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์š”์ฒญ ์‹œ๋„๋ฅผ ๋“ค์„ ์ˆ˜ ์—†๋‹ค. ๋”ฐ๋ผ์„œ ๋™์‹œ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ์š”์ฒญ์— ์‘๋‹ตํ•  ์ˆ˜ ์žˆ๋Š” proxy๋กœ ๊ฐœ์„ ํ•œ๋‹ค. pthread๋ฅผ ์ด์šฉํ•ด ๋™์‹œ์„ฑ ๊ตฌํ˜„์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

Part III: Caching web objects

  1. ์•„์ฃผ ๊ฐ„๋‹จํ•œ ์บ์‹ฑ์„ ํ•˜๋Š” ํ”„๋ก์‹œ๋กœ ๊ฐœ์„ ํ•œ๋‹ค.
    ์บ์‹ฑ ๊ฐ€๋Šฅํ•œ ์›น object ํฌ๊ธฐ (MAX_OBJECT_SIZE)๊ฐ€ ์ •ํ•ด์ ธ ์žˆ๊ณ , ์บ์‹œ๋œ object๋“ค์˜ ํฌ๊ธฐ ํ•ฉ์€ ๋‹ค์‹œ MAX_CACHE_SIZE๋ฅผ ๋„˜์„ ์ˆ˜ ์—†๋„๋ก ๊ตฌํ˜„ํ•œ๋‹ค

  2. LRU(Least-recently-used) ์‚ญ์ œ ์ •์ฑ…(eviction policy)์„ ์ ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ๋‹ค.

  3. ์บ์‹œ ์ ‘๊ทผ์ด '์Šค๋ ˆ๋“œ์„ธ์ดํ”„'(์—ฌ๋Ÿฌ์Šค๋ ˆ๋“œ์—์„œ ๋™์‹œ์— ์ ‘๊ทผํ•ด๋„ ํ”„๋กœ๊ทธ๋žจ์ด ์•ˆ์ „ํ•ด์•ผ ํ•จ) ํ•˜๋„๋ก ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

๊ตฌํ˜„ ์ด์Šˆ

rio_readnb vs rio_readn

Proxy๊ฐ€ ์„œ๋ฒ„์—์„œ ๋ฐ›์€ ์‘๋‹ต์˜ contents(body)๋ฅผ ์ž์‹ ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋ฒ„ํผ(ํ•ด๋‹น ์‘๋‹ต์˜ ํฌ๊ธฐ๋งŒํผ malloc์œผ๋กœ ํ• ๋‹น ํ–ˆ๋‹ค)์— ์ž ์‹œ ๋„ฃ์–ด๋‘๊ณ , ๋‹ค์‹œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •์ด ์žˆ๋‹ค. ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ๋œ socket์—์„œ proxy์˜ ๋ฒ„ํผ๋กœ read ํ•  ๋•Œ, ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜๊ฐ€ ๋‘ ๊ฐ€์ง€ : rio_readn(), rio_readnb() ์žˆ์—ˆ๋Š”๋ฐ, rio_readnb()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‘๋‹ต์ด ๋ฌธ์ œ ์—†์ด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ „๋‹ฌ๋˜์—ˆ์ง€๋งŒ, rio_readn()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฐ๋ฐœ์ ์œผ๋กœ ์™„์ „ํ•˜์ง€ ๋ชปํ•œ ์‘๋‹ต์ด ์ „๋‹ฌ๋˜๋Š” ํ˜„์ƒ์ด ์žˆ์—ˆ๋‹ค. ์›์ธ์„ ์ฐพ๊ณ ์ž ๋งŽ์€ ๊ณ ๋ฏผ๊ณผ ์‹œ๋„๋ฅผ ํ–ˆ๋‹ค.

RIO (Robust I/O)
๊ฐ€์žฅ ๋จผ์ € ์œ„์—์„œ ์–ธ๊ธ‰๋œ ํ•จ์ˆ˜์˜ ์ƒ์œ„ ํŒจํ‚ค์ง€์ธ RIO package์˜ ํŠน์„ฑ์„ ๋œฏ์–ด๋ดค๋‹ค.
๊ธฐ๋ณธ I/O ํ•จ์ˆ˜์ธ ssize_t read(int fd, void *buf, size_t n) ์€ fd์˜ ํ˜„์žฌ ํŒŒ์ผ ์œ„์น˜์—์„œ ์ตœ๋Œ€ n ๋ฐ”์ดํŠธ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜ buf๋กœ ๋ณต์‚ฌํ•˜๊ณ , ์ž์‹ ์ด ์‹ค์ œ๋กœ ์ „์†กํ•œ ๋ฐ”์ดํŠธ ์ˆ˜๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. ๋ฆฌํ„ด ๊ฐ’ -1์€ ์—๋Ÿฌ๋ฅผ, 0์€ EOF๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
์ฃผ์˜ํ•  ์ ์€ '์ตœ๋Œ€ n' ๋ฐ”์ดํŠธ๋ผ๋Š” ์ . ์ฆ‰, ์šฐ๋ฆฌ๊ฐ€ read() ์—๊ฒŒ ์š”์ฒญํ•œ n ๋ณด๋‹ค ์ ์€ ์–‘์„ ์ฝ์–ด์ค„ ์ˆ˜๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ฑ…์—์„œ๋Š” ์ด๋ฅผ short count๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ์ •์˜ํ•œ๋‹ค. ์ด์— ๋Œ€ํ•ด์„œ๋Š” ์„ธ๊ฐ€์ง€ ์ •๋„์˜ ์›์ธ์ด ์žˆ๋Š”๋ฐ, ์•„๋ž˜์™€ ๊ฐ™๋‹ค :

  1. EOF๋ฅผ ์ฝ๊ธฐ ์ค‘์— ๋งŒ๋‚ฌ์„ ๋•Œ.
    20๋ฐ”์ดํŠธ๋งŒ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ํŒŒ์ผ์˜ ํ˜„์žฌ ํŒŒ์ผ ์œ„์น˜์—์„œ 50๋ฐ”์ดํŠธ๋ฅผ ํ•œ ๋ฒˆ์— ์ฝ์œผ๋ ค ํ•œ๋‹ค๋ฉด, ๋‹น์—ฐํžˆ read๋Š” 50์ด ์•„๋‹Œ 20์„ ๋ฆฌํ„ดํ•  ๊ฒƒ์ด๊ณ , ์ด ๋•Œ short count๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. ํ„ฐ๋ฏธ๋„์—์„œ ํ…์ŠคํŠธ ์ค„์„ ์ฝ์„ ๋•Œ.
    ๋งŒ์•ฝ ์—ด๋ฆฐ ํŒŒ์ผ์ด ํ„ฐ๋ฏธ๋„๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉด, ๊ฐ read()๋Š” ํ•œ ๋ฒˆ์— ํ•œ ๊ฐœ์˜ ํ…์ŠคํŠธ ์ค„์„ ์ „์†กํ•  ๊ฒƒ์ด๋‹ค. ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด read()์—๊ฒŒ ์š”์ฒญํ•œ ํฌ๊ธฐ๊ฐ€ ์ด ํ…์ŠคํŠธ ์ค„์˜ ํฌ๊ธฐ๋ณด๋‹ค ์ปธ๋‹ค๋ฉด, short count๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค๊ณ  ๋ง ํ•  ์ˆ˜ ์žˆ๋‹ค.

  3. ๋„คํŠธ์›Œํฌ ์†Œ์ผ“์„ ์ฝ๊ฑฐ๋‚˜ ์“ธ ๋•Œ.
    ์—ด๋ฆฐ ํŒŒ์ผ์ด ๋„คํŠธ์›Œํฌ ์†Œ์ผ“์ด๋ผ๋ฉด, ๋‚ด๋ถ€ ๋ฒ„ํผ๋ง ์ œ์•ฝ(์ปค๋„์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ๋‚ด๋ถ€ ์†Œ์ผ“ ๋ฒ„ํผ๊ฐ€ ์กด์žฌํ•œ๋‹ค)๊ณผ ๊ธด ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์‹œ๊ฐ„ ๋•Œ๋ฌธ์— read()์™€ write() ํ˜ธ์ถœ ์‹œ short count๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹ค์ œ๋กœ, ๋””์Šคํฌ ํŒŒ์ผ์„ ์ฝ์„ ๋•Œ๋Š” EOF๋ฅผ ์ œ์™ธํ•˜๊ณ ๋Š” short count๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋””์Šคํฌ ํŒŒ์ผ์— ์“ธ ๋•Œ๋Š” ์ ˆ๋Œ€๋กœ short count๋ฅผ ๋งŒ๋‚˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ 3๋ฒˆ์˜ ๊ฒฝ์šฐ์™€ ๊ฐ™์ด, ๋„คํŠธ์›Œํฌ ์†Œ์ผ“์— ๊ด€๋ จ๋œ I/O์— ๋Œ€ํ•ด์„œ๋Š” short count๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๊ณ , ์ด๋Š” ๊ณง ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ '์š”์ฒญํ•œ ํฌ๊ธฐ' ๋งŒํผ์˜ I/O๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง€๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์•ˆ์ •๋œ ํ”„๋กœ๊ทธ๋žจ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์—†์„ ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ short count ์ƒํ™ฉ์— ๊ตดํ•˜์ง€ ์•Š๋Š” ๊ฒฌ๊ณ ํ•œ(robust) I/O๋ฅผ ๊ตฌํ˜„ํ•œ ๊ฒƒ์ด RIO ํŒจํ‚ค์ง€์™€ ๊ทธ ํ•จ์ˆ˜๋“ค์ด๋‹ค.

์•ž์„œ ์–ธ๊ธ‰ํ•œ ์ด์Šˆ๋ฅผ ๋งž๋‹ฅ๋“œ๋ ธ์„ ๋•Œ, ๋‚˜์™€ ํŒ€์›๋“ค์€ rio_readn()ํ•จ์ˆ˜๊ฐ€ RIO ํŒจํ‚ค์ง€ ํ•จ์ˆ˜์ž„์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์–ด๋”˜๊ฐ€ ๋ชจ๋ฅด๊ฒŒ short count์— ๋Œ€์‘ํ•˜์ง€ ๋ชปํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ ์„œ ๋ฌธ์ œํ•ด๊ฒฐ์„ ์‹œ๋„ํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ตฌ์ฒด์ ์ธ ํ•จ์ˆ˜ ๊ตฌํ˜„ ๋‚ด์šฉ์„ ํ™•์ธํ•œ ๊ฒฐ๊ณผ, rio_readn(), rio_readnb() ํ•จ์ˆ˜ ๋ชจ๋‘ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์ด ์š”์ฒญํ•œ 'n'๋งŒํผ์„ ์ฝ์–ด๋“ค์ผ ๋•Œ๊นŒ์ง€ read()๋ฅผ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ˜ธ์ถœํ•ด ์ฃผ๊ณ  ์žˆ์Œ์—๋Š” ํ‹€๋ฆผ์ด ์—†์—ˆ๋‹ค.

๊ฒฐ๊ตญ ๋‚˜์ค‘์— ์ฐพ์€ ์›์ธ์€, ์‘๋‹ต body๋ฅผ read ํ•˜๊ธฐ ์ „์— header๋ฅผ ์ฝ์„ ๋•Œ ์‚ฌ์šฉํ–ˆ๋˜ readlineb()์— ์žˆ์—ˆ๋‹ค.

RIO์—์„œ ์ œ๊ณตํ•˜๋Š” readํ•จ์ˆ˜๋Š” ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜์™€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜๋กœ ๋‚˜๋‰  ์ˆ˜ ์žˆ๋‹ค.
๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜ :

  • ssize_t rio_readlineb(rio_t *rp, void *usrbuf, size_t maxlen)
  • ssize_t rio_readnb(rio_t *rp, void *usrbuf, size_t n)
  • ๊ฐ ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€์—์„œ ์‹ค์ œ๋กœ readํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜
    • static ssize_t rio_read(rio_t *rp, char *usrbuf, size_t n)

๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜ :

  • ssize_t rio_readn(int fd, void *usrbuf, size_t n)
  • ๊ฐ ํ•จ์ˆ˜์˜ ๋‚ด๋ถ€์—์„œ ์‹ค์ œ๋กœ readํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ํ•จ์ˆ˜
    • ssize_t read(int fd, void *vuf, size_t n) : ํ‘œ์ค€ I/O ํ•จ์ˆ˜

๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜์—์„œ ์ฃผ๋ชฉํ•ด์•ผ ํ•  ์ ์€, 1. ๊ฐ ํ•จ์ˆ˜๋“ค์˜ ๋‚ด๋ถ€์—์„œ ๋˜ํ•˜๋‚˜์˜ RIO ํŒจํ‚ค์ง€ ํ•จ์ˆ˜์ธ rio_read()๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค๋Š” ๊ฒƒ๊ณผ, 2. ํ•จ์ˆ˜๋“ค์ด ์„œ๋กœ rio_t๋ผ๋Š” ๊ตฌ์กฐ์ฒด๋ฅผ ๊ณต์œ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.



1. rio_read()๋Š” ๋ฆฌ๋ˆ…์Šคread() ํ•จ์ˆ˜์˜ ๋ฒ„ํผํ˜• ๋ฒ„์ „์ด๋‹ค. 7๋ฒˆ ๋ผ์ธ์„ ๋ณด๋ฉด, ๋งค read() ํ˜ธ์ถœ๋งˆ๋‹ค rio_buf์˜ ๋ฒ„ํผ ํฌ๊ธฐ(ํ•ญ์ƒ RIO_BUFSIZE)๋งŒํผ ์ฝ์–ด์™€์„œ rio_buf๋ฅผ ๊ฝ‰ ์ฑ„์›Œ๋‘”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ž์‹ ์„ ๋ถ€๋ฅธ ํ•จ์ˆ˜๊ฐ€(๋˜๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด) ์š”์ฒญํ•œ ํฌ๊ธฐ์ธ n๋งŒํผ ๋ฒ„ํผ์—์„œ ๋–ผ์„œ ์ฃผ๋Š” ํ˜•์‹์ด๋‹ค. ๋”ฐ๋ผ์„œ ํ•ญ์ƒ ๋ฒ„ํผ๊ฐ€ ๋น„์›Œ์ง€๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ฏ€๋กœ, ๋ฒ„ํผ์—์„œ ์–ด๋””๊นŒ์ง€ ์ฝ์–ด์„œ ์ „๋‹ฌํ–ˆ๋Š”์ง€ ๊ธฐ์–ตํ•  ์ˆ˜ ์žˆ๋Š” ํฌ์ธํ„ฐ rio_bufptr์ด ํ•„์š”ํ•˜๋‹ค. 2. rio_t๊ตฌ์กฐ์ฒด๋ฅผ ๊ณต์œ ํ•˜๋Š” ํ•จ์ˆ˜๋“ค์€ ๊ฒฐ๊ตญ ์ด rio_bufptr๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. rio_t ๊ตฌ์กฐ์ฒด๋Š” ํ•˜๋‚˜์˜ ์†Œ์ผ“์— ๋Œ€ํ•ด ์ดˆ๊ธฐํ™”๋˜๋ฏ€๋กœ, ํ•˜๋‚˜์˜ ์†Œ์ผ“์— ๋Œ€ํ•ด ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•จ์ˆ˜๋“ค๋ผ๋ฆฌ๋Š” ์„œ๋กœ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ํ˜ธ์ถœ๋˜์–ด๋„ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ์ง€ ์•Š๋Š”๋‹ค.

RIO input functions are thread-safe (Section 12.7.1) and can be interleaved arbitrarily on the same descriptor. For example, you can read some text lines (rio_readlineb()) from a descriptor, then some binary data (rio_readn()), and then some more text lines (rio_readlineb()).
- ์ถœ์ฒ˜ : CSAPP 10.5 - Robust Reading and Writing with the RIO Package

ํ•˜์ง€๋งŒ, rio_readn()์€ ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•จ์ˆ˜์ด๊ธฐ์—, rio_t ๊ตฌ์กฐ์ฒด๋ฅผ ๊ณต์œ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ๊ทธ์ € ํ•œ ์†Œ์ผ“์— ๋Œ€ํ•œ ๋ฐ”๋กœ ์ด์ „์˜ ์ฝ๊ธฐ ํ˜ธ์ถœ์˜ ๋์ง€์ ์—์„œ ๋ถ€ํ„ฐ readํ•œ๋‹ค. ๊ทธ๋ž˜์„œ rio_readlineb()๋ฅผ ํ•œ ์ดํ›„์—, rio_readn()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, ์‹ค์ œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ „์†ก๋ฐ›์€ ๋ฐ์ดํ„ฐ ๋ฐ”๋กœ ์ดํ›„์˜ ๋ฐ์ดํ„ฐ๋ถ€ํ„ฐ ์ฝ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ๋ฒ„ํผ๋ฅผ ์‚ฌ์šฉํ•œ rioํ•จ์ˆ˜๊ฐ€ ์ฝ์–ด๋“ค์˜€๋˜ ๋ฒ„ํผ์˜ ๋ ๋ฐ์ดํ„ฐ์—์„œ๋ถ€ํ„ฐ ์ฝ์–ด๋“ค์ด๊ฒŒ ๋œ๋‹ค. ๋ฐ”๋กœ ์ด ๊ณผ์ •์—์„œ ์‘๋‹ต body๊ฐ€ ๋ถˆ์™„์ „ํ•˜๊ฒŒ ๊ตฌ์„ฑ๋˜์—ˆ๋˜ ๊ฒƒ์ด์—ˆ๋‹ค.

ํŒจํ‚ค์ง•์ด ๋œ ํ•จ์ˆ˜๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ฐ„ํŽธํ•˜๊ณ , ์‹ค์šฉ์ ์ด๊ณ , ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ๋‚ด๋ถ€์ ์ธ ๊ตฌ์กฐ๋ฅผ ์ „ํ˜€ ๋ชจ๋ฅด๋Š” ์ฑ„๋กœ programming voodoo๋ฅผ ํ•ด์„œ๋Š” ์•ˆ๋  ์ผ์ž„์„ ์ด๋ฒˆ ์ด์Šˆ๋ฅผ ํ†ตํ•ด ์ ˆ์‹คํžˆ ๋Š๊ผˆ๋‹ค.

LRU implementation

๋จผ์ €, cache object๋ฅผ ํฌํ•จํ•œ ๊ตฌ์กฐ์ฒด๋“ค์„ node๋กœ ๊ฐ€์ง€๋Š” Doulbly Linked List๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ทธ ๋ฆฌ์ŠคํŠธ๋ฅผ LIFO ๋ฐฉ์‹์œผ๋กœ ๊ด€๋ฆฌํ•˜๋„๋ก ํ–ˆ๋‹ค. ๊ฐ cache node๋Š” ์š”์ฒญ URI string field๋กœ ์‹๋ณ„๋˜๋ฉฐ, ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์— ๋Œ€ํ•œ cache๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•  ๋•Œ list์˜ ๊ฐ node๋ฅผ ์„ ํ˜•์ ์œผ๋กœ ํƒ์ƒ‰ํ•œ๋‹ค.

  1. cache object๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ๋‹ค๋ฉด, hit๋œ cache object๋ฅผ list์˜ top์œผ๋กœ ๋Œ์–ด ์˜ฌ๋ฆฐ๋‹ค.

  2. ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ์˜ ์ƒˆ๋กœ์šด ์‘๋‹ต์„ cacheํ•˜๊ณ ์ž ํ•  ๋•Œ MAX_CACHE_SIZE๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ์ƒํ™ฉ์ด๋ผ๋ฉด,
    list์˜ ๋์— ์žˆ๋Š” (top์œผ๋กœ๋ถ€ํ„ฐ ๊ฐ€์žฅ ๋ฉ€๋ฆฌ ์žˆ๋Š”) node๋ฅผ ์‚ญ์ œํ•˜๊ณ , ์ƒˆ๋กœ์šด cache object๋ฅผ list์— ์ถ”๊ฐ€ํ•œ๋‹ค.

  3. sentinel node๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ์˜ ์‚ฝ์ž…๊ณผ ์‚ญ์ œ ์‹œ์˜ ํฌ์ธํ„ฐ๋“ค์˜ ๊ฐฑ์‹ ์„ ์šฉ์ดํ•˜๊ฒŒ ํ–ˆ๋‹ค.

๋ฐฐ๊ฒฝ์ง€์‹

ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๋ชจ๋ธ

  • ํ•œ ๊ฐœ์˜ ์„œ๋ฒ„ ํ”„๋กœ์„ธ์Šค, ํ•œ ๊ฐœ ์ด์ƒ์˜ ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ์„ธ์Šค
  • ์—ฐ์‚ฐ์˜ ๊ฐ€์žฅ ๊ธฐ๋ณธ ๋‹จ์œ„๋Š” ํŠธ๋žœ์žญ์…˜ (์š”์ฒญ - ์‘๋‹ต)
  • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” ํ”„๋กœ์„ธ์Šค์ž„.

๋„คํŠธ์›Œํฌ

  • ๋„คํŠธ์›Œํฌ๋Š” ๋‹จ์ง€ ๋˜ ๋‹ค๋ฅธ I/O ๋””๋ฐ”์ด์Šค.
  • LAN : Local Area Network
  • Ethernet : ๊ฐ€์žฅ ๋Œ€์ค‘์ ์ธ LAN ๊ธฐ์ˆ 
  • Ethernet segment : ํ˜ธ์ŠคํŠธ๋“ค์ด ํ—ˆ๋ธŒ๋กœ ์—ฐ๊ฒฐ๋˜์–ด์žˆ๋Š” ๋„คํŠธ์›Œํฌ ๋‹จ์œ„
    ํ˜ธ์ŠคํŠธ - ์–ด๋Œ‘ํ„ฐ / ํ—ˆ๋ธŒ - ํฌํŠธ
    ํ—ˆ๋ธŒ๋Š” ๊ฐ ํฌํŠธ์—์„œ ์ˆ˜์‹ ํ•œ ๋น„ํŠธ๋ฅผ ๋‹ค๋ฅธ ๋ชจ๋“  ๋น„ํŠธ๋กœ ๋ณต์‚ฌ. ๊ทธ๋ž˜์„œ ๋ชจ๋“  ํ˜ธ์ŠคํŠธ๋Š” ๋ชจ๋“  ๋น„ํŠธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Œ.
  • Ethernet adapter : ์–ด๋Œ‘ํ„ฐ์˜ ๋น„ํœ˜๋ฐœ์„ฑ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๊ณ ์œ ํ•œ 48๋น„ํŠธ ์ฃผ์†Œ.
  • frame : LAN์—์„œ ์ „์†ก ๋‹จ์œ„
    header bit : source, destination, ํ”„๋ ˆ์ž„ ๊ธธ์ด
    data bit : data
  • bridged ethernet : ๋‹ค์ˆ˜์˜ ์ด๋”๋„ท ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ์—ฐ๊ฒฐ๋œ LAN
    ์–ด๋–ค ํ˜ธ์ŠคํŠธ๊ฐ€ ์–ด๋–ค ํฌํŠธ์—์„œ ๋„๋‹ฌ ๊ฐ€๋Šฅํ•œ์ง€ ์žฅ๊ธฐ๊ฐ„์— ๊ฑธ์ณ ํ•™์Šต.
    ์„ ํƒ์ ์œผ๋กœ ํ•˜๋‚˜์˜ ํฌํŠธ์—์„œ ๋‹ค๋ฅธ ํฌํŠธ๋กœ ํ”„๋ ˆ์ž„์„ ๋ณต์‚ฌ.
  • router : ๋„คํŠธ์›Œํฌ๊ฐ„ ์—ฐ๊ฒฐ์„ ๊ตฌ์„ฑํ•˜๋Š” ํŠน๋ณ„ํ•œ ์ปดํ“จํ„ฐ
    ๊ฐ ๋ผ์šฐํ„ฐ๋Š” ์ž์‹ ์ด ์—ฐ๊ฒฐ๋˜๋Š” ๊ฐ ๋„คํŠธ์›Œํฌ์— ๋Œ€ํ•ด ์–ด๋Œ‘ํ„ฐ(ํฌํŠธ)๋ฅผ ๊ฐ€์ง.
  • WAN : Wide Area Network
    ๋ผ์šฐํ„ฐ๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ๋œ ๋„คํŠธ์›Œํฌ ๋ชจ์ž„.
  • internet : LAN๊ณผ WAN๋“ค๋กœ๋ถ€ํ„ฐ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ด์ฒด์  ๋„คํŠธ์›Œํฌ
    ์„œ๋กœ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋„คํŠธ์›Œํฌ๋“ค๋ผ๋ฆฌ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€๋งŒ ๋ฐ์ดํ„ฐ ์ „์†ก์ด ๊ฐ€๋Šฅ
    ์–ด๋–ป๊ฒŒ? โฌ‡๏ธ
    ํ˜ธ์ŠคํŠธ ๋˜๋Š” ๋ผ์šฐํ„ฐ์—์„œ ๋Œ๊ณ ์žˆ๋Š”, ๋ฏธ๋ฆฌ ์•ฝ์†๋œ ๋ฐฉ๋ฒ•(protocol)์„ ๊ตฌํ˜„ํ•ด๋†“์€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ํ†ตํ•ด.
  • internet protocol : ํ˜ธ์ŠคํŠธ๋“ค๊ณผ ๋ผ์šฐํ„ฐ๋“ค์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด์„œ ์–ด๋–ป๊ฒŒ ํ˜‘๋ ฅํ• ์ง€๋ฅผ ์•ฝ์†ํ•ด๋†“์€ ๊ฒƒ.
    • Naming Scheme : ์„œ๋กœ ๋‹ค๋ฅธ LAN์€ ํ˜ธ์ŠคํŠธ์— ์ฃผ์†Œ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์„œ๋กœ ๋‹ค๋ฆ„. internet protocol์€ ํ˜ธ์ŠคํŠธ์˜ ์ฃผ์†Œ๋ฅผ ์œ„ํ•œ ํ†ต์ผ๋œ ํฌ๋งท์„ ์ •์˜.
    • delivery mechanism : ์„œ๋กœ ๋‹ค๋ฅธ ๋„คํŠธ์›Œํ‚น ๊ธฐ์ˆ ์€ ๋น„ํŠธ ์ธ์ฝ”๋”ฉ ๋ฐฉ๋ฒ• / ํ”„๋ ˆ์ž„ ๋‚ด์— ํŒจํ‚ค์ง•ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์„œ๋กœ ๋‹ค๋ฅด๋‹ค. internet protocol์€ packet์ด๋ผ๋Š” ๋น„์—ฐ์†์  ๋‹จ์œ„๋กœ ๋ฌถ๋Š” ํ†ต์ผ๋œ ๋ฐฉ๋ฒ•์„ ์ •์˜.
      packet = header(source, destination, size) + data
      ๋ณดํ†ต LAN์˜ frame(header+data)์—์„œ data ๋ถ€๋ถ„์ด internet packet.

๊ธ€๋กœ๋ฒŒ IP Internet

  • ๊ธ€๋กœ๋ฒŒ IP Internet : internet์— ๋Œ€ํ•œ ๊ฐ€์žฅ ์œ ๋ช…ํ•˜๊ณ  ์„ฑ๊ณต์ ์ธ ๊ตฌํ˜„.
  • ๋ฏธ๋ฆฌ ์•ฝ์†๋œ ๋ฐฉ๋ฒ•์€ TCP/IP ๋ฅผ ์‚ฌ์šฉ.
    TCP ๋Š” IP์œ„์— ๊ตฌํ˜„๋œ ๋ณต์žกํ•œ ํ”„๋กœํ† ์ฝœ. ํ”„๋กœ์„ธ์Šค๋“ค ๊ฐ„์— '์•ˆ์ „ํ•œ ์™„์ „ ์–‘๋ฐฉํ–ฅ' ์—ฐ๊ฒฐ์„ ์ œ๊ณต.
  • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” socket interface์™€ Unix I/O ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ํ†ต์‹ ํ•จ
  • IP๋Š” ์•„๋ž˜์˜ ์†์„ฑ์„ ๊ฐ€์ง
    • Naming Scheme : basic naming scheme
    • delivery mechanism : datagram(packet)
  • Internet์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŠน์ง•์„ ๊ฐ–๋Š”, ์ „ ์„ธ๊ณ„์˜ ํ˜ธ์ŠคํŠธ์˜ ์ง‘ํ•ฉ
    • ํ˜ธ์ŠคํŠธ๋Š” 32bit IP ์ฃผ์†Œ๋ฅผ ๊ฐ–๋Š”๋‹ค.
      IP ์ฃผ์†Œ์˜ ์ง‘ํ•ฉ์€ Internet Domain Name ์ง‘ํ•ฉ์— ๋งคํ•‘๋œ๋‹ค.
    • ํ•˜๋‚˜์˜ ์ธํ„ฐ๋„ท ํ˜ธ์ŠคํŠธ์˜ ํ”„๋กœ์„ธ์Šค๋Š” '์—ฐ๊ฒฐ'์„ ํ†ตํ•ด ๋‹ค๋ฅธ ์ธํ„ฐ๋„ท ํ˜ธ์ŠคํŠธ์˜ ํ”„๋กœ์„ธ์Šค์™€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.

IP ์ฃผ์†Œ

  • IP ์ฃผ์†Œ๋Š” unsigned int (32bit).
  • ๋„คํŠธ์›Œํฌ ๋ฐ”์ดํŠธ ์ˆœ์„œ๋Š” '๋น…์—”๋””์•ˆ'
    • ๋น… ์—”๋””์•ˆ : ์ตœ์ƒ์œ„ ๋ฐ”์ดํŠธ(๋†’์€ ์ž๋ฆฌ์ˆ˜์— ํ•ด๋‹นํ•˜๋Š” ๋ฐ”์ดํŠธ)๋ถ€ํ„ฐ ๋ฉ”๋ชจ๋ฆฌ์— ์“ด๋‹ค.(์‚ฌ๋žŒ์ด ์ฝ๋Š” ๋ฐฉ์‹๊ณผ ๋™์ผ) ๋””๋ฒ„๊ทธ๊ฐ€ ํŽธํ•˜๋‹ค.
    • ๋ฆฌํ‹€ ์—”๋””์•ˆ : ์ตœํ•˜์œ„ ๋ฐ”์ดํŠธ๋ถ€ํ„ฐ ๋ฉ”๋ชจ๋ฆฌ์— ์“ด๋‹ค. ํ•˜์œ„ ๋ฐ”์ดํŠธ๋“ค๋งŒ ํ•„์š”ํ•  ๋•Œ ํŽธํ•˜๋‹ค.

๋„๋ฉ”์ธ

  • ๋„๋ฉ”์ธ ์ด๋ฆ„๋“ค์˜ ์ง‘ํ•ฉ์€ IP ์ฃผ์†Œ ์ง‘ํ•ฉ์œผ๋กœ ๋งคํ•‘๋˜์–ด ์žˆ์Œ. ์‚ฌ๋žŒ๋“ค์ด ์ฝ๊ณ  ์“ฐ๊ธฐ ํŽธํ•˜๊ฒŒ.

  • ํ•˜๋‚˜์˜ ๋„๋ฉ”์ธ ์ด๋ฆ„์€ ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

    • First-level domain names : com, edu, gov, org, net ๋“ฑ๋“ฑ
    • Second-level domain names : ICANN์ธ์ • ๋Œ€ํ–‰์‚ฌ๊ฐ€ ํš๋“ํ•œ domain name์— ํ•ด๋‹น.
    • ์ด ์•„๋ž˜ ๋‹จ๊ณ„์˜ ๋„๋ฉ”์ธ ๋ ˆ๋ฒจ์€ ๊ทธ ๋„๋ฉ”์ธ์„ ๊ฐ€์ง„ ์กฐ์ง์ด ์ž์œ ๋กญ๊ฒŒ ์ƒ์„ฑ ๊ฐ€๋Šฅ.
  • ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ, ๋‹ค์ˆ˜์˜ ๋„๋ฉ”์ธ ์ด๋ฆ„๋“ค์€ ๋‹ค์ˆ˜์˜ IP์ฃผ์†Œ๋กœ ๋งคํ•‘๋  ์ˆ˜ ์žˆ๋‹ค. (๋กœ๋“œ ๋ฐธ๋Ÿฐ์‹ฑ ๋“ฑ์˜ ์ด์œ )

์†Œ์ผ“

  • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” ์—ฐ๊ฒฐ์„ ํ†ตํ•ด์„œ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์„ ์ฃผ๊ณ ๋ฐ›๋Š” ํ˜•์‹์œผ๋กœ ํ†ต์‹ .
  • ์†Œ์ผ“์ด๋ž€
    • ์ปค๋„์˜ ๊ด€์ : ์†Œ์ผ“์€ ํ†ต์‹ ์„ ์œ„ํ•œ ๋์ .
    • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ด€์ : ์†Œ์ผ“์€ ํ•ด๋‹น ์‹๋ณ„์ž๋ฅผ ๊ฐ€์ง€๋Š” ์—ด๋ฆฐ ํŒŒ์ผ
  • ํ•˜๋‚˜์˜ ์†Œ์ผ“์€ IP์ฃผ์†Œ์™€ 16bit int port๋ฒˆํ˜ธ๋กœ ์ด๋ฃจ์–ด ์ง.

  • ์†Œ์ผ“ ์ธํ„ฐํŽ˜์ด์Šค์—์„œ ์†Œ์ผ“์€ active socket, listening socket ์œผ๋กœ ๋‚˜๋‰  ์ˆ˜ ์žˆ๋‹ค.
    socket()์œผ๋กœ ์†Œ์ผ“ ์‹๋ณ„์ž(ํŒŒ์ผ)์„ ๋งŒ๋“ค๋ฉด, ์ผ๋‹จ ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ํ•ญ์ƒ active socket์ด๋‹ค.
    ์ด ์ƒํƒœ์—์„œ ํ•ด๋‹น ์†Œ์ผ“์— ๋Œ€ํ•ด connect()๋ฅผ ํ•˜๋ฉด active socket์œผ๋กœ์„œ ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ๋งŒ๋“ค์–ด์ง„ ์†Œ์ผ“ ์‹๋ณ„์ž๋ฅผ bind()์™€ listen()์„ ์‚ฌ์šฉํ•ด ํด๋ผ์ด์–ธํŠธ๋กœ๋ถ€ํ„ฐ์˜ ์š”์ฒญ์„ '๋“ค์„ ์ˆ˜ ์žˆ๋Š”' listening socket์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์ƒํƒœ์—์„œ ํ•ด๋‹น ์†Œ์ผ“์— ๋Œ€ํ•ด accept()๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ ์š”์ฒญ์ด listening socket์— ๋„์ฐฉํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฐ ํ›„, ๋„์ฐฉํ•˜๋ฉด ๊ทธ ํด๋ผ์ด์–ธํŠธ์™€์˜ ์—ฐ๊ฒฐ์ด ์ˆ˜๋ฆฝ๋œ ์—ฐ๊ฒฐ ์‹๋ณ„์ž(connect socket, which is active socket)๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค. listening socket๊ณผ connect socket์„ ๋ถ„๋ฆฌํ•จ์œผ๋กœ์จ ๋งŽ์€ ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ๋™์‹œ์— ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์ด ์ƒ๊ธด๋‹ค (์ด์— ์ถ”๊ฐ€๋กœ ๋™์‹œ์„ฑ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•จ).

  • ๋ฆฌ๋ˆ…์Šค์—์„œ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜์ธ getaddrinfo() ์™€ getnameinfo()๋ฅผ ํ†ตํ•ด ์œ„ ํ•จ์ˆ˜์— ์‚ฌ์šฉ๋˜๋Š” ์ธ์ž๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ํš๋“ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋‘˜์€ ํ˜ธ์ŠคํŠธ์ด๋ฆ„,์ฃผ์†Œ,์„œ๋น„์Šค์ด๋ฆ„,ํฌํŠธ๋ฒˆํ˜ธ ๋“ฑ์˜ ์ŠคํŠธ๋ง์ •๋ณด๋ฅผ sockaddr(์†Œ์ผ“ ์ฃผ์†Œ ๊ตฌ์กฐ์ฒด)๋กœ ๊ตํ™˜ํ•ด์ฃผ๊ฑฐ๋‚˜, ๊ทธ ์—ญ์„ ์ˆ˜ํ–‰ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

HTTP

  • HTTP - Hypertext Transfer Protocol

  • ๋ง๊ทธ๋Œ€๋กœ 'ํ†ต์‹  ๊ทœ์•ฝ'. ์›น ์ปจํ…์ธ ๋ผ๋Š” ์ •๋ณด๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ์œ„ํ•œ ์•ฝ์†.

  • Request = request line 1์ค„ + request headers(0๊ฐœ ์ด์ƒ) + ๋นˆ์ค„ (+ request body)

    • request line = %s %s %s\r\n : method, URI, version
    • request header = %s: %s\r\n : header-name, header-data
    • empty line = \r\n
  • Response = response body 1์ค„ + response headers(0๊ฐœ ์ด์ƒ) + ๋นˆ์ค„ (+ response body)

    • response line = %s %s %s\r\n : version, status-code, status-message
    • response header = %s: %s\r\n : header-name, header-data
    • empty line = \r\n

  • HTTP 0.9 - ์›๋ผ์ธ ํ”„๋กœํ† ์ฝœ

    • ์š”์ฒญ ๋ฉ”์„œ๋“œ๊ฐ€ GET๋งŒ ์กด์žฌํ•œ๋‹ค. ์›๋ผ์ธ ํ”„๋กœํ† ์ฝœ๋กœ ๋ถˆ๋ ท๋‹ค.
    • HTTP ํ—ค๋”๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•˜๋‹ค.
    • ์‘๋‹ต์ด ํŒŒ์ผ ๋‚ด์šฉ ์ž์ฒด๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. HTML ํŒŒ์ผ ์ด์™ธ์— ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๋ฌธ์„œ๋Š” ์ „์†กํ•  ์ˆ˜ ์—†์—ˆ๋‹ค.

    ์š”์ฒญ

    GET /mypage.html

    ์‘๋‹ต

    <HTML>
    A very simple HTML page
    </HTML>
  • HTTP 1.0 - ํ™•์žฅ์„ฑ ๋งŒ๋“ค๊ธฐ

    • ํ—ค๋”๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค.
    • HTTP ๋ฒ„์ „์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์‘๋‹ต ์ฝ”๋“œ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
    • Content-Type์ด ์กด์žฌํ•˜์—ฌ HTML์ด ์•„๋‹Œ ๋‹ค๋ฅธ ๋ฌธ์„œ๋„ ์ „์†กํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.
    • ์ปค๋„ฅ์…˜ ํ•˜๋‚˜๋‹น ์š”์ฒญ ํ•˜๋‚˜๋งŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

    ์š”์ฒญ

    GET /mypage.html HTTP/1.0
    User-Agent: NCSA_Mosaic/2.0 (Windows 3.1)

    ์‘๋‹ต

    200 OK
    Date: Tue, 15 Nov 1994 08:12:31 GMT
    Server: CERN/3.0 libwww/2.17
    Content-Type: text/html
    
    <HTML>
    A page with an image
    <IMG SRC="/myimage.gif">
    </HTML>
  • HTTP 1.1 - ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ

    • HTTP์˜ ์ฒซ๋ฒˆ์งธ ํ‘œ์ค€ ๋ฒ„์ „์ด๋‹ค.
    • ์ง€์ •ํ•œ timeout ๋™์•ˆ ์ปค๋„ฅ์…˜์„ ๋‹ซ์ง€ ์•Š๋Š” persistent Connection์ด ๋„์ž…๋˜์—ˆ๋‹ค.
    • ์—ฌ๋Ÿฌ ์š”์ฒญ์ด ํ•˜๋‚˜์˜ ์ปค๋„ฅ์…˜์„ ํ†ตํ•ด ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.
    • Pipelining ๊ธฐ๋ฒ•์ด ๋„์ž…๋˜์—ˆ๋‹ค.
  • Content-Length ํ—ค๋”์˜ ์กด์žฌ ์ด์œ .
    response body๋ฅผ ์ฝ๊ธฐ ์œ„ํ•ด ํด๋ผ์ด์–ธํŠธ๋Š” ์ž์‹ ์ด ์ฝ๊ณ  ์žˆ๋Š” ์ŠคํŠธ๋ฆผ์—์„œ body contents์˜ ๋์ด ์–ด๋””์ธ์ง€๋ฅผ ์•Œ์•„์•ผ ํ•  ๊ฒƒ์ด๋‹ค. non-persistentํ•œ ์—ฐ๊ฒฐ์˜ ๊ฒฝ์šฐ, ์—ฐ๊ฒฐ์ด ๋Š๊ธฐ๋ฉด ํ•ด๋‹น ์‘๋‹ต์ด ์ข…๋ฃŒ๋œ ๊ฒƒ์œผ๋กœ ๋ณด๊ณ , ๊ทธ ๋Š๊ธด ์ง€์ ๊นŒ์ง€๊ฐ€ response body ์˜ ๋์ด๋ผ๊ณ  ํŒ๋‹จํ•˜๋ฉด ๋˜๊ฒ ์ง€๋งŒ, persistentํ•œ ์—ฐ๊ฒฐ์˜ ๊ฒฝ์šฐ response body์˜ ๋์ด ์–ด๋”˜์ง€ ๋ชจํ˜ธํ•ด์ง„๋‹ค. ์ด๋ฅผ ์œ„ํ•ด ์„œ๋ฒ„๋Š”Content-Length ํ—ค๋”๋ฅผ ์‚ฌ์šฉํ•ด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ response body์˜ ํฌ๊ธฐ๋ฅผ ์ „๋‹ฌํ•˜๋ฏ€๋กœ์จ, ์‘๋‹ต ํ—ค๋”์˜ ์ข…๋ฃŒ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋นˆ์ค„(\r\n)์ด ๋‚˜ํƒ€๋‚œ ์ดํ›„์˜ ์ง€์ ๋ถ€ํ„ฐ ํ•ด๋‹น ํฌ๊ธฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค์–ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

์ฐธ๊ณ ์ž๋ฃŒ

profile
I think I think too much.

0๊ฐœ์˜ ๋Œ“๊ธ€