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).
ํ๋ก์๋,
- ์๋ฒ์ ๋ํ ๋ฐฉํ๋ฒฝ(firewall)์ ์ญํ ์ ์ํํ ์ ์๋ค.
- ๋ธ๋ผ์ฐ์ ๋ฅผ ์ต๋ช ํ(anonymize)ํ ์ ์๋ค. ๋ธ๋ผ์ฐ์ ๋ฅผ ์๋ณํ ์ ์๋ ์ ๋ณด๋ฅผ ์๋ฒ์๊ฒ ๋๊ธฐ์ง ์์์ผ๋ก์จ.
- ์๋ฒ์ ์๋ต์ ์บ์(cache)ํจ์ผ๋ก์จ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์๋ ์๋ค.
Proxy-lab์์๋ ๊ฐ์ฅ ์ฐ๋ฆฌ์๊ฒ ๊ฐ์ฅ basicํ proxy๋ฅผ ๋ง๋ค๊ณ , 2๋จ๊ณ์ ๊ฑธ์ณ ๊ฐ์ ํ๋๋ก ์ฃผ๋ฌธํ๋ค.
"ํ๋ก์์ ๊ธฐ๋ณธ ์ ์ : ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฌ์ด์ ์์ฒญ/์๋ต์ ๋งค๊ฐํ๋ ์ญํ . ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์๋ฒ์๊ฒ ์ ๋ฌํ๊ณ , ์๋ฒ์ ์๋ต์ ํด๋ผ์ด์ธํธ์๊ฒ ๋๋๋ ค์ค๋ค."
์ ์ถฉ์คํ ๊ตฌํ์ ์ผ๋จ ํ๋ฉด ๋๋ค. HTTP/1.0 ๋ฒ์ ์ GET method ์์ฒญ๋ง์ ์ฒ๋ฆฌํ ์ ์์ผ๋ฉด ๋๋ค. ๋๋จธ์ง(POST method ๋ฑ)๋ optional.
ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด validํ์ง๋ฅผ ํ์ธํด์ผ ํ๋ค. ์์ธํ๊ฒ ์ค๋ช
๋์ด ์์ง๋ ์์ผ๋, ๊ตฌ์ฒด์ ์ผ๋ก๋ ์์ฒญ ๋ผ์ธ, ํค๋๊ฐ HTTP ํ๋กํ ์ฝ์ ํฌ๋งท์ ๋ง๋์ง๋ฅผ ํ์ธํด์ผ ํ๋ค
: ์์ฒญ ๋ผ์ธ(method, URI, version), ํค๋(header-name: header-data).
pthread
๋ฅผ ์ด์ฉํด ๋์์ฑ ๊ตฌํ์ ํ ์ ์๋ค.์์ฃผ ๊ฐ๋จํ ์บ์ฑ์ ํ๋ ํ๋ก์๋ก ๊ฐ์ ํ๋ค.
์บ์ฑ ๊ฐ๋ฅํ ์น object ํฌ๊ธฐ (MAX_OBJECT_SIZE
)๊ฐ ์ ํด์ ธ ์๊ณ , ์บ์๋ object๋ค์ ํฌ๊ธฐ ํฉ์ ๋ค์ MAX_CACHE_SIZE
๋ฅผ ๋์ ์ ์๋๋ก ๊ตฌํํ๋ค
LRU(Least-recently-used) ์ญ์ ์ ์ฑ (eviction policy)์ ์ ์ฉํ์ฌ ๊ตฌํํ๋ค.
์บ์ ์ ๊ทผ์ด '์ค๋ ๋์ธ์ดํ'(์ฌ๋ฌ์ค๋ ๋์์ ๋์์ ์ ๊ทผํด๋ ํ๋ก๊ทธ๋จ์ด ์์ ํด์ผ ํจ) ํ๋๋ก ๊ตฌํํด์ผ ํ๋ค.
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
๊ฐ ๋ฐ์ํ๋ค๊ณ ์ ์ํ๋ค. ์ด์ ๋ํด์๋ ์ธ๊ฐ์ง ์ ๋์ ์์ธ์ด ์๋๋ฐ, ์๋์ ๊ฐ๋ค :
EOF๋ฅผ ์ฝ๊ธฐ ์ค์ ๋ง๋ฌ์ ๋.
20๋ฐ์ดํธ๋ง ๊ฐ์ง๊ณ ์๋ ํ์ผ์ ํ์ฌ ํ์ผ ์์น์์ 50๋ฐ์ดํธ๋ฅผ ํ ๋ฒ์ ์ฝ์ผ๋ ค ํ๋ค๋ฉด, ๋น์ฐํ read๋ 50์ด ์๋ 20์ ๋ฆฌํดํ ๊ฒ์ด๊ณ , ์ด ๋ short count๊ฐ ๋ฐ์ํ๋ค๊ณ ๋งํ ์ ์๋ค.
ํฐ๋ฏธ๋์์ ํ
์คํธ ์ค์ ์ฝ์ ๋.
๋ง์ฝ ์ด๋ฆฐ ํ์ผ์ด ํฐ๋ฏธ๋๊ณผ ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉด, ๊ฐ read()
๋ ํ ๋ฒ์ ํ ๊ฐ์ ํ
์คํธ ์ค์ ์ ์กํ ๊ฒ์ด๋ค. ์ดํ๋ฆฌ์ผ์ด์
์ด read()
์๊ฒ ์์ฒญํ ํฌ๊ธฐ๊ฐ ์ด ํ
์คํธ ์ค์ ํฌ๊ธฐ๋ณด๋ค ์ปธ๋ค๋ฉด, short count๊ฐ ๋ฐ์ํ๋ค๊ณ ๋ง ํ ์ ์๋ค.
๋คํธ์ํฌ ์์ผ์ ์ฝ๊ฑฐ๋ ์ธ ๋.
์ด๋ฆฐ ํ์ผ์ด ๋คํธ์ํฌ ์์ผ์ด๋ผ๋ฉด, ๋ด๋ถ ๋ฒํผ๋ง ์ ์ฝ(์ปค๋์์ ๊ด๋ฆฌ๋๋ ๋ด๋ถ ์์ผ ๋ฒํผ๊ฐ ์กด์ฌํ๋ค)๊ณผ ๊ธด ๋คํธ์ํฌ ์ง์ฐ์๊ฐ ๋๋ฌธ์ 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)
static ssize_t rio_read(rio_t *rp, char *usrbuf, size_t n)
๋ฒํผ๋ฅผ ์ฌ์ฉํ์ง ์๋ ํจ์ :
ssize_t rio_readn(int fd, void *usrbuf, size_t n)
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
๋ฅผ ํด์๋ ์๋ ์ผ์์ ์ด๋ฒ ์ด์๋ฅผ ํตํด ์ ์คํ ๋๊ผ๋ค.
๋จผ์ , cache object๋ฅผ ํฌํจํ ๊ตฌ์กฐ์ฒด๋ค์ node๋ก ๊ฐ์ง๋ Doulbly Linked List๋ฅผ ๊ตฌํํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ฆฌ์คํธ๋ฅผ LIFO ๋ฐฉ์์ผ๋ก ๊ด๋ฆฌํ๋๋ก ํ๋ค. ๊ฐ cache node๋ ์์ฒญ URI string field๋ก ์๋ณ๋๋ฉฐ, ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ๋ํ cache๊ฐ ์๋์ง ํ์ธํ ๋ list์ ๊ฐ node๋ฅผ ์ ํ์ ์ผ๋ก ํ์ํ๋ค.
cache object๊ฐ ์ฌ์ฉ๋์๋ค๋ฉด, hit๋ cache object๋ฅผ list์ top์ผ๋ก ๋์ด ์ฌ๋ฆฐ๋ค.
์๋ฒ๋ก๋ถํฐ์ ์๋ก์ด ์๋ต์ cacheํ๊ณ ์ ํ ๋ MAX_CACHE_SIZE
๋ฅผ ์ด๊ณผํ๋ ์ํฉ์ด๋ผ๋ฉด,
list์ ๋์ ์๋ (top์ผ๋ก๋ถํฐ ๊ฐ์ฅ ๋ฉ๋ฆฌ ์๋) node๋ฅผ ์ญ์ ํ๊ณ , ์๋ก์ด cache object๋ฅผ list์ ์ถ๊ฐํ๋ค.
sentinel node๋ฅผ ์ฌ์ฉํ์ฌ ๋ ธ๋์ ์ฝ์ ๊ณผ ์ญ์ ์์ ํฌ์ธํฐ๋ค์ ๊ฐฑ์ ์ ์ฉ์ดํ๊ฒ ํ๋ค.
๋๋ฉ์ธ ์ด๋ฆ๋ค์ ์งํฉ์ IP ์ฃผ์ ์งํฉ์ผ๋ก ๋งคํ๋์ด ์์. ์ฌ๋๋ค์ด ์ฝ๊ณ ์ฐ๊ธฐ ํธํ๊ฒ.
ํ๋์ ๋๋ฉ์ธ ์ด๋ฆ์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
์ผ๋ฐ์ ์ธ ๊ฒฝ์ฐ, ๋ค์์ ๋๋ฉ์ธ ์ด๋ฆ๋ค์ ๋ค์์ IP์ฃผ์๋ก ๋งคํ๋ ์ ์๋ค. (๋ก๋ ๋ฐธ๋ฐ์ฑ ๋ฑ์ ์ด์ )
์์ผ ์ธํฐํ์ด์ค์์ ์์ผ์ 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 - Hypertext Transfer Protocol
๋ง๊ทธ๋๋ก 'ํต์ ๊ท์ฝ'. ์น ์ปจํ ์ธ ๋ผ๋ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํ ์ฝ์.
Request = request line 1์ค + request headers(0๊ฐ ์ด์) + ๋น์ค (+ request body)
%s %s %s\r\n
: method, URI, version%s: %s\r\n
: header-name, header-data\r\n
Response = response body 1์ค + response headers(0๊ฐ ์ด์) + ๋น์ค (+ response body)
%s %s %s\r\n
: version, status-code, status-message%s: %s\r\n
: header-name, header-data\r\n
HTTP 0.9 - ์๋ผ์ธ ํ๋กํ ์ฝ
์์ฒญ
GET /mypage.html
์๋ต
<HTML>
A very simple HTML page
</HTML>
HTTP 1.0 - ํ์ฅ์ฑ ๋ง๋ค๊ธฐ
์์ฒญ
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 - ํ์ค ํ๋กํ ์ฝ
Content-Length
ํค๋์ ์กด์ฌ ์ด์ .
response body๋ฅผ ์ฝ๊ธฐ ์ํด ํด๋ผ์ด์ธํธ๋ ์์ ์ด ์ฝ๊ณ ์๋ ์คํธ๋ฆผ์์ body contents์ ๋์ด ์ด๋์ธ์ง๋ฅผ ์์์ผ ํ ๊ฒ์ด๋ค. non-persistentํ ์ฐ๊ฒฐ์ ๊ฒฝ์ฐ, ์ฐ๊ฒฐ์ด ๋๊ธฐ๋ฉด ํด๋น ์๋ต์ด ์ข
๋ฃ๋ ๊ฒ์ผ๋ก ๋ณด๊ณ , ๊ทธ ๋๊ธด ์ง์ ๊น์ง๊ฐ response body ์ ๋์ด๋ผ๊ณ ํ๋จํ๋ฉด ๋๊ฒ ์ง๋ง, persistentํ ์ฐ๊ฒฐ์ ๊ฒฝ์ฐ response body์ ๋์ด ์ด๋์ง ๋ชจํธํด์ง๋ค. ์ด๋ฅผ ์ํด ์๋ฒ๋Content-Length ํค๋๋ฅผ ์ฌ์ฉํด ํด๋ผ์ด์ธํธ์๊ฒ response body์ ํฌ๊ธฐ๋ฅผ ์ ๋ฌํ๋ฏ๋ก์จ, ์๋ต ํค๋์ ์ข
๋ฃ๋ฅผ ์๋ฏธํ๋ ๋น์ค(\r\n)์ด ๋ํ๋ ์ดํ์ ์ง์ ๋ถํฐ ํด๋น ํฌ๊ธฐ๋ฅผ ์ฝ์ ์ ์๋๋ก ๋ง๋ค์ด์ฃผ๋ ๊ฒ์ด๋ค.