[ํ์คํ] ๊ธฐ๋ง๊ณ ์ฌ Summary
1. gRPC
- ํจ์๋ฅผ ํธ์ถํ์ผ๋, ๋ด ์ปดํจํฐ์ ์๋ ํจ์๋ฅผ, ๋คํธ์ํฌ๋ฅผ ํตํด ํธ์ถํ์ฌ, return ๊ฐ์ ๋๋ ค์ฃผ๋ ๊ฒ
- Static linking: ์คํ ํ์ผ ์์ฑ ์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ชจ๋ ํฌํจํ์ฌ ์์ฑ
- Dynamic linking: ๋์ ๋งํน, ํจ์๊ฐ ํธ์ถ๋๋ ์์ ์ ๋์ ์ผ๋ก ๋งํน์ ํ๋ค
-> ํ์ํ ๋ ๋์คํฌ์ ์๋ ํ์ผ์ ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค์ ์ฌ์ฉํ๋ค.
- ์ ์ ๋งํน๋ณด๋ค ์คํ ํ์ผ์ ํฌ๊ธฐ๊ฐ ์๊ณ , ์คํ ์ ์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฐจ์งํจ.
- ์๊ฒฉ ํจ์ ํธ์ถ RPC โ remote procedure call
- DLL์ ๋์ผํ ์ปดํจํฐ ๋ด์ ์์ // RPC๋ ๋คํธ์ํฌ๋ก ์ฐ๊ฒฐ๋ ๋ค๋ฅธ ์ปดํจํฐ์ ํจ์๋ฅผ ํธ์ถํ๋ ๊ณผ์
- Stub ํจ์ ๋ฐ์ RPC protocol์ ๊น๋ค. ํด๋ผ์ด์ธํธ์ ์๋ฒ๋ ๋ณต์กํ ๊ณผ์ ์ ๋ชจ๋ฅธ ์ฑ, stub func์ ํธ์ถํจ
- gRPC โ ๊ตฌ๊ธ์ด ๊ฐ๋ฐ
- 1. Protocol buffer 2. HTTP/2๋ฅผ ์ฌ์ฉํ๋ค.
- ๊ธฐ์กด RESTful API์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ โ REQ, REPํจํด์ด ์๋, ๋น๋๊ธฐ์ ์ผ๋ก ์คํธ๋ฆฌ๋ฐ ์๋ฐฉํฅ ์ง์
+ ํ๋ฆ์ ์ด, ์ฐจ๋จ, ํ์์์ ๋ฑ ๋ถ๊ฐ ๊ธฐ๋ฅ๋ ์ ๊ณต
- ์ด์์ฒด์ ์ ์ธ์ด์ ๋ ๋ฆฝ์ ์ด๋ผ๋ ์ฅ์
* RPC์ ๊ฐ์ ๋ฒ์ , gRPC
- ํด๋ผ์ด์ธํธ โ ์๋ฒ ์ํคํ ์ฒ
- stub โ ํต์ ์ ํตํด ์๊ฒฉ์ง๋ก ๋ณด๋ด๋ ๊ฒ
- protocol buffer์ ๊ธฐ๋ฐํ ํํ๋ก ํํ๋ request, reply
// ์ฃผ๊ณ ๋ฐ๋ ๋ฐ์ดํฐ์ ํํ๊ฐ protocol buffer์ ์ํด ๋ณํ๋จ
* gRPC vs REST API
// http1.1 -> http2 + gRPC // JSON -> proto buffer
1. ๊ท์น โ restful ๋ฐ๋์ ์ง์ผ์ผํ๋ ๊ฒ์ ์๋ (์์ ๋ถ๋ฐฉ), .proto๋ ๊ท์น์ด ๋งค์ฐ ์๊ฒฉํจ
2. protocol โ restful์ HTTP1,2,3 ๋ชจ๋ ์ง์, gRPC๋ only HTTP/2
3. payload โ ์ ๋ณด๋ฅผ ์ค์ด ๋๋ฅด๋ ์ฃผ์ฒด. Proto buffer(์๊ณ , binary, ์ฌ๋์ด ์ฝ์ ์ X)
/ JSON(large, human readable)
4. Streaming โ gRPC๋ client, server, bi-directional ๋ชจ๋ ์ ๊ณต, restful์ ์คํธ๋ฆฌ๋ฐ ๊ฐ๋ ์ด ์๋ค. ๋์์์ด req, rep๋ฅผ ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ ํ๋ด๋ด๋ ๊ฒ์ ๊ฐ๋ฅ
5. Browser support โ gRPC๋ ์น ๋ธ๋ผ์ฐ์ ์์ ๋์ํ์ง ์์. ์ฑ๊ณผ ์๋ฒ, ์๋ฒ์ ์๋ฒ ๊ฐ ํต์ ์ ์ํ ๋ชฉ์ .
Restful์ ์ง์O
6. security โ ๋ ๋ค TLS // gRPC๋ ์ํธํ๊ฐ ํ์ + Client Code generation โ ์๋์ผ๋ก ์์ฑํด์ค๋ค.
# ์ฒซ๋ฒ์งธ, Unary RPC โ ๊ฐ์ฅ ๊ฐ๋จํ ํํ, 1:1 request, response
- .proto file์์ ์ ์๋ single request๋ฅผ ๋ณด๋ด๊ณ , single response๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฐ๋จํ ํ๋ก๊ทธ๋จ
- ์ผ๋ฐ์ ์ธ ํจ์ ํธ์ถ์ฒ๋ผ ๋์ํ๋ค // ์๊ฒฉ์ง์ ์๋ฒ์ ์ฃผ๊ณ ๋ฐ๊ณ ์ถ์ ๋ฐ์ดํฐ ๋ฐ ํจ์๋ฅผ ํํํ๋ ๊ฒ
- rpc RpcFunc (request) returns (response)
-> RpcFunc ์๊ฒฉ์ง์์ ํธ์ถํ , ํธ์ถ ๋นํ ํจ์ ์ด๋ฆ // ์ ๋ ฅ parameter request / response๋ฅผ return
1. ์๊ฒฉ ํธ์ถ ํจ์ ์์ฑ
- my_func -> ์๋ฒ ์ชฝ์์ ์๊ฒฉ์ผ๋ก ํธ์ถ๋นํ ํจ์๋ฅผ ์ ์ํ๋ ๊ฒ (์ ๊ณฑํ์ฌ Return)
: ๋ด๊ฐ ์๋ฒ ์ ์ฅ์์ ์ ๊ณตํ ํจ์๋ฅผ ์์ฑ // application์ grpc๊ฐ ๋ญ์ง ๋ชจ๋ฅธ๋ค.
2. protocol buffer ๊ตฌ์ฑ (.proto ํ์ผ ์์ฑ) -> ์ผ์ข ์ ์ธ์ด
- service Myservice -> ์ด ๋ด๋ถ์ ์ค์ํ ํ ์ค rpc MyFunction(MyNumber) returns (MyNumber)
- ๋ด๊ฐ ์๋๋ฐฉ์๊ฒ ํธ์ถํ ํจ์๋ myFunc, ์ด๋ฅผ ์ 3์ ๋ฐฉ์์ผ๋ก ํ๋กํ ๋ฒํผ๊ฐ ํํํ๋ ์ฝ๋
- message MyNumber -> int 32, ์ ํํ๊ฒ ์ ์ ํํ, ์๋ก ์ฃผ๊ณ ๋ฐ์ ๋ฐ์ดํฐ์ ํ์์ ์ ์ํจ
3. gRPC class ์๋ ์์ฑ -> ์๋์ผ๋ก ์์ฑ๋ ํ์ผ์ ์ด๋ ์์น์ ์ ์ฅํ ์ง ์ง์
: grpc_tools.protoc ์ ํตํด ์๋์ผ๋ก ํด๋์ค ํ์ผ๋ค์ ์์ฑํจ
1) message class ํ์ผ - .MyNumber -> ๋ด๊ฐ ์ ์ํ ์ด๋ฆ ๊ทธ๋๋ก ๊ฐ์ ธ์์ ์ฝ๋ ์ ์ฅํด์ค๋ค.
2) client/server class ํ์ผ โ .MyServiceServicer -> ์๋ฒ์ฉ ์ฝ๋
- .MyServiceStub -> ํด๋ผ์ด์ธํธ์ฉ ์ฝ๋
4. gRPC ์๋ฒ ์์ฑ
- ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ํ futures import, ์๋ ์์ฑํด์ค class import, ์๊ฒฉ ํธ์ถ ๋นํ ํจ์๋ import
- ์๋ ์์ฑ๋ base class, MyServiceServicer๋ฅผ base๋ก derived class๋ฅผ ๋ง๋ฆ
- ์๊น ์์ฑํ myfunc์ด servicer ์์ ๋ค์ด๊ฐ ์์ -> ์์ ๋ MyNumber๋ฅผ response๋ฅผ return
- ์๋ฒ๋ฅผ ๋์ฐ๋ ํ์ โ ๋์๋ค๋ฐ์ ์ผ๋ก ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ํ ๊ฒ (์์์ ํ๋ก๊ทธ๋จ์ด ํด์ค, ๋๋ params๋ง ์ค์ )
- ์ฐ๋ฆฌ๊ฐ ์์์ ๋ง๋ MyServiceServicer๋ฅผ gRPC ์๋ฒ์ ์ฐ๊ฒฐ
5. gRPC ํด๋ผ์ด์ธํธ ์์ฑ
- protoc (proto compiler)๊ฐ ์๋์ผ๋ก ๋ง๋ค์ด์ง class import
- gRPC ํต์ ์ฑ๋์ ์ฐ๋ค -> ์ด ์ฑ๋์ ์ฌ์ฉํ์ฌ, ์๋ ์์ฑ๋ ํ์ผ์ MyServiceStub ํจ์๋ฅผ ํธ์ถํด, stub์ ์์ฑํจ
- gRPC๋ฅผ ํตํด ๋ด๊ฐ ์๋ฒ๋ก ๋ณด๋ผ ๊ฐ์ ๋ง๋ค๊ณ , ์ด request๋ฅผ parameter๋ก,
stub์ ์ฌ์ฉํ์ฌ, ์๊ฒฉ ํจ์๋ฅผ ํธ์ถํจ / ์๋ต ๊ฒฐ๊ณผ๋ฅผ print / 4*4 = 16 ๋์ด
+ ๊ฐ๋ฐ ํ์ผ ํ์ธ
- ์๊ฒฉ ํธ์ถ ๋์ ํ์ผ โ ์๊ฒฉ์์ ํธ์ถ ๋นํ ํ์ผ์ ์ด๊ฑฐ ํ๋์์ (์ ๊ณฑ ๊ธฐ๋ฅ ํ ์ค)
- ํ๋กํ ๋ฒํผ ์ ์ ํ์ผ (.proto) โ method ํจ์๋ service๋ก, ๋ฐ์ดํฐ๋ message๋ก ์ ์
- ์๋ ์์ฑ๋ message class ํ์ผ, ์๋ ์์ฑ๋ ํ๋์ ํ์ผ ๋ด๋ถ์ client, server ์ฉ ๊ฐ๊ฐ ์ ์๋์ด ์๋ ๊ฒ
- ์๋ฒ ํ์ผ / ํด๋ผ์ด์ธํธ ํ์ผ
# ๋๋ฒ์งธ, bidirectional streaming gRPC
- ์๋ฐฉํฅ์ผ๋ก ์ฃผ๊ณ ๋ฐ๊ธฐ ๊ฐ๋ฅ, ์ ๋ณด๋ฅผ ๋์์์ด ์ฃผ๊ณ ๋ฐ๋๋ค. ํ๋ฒ์ ๋ฑ ๋ค ๋ณด๋ด๋ ๊ฒ์ด X
- collection data type์ element๋ค์ ๋์๋์ ๋ณด๋ธ๋ค.
* proto ํ์ผ ์ ์ ์์
- rpc RpcFunc (stream request) return (stream response)
1. proto buffer ํ์ผ ๊ตฌ์ฑ
- package bidirectional โ ์๋ฐฉํฅ์ผ๋ก ๋ฐ๋
- service Bidirectional {
rpc GetServerResponse (stream Message) returns (stream Message) {}
}
- input๊ณผ output ๋ชจ๋ ์คํธ๋ฆผ์ผ๋ก ์ ์, rpc๋ก ํธ์ถํ , ํธ์ถ ๋นํ ํจ์ ์ด๋ฆ์ GetServerResponse
2. ์๋ฒ ๊ฐ๋ฐ
- ํ์ํ ํ์ผ import, ์๋์ผ๋ก ์์ฑ๋๋ base class BidirectionalServicer๋ฅผ ๋ฐํ์ผ๋ก ์ฐ๋ฆฌ์ derived class ์์ฑ
- ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์ ๊ฒ์ ์๋ฒ๊ฐ ๊ทธ๋๋ก ๋ณด๋
- ๋ฐ์์ ๋ณด๋ด๊ณ , ๋ฐ์์ ๋ณด๋ด๋ stream to stream (ํ๋ ํ๋ ๋๋ ค์ค) / ์คํธ๋ฆฌ๋ฐ์ ์์์ ํด๋ผ์ด์ธํธ
3. ํด๋ผ์ด์ธํธ ๊ฐ๋ฐ
- ํต์ channel์ ์ฐ๋ค, ๋ด๊ฐ ๋ง๋ ์ฑ๋์ proto compiler๊ฐ ๋ง๋ค์ด์ค BidirectionalStub์ ๋ฃ์ด, stub ๊ฐ์ฒด๋ฅผ ๋ง๋ ๋ค. // ์ด stub์ ํตํด ์๋ฒ๋ก ๋ฉ์ธ์ง๋ฅผ ์ ๋ฌํจ
- ๋ด๊ฐ ์๋ฒ์๊ฒ ํธ์ถํ GetServerResponse ์ ์ ๋ ฅ parameter (์ฆ, request)๋ก generate_message๋ฅผ ๋ฃ์ด์ค๋ค.
- ์ฐ๋ฆฌ๊ฐ ์ฃผ๊ณ ๋ฐ์ ๋ฐ์ดํฐ ํํ, message๋ฅผ ๋ง๋ค์ด์ฃผ๋ ํจ์ make message
- ์ด ํธ์ถ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ๋ list element -> ๊ณ ์ ๋ ๋ฆฌ์คํธ๊ฐ ์๋๋ผ, ๋ด๊ฐ ์์ ์ ํ๋ฉฐ ์ฑ์๋๊ฐ๋ ๋ฆฌ์คํธ ์๋ฏธ
: ์ด๋ฌํ ๊ฒฝ์ฐ, return ๋์ yield๋ฅผ ์ฌ์ฉํ๋ค!
: return์ ์์ฑ๋ ํ๋์ ๊ฐ์, ํ ๋ฒ์ ๋ณด๋ผ ๋ ์ฌ์ฉ // yield๋ ๋ฉ์ธ์ง๋ฅผ ํ๋์ฉ ๋๋ ค์ฃผ๋ ๊ฒ
* Original RPC์๋ ์ด๋ฌํ ๊ธฐ๋ฅ X, gRPC์์ ์๋กญ๊ฒ ๋ฑ์ฅํ stream ๊ฐ๋ ex) ์์ํตํ
# 3. Client Streaming gRPC โ ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ชฝ์ผ๋ก ๋์์์ด ๋ณด๋ด๋ ์คํธ๋ฆฌ๋ฐ
- rpc RpcFunc (stream request) returns (response)
- ex) ํด๋ผ์ด์ธํธ(์ผ์)๊ฐ ์ผ์ ๊ฐ์ ์๋ฒ๋ก ์ฌ๋ฆฌ๋ ๊ฒฝ์ฐ
+ Unix ์ฒ ํ โ ํ๋์ ํ๋ก๊ทธ๋จ์ ๊ฒฐ๊ณผ ๊ฐ์ด, ๋ค๋ฅธ ํ๋ก๊ทธ๋จ์ ์ ๋ ฅ ๊ฐ์ผ๋ก ์ค ์ ์๋ค โ stream ๊ฐ๋
- ๋์์์ด ๊ฐ๋ฌผ์ฒ๋ผ ์ค์ค์ด ๋ณด๋ด๋ ๊ฒ
- proto buffer ๊ตฌ์ฑ // package clientstreaming
- service ClientStreaming {
Rpc GetServerResponse(stream Message) returns (Number) {}
}
- message โ Message๋ string, Number๋ int32
- ์๋ฒ ๊ฐ๋ฐ
- ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ๋ฐ์์ผ ํ ๊ฐ์ด ์ฌ๋ฌ ๊ฐ (request_iterator)
-> ๋ฐ์ ๋ ๋ง๋ค, count๋ฅผ ์ฆ๊ฐ์ํด โ 5๋ฅผ ๋ค ๋ฐ๊ณ ๋๋ฉด, ๋ฐ์ ๊ฐ์ 5๋ฅผ return
- ํด๋ผ์ด์ธํธ ๊ฐ๋ฐ
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก ๋ณด๋ธ๋ค๋ ๋ฌธ๊ตฌ๋ฅผ ์ถ๋ ฅ, ๊ฐ์ ๋ณด๋ผ ๋, ์คํธ๋ฆฌ๋ฐ์ ์ํด return์ด ์๋๋ผ yield
- request ๋ณด๋ผ ๋๋ stream์ด์ง๋ง, ์๋ฒ๋ก๋ถํฐ ๋ฐ์ response๋ ํ ๋ฒ์ ์ค๋ ๊ฒ (์คํธ๋ฆฌ๋ฐ ์๋)
-> response ๊ฐ ํ๋๋ง, ํ ๋ฒ์ ๋ฐ์ ์ถ๋ ฅ
- ์คํ ๊ฒฐ๊ณผ โ HTTP ๋ฉ์๋๋ผ๋ฉด, ํ๋ํ๋ ์ด 5๋ฒ POST/PUT์ ๋ณด๋์ด์ผ ํ๋๋ฐ, (์ด๋ฌ๋ฉด์ ๊ณ์ TCP ์ฐ๊ฒฐ์ ์ด๊ณ , ๋์) ์ง๊ธ์ ํ ๋ฒ์ ์ฌํํ๊ฒ ์ฒ๋ฆฌ ๊ฐ๋ฅ
# 4. Server streaming gRPC
- ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ๋ก ๋์์์ด ์คํธ๋ฆฌ๋ฐ ํ๋ ๊ฒ
- rpc RpcFunc (request) returns (stream response)
-> ์ด๋ ๊ฒ ์คํธ๋ฆผ์ด๋ผ๊ณ ๋ช ์ํ๋ฉด ์คํธ๋ฆผ์ด ๋๊ณ , ์๋ฌด ๋ง ์์ผ๋ฉด ์คํธ๋ฆผ์ด ์๋ ๊ฒ
- proto buffer ๊ตฌ์ฑ / package โ serverstreaming
- service ServerStreaming {
Rpc GetServerResponse (Number) returns (stream Message) {}
}
- message โ Message โ string, Number โ int32
-> ์ฆ ์๋ฒ๊ฐ ํ๋ ์ด์์ ๋ฌธ์์ด์ ์คํธ๋ฆผ์ผ๋ก ๋ณด๋ผ ๊ฒ
- ์๋ฒ ๊ฐ๋ฐ
- ์๋ ์์ฑ๋ ํ์ผ import, ๋ฌธ์์ด์ ๋ฐ์ message๋ก ๋ง๋ฆ, ์ด๋ฅผ list๋ก ๋ง๋ค๊ณ , ํด๋ผ์ด์ธํธ์๊ฒ yield message
- ์ด๋, return ๊ฐ์ ๋ฐ๋ ์ ๋ ๋น๋๊ธฐ์ ์ผ๋ก ์์ ํจ
- 5๊ฐ๋ฅผ ํ ๋ฒ์ ๋ณด๋ด๋ ๊ฒ์ด X, ํ๋ ๋ณด๋ด๊ณ , ํ๋ ๋ณด๋ด๊ณ ing -> yield
-> ์ฆ, ๋น๋๊ธฐ์ ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋๋ ค์ค์ผ ํ ๋, return์ด ์๋๋ผ yield ์ฌ์ฉ
- client ๊ฐ๋ฐ
- 5๋ผ๋ ๊ฐ์ผ๋ก Number๋ฅผ ๋ง๋ค๊ณ , ์ด๋ฅผ ์๋ฒ๋ก๋ถํฐ ํธ์ถํ๊ณ ์ ํ๋ ํจ์ GetServerResponse์ ๋ฐ์ดํฐ๋ฅผ ๋ด์ ๋ณด๋ธ๋ค.
- ํด๋ผ์ด์ธํธ๋ ์ด ๋์๋ yield๋ฅผ ์ด๋ป๊ฒ ๋ฐ์๊น?
-> ๋ฐ๋ณต๋ฌธ์ผ๋ก ๊บผ๋ด์ด ํ๋์ฉ ์ถ๋ ฅ, ํด๋ผ์ด์ธํธ๋ ์ ๊ฒฝ ์ธ ํ์ X
- response๊ฐ ๋ฆฌ์คํธ๋ผ๋ ์ ์ ํ์, ๊ทธ์ ๋ฐ๋ฅธ ๊ฒฐ๊ณผ๊ฐ ๋ค์ด์๋ค๋ฉด ํ๋์ฉ ์ฒ๋ฆฌ๋๋ ๊ฒ
// restful API๋ ์ด๋ฐ๊ฑฐ ์ ๋จ
* ์ฐ๋ฆฌ๊ฐ ์ด๋ ๊ฒ 4๊ฐ์ง gRPC ํจํด์ ๋ฐฐ์ด ๊ฒ
1. Unary
2. bidirectional streaming
3. client streaming / server streaming
์ด๋ฌํ streaming์ด ๊ธฐ์กด rpc ๋๋น gRPC์ ์ฅ์ ์ด์ ํน์ง
* Protocol Buffer์ ์ดํด
- RPC๋ฅผ ์ฌ์ฉํ๋ ์ ์ฅ์์ proto buffer ํ์ผ์, ์ฌ์ฉํ๋ ์ธ์ด์ ๋ฌด๊ดํ๊ฒ ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ์ฃผ๊ณ ๋ฐ๋ ๋ฐ์ดํฐ์ ํํ, ํธ์ถํ ํจ์๋ฅผ ์ ์ํ ๊ฒ
- ํ ์ปดํจํฐ์์ ๋ค๋ฅธ ์ปดํจํฐ๋ก ๋คํธ์ํฌ๋ฅผ ํตํด ๋์์์ด ๊ฐ์ ์ฃผ๊ณ ๋ฐ์ ๋,
์๋ก ์ธ์ด๊ฐ ๋ฌ๋ผ๋, OS๊ฐ ๋ฌ๋ผ๋ ์ฃผ๊ณ ๋ฐ์ ์ ์๋๋ก, 2001๋
์ ๊ตฌ๊ธ์ด ๊ฐ๋ฐํ ๊ฒ
- serialization format and library, IDL compiler โ ์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ์ฌ์ฉํ๋ ์ฝ๋๋ฅผ ์๋ ์์ฑ
+ ๋ณต์กํ ๊ฐ์ฒด๋ค์ ๋จ์ํ 0101 ๋ฐ์ดํธ๋ก ๋ด๋ณด๋ด๊ธฐ ์ํ ์ ํ == serialization
- ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฐ๋ , ์ธ์ด์ ์ด์์ฒด์ ์ ์๊ด ์์ด, ๋ ๋ฆฝ์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํํํ ๊ฒ
+ IDL๋ ๊ฒฐ๊ตญ ์ธ์ด์ด๋ค โ interface description language
* Protobuf์ ๋์ ์๋ฆฌ
- ๊ฐ๋ฐ์๋ gRPC๋ฅผ ์ฝ๊ฒ ์ฌ์ฉํ๊ณ , low, hardware ์ฒ๋ฆฌ๋ protocol buffer๊ฐ ๋ชจ๋ ๋ฎ์ด์ค
- Protocol Buffer์ binary encoding ๋์
- ์ ์ํ ๊ฐ์ฒด๋ค์ด 0101๋ก ๋ณํ๋ ๋ชจ์ต
+ 1337์ 2byte๋ก ํํ, ๋ค์ง์ด์ง ๋ฐฉ์์ ์ฌ์ฉ, little endian vs big endian // ํ๋ก์ธ์ค๋ง๋ค ๋ค๋ฆ
- Type Length Value -> TLV
- ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ด๋ฌํ ๋ฐฉ์์ผ๋ก ๋ณํํ ๊ฒ โ ํ๋์จ์ด, ์์ด์ ์ผ๋ก โ ์ด 33๋ฐ์ดํธ
* gRPC์ ์ฅ์
1. Performance โ 1) ProtoBuf (ํ๋กํ ์ฝ ๋ฒํผ) โ ํจ์จ์ ์ธ binary message format
- ๋งค์ฐ ๋น ๋ฅด๊ฒ serialize, ํ๋กํ ๋ฒํผ๋ ์๊ณ ๋น ๋ฅด๋ค. JSON์ ํ์ฑ ๊ณผ์ ์ด ํจ์ฌ ํผ
+ small message payload -> ๋ฌด์ , ๋ชจ๋ฐ์ผ ํ๊ฒฝ์์ ์ ๋ฆฌ
// 2) HTTP/2 ๊ธฐ๋ฐ
- 2-1) binary framing and compression โ ๋นํธ ๋จ์๋ก ์ ๋ณด๋ฅผ ๋ณด๋ด์ด ์ฌ๋์ด ์ฝ์ ์ ์์ + ์ ๋ณด๋ฅผ ์์ถํจ
-> ํต์ ๋งํฌ๋ฅผ ์๋ผ๊ณ , CPU๋ฅผ ๋ ์ฐ๋ ๊ฒ (์ฑ๋ฅ ์ ํ์ ์์ธ์ด ๋๊ธฐ๋ ํจ)
- 2-2) Multiplexing โ ๋จ์ผ TCP์ฐ๊ฒฐ์์ request ๋ณด๋ธ ์์์ ์๊ด ์์ด response๊ฐ ์ฌ ์ ์๋ค. 1.1์ ๋ํ์ ์ธ ๋จ์ , Head Of Line Blocking์ ํด๊ฒฐํ๋ค.
+ HTTP/2 ์๋ฒ ๊ฐ ํต์ ์ ๋ํ์ ์ธ ์์๊ฐ gRPC์ธ ๊ฒ์ด์ง, ๊ณผ๊ฑฐ 1.1๋ก ํ๋ ๋ค๋ฅธ ์ผ๋ค๋ 2๊ฐ ๋ชจ๋ ์ง์ํจ
2. Code generation
- Proto file โ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ๋ฐํ์ด ์ด protofile๋ง ๊ณต๋์ผ๋ก ์์ ํ๋ฉด ๋จ // ๊ฐ๋ฐ ์๊ฐ ๋จ์ถ
+ ์๋์ผ๋ก base class ์ฝ๋ ์์ฑ
- ์์ฃผ ๋ช ํํ ํ๋กํ ํ์ผ์ ๋ฐ๋ผ ๊ท๊ฒฉ์ ์ ํ ๊ฒ
3. Strict specification
- ๊ธฐ์กด restful API, REST๋ ์ฒ ํ -> HTTP์๋ ์ฌ๋ฐ๋ฅธ ์ ๋ต ๊ฐ์ ๊ฑด ์์
- gRPC๋ ์ฒ ํ ๊ฐ์ ๊ฐ๋ ์ด ์๋.
- ๋ช ํํ ๊ท์ ์ ์ ํ๋ ์ ์ฅ โ ์ ๋น์ฑ์ ๋ ผ์ํ ํ์ X
- ๊ฐ๋ฐ์๋ค ๊ฐ ์ ํ ๊ฒ๋ค์ ๋ํด ์๊ฐ์ ์ค์ฌ์ค๋ค.
4. Streaming
- HTTP/2๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ชจ๋ ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๋ค ์ ๊ณต
- Unary (no streaming), Server streaming, Client streaming, Bi-directional streaming
- ๊ณผ๊ฑฐ RPC๋ Unary๋ง ๊ฐ๋ฅ, gRPC๋ ์คํธ๋ฆฌ๋ฐ์ด ๋๋ค. -> ํฐ ์ฅ์
: ์๋ถํ ์ ์ผ๋ก ์ฌ๋ฌ ๊ฐ์ ๊ฐ์ ๋ณด๋ผ ๋
5. ์ถ๊ฐ ๊ธฐ๋ฅ โ Deadline/timeout, Cancellation๋ ๊ฐ๋ฅํ๋ค
- ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ฅผ ์ผ๋ง๋ ๊ธฐ๋ค๋ ค์ค ์ ์๋์ง, ์ด ๋ฐ๋๋ผ์ธ ๊ฐ์ ์๋ฒ๋ก ๋๊ธธ ์ ์๋ค. -> ์ค์ผ์ค๋ง
- ํด๋ผ์ด์ธํธ ์ ์ฅ์์ ์๋ฒ์๊ฒ ์์ฒญ์ ์ทจ์ํ ์๋ ์์ (์๋ฒ์์ ๊ฐ์ด ์ ์ฌ ๋)
* gRPC ๊ถ์ฅ ์ฌ์ฉ ์๋๋ฆฌ์ค
- microservices โ light weight, ์๋ฒ ํฌ ์๋ฒ ํต์
- bi-directional streaming (real-time communication์์ ์ฌ์ฉ)
- Polyglot โ ์ชผ๊ฐ์ด ์์ ํ๋ก๊ทธ๋จ๋ค์ด ๊ฐ์์ ์ปดํจํฐ์์, ๊ฐ์์ ์ธ์ด๋ก ๋๋ค โ ๊ต์ฅํ ๋ค์ํ ์ธ์ด๋ฅผ ์ง์ํ๋ gRPC๊ฐ ์ ํฉ // for multi-language environment
- serialized with ProtoBuf, a lightweight message format
- IPC โ between apps on the same machine.
+ microservice ์ ์ฉ ์์
- ์์ ๋์ฅ, ์ธ๋ถ์ ์ฐ๊ฒฐ๋ ๋ถ๋ถ์ RESTful, ๋ค์ชฝ ์๋ฒ ๋ด๋ถ๋ ๋ชจ๋ gRPC๋ก
* gRPC์ ๋จ์
1. limited browser support โ ์น ๋ธ๋ผ์ฐ์ ๋ฅผ ํตํด ํ ์ ์์
- ์ฌ์ฉ์๋ URL๋ง ์ฃผ๊ณ , ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ๊ฐ ์์์ HTTP1.1 or HTTP/2, 3์ ๊ฒฐ์ ํ๋ค.
- impossible to directly call a gRPC service from a browser
2. Not human readable โ ์ฌ๋์ด ์ฝ์ผ๋ ค๋ฉด ๋ณ๋์ ๋๊ตฌ๊ฐ ํ์ํ๋ค. HTTP1.1์ ์ฅ์ ์ด ์ฌ๋ผ์ง ๊ฒ
** ZMQ์ request response ํจํด๋ณด๋ค, gRPC ์ฑ๋ฅ์ด ํ์คํ ๋ฎ์
1. HTTP/2๋ ์ํธํ๊ฐ default (ํ์๋ ์๋์ง๋ง ๊ฑฐ์ ๋ค ์ฌ์ฉ) -> ๋ณด์์ ๋ํ ์ฒ๋ฆฌ -> ์ฑ๋ฅ ์ ํ
2. ๋ณํ + ์์ถ ๊ณผ์ protocol buffer์ ์ฒ๋ฆฌ -> ์ฑ๋ฅ ์ ํ
-> ๋ชฉ์ ์ ๋ถํฉํ๋ ๋๊ตฌ, ์๊ตฌ ์ฌํญ์ ๋ง๋์ง ๋ถ์ํ ์ ์๋ ๋ฅ๋ ฅ์ด ์ค์ํ๋ค.
2. HTTP2
* ๊ฐ์ฅ ๋ง์ ๊ธฐ๋ง๊ณ ์ฌ ๋ฌธ์ ์ถ์
* HTTP1.1์ ๋ฌธ์ ์
1. Head of line blocking: ์๋ฒ๋ ์์ฒญ ๋ฐ์ ์์๋๋ก ์๋ต์ ๋ณด๋ด์ผ ํ๋ค. ์ค๊ฐ์ ๋ฌธ์ ๋ฐ์ ์, ํ์ ์์ฒญ๋ค์ ๋ชจ๋ ์ง์ฐ๋จ
2. Fat message headers: ํค๋์ ๋ง์ ๋ฉํ ์ ๋ณด๊ฐ ์ ์ฅ, ๋งค ์์ฒญ ์ ์ค๋ณต๋ ํค๋๋ฅผ ์ ์ก, ์ฟ ํค ์ ๋ณด๋ ๋งค ์์ฒญ ์ ํค๋์ ํฌํจ๋์ด ์ ์ก // human readable + ๋๋ฌด ๋ง์ ์ ๋ณด๊ฐ ๋ถ์
3. limited priorities: HTTP1.1์ ์ฐ์ ์์ ๊ฐ๋ ์ด ์๋ค. ํ๋ฉด์ ์ฑ์ฐ๋ ๋ชจ๋ ์ ๋ณด๊ฐ ๋์ผํ ์ฐ์ ์์
4. Client-driven Transmission: ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ์ ์์ฒญ์ ํด์ผ๋ง ํต์ ์ด ๊ฐ๋ฅ. ์๋ฒ๋ ์์ฒญ ์์ด ์ ๋ณด ์ ๋ฌ X
- ๊ตฌ๊ธ SPDY: ์ ์ก ์ง์ฐ์ ์ค์ด๋ ๊ฒ ๋ชฉํ๋ก ๋ง๋ค์ด์ง ์คํ์์ค (2009)
- ํ์ฌ ์ ์ธ๊ณ ์น์ฌ์ดํธ์ 50%๊ฐ HTTP2 ์ฌ์ฉ ์ค
* HTTP2์ ๋ชฉํ
- ์ค์ด๋ ์ง์ฐ ์๊ฐ
- ์๋ต ๋ค์คํ ์ง์
- HTTP ํค๋ ์์ถ -> ํ๋กํ ์ฝ ์ค๋ฒํค๋ ์ต์ํ
- ์์ฒญ ๋ณ ์ฐ์ ์์ ์ง์
- ์๋ฒ ํธ์
* Binary Framing Layer
- ๋์ด์ human readableํ text ๊ธฐ๋ฐ ์ ์กX -> ์๋ก์ด binary framing ๊ณ์ธต์ ๋์
- ๋ฐ์ด๋๋ฆฌ ํ์, ๋นํธ ํํ๋ก ์ธ์ฝ๋ฉ ํจ
- ์คํธ๋ฆผ: ๋ฉ์ธ์ง์ ์์ ๊ฐ๋ , ๊ตฌ์ฑ๋ ์ฐ๊ฒฐ ๋ด์์ ์ ๋ฌ๋๋ ๋ฐ์ดํธ๋ค์ ์๋ฐฉํฅ ํ๋ฆ, ํ๋ ์ด์์ ๋ฉ์ธ์ง๊ฐ ์ ๋ฌ๋ ์ ์์
- ๋ฉ์์ง: response, request ๋ฉ์ธ์ง์ ๋งคํ๋๋ ํ๋ ์์ ์ ์ฒด ์ํ์ค, ํ๋์ ๋ฉ์ธ์ง๊ฐ ์ฌ๋ฌ ๊ฐ์ ํ๋ ์์ผ๋ก ์ชผ๊ฐ์ ธ์ ๋ณด๋ด์ง๋ค.
- ํ๋ ์: HTTP/2์์ ํต์ ์ ์ต์ ๋จ์. ๊ฐ ์ต์ ๋จ์์๋ ํ๋์ ํ๋ ์ ํค๋๊ฐ ํฌํจ๋จ -> ํ๋ ์์ด ์ํ๋ ์คํธ๋ฆผ์ ์๋ณํจ
- ํด๋ผ์ด์ธํธ์ ์๋ฒ ์ฌ์ด์ ํ๋์ TCP ์ฐ๊ฒฐ์ ๋ซ๊ณ , ๋์์ N๊ฐ์ ์คํธ๋ฆผ์ ์ฐ๋ค. ์คํธ๋ฆผ๋ค์ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๊ฐ๋ฅ, ์์๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๋ถ์ฌํ ์ ์๋ค.
- ๋ณ๋ ฌ์ฒ๋ผ ๋ณด์ด์ง๋ง ์ฌ์ค ์ค์ ํ๋ -> ๊ฐ ์คํธ๋ฆผ์ด ์ ์ ํ๋ ์๊ฐ์ ์กฐ์
- ํ๋์ ์คํธ๋ฆผ ๋ด๋ถ์์๋ ์์ฐจ์ ์ผ๋ก ์ ์ก๋จ
- ํค๋๊ฐ ๋ณ๋์ ํ๋ ์์ผ๋ก ๊ฐ์ฅ ๋จผ์ ๋์ฐฉํ๋ค.
* ๋ชจ๋ ํต์ ์ ๋จ์ผ TCP ์ฐ๊ฒฐ์ ํตํด ์ํ๋จ, ์๋ฐฉํฅ ์คํธ๋ฆผ์ ์๋ ์ ํ X
- ๊ฐ ์คํธ๋ฆผ์๋ ๊ณ ์ ์๋ณ์์ ์ฐ์ ์์ ์ ๋ณด๊ฐ ์๋ค.
- ํ๋ ์์ ํต์ ์ ์ต์ ๋จ์, ๊ฐ ํ๋ ์์ ํค๋์ ์ฝ์ ๋ ์คํธ๋ฆผ ์๋ณ์๋ฅผ ํตํด, ํ๋ ์์ ์ฌ์กฐ๋ฆฝ ๊ฐ๋ฅ
* HTTP/2์ ๊ฐ์ฅ ํฐ ํน์ง 2๊ฐ์ง
1. ๋์๋ค๋ฐ์ ์ผ๋ก ์ฃผ๊ณ ๋ฐ๊ธฐ ์ํด stream ๊ฐ๋ ๋์
2. ํ๋์ ํฐ ๋ฉ์ธ์ง๊ฐ ์ ์ ํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด frame ๊ฐ๋ ๋์
# ์์ฒญ ๋ฐ ์๋ต ๋ค์คํ
* HTTP/1.1 ๋ฌธ์ ์ฌํ์ธ
- ํด๋ผ์ด์ธํธ๊ฐ ๋ณ๋ ฌ ์์ฒญ์ ์ํํ๋ ค๋ ๊ฒฝ์ฐ, ์ฌ๋ฌ TCP ์ฐ๊ฒฐ์ด ์ฌ์ฉ๋จ
- HTTP1.1์ ์ฐ๊ฒฐ ๋น ํ ๋ฒ์ ํ๋์ ์๋ต๋ง ์ ๋ฌ๋๋๋ก ๋ณด์ฅํจ
- Head of Line Blocking ๋ฌธ์ (์์ ๋ฌธ์ ๋ก, ๋ค๊ฐ ๋งํ๋ ๊ฒ) + TCP ์ฐ๊ฒฐ์ ๋นํจ์จ์ ์ธ ์ฌ์ฉ ์ด๋ (์๋ฒ ๋ถํ)
* ์ ์ฒด ์์ฒญ ๋ฐ ์๋ต ๋ค์คํ๋ฅผ ์ง์ํจ
- ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ HTTP ๋ฉ์ธ์ง๋ฅผ ๋ ๋ฆฝ๋ ํ๋ ์์ผ๋ก ์ธ๋ถํ
โ ์ด ํ๋ ์์ ์ธํฐ๋ฆฌ๋น(๋ผ์ ๋ฃ๊ธฐ) ํ ํ, ๋ค๋ฅธ ์ชฝ์์ ์ฌ์กฐ๋ฆฝ // ๋ค์ํ ์คํธ๋ฆผ๋ค์ด ์์ฌ ์๋ค.
- ์์ฒญ ์์์ ์๊ด ์์ด, (์์ฌ์) ๋์ ๋ค๋ฐ์ ์ผ๋ก ์ฒ๋ฆฌ ๊ฐ๋ฅ.
* HTTP/2 ๋ฐ์ด๋๋ฆฌ ํ๋ ์ด๋ฐ ๊ณ์ธต์ ๋ค์คํ ํจ๊ณผ
- ์ฌ๋ฌ ์์ฒญ/์๋ต์ ํ๋๋ ์ฐจ๋จํ์ง ์๊ณ , ๋ณ๋ ฌ๋ก ์ธํฐ๋ฆฌ๋น ํ ์ ์๋ค.
- ๋จ์ผ TCP ์ฐ๊ฒฐ์ ์ฌ์ฉํ์ฌ, ๋ณ๋ ฌ์ ์ผ๋ก ์ ๋ฌ ๊ฐ๋ฅ
- ๋ถํ์ํ ์ง์ฐ ์๊ฐ ์ ๊ฑฐ, ํ์ด์ง ๋ก๋ ์๊ฐ์ ์ค์
: ๊ฒฐ๋ก ์ ์ผ๋ก, HOL blocking์ ํด๊ฒฐํ ์ ์์ผ๋ฉฐ, ์ฌ๋ฌ TCP ์ฐ๊ฒฐ ์์ด๋ ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค.
# ์คํธ๋ฆผ ์ฐ์ ์์ ์ง์
- ์ฌ๋ฌ ์คํธ๋ฆผ์ ํ๋ ์์ ๋ค์คํ ํ๋ ๊ฒ์ด ๊ฐ๋ฅํด์ง์, ์ธํฐ๋ฆฌ๋น๋๊ณ ์ ๋ฌ๋๋ ์์๊ฐ ์ค์ํด์ง
-> ์คํธ๋ฆผ์ด ๊ฐ์ค์น(weight)์ ์ข ์์ฑ(dependency โ ์์ ๋ถ์ฌ)์ ๊ฐ๋๋ก ํ์ฉํจ
- ํด๋ผ์ด์ธํธ๊ฐ โ์ฐ์ ์์ ์ง์ ํธ๋ฆฌโ๋ฅผ ๊ตฌ์ฑ -> ํด๋ผ์ด์ธํธ๊ฐ ์ ํธํ๋ ์๋ต ์์ ๋ฐฉ์ ๋ํ๋
- ์๋ฒ๊ฐ ์ด ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ, ์คํธ๋ฆผ ์ฒ๋ฆฌ์ ์ฐ์ ์์๋ฅผ ์ง์ ํจ
- ์๋ต ๋ฐ์ดํฐ๊ฐ ์๋ ๊ฒฝ์ฐ, ์๋ฒ๋ ์ฐ์ ์์ ๋์ ์๋ต์ด ์ต์ ์ผ๋ก ์ ๋ฌ๋๋๋ก ๋์ญํญ ํ ๋นํจ (๋ฌด์ ํต์ ์ ๊ฒฝ์ฐ ์๋ฏธ๊ฐ ํฌ๋ค.)
* ์คํธ๋ฆผ ์ข ์์ฑ (dependency)
- ์์ ๋ณด๋ค ๋์ ์ฐ์ ์์์ ์คํธ๋ฆผ์ ์๋ณ์๋ฅผ ์์ ์์๋ก ์ฐธ์กฐํ๋ ๋ฐฉ์
- ์๋ณ์ ์๋ต โ ์คํธ๋ฆผ์ด ๋ฃจํธ ์คํธ๋ฆผ์ ์ข ์๋จ (๋ด๊ฐ ๋ฃจํธ)
- ์์ ์์ ์คํธ๋ฆผ์ ๋ฆฌ์์ค๊ฐ ๋จผ์ ํ ๋น๋์ด์ผ ํจ์ ๋ํ๋
* ์คํธ๋ฆผ ์์ ํ ๋น
- ๋์ผํ level์ ์คํธ๋ฆผ ์ฌ์ด์์๋, ๊ฐ์ค์น์ ๋น๋กํ์ฌ ๋ฆฌ์์ค๊ฐ ํ ๋น๋จ
- ex) A = 12, B = 4 -> AAA B AAA B AAA B AAA B (์ธํฐ๋ฆฌ๋น, ๋ผ์๋ฃ๊ธฐ, ๋น์จ ๊ณ ๋ ค)
- ์ข ์์ฑ์ด ์๋ค๋ฉด, ๊ฐ์ค์น๋ ์ค์ํ์ง ์์ (๋ฌด์กฐ๊ฑด ์์ ์ ๊ฐ ๋ ๋์ ์ฐ์ ๊ถ)
- ๋์ผํ level: ๋จผ์ ํ ๋น ๋ฐ๋ ๊ฒ์ ์๋ - ๊ฐ์ค์น์ ๋ฐ๋ผ ํ ๋น์ ๋น์จ์ด ๋ฌ๋ผ์ง๋ ๊ฒ
* ์คํธ๋ฆผ ์ฐ์ ์์ ์ง์์ ํจ๊ณผ
- ๋ธ๋ผ์ฐ์ ์ฑ๋ฅ ๊ฐ์ ์ ์ค์ (์ฌ๋ฌ ๋ฆฌ์์ค ์ ํ์ด ์กด์ฌํ ๋)
- ํด๋ผ์ด์ธํธ ๊ฐ๋ฐ์๊ฐ ์ธ์ ๋ ์ง ์ข ์์ฑ, ๊ฐ์ค์น ๋ณ๊ฒฝ ๊ฐ๋ฅ
- ์ฃผ์ ์ฌํญ: ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฐธ์กฐํ๋, ์๋ฒ๊ฐ ๋ฌด์กฐ๊ฑด ํด์ฃผ๋ ๊ฒ์ ์๋๋ค. ์๋ฒ์๊ฒ ๊ฐ์ํ ์ ์์
- ๋ฐ๋ผ์, ํน์ ํ ์ฒ๋ฆฌ๋ ์ ์ก ์์๋ฅผ ๋ณด์ฅํ์ง๋ ์์
# ๋จ์ผ TCP ์ฐ๊ฒฐ
- ๋ชจ๋ HTTP/2 ์ฐ๊ฒฐ์ ์๊ตฌ์ โ ๊ฐ๋น์ผ TLS ํธ๋์ ฐ์ดํฌ๊ฐ ์ค์ด๋ฆ (์ํธ ๊ด๋ จ ์ฐ๊ฒฐ ์ค์ โ ์๋นํ ๋ง์ ์๊ฐ)
- ๋๋ถ๋ถ์ HTTP ์ ์ก์ ์๋ช ์ด ์งง๊ณ ํญ์ฃผ burstness // ๋ฐ๋ฉด TCP๋ ์๋ช ์ด ๊ธด ๋๋ ๋ฐ์ดํฐ ์ ์ก์ ์ต์ ํ
- HTTP/2 : ๋์ผํ TCP ์ฐ๊ฒฐ์ ์ฌ์ฌ์ฉ โ ๋ ํจ์จ์ ์ธ ์ฌ์ฉ, ํ๋กํ ์ฝ ์ค๋ฒํค๋๋ฅผ ๋ํญ ์ค์
+ ๋ ์ ์ TCP ์ฐ๊ฒฐ์ ์ฌ์ฉ โ ๋ฉ๋ชจ๋ฆฌ์ ์ฒ๋ฆฌ๋ ์ค์ด๋ฆ
-> ๋ฐ๋ผ์ 2๋ ๋คํธ์ํฌ ์ง์ฐ ์๊ฐ์ด ์ค์ด๋ค ๋ฟ๋ง ์๋๋ผ ์ฒ๋ฆฌ๋์ด ๊ฐ์ ๋๊ณ ์ด์ ๋น์ฉ์ด ์ค์ด๋ฆ
# ํ๋ฆ ์ ์ด
- ์ฌ์ฉ์๊ฐ ๋์์์ ์ผ์ ์ค์ง -> ์๋ฒ๋ก๋ถํฐ ๋์์ ์ ๋ฌ์ ์ค์ง or ์ฐจ๋จ
: ์ธ๋ชจ ์๋ ์ปจํ ์ธ ๋ฅผ ๋ณด๋ด๊ณ , ํด๋ผ์ด์ธํธ๊ฐ ์ฒ๋ฆฌํ๋ ๊ฒ์ ๋ชจ๋ ์์ฐ
- ํ๋ก์ ์๋ฒ๊ฐ ์ ์คํธ๋ฆผ ์๋์ ๋ง๊ฒ ๋ค์ด์คํธ๋ฆผ ๋ฐ์ดํฐ ์ ๋ฌ ์๋๋ฅผ ์กฐ์
HTTP/2 ํ๋ฆ ์ ์ด ํน์ง
- ํ๋ฆ ์ ์ด๋ฅผ ๊ตฌํํ๊ธฐ ์ํ ํน์ ์๊ณ ๋ฆฌ์ฆ ์ง์ X (๊ฐ๋ฐ์๊ฐ ์์์ ํจ, ๋น๋ฉ ๋ธ๋ก์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ค์ )
- ํน์ ๋ฆฌ์์ค์ ์ผ๋ถ๋ง ๊ฐ์ ธ์จ ๋ค, ์์ ๋ฒํผ ์ฌ์ด์ฆ๋ฅผ 0์ผ๋ก ๋ง๋ค์ด ๋ฒํผ๋ง์ ์ํ ์ ์์
-> ํน์ ์ด๋ฏธ์ง์ ๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ ์ต์ด ์ค์บ
HTTP/2 ํ๋ฆ ์ ์ด ๋์ ์๋ฆฌ (์๋ฆฌ๋ TCP ํ๋ฆ ์ ์ด์ ๊ฐ๋ค)
- ํ๋ฆ ์ ์ด๋ ์๋ฐฉํฅ โ ๊ฐ ์คํธ๋ฆผ๊ณผ ์ ์ฒด ์ฐ๊ฒฐ์ ์ํ๋ ์ฐฝ ํฌ๊ธฐ๋ฅผ ์ค์
: stream level์์ ์๋์ฐ ํฌ๊ธฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ flow control
- ๊ฐ ์์ ๋จ์ ์์ฒด์ ์ด๊ธฐ ์ฐ๊ฒฐ๊ณผ ์คํธ๋ฆผ ํ๋ฆ ์ ์ด Window (๋ฐ์ดํธ ๋จ์, ๋ฒํผ ํฌ๊ธฐ)๋ฅผ ์๋ฆผ
- ํ๋ฆ ์ ์ด๋ ๋นํ์ฑํ ๋ ์ ์๋ค (์ค๋จ๋ง ๊ฐ๋ฅ, ๋ ์ ์๋ค. ๋ฌด์กฐ๊ฑด ์ฌ์ฉ)
- ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ SETTINGS ํ๋ ์์ ๊ตํ -> ์์ชฝ ๋ฐฉํฅ์์ ํ๋ฆ ์ ์ด ์ฐฝ ํฌ๊ธฐ๋ฅผ ์ค์
: ๊ธฐ๋ณธ๊ฐ์ 64KB, ์ต๋ ์ฐฝ ํฌ๊ธฐ 2GB -> application level์์ ์ ์ ์๋ ์์ด ๋งค์ฐ ๋์๋ค.
- ํ๋ฆ ์ ์ด๋ ํ ๋ฐฉ์์ด๋ค. (hop by hop)
: ์ค๊ฐ์(ํ๋ก์)๊ฐ ํ๋ก์์ ์๋ฒ, ํ๋ก์์ ํด๋ผ์ด์ธํธ ๊ฐ๊ฐ์ ๋ํ ํ๋ฆ ์ ์ด๊ฐ ๊ฐ๋ฅํ๋ค.
- ํ๋ก์ ์๋ฒ๊ฐ ์ ๋ฉด์ ๋ฑ์ฅ
# ์๋ฒ ํธ์
- ํด๋ผ์ด์ธํธ๊ฐ ๋ช ์์ ์ผ๋ก ์์ฒญํ์ง ์์๋, ์๋ฒ๊ฐ ์ถ๊ฐ์ ์ธ ๋ฆฌ์์ค๋ฅผ ํธ์ํ ์ ์์
- ๋์ค์ ์์ฒญํ ๊ฒ์ ๋ฏธ๋ฆฌ ๋ณด๋ด, ์ง์ฐ ์๊ฐ์ ์ค์ฌ๋ณด์
- PUSH_PROMISE frame์ ๋ณด๋ธ๋ค (ํค๋๋ง ๋ด๊ธด) -> ์ดํ, ๊ฐ๊ฐ์ pushed ๋ฆฌ์์ค๋ ์คํธ๋ฆผ์ด๋ค.
- ํด๋ผ์ด์ธํธ๋ RST_STREAM์ผ๋ก ๊ฑฐ์ ํ ์๋ ์๋ค. (์ด๋ฏธ ๋ฆฌ์์ค๊ฐ ์บ์์ ์๊ฑฐ๋ ๋ฑ๋ฑ)
- ํด๋ผ์ด์ธํธ๊ฐ ํธ์ ์คํธ๋ฆผ์ ๊ฐ์๋ฅผ ์กฐ์ ํ ์ ์๋ค. (flow control window๋ ์กฐ์ ๊ฐ๋ฅ)
- but ๊ตฌ๊ธ์ด ๋ง๋ ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ์์ ์ญ์ ๋จ
# ํค๋ ์์ถ
- HTTP1.1 โ ์ฃผ๊ณ ๋ฐ๋ ๋ฐ์ดํฐ ๋๋น ๋๋ฌด ํฐ ํค๋ -> ์์ถ โ HPACK
* ํํ๋ง ์ฝ๋ฉ โ ๊ณผ๊ฑฐ์ ํ์ฌ์ ์ฐจ์ด ๊ธฐ๋ฐ ์์ถ ๊ธฐ์
: ๋ฐ๋์ง ์์ ๊ฐ๋ค์ ์ธ๋ฑ์ค๋ง ์ ๋ฌ, ๋ฌ๋ผ์ง ๊ฐ๋ง ์ฃผ๊ณ ๋ฐ๋ ํํ๋ง ์ฝ๋ฉ ๋ฐฉ์
- HTTP1.1: ๋ ๊ฐ์ ์์ฒญ ํค๋์ ์ค๋ณต ๊ฐ์ ๊ทธ๋ฅ ์ค๋ณต ์ ์ก
- HTTP/2: ์ค๋ณต๋ ํค๋๋ index ๊ฐ๋ง ์ ์ก, ์ค๋ณต๋์ง ์์ ํค๋ ์ ๋ณด์ ๊ฐ์ ํํ๋ง ์ธ์ฝ๋ฉํ์ฌ ์ ์ก
: ์ฐจ์ด๊ฐ ์์ ๋, ๋ฌ๋ผ์ง ๊ฐ(์์ ๋นํธ)๋ง ๋ณด๋ด๋ ๊ธฐ๋ฒ
-> ๊ณผ๊ฑฐ ์ด๋ ฅ์ ๋ํ ํ ์ด๋ธ์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด, ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ๊ฐ๊ณ ์๋๋ค.
- static table: ์์ฃผ ์ฃผ๊ณ ๋ฐ๋, ๋๋ถ๋ถ ์ฌ์ฉํ๋ ๊ฐ๋ค์ ๋ฏธ๋ฆฌ static์ผ๋ก ๋ง๋ค์ด ๊ฐ๋๋ค.
- dynamic table: ์ฒ์์๋ empty, ๋ฉ์ธ์ง๋ฅผ ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ ์ฑ์๋๊ฐ๋ ํ ์ด๋ธ
// HTTP/2 ๊ฐ๋ฐ ํ๊ฒฝ
- ์ธ์ด๊ฐ ์ง์ํ์ง ์๋๋ค. ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๋ฐ๊พธ๊ธฐ ๋งค์ฐ ์ด๋ ต๋ค.
- GO: ์ธ์ด๊ฐ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก HTTP2 ์ ๊ณต (standard)
- strong, static typing, C์ ์ ์ฌ, ์๋ฒ ๊ฐ๋ฐ์ ์ํ ์ธ์ด
* TLS ๊ธฐ๋ฐ โ localhost Server์ ๋ํ ์์ ์ธ์ฆ์๋ฅผ ์์ฒด ๋ฐํ (RSA ์ํธํ ๋ฐฉ์)
- ์ฝ๋์ ์ํธํ ์ ์ฐจ, TLS ๊ด๋ จ ์ฝ๋๊ฐ ์๋ค.
- HTTP ์ฌ๋ฌ ๋ฒ์ ์ ๋ํ ์ฒ๋ฆฌ -> client.Transport๋ฅผ ๋ณ๊ฒฝํ์ฌ ์ฒ๋ฆฌ ๊ฐ๋ฅ
3. WebRTC
- ์น ๋ธ๋ผ์ฐ์ ๊ธฐ๋ฐ์ real time communication / ์ค๋์ค, ๋น๋์ค ๊ธฐ๋ฐ์ ์๋น์ค / P2P ๊ธฐ์ by ๊ตฌ๊ธ
- ZMQ์ dirty P2P -> too heavy / ์๋ฒ ํ๋๋ ์๋ ๊ฒ, ๋ชจ๋ IP address์ ๋ํด ์ฐ๊ฒฐ, OS๋ ํ๋ ์ผ
- peer 2 peer โ ์ค์์ง์คํ ๋ ์๋ฒ ์์ด, ๋๋ฅผ ์ ์ธํ ๋ชจ๋ ๋๋ฑํ peer(node)์ ์ฐ๊ฒฐํ์ฌ, ์๋ก ์์์ ๊ณต์ ํจ
- peer to peer์ ๋ฌ๋ฆฌ client โ server ๊ตฌ์กฐ -> ๊ฐ ํด๋ผ์ด์ธํธ๋ค์ด ์๋ฒ์๊ฒ request, ์ค์ ์๋ฒ๊ฐ ๋ฆฌ์์ค ์ ๊ณต
* block chain ๊ธฐ์ โ P2P ๊ธฐ์ ์ ๊ธฐ๋ฐ์ผ๋ก, ์ฒด์ธ ํํ์ ์ฐ๊ฒฐ๊ณ ๋ฆฌ ๊ธฐ๋ฐ ๋ถ์ฐ ๋ฐ์ดํฐ ์ ์ฅ ํ๊ฒฝ
- ์์ ์กฐ์์ด ๋ถ๊ฐ๋ฅ, ๋ณํ๊ฐ ๋ฐ์ ์, ๋ชจ๋ ์ฌ์ฉ์๊ฐ ์์ฑ๋ block์ ๋๋ ๊ฐ์ง / ์ค์ ์ง์คํ ๋ ์๋ฒ X
- ํ์ธ์ ๊ฑฐ๋์ ๋ด ๋ ธํธ๋ถ ์์์ด ์ฌ์ฉ๋จ / ์ด๋ํต์ โ ๋น์ฉ, ์ด๋์ด ์๋ค.
- WebRTC โ real time communication ์๋น์ค / ์ ํ, ๊ตฌ๊ธ, ๋ชจ์ง๋ผ ๋ฑ ๋ชจ๋ ์น ๋ธ๋ผ์ฐ์ ์ ๋์ ํจ
- ๋ณธ์ธ์ด ํ์ํ ๊ธฐ๋ฅ์ ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ์์ ํธ์ถํ์ฌ ์ฌ์ฉํ๋ฉด ๋จ / ํ๋ฉด ๊ตฌ์ฑ๋ง ํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ ์์์ ๋ค ํจ
- GIPS ์์ ๊ฐ๋ฐ์๊ฐ ๊ฐ๋ฐ -> ๊ตฌ๊ธ์ด ์ธ์, 2011๋ WebRTC๋ก ๊ฐ๋ช ํ ํ, ์คํ์์ค ๊ณต๊ฐ / IETF ํตํ ํ์คํ
* WebRTC์ ๋ชฉ์ โ ์ค๊ฐ์ ์์ด ๋ธ๋ผ์ฐ์ ๊ฐ ์ค๋์ค๋ ์์์ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ค. ์ํํธ์จ์ด ์ค์น๋ ํ์ X
- ๋ํ์ ์ธ 3๊ฐ์ API
1) RTCPeerCommunication() โ ์๋ก ์ง์ ๊ฐ๋ฅํ ๋ฐฉ์์ negoํ๋ ๊ฒ, ์ฐ๊ฒฐ ์ค์ ๊ด๋ จ๋ ํจ์
2) getUserMedia() โ ๋ น์, ๋ นํ ๋ฑ ๋น๋์ค์ ์ค๋์ค๋ฅผ ๋ด๋ณด๋ด๊ธฐ ์ํด ๋ฐ์ดํฐ get
3) RTCDataChannel() โ ๋ฐ์ดํฐ๋ค์ ์ค์ด๋๋ฅด๋ ๊ฒ
* WebRTC์๋ 3๊ฐ์ ๊ธฐ์ ์ด ๋ฐ๋ผ๋ถ๋๋ค -> ์ํ ๋ฌธ์ ์ถ์ !
* ICE (Interactive Connectivity Establishment)
- ๋ธ๋ผ์ฐ์ ๊ฐ peer๋ฅผ ํตํ ์ฐ๊ฒฐ์ด ๊ฐ๋ฅํ๋๋ก ํ๊ฒ ํด์ฃผ๋ ํ๋ ์์ํฌ
- private IP๊ฐ NAT/PAT๋ฅผ ํต๊ณผํ๋ฉฐ public IP๋ก ๋ณํ๋จ โ ๋ด public IP๋ฅผ ์ด๋ป๊ฒ ์ ์ ์์๊น? -> ICE๋ก ํด๊ฒฐ
- ICE๋ ์ด๋ฌํ ์์ ์ ์ํํ๊ธฐ ์ํด, STUN์๋ฒ์ TURN ์๋ฒ๋ฅผ ์ฌ์ฉํจ
* STUN (Session Traversal Utilities for NAT) - NAT๋ฅผ ํต๊ณผํ๊ธฐ ์ํ STUN ์๋ฒ
- NAT ๋ค์ ๋ peer ๊ฐ ์ฐ๊ฒฐ์ด ํ์ / ์์ฒญ์์ Public IP address๋ฅผ ์๋ ค์ฃผ๋ ๊ฒ
+ symmetric NAT โ STUN์๋ฒ์ ์ํด public IP ์์๋ธ๋ค๊ณ ๋ชจ๋ ์ฐ๊ฒฐ๋๋ ๊ฑด X, ์ด๋ฅผ ์ํด TURN์ด ํ์
* TURN (Traversal Using Relays around NAT)
- NAT๊ฐ ์๋ ๊ณณ์์ ๋ฆด๋ ์ด(ํธ๋ํฝ)๋ฅผ ์ ๊ณตํ์ฌ ํต์ ์ ํ๋ค.
- peer ๊ฐ M:N ์ ๋ณด๋ฅผ ์ง์ ์ฃผ๊ณ ๋ฐ์ง ์๊ฒ, ์ ๋ขฐํ ์ ์๋ TURN ์๋ฒ์๊ฒ๋ง ๋ฐฉํ๋ฒฝ์ ๋ซ๊ณ , ์ ๋ณด๋ฅผ ๋ณด๋ด๋ฉด TURN ์๋ฒ๊ฐ ๋์ ๋ฟ๋ ค์ฃผ๋ ์ญํ
- ์ฆ, TURN ์๋ฒ๋ ํธ๋ํฝ์ ์ฃผ๊ณ ๋ฐ๋ ์ฉ๋๋ก ์ฌ์ฉ
+ SDP โ Session Description Protocol - ํด์๋, ํ์, ์ํธํ ๋ฑ ์ปจํ ์ธ ์ ์ฐ๊ฒฐ์ ์ค๋ช ํ๊ธฐ ์ํ ํ์ค
- session์ describe ํ๋ค๋ฉด, (ํต์ ํ๋ค๋ฉด) ์ฃผ๊ณ ๋ฐ๋ ๋ฏธ๋์ด์ ํฌ๋งท์ ํฉ์ํ๋ ๊ฒ
- ๋คํธ์ํฌ๋ฅผ ํ๊ณ p2p ๊ตฌํ ์, NAT/PAT + ๋ฐฉํ๋ฒฝ ๋ฑ์ ๋ฌธ์ ๋ก ์ง์ ์ฃผ๊ณ ๋ฐ์ ์ ์๋ค.
- ์ฐ๊ฒฐ์ ์ํ ์๋ฒ๋ค์ด ํ์ฐ์ ์ผ๋ก ๋ฑ์ฅ
1) STUN์ ๊ฑฐ์ณ public IP๋ฅผ ์ป์ด ์ฐ๊ฒฐ ์ค์ 2) TURN ์๋ฒ๋ก ํธ๋ํฝ์ ์ฃผ๊ณ ๋ฐ์
- peer ๊ฐ ๋ฐ์ดํฐ๋ ์ง์ ์ก์์ ํ๋ ๊ฒ์ด ๊ธฐ๋ณธ ๊ตฌ์กฐ
1) Signaling ์๋ฒ๋ฅผ ํตํด SDF๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค (๋๋ ์ด๋ฐ ๋ฏธ๋์ด ์ง์ ํ ์ ์์ด โ offer / ๋๋? โ answer)
2) ICE (STUN + TURN) ์๋ฒ๋ฅผ ํตํด ํต์ ๊ด๋ จ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค.
-> ์ด๋ฌํ signaling ์๋ฒ, STUN + TURN ์๋ฒ โ ๊ตฌ๊ธ์ด ์์์ ๊ด๋ฆฌ
* WebRTC ์ฃผ์ ๊ตฌ์ฑ์์
- NAT โ network address translation โ ์ฐ๊ฒฐ๋ ์ธํฐ๋ท ๋๋ฐ์ด์ค์ ์ฌ์ค(private) IP ๋ถ์ฌ
- ICE โ interactive connectivity establishment โ ICE๋ผ๋ ์ฐ์ฐ ์๋, STUN, TURN ์๋ฒ๊ฐ ์๋ค. โp2p ๊ฐ ๋ค์ด๋ ํธ ํต์ ์ ์ํ ๊ธฐ์ ๋ก, ํต์ ์ ์ํ ์ต์ ์ ๊ฒฝ๋ก ํ์
- STUN โ session traversal utilities for NAT โ ๊ธฐ๊ธฐ์ public IP๋ฅผ ์ฐพ๊ณ , p2p ์ฐ๊ฒฐ์ ๋ฐฉํดํ๋ ์์ ํ์ง
- TURN โ traversal using relays around NAT โ STUN ์๋ฒ๋ฅผ ์ด์ฉํ ์ฐ๊ฒฐ์ด ์คํจํ ๊ฒฝ์ฐ, ์ค๋์ค ๋น๋์ค ๋ฑ์ ๋ฆด๋ ์ด (ํธ๋ํฝ ์ ๋ฌ)
- SDP โ session description protocol โ p2p๋ก ์๋ก ์ฃผ๊ณ ๋ฐ๋ ๋ฐ์ดํฐ์ ๋ํด ์ดํดํ ๋ ์ฌ์ฉ
- signaling server โ ๊ธฐ๊ธฐ ์ฌ์ด์ ์ฐ๊ฒฐ์ ์์ฑํ๋ ์ญํ
+ WebRTC๋ UDP ์์์ ๊ตฌํ๋๋ค.
- SRTP โ real time์ผ๋ก ์ค๋์ค, ๋น๋์ค ๋ฐ์ดํฐ๋ฅผ ์ค์ด๋๋ฅด๋ ๊ฒ
* WebRTC์ ์ฅ์
- near real time -> low latency โ ์ค๊ฐ์ ์๋ฒ๋ฅผ ๊ฒฝ์ ํ์ง ์์, ์ง์ฐ ์๊ฐ์ด ๋งค์ฐ ์ค์ด๋ฆ (๋งค์ฐ ๋น ๋ฆ)
- glass to galss latency โ ์นด๋ฉ๋ผ์์ ์ดฌ์ โ ํ๋ฉด์ผ๋ก ๋์ค๋ ๊ฒ ๊น์ง์ ์ง์ฐ ์๊ฐ โ 500ms
- WebRTC๋ HTML5 โ ํ ์ผ์ด ๋ง์์ก๋ค / ๋ธ๋ผ์ฐ์ ๊ฐ ๊ฐ๋ ฅํด์ง ๊ฒ
- ํ์คํ ๋ ์คํ์์ค (IETF๋ก๋ถํฐ ํ์คํ ๋จ)
+ Simulcasting
- HTTP live streaming โ ๋์์๋ HTTP request โ ๋คํธ์ํฌ ์ํฉ์ ๋ง์ถ์ด, ์๋ฒ์์ ๊ฐ์ ธ์ฌ ํ์ผ์ ํด์๋๋ฅผ ์กฐ์ ํ๋ค. ํ ์๊ฐ์๋ ํ๋์ ํ์ผ๋ง ๊ฐ์ ธ์จ๋ค.
- simulcasting / WebRTC๋ ๋ชจ๋ ํด์๋๋ฅผ ๋ณด๋ธ๋ค / client๊ฐ ์์์ ๊ฐ์ํ๋ฉด ๋จ โ ์ ํ์ ๋ฐ๋ ์ฌ๋์ด
* WebRTC์ ๋จ์
- Scalability โ ํ๋์ WebRTC session์ ๋ํด, 50๋ช ์ด๋ด๋ก ์๋ ๊ฒ์ด ์ ์ ํ๋ค. (์ ํ๋จ)
- 50๋ช ์ด์์ผ ๊ฒฝ์ฐ, live streaming server์ ์ ๋ฌํ๊ณ , ์๋ฒ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฟ๋ ค์ผ ํจ โ ์ฆ ์๋ฒ๊ฐ ๋์ ๋จ
+ ์ฌ์ฉ์ ์๊ฐ ๋์ด๋๋ ๋ถ๋ด, ์ง์ํ ํด์๋๊ฐ ๋์ด๋ ๋ถ๋ด
+ ํ์ง ์ ๋ฌธ์ ๊ฐ ์๋ค๊ณ ํ๋๋ฐ, ์ด๊ฑด ํฌ๊ฒ X
- ๊ตฌ๊ธ์ WebRTC์ ์ค๋ ์๊ฐ ๊ฐ๋ฐ, ํ์คํ๋ฅผ ์ฃผ๋, WebRTC๋ฅผ ์ํด ์คํ์์ค VP8 ์ฝ๋ฑ ๊ฐ๋ฐ ๋ฐ ์คํ์์คํ
- ๊ตฌ๊ธ meet, ์ ํ๋ธ ๋ผ์ด๋ธ ์ฑํ ๊ธฐ์ ์์๋ WebRTC๋ฅผ ์ฌ์ฉํจ
- ๋ชจ์ง๋ผ โ firefox ์น ๋ธ๋ผ์ฐ์ ๋ ์ด์ฐฝ๊ธฐ 2013๋ ๋ถํฐ ์์ฑ ์์ ํ์ค WebRTC ์ง์
- ์์ค์ฝ โ Webex๋ WebRTC ํ์ค ์ฌ์ฉ
- ์น ๋ธ๋ผ์ฐ์ ์์์ ์๋ฐ ์คํฌ๋ฆฝํธ๊ฐ ๊ธฐ๋ณธ์ด์ง๋ง, ๋ค๋ฅธ ์ธ์ด๋ ์ง์ / ํ์ด์ฌ, ๋คํธ๋ ๊ฐ๋ฅ
- SOLID โ ํ ๋ฒ๋์ค ๋ฆฌ ๊ฒฝ โ ๋ด๊ฐ ์ํ ์ธ์์ ์ด๋ฐ ๊ฒ ์๋๋ค (๊ตฌ๊ธ, ๋ฉํ๊ฐ ๋์ ๋ฒ๋ ๊ตฌ์กฐ, WWW ์์ ํ)
- ์ธ์คํ์ ์ฌ์ง ์ ๋ก๋ ์, ๋์ด์ ๋ด ๊ฒ์ด ์๋ / ๋ด ์ ๋ณด๋ ๊ณต์ธ๋ ์ ์ฅ ๊ณต๊ฐ์๋ง ์ ์ฅ / ๋ค๋ฅธ ๊ณณ์๋ ๋งํฌ / ๋ด๊ฐ ๊ฑฐ์ ํ๋ฉด ๋ณผ ์ ์๋ค โ ๋ด ํ๋ฝ ๋ฐ์
- ํฐ์ SOLID โ ์ด๋ ํต์ ์๊ธ ๋ฌธ์ / ๊ตฌํ ์ ๊ตฌ๊ธ ๋๋ผ์ด๋ธ, ๋๋กญ๋ฐ์ค ์ฌ์ฉ โ ์๊ฐ๋น์ฐฉ
4. QUIC & HTTP3
* ํ๋ ํต์ ํ๋กํ ์ฝ ํจ๋ฌ๋ค์
1) application layer 2) opensource 3) UDP based new transport protocol
* QUIC / HTTP3 ์ถํ ๋ฐฐ๊ฒฝ
- ๊ธฐ์กด TCP์ ๋ฌธ์ ์ ์ QUIC์์ UDP๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์
- ๋์๊ฐ TLS ์ํธํ โ ์ 3์๊ฐ ๋ณผ ์ ์๋๋ก ํ์๋ค.
* TCP์ ๋จ์
- slow start
- loss ๋ฐ์ ์ ๊ธ๊ฐ โ ํฑ๋๋ฐํด ๋ชจ์์ ๊ทธ๋ํ
- head of line blocking โ ํ ์ค์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ฉด, ๋ชจ๋ ์ํฅ์ ๋ฐ์
- HTTP2๋ ์ฌ์ ํ ํด๊ฒฐํ์ง ๋ชปํ ๋ฌธ์ ์ (TCP ์ฌ์ฉํ๋๊น)
* QUIC
- UDP ๊ธฐ๋ฐ์ ์๋ก์ด transport protocol
- TLS ํ์ โ ์ ๋ขฐ์ฑ์ ์ ๊ณตํ๋ค.
* QUIC connection
- QUIC ์ฐ๊ฒฐ์ ๋ QUIC ์๋ ํฌ์ธํธ ์ฌ์ด์ ๋ํ
- ์ฐ๊ฒฐ ์ค์ ์ ์ง์ฐ ์๊ฐ์ ์ค์ฌ์ค๋ค.
- ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ๋, ํ๋ ์ด์์ stream์ ๋ง๋ค์ด ์ฌ์ฉ
* QUIC Connection ID
- IP address์ ๋ณ๊ฐ์, Connection ID๊ฐ ์๋ค.
- ๋ชจ๋ฐ์ผ ํ๊ฒฝ์์ IP address๋ ๋ฐ๋๋๋ผ๋, (์นดํ์์ wifi โ ์ค์ธ์์ ์ด๋ ํต์ , ์ ๋ฃฐ๋ฌ)
Connection ID๊ฐ ์ ์ง๋๋ค๋ฉด, ์๋น์ค ์ฐ๊ฒฐ์ด ์ ์ง๋๋ค!
* Stream based Transport
- ํ๋์ ์ฐ๊ฒฐ๋ก ๋ค์์ ๋ณ๋ ฌ ์คํธ๋ฆผ์ ์ ์ก
- ์๋ก ๋ค๋ฅธ ์คํธ๋ฆผ์ ์์ ์์ด ์ ๋ฌ ๊ฐ๋ฅ
- QUIC์ ์ฐ๊ฒฐ๊ณผ ์คํธ๋ฆผ ๋ชจ๋์์ ํ๋ฆ ์ ์ด ์ ๊ณต
- stream์ ๋ํ ์ฐ์ ์์ ์กด์ฌ
** QUIC์ ํน์ฅ์ : ์ง์ฐ ์๊ฐ ๊ฐ์
- TCP์ 3 way handshake vs QUIC 0-RTT, 1-RTT handshake
- ์ด๋ฅธ ๋ฐ์ดํฐ (early data) ์ง์
- QUIC ์ฐ๊ฒฐ ์ค์ ์์ TLS ์ฐ๊ฒฐ ์ค์ ์ ํฌํจํ์ฌ, ๋ ๋น ๋ฅธ ์ฐ๊ฒฐ์ด ๊ฐ๋ฅํ๋ค.
- ๊ธฐ์กด์ ์ฐ๊ฒฐํ ํด๋ผ์ด์ธํธ -> ํด๋น ์ฐ๊ฒฐ์ ํน์ parameter๋ฅผ ์บ์ํ์ฌ, ์๋ฒ์ 0-RTT ์ฐ๊ฒฐ ๊ฐ๋ฅ
- ์ฐ๊ฒฐ ์ค์ ์ด ์์ํ์๋ง์, ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ์ ์๋ค.
- 0-RTT โ ์๋๋ฐฉ์๊ฒ ์ค๋ ๊ฒ์ ๊ธฐ๋ค๋ฆฌ๋ ์๊ฐ์ด ์๋ค.
* URL โ ์๋ก์ด URL ์ฒด๊ณ๋ฅผ ๋ง๋ค์ง ์๊ณ , ๊ธฐ์กด ์ฒด๊ณ ์ ์ง
- ์ด๊ธฐ ์ฐ๊ฒฐ์ TCP๋ฅผ ํตํด ์ํ๋๋ค. (HTTP1.1 or 2)
- ์๋ฒ๋ ๋ค์ ์ฐ๊ฒฐํ์ฌ, 3๋ฅผ ์๋ํ ์ ์๋ค๊ณ ํด๋ผ์ด์ธํธ์๊ฒ ์๋ฆด ์ ์๋ค.
* Alt-svc (alternative service)
- ์๋ฒ๊ฐ Alt-svc: h3 = โ:50781โ ๋ฅผ ์๋ต์ ํฌํจํ์ฌ, 50781 UPD ํฌํธ์์ HTTP3๋ฅผ ์ฌ์ฉํ ์ ์์์ ๋ํ๋ด๋ ์๋ฏธ๋ก ํด๋ผ์ด์ธํธ์๊ฒ ์ ๋ฌ
* HTTP/3 frame
- HEADERS โ ์์ถ๋ single HTTP ํค๋๋ฅผ ๋ณด๋
- DATA โ ์ดํ ๋ฐ์ด๋๋ฆฌ ๋ฐ์ดํฐ ์ปจํ ์ธ frame๋ค์ ๋ณด๋
- GOAWAY โ ๋ง์ง๋ง์ผ๋ก ์ฐ๊ฒฐ ์ข ๋ฃ ์ ๋ฉ์ธ์ง
- QPACK ์ ์ํด headers ํ๋ ์์ด ์์ถ๋๋ค.
-> HTTP/2์ HPACK๊ณผ ์ ์ฌํ๋ค.
* ์ฐ์ ์์ ์ ์ด โ HTTP2์ ๋์ผํ ๋ฐฉ์
- ์ข ์๋ stream์ ๋ถ๋ชจ ๋จผ์
- ๋์ผํ level -> ๊ฐ์ค์น์ ๋ฐ๋ผ ๋ฆฌ์์ค๋ฅผ ํ ๋น ๋ฐ๋๋ค.
* Server PUSH ํธ์ฌ
- ์๋ฒ ํธ์ฌ: ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ ์ ์๋ ์์ฒญ์ ๋ํ ํจ์จ์ ์ธ ์๋ต
- ์๋ฒ๊ฐ ์์ฒญ์ ํธ์๋ก ์๋ตํ ๊ฒ ์ฒ๋ผ ๋ณด์ด๋ PUSH_PROMISE ํ๋ ์์ ๋ณด๋ผ ์ ์๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ํธ์ฌ ์ทจ์ํ๊ณ ์ถ๋ค๋ฉด, ์๋ฒ์ CANCEL_PUSH ํ๋ ์์ ๋ณด๋
* HTTP/2 ์ HTTP/3์ ์ ์ฌ์
- connection์ด ์๊ณ , stream์ ์ ๊ณตํ๋ค.
- ์๋ฒ ํธ์๋ฅผ ์ง์ํ๋ค.
- ํค๋ ์์ถ์ ์ ๊ณตํ๋ค. (QPACK, HPACK โ ์ ์ฌ)
- ์คํธ๋ฆผ์ ์ด์ฉํ์ฌ, ํ๋์ ์ฐ๊ฒฐ์ ํตํด ๋ฉํฐํ๋์ฑ ์ ๊ณต
- ์คํธ๋ฆผ์ ์ฐ์ ์์๋ฅผ ์ ํจ
* HTTP/2 ์ HTTP/3์ ์ฐจ์ด์
- QUIC ๋๋ถ์ ์ฐ๊ฒฐ ์ค์ ์ ๋ ๋น ๋ฅด๋ค.
- TLS ํ์ โ ์ํธํ๋์ง ์์ ๋ฒ์ ์ด ์๋ค.
+ ํด๋ผ์ด์ธํธ๋ก๋ถํฐ Alt-svc ํค๋ ์๋ต์ด ๋จผ์ ์์ด์ผ ํ๋ค.
* QUIC์ ๋จ์
1. ์ปค๋ ์์ ์๋ค โ> QUIC์๋ ํ์ค API๊ฐ ์๋ค.
-> ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋ค๋ฅธ ๊ฒ์ผ๋ก ๋ฐ๊พธ๊ธฐ ๋งค์ฐ ์ด๋ ต๋ค. (Locked in)
2. UDP ํ๋กํ ์ฝ์ด TCP๋งํผ ์ต์ ํ ๋์ด์์ง ์์, QUIC ํ๋กํ ์ฝ ์ฑ๋ฅ ๊ฐ์ ์ฐ๊ตฌ ์ค
- HTTP/3๊ฐ HTTP/2 ๋๋น ๊ฐ์ ํธ๋ํฝ ๊ธฐ์ค, 2๋ฐฐ์ CPU ํ์ํ๋ค๋ ๋ณด๊ณ
* QUIC ํํฉ
- ๊ตฌ๊ธ, ์ ํ๋ธ, ๋ฉํ, ๋ค์ด๋ฒ // ์๋ฒ โ nginx // ๋ธ๋ผ์ฐ์ โ ํฌ๋กฌ, firefox, safari, edge