ComputerScience/FullStackProgramming

[ํ’€์Šคํƒ] ๊ธฐ๋ง๊ณ ์‚ฌ Summary

๊น€๊ฐœ๋ฏธ_ 2023. 7. 21. 00:29

 

 

 

 

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 

 

 

 

 

 

๋Œ“๊ธ€์ˆ˜0