SSE (Server Sent Event)

TCP ์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ
โ†’ HTTP GET /sse
โ†’ HTTP 200 OK (ํ—ค๋”)
โ†’ SSE ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ ๋ฐ˜๋ณต ์ „์†ก
โ†’ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์—ฐ๊ฒฐ ์ข…๋ฃŒ
โ†’ ์„œ๋ฒ„ ACK
โ†’ ์˜ˆ์™ธ์  RST ๋ฐœ์ƒ

Phase 1: TCP 3-Way Handshake

TCP 3-Way Handshake ๊ณผ์ •์€ WebSocket ๋ถ„์„ ์‹œ์™€ ๋™์ผํ•˜๋ฏ€๋กœ ์ƒ๋žตํ•ฉ๋‹ˆ๋‹ค.

332~334๋ฒˆ ํŒจํ‚ท์—์„œ ESTABLISHED ์ƒํƒœ๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

Phase 2: SSE Handshake (HTTP Request & Response)

WebSocket์€ 101 Switching Protocols๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ํ•˜์ง€๋งŒ SSE๋Š” ํ‘œ์ค€ HTTP ์š”์ฒญ์„ ์œ ์ง€ํ•˜๋˜ ์‘๋‹ต์„ ์ข…๋ฃŒํ•˜์ง€ ์•Š๊ณ  ์—ด์–ด๋‘๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

  • SSE๋Š” ํ”„๋กœํ† ์ฝœ ์—…๊ทธ๋ ˆ์ด๋“œ๊ฐ€ ์•„๋‹Œ, HTTP ์—ฐ๊ฒฐ์˜ ์žฅ๊ธฐ ์œ ์ง€(Long-lived HTTP Connection)

[Packet-335]: Client โ†’ Server (HTTP GET /sse)

ํด๋ผ์ด์–ธํŠธ๊ฐ€ Server-Sent Events(SSE) ๊ตฌ๋…์„ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•œ HTTP ์š”์ฒญ์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

์ด ํŒจํ‚ท์€ TCP ์—ฐ๊ฒฐ์ด ์ด๋ฏธ ESTABLISHED ์ƒํƒœ์ธ ์ƒํ™ฉ์—์„œ ์ „์†ก๋˜๋ฉฐ, SSE ํ†ต์‹ ์˜ ์‹œ์ž‘์ ์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๋Š” GET /sse HTTP/1.1 ์š”์ฒญ์„ ํ†ตํ•ด ์„œ๋ฒ„์— ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ์„ ์š”์ฒญํ•ฉ๋‹ˆ๋‹ค.

  • Accept: text/event-stream โ†’ ํ—ค๋”๋ฅผ ํ†ตํ•ด ์‘๋‹ต ๋ฐ์ดํ„ฐ๊ฐ€ ์ผ๋ฐ˜์ ์ธ HTTP ๋ฆฌ์†Œ์Šค๊ฐ€ ์•„๋‹Œ, ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ ํ˜•์‹์ž„์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.

  • Connection: keep-alive โ†’ ํ—ค๋”๋Š” ์„œ๋ฒ„๊ฐ€ ์‘๋‹ต์„ ์ฆ‰์‹œ ์ข…๋ฃŒํ•˜์ง€ ์•Š๊ณ , ํ•˜๋‚˜์˜ HTTP ์‘๋‹ต์„ ์žฅ์‹œ๊ฐ„ ์œ ์ง€ํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์†์ ์œผ๋กœ ์ „์†กํ•  ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  • SSE๋Š” WebSocket๊ณผ ๋‹ฌ๋ฆฌ ํ”„๋กœํ† ์ฝœ ์—…๊ทธ๋ ˆ์ด๋“œ(Upgrade) ๊ณผ์ •์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉฐ, ์ด ๋‹จ์ผ HTTP ์š”์ฒญ ์ดํ›„ ๋ณ„๋„์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต ํ•ธ๋“œ์…ฐ์ดํฌ๋Š” ์ˆ˜ํ–‰๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ์ด ์š”์ฒญ์€ ๋ฐ์ดํ„ฐ Payload๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ๋‹จ๋ฐœ์„ฑ ์š”์ฒญ์ด๋ฉฐ, ์ดํ›„์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ์ „์†ก์€ ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ด๋Š” HTTP ์‘๋‹ต ์ŠคํŠธ๋ฆผ์„ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค.

  • ๋”ฐ๋ผ์„œ ์ด ํŒจํ‚ท์€ WebSocket์—์„œ์˜ Upgrade Request์— ๋Œ€์‘๋˜๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ, ํ”„๋กœํ† ์ฝœ ์ „์ด ์—†์ด HTTP ์—ฐ๊ฒฐ์„ ์œ ์ง€ํ•œ๋‹ค๋Š” ์ ์—์„œ ๊ทผ๋ณธ์ ์ธ ์ฐจ์ด๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

  • TCP ๊ณ„์ธต์—์„œ๋Š” PSH, ACK ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋œ ์ผ๋ฐ˜ ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ๋กœ ์ „์†ก๋˜๋ฉฐ, TCP๋Š” ์ดํ›„ ์ „์†ก๋  SSE ์ด๋ฒคํŠธ์˜ ๊ฒฝ๊ณ„๋‚˜ ์˜๋ฏธ๋ฅผ ์ธ์ง€ํ•˜์ง€ ๋ชปํ•˜๊ณ  ๋‹จ์ˆœํ•œ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์œผ๋กœ๋งŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

[Packet-336]: Server โ†’ Client (ACK)

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ [Packet-335] (GET /sse) ์š”์ฒญ์„ "์ž˜ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค."๊ณ  ์„œ๋ฒ„์˜ OS(TCP ๊ณ„์ธต)๊ฐ€ ์‘๋‹ตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. (TCP ๊ณ„์ธต์˜ ์ˆ˜์‹  ํ™•์ธ ํŒจํ‚ท)

์ด ACK์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(Spring, Node.js ๋“ฑ)์ด ์‘๋‹ต์„ ๋งŒ๋“ค๊ธฐ๋„ ์ „์—, OS ๋ ˆ๋ฒจ์—์„œ ๋ณด๋‚ด๋Š” ์ˆ˜์‹  ํ™•์ธ ํŒจํ‚ท์ž…๋‹ˆ๋‹ค.

[Packet-337, 339]: Server โ†’ Client (PSH, ACK)

์„œ๋ฒ„๊ฐ€ ์ƒ์„ฑํ•œ HTTP 200 OK ์‘๋‹ต ํ—ค๋”(Response Header) ๋ฐ์ดํ„ฐ์˜ ์‹ค์ œ ์ „์†ก ๊ตฌ๊ฐ„์ž…๋‹ˆ๋‹ค.

์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ผ HTTP ์‘๋‹ต ํ—ค๋”์˜ ์–‘์ด ๊ฝค ๋˜๊ธฐ ๋•Œ๋ฌธ์—, TCP ๊ณ„์ธต์—์„œ ์ด๋ฅผ ๋‘ ๊ฐœ์˜ ์กฐ๊ฐ(Segment)์œผ๋กœ ๋‚˜๋ˆ„์–ด ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

์ด ํŒจํ‚ท๋“ค์—๋Š” PSH(PUSH) ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ๋Š”๋ฐ, ์ด๋Š” ์ˆ˜์‹  ์ธก์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฒ„ํผ์— ์ง€์—ฐ์‹œํ‚ค์ง€ ์•Š๊ณ ,

์ฆ‰์‹œ ์ƒ์œ„ ๊ณ„์ธต(์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)์œผ๋กœ ์ „๋‹ฌํ•˜๋„๋ก ์œ ๋„ํ•˜๊ธฐ ์œ„ํ•œ ํžŒํŠธ์ž…๋‹ˆ๋‹ค.

์™€์ด์–ด์ƒคํฌ์˜ Info ์ปฌ๋Ÿผ์— ํ‘œ์‹œ๋œ [TCP PDU reassembled in 341]๋Š” ๋‹ค์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  • 337๋ฒˆ, 339๋ฒˆ ํŒจํ‚ท์€ ๋ฌผ๋ฆฌ์ ์œผ๋กœ ๋ถ„ํ• ๋œ TCP ์„ธ๊ทธ๋จผํŠธ (์ „์†ก ๋‹จ์œ„๋กœ ํ•ด์„ ๊ฐ€๋Šฅ)

  • ์ด ๋‘˜์„ ์žฌ์กฐ๋ฆฝํ•˜๋ฉด, 341๋ฒˆ์—์„œ ํ™•์ธ ๊ฐ€๋Šฅํ•œ ์™„์ „ํ•œ HTTP ์‘๋‹ต ๋ฉ”์‹œ์ง€๊ฐ€ ๋จ

  • ์ฆ‰, "์ด ํŒจํ‚ท(337, 339)๋“ค์€ ์กฐ๊ฐ๋‚œ ๋ฐ์ดํ„ฐ์ด๋‹ˆ, 341๋ฒˆ์—์„œ ์กฐ๋ฆฝ๋œ ์™„์„ฑ๋ณธ์„ ๋ณด์—ฌ์ฃผ๊ฒ ๋‹ค"๋Š” ๋œป์ž…๋‹ˆ๋‹ค.

[Packet-338, 340]: Client โ†’ Server (ACK)

์ด ๊ณผ์ •์€ HTTP๋‚˜ SSE์™€๋Š” ๋ฌด๊ด€ํ•˜์ง€๋งŒ, ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ TCP ์„ธ๊ทธ๋จผํŠธ๋ฅผ ํ•˜๋‚˜ ์ˆ˜์‹ ํ•  ๋•Œ๋งˆ๋‹ค, ๊ฐ ์„ธ๊ทธ๋จผํŠธ์— ๋Œ€ํ•ด ์ˆœ์ฐจ์ ์œผ๋กœ ์ˆ˜์‹  ํ™•์ธ(ACK)์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • Packet-338 โ†’ Packet-337 ์ˆ˜์‹  ์™„๋ฃŒ ํ™•์ธ

  • Packet-340 โ†’ Packet-339 ์ˆ˜์‹  ์™„๋ฃŒ ํ™•์ธ

์‰ฝ๊ฒŒ ์–˜๊ธฐํ•˜๋ฉด, ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ธ ์กฐ๊ฐ(337๋ฒˆ, 339๋ฒˆ)์„ ํ•˜๋‚˜ ๋ฐ›์„ ๋•Œ๋งˆ๋‹ค ํด๋ผ์ด์–ธํŠธ๊ฐ€ "1๋ฒˆ ์กฐ๊ฐ ๋ฐ›์Œ(338)", "2๋ฒˆ ์กฐ๊ฐ ๋ฐ›์Œ(340)" ํ•˜๊ณ  ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

[Packet-341]: Server โ†’ Client (HTTP/1.1 200 OK)

์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ GET /sse ์š”์ฒญ์— ๋Œ€ํ•œ HTTP ์‘๋‹ต ํ—ค๋”๋ฅผ ๋ชจ๋‘ ์ „์†กํ•œ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

์ด ํ•ญ๋ชฉ์€ ์‹ค์ œ๋กœ ์ƒˆ๋กœ์šด ํŒจํ‚ท์ด ์ „์†ก๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์•ž์„œ ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ธ TCP ์„ธ๊ทธ๋จผํŠธ๋“ค([Packet-337], [Packet-339])์— ๋‹ด๊ธด ๋ฐ”์ดํŠธ๋ฅผ ์™€์ด์–ด์ƒคํฌ๊ฐ€ ํ•˜๋‚˜์˜ HTTP ์‘๋‹ต์œผ๋กœ ํ•ฉ์ณ์„œ ๋ณด์—ฌ์ฃผ๋Š” ํ‘œ์‹œ์ž…๋‹ˆ๋‹ค.

  • ์ฆ‰, ์™€์ด์–ด์ƒคํฌ๊ฐ€ ๋…ผ๋ฆฌ์ ์œผ๋กœ ์žฌ์กฐ๋ฆฝ(Reassembled)ํ•˜์—ฌ ๋ณด์—ฌ์ฃผ๋Š” ๊ฐ€์ƒ์˜ ๊ฒฐ๊ณผ๊ฐ’์ž…๋‹ˆ๋‹ค.

์ด ์‹œ์ ๋ถ€ํ„ฐ ํด๋ผ์ด์–ธํŠธ๋Š” ํ•ด๋‹น ์—ฐ๊ฒฐ์„ SSE ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ์œผ๋กœ ํ•ด์„ํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์‘๋‹ต์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ƒํƒœ ์ฝ”๋“œ: HTTP/1.1 200 OK

  • Content-Type: text/event-stream โ†’ ์‘๋‹ต์˜ Body๋Š” ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ์ž„์„ ์˜๋ฏธ

  • Connection: keep-alive โ†’ ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜์ง€ ์•Š๊ณ  ์œ ์ง€ํ•จ

์ด ์‘๋‹ต์ด ์ „๋‹ฌ๋˜๋ฉด์„œ, ์„œ๋ฒ„๋Š” ๋‹ค์Œ์„ ๋ช…ํ™•ํžˆ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ด ์—ฐ๊ฒฐ์„ ์š”์ฒญโ€“์‘๋‹ต์œผ๋กœ ๋๋‚ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ํ•˜๋‚˜์˜ HTTP ์‘๋‹ต์„ ์œ ์ง€ํ•œ ์ฑ„, ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•  ๋•Œ๋งˆ๋‹ค ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์† ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ์‹œ์  ์ดํ›„,

  • ํด๋ผ์ด์–ธํŠธ๋Š” ๋” ์ด์ƒ ์„œ๋ฒ„ ์‘๋‹ต์„ โ€œ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒํƒœโ€๊ฐ€ ์•„๋‹ˆ๋ผ, ์—ด๋ฆฐ HTTP ์‘๋‹ต ์ŠคํŠธ๋ฆผ์„ ์ˆ˜์‹ ํ•˜๋Š” ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

  • ์ฆ‰, ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ด๋Š” ๋ชจ๋“  SSE ์ด๋ฒคํŠธ๋Š” ์ด HTTP ์‘๋‹ต์˜ ๋ณธ๋ฌธ(Body)์— ์—ฐ์†์ ์œผ๋กœ ์ถ”๊ฐ€๋˜๋ฉฐ, TCP ๊ณ„์ธต์—์„œ๋Š” ์ด๋ฅผ ๋‹จ์ˆœํ•œ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์œผ๋กœ๋งŒ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

[Packet-342]: Client โ†’ Server (ACK)

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„์—์„œ ์ „์†กํ•œ HTTP ์‘๋‹ต ๋ฐ์ดํ„ฐ(337, 339 โ†’ ๋…ผ๋ฆฌ์ ์œผ๋กœ 341)๋ฅผ ์ •์ƒ์ ์œผ๋กœ ์ˆ˜์‹ ํ–ˆ์Œ์„ TCP ๊ณ„์ธต์—์„œ ํ™•์ธ(ACK)ํ•˜๋Š” ํŒจํ‚ท์ž…๋‹ˆ๋‹ค.

์ด ํŒจํ‚ท์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต(HTTP/SSE)๊ณผ๋Š” ์ง์ ‘์ ์ธ ์˜๋ฏธ๊ฐ€ ์—†์œผ๋ฉฐ, TCP์˜ ์‹ ๋ขฐ์„ฑ ๋ณด์žฅ ๋ฉ”์ปค๋‹ˆ์ฆ˜์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ „์†ก๋˜๋Š” ์ˆ˜์‹  ํ™•์ธ ํŒจํ‚ท์ž…๋‹ˆ๋‹ค.

๋ฌผ๋ฆฌ์  ์˜๋ฏธ:

๋ฐฉ๊ธˆ ์ „ Packet-341์€ ์™€์ด์–ด์ƒคํฌ์—์„œ โ€˜HTTP ์‘๋‹ต ์™„์„ฑ๋ณธ'์œผ๋กœ ํ‘œํ˜„๋˜์—ˆ์ง€๋งŒ, ์‹ค์ œ ๋ฌผ๋ฆฌ์  ๋„คํŠธ์›Œํฌ์ƒ์—์„œ๋Š” ๋งˆ์ง€๋ง‰ ๋ฐ์ดํ„ฐ(7 bytes)๋ฅผ ๋‹ด์€ ํŒจํ‚ท์ด์—ˆ์Šต๋‹ˆ๋‹ค.

  • ACK ๋ฒˆํ˜ธ ๊ณ„์‚ฐ: ์ด์ „๊นŒ์ง€ ํ™•์ธํ•œ ๋ฒˆํ˜ธ(287) + ๋ฐฉ๊ธˆ ๋ฐ›์€ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ(7) = ACK(294)

๋…ผ๋ฆฌ์  ์˜๋ฏธ (Handshake Completed):

์ด ํŒจํ‚ท์„ ๋์œผ๋กœ SSE ์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ์„ ์œ„ํ•œ ์ดˆ๊ธฐ ๋ฐ์ดํ„ฐ ๊ตํ™˜์ด ๋งˆ๋ฌด๋ฆฌ๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  • ์ด ์‹œ์ ๋ถ€ํ„ฐ ํด๋ผ์ด์–ธํŠธ๋Š” Passive Receiver๋กœ ์ „ํ™˜๋˜๋ฉฐ, ์„œ๋ฒ„๊ฐ€ ์ด๋ฒคํŠธ๋ฅผ PUSH ํ•ด์ค„ ๋•Œ๋งˆ๋‹ค ACK๋งŒ ๋ณด๋‚ด๋Š” ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

[Follow TCP Stream]

์ด ๊ธฐ๋Šฅ์€ TCP ์—ฐ๊ฒฐ์—์„œ ์˜ค๊ฐ„ ๋ชจ๋“  ๋ฐ”์ดํŠธ๋ฅผ ์‹œ๊ฐ„ ์ˆœ์„œ๋Œ€๋กœ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

SSE๋Š” ์š”์ฒญ 1๋ฒˆ + ์‘๋‹ต 1๋ฒˆ + ์—ฐ๊ฒฐ ์œ ์ง€ + Body์— ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์† ์ถ”๊ฐ€ํ•˜๋Š” ๊ตฌ์กฐ์ด๊ธฐ ๋•Œ๋ฌธ์—,

  • GET /sse ์š”์ฒญ

  • HTTP/1.1 200 OK ์‘๋‹ต ํ—ค๋”

  • ๊ทธ ๋’ค์— ์ด์–ด์ง€๋Š” ๋ชจ๋“  ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ

์ด ๋ชจ๋“ ๊ฒƒ์ด ํ•˜๋‚˜์˜ TCP ์ŠคํŠธ๋ฆผ ์•ˆ์— ๋“ค์–ด์žˆ์–ด์„œ 341๋ฒˆ ํŒจํ‚ท์„ ๊ธฐ์ค€์œผ๋กœ Follow ํ•˜๋ฉด ์ „์ฒด ๋Œ€ํ™” ๋‚ด์šฉ์ด ๋ณด์ž…๋‹ˆ๋‹ค.

์ด๋ฏธ์ง€๋ฅผ ๋ณด๋ฉด, ๋๋‚˜์ง€ ์•Š๋Š” HTTP ์‘๋‹ต์˜ Body์—, ์„œ๋ฒ„๊ฐ€ chunk ๋‹จ์œ„๋กœ ์ด๋ฒคํŠธ๋ฅผ ๊ณ„์† ์จ ๋‚ด๋ ค๊ฐ€๋Š” ๊ตฌ์กฐ์ธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Phase 3: Data Transmission (Event Stream)

HTTP ์‘๋‹ต ํ—ค๋”๊ฐ€ ๋ชจ๋‘ ์ „๋‹ฌ๋˜๊ณ (SSE ํ•ธ๋“œ์…ฐ์ดํฌ ์™„๋ฃŒ), ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ด๋ฅผ text/event-stream์œผ๋กœ ํ•ด์„ํ•˜๊ธฐ ์‹œ์ž‘ํ•œ ์ดํ›„์˜ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

  • ์ฆ‰, HTTP/1.1 200 OK ์‘๋‹ต ํ—ค๋”๊ฐ€ ๋๋‚˜๊ณ  Body ์ „์†ก์ด ์‹œ์ž‘๋œ ์ดํ›„์˜ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

์ด Phase์—์„œ๋Š” ์ƒˆ๋กœ์šด HTTP ์š”์ฒญ์ด๋‚˜ ์‘๋‹ต์ด ์˜ค๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ์—ด๋ ค ์žˆ๋Š” ๋‹จ ํ•˜๋‚˜์˜ HTTP/1.1 200 OK ์‘๋‹ต์˜ Body์— ์„œ๋ฒ„๊ฐ€ ์‹œ๊ฐ„ ๊ฐ„๊ฒฉ์„ ๋‘๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์† ์ถ”๊ฐ€(Append)ํ•ฉ๋‹ˆ๋‹ค.

  • ์ „์ฒด ํŒจํ‚ท์„ ๋‚˜ํƒ€๋‚ธ ์ด๋ฏธ์ง€๋Š” ์„œ๋ฒ„๊ฐ€ ์•ฝ 5์ดˆ ๊ฐ„๊ฒฉ์œผ๋กœ ์ด 3๋ฒˆ์˜ ์ด๋ฒคํŠธ๋ฅผ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ PUSH ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.

  • ๊ฐ ์‚ฌ์ดํด์€ [์„œ๋ฒ„์˜ ๋ฐ์ดํ„ฐ ์ „์†ก(PSH)] โ†’ [ํด๋ผ์ด์–ธํŠธ์˜ ์ˆ˜์‹  ํ™•์ธ(ACK)] ํŒจํ„ด์ด ๋™์ผํ•˜๊ฒŒ ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค.

Follow TCP Stream ์„น์…˜์— ์ด๋ฏธ์ง€๋ฅผ ๋ณด๋ฉด, id=0๊นŒ์ง€ SSE ์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ ,

id=1 ๋ถ€ํ„ฐ 890~2899๋ฒˆ ํŒจํ‚ท์—์„œ ์˜ค๊ฐ„ ๋ฐ์ดํ„ฐ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. (Packet Bytes์—์„œ ํ™•์ธ ๊ฐ€๋Šฅ)

[Packet-890 ~ 894]: Server โ†’ Client (์ฒซ ๋ฒˆ์งธ ์ด๋ฒคํŠธ ์ „์†ก)

  • ์ด๋ฒคํŠธ: id:1 ๋ฉ”์‹œ์ง€ ๋ฐœ์ƒ

  • ๋™์ž‘:

    • SSE ์—ฐ๊ฒฐ์ด ๋งบ์–ด์ง€๊ณ  ์•ฝ 5์ดˆ(ํ•ธ๋“œ์…ฐ์ดํฌ ์‹œ๊ฐ„ ํฌํ•จ) ๋’ค, ์„œ๋ฒ„๊ฐ€ ์ฒซ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค.

    • ๋ฐ์ดํ„ฐ๊ฐ€ TCP ์„ธ๊ทธ๋จผํŠธ ์—ฌ๋Ÿฌ ๊ฐœ(890, 892 ๋“ฑ)๋กœ ๋ถ„ํ• ๋˜์–ด ์ „์†ก

    • Wireshark๋Š” ์ด๋ฅผ Packet-894์—์„œ ํ•˜๋‚˜์˜ HTTP PDU๋กœ ์žฌ์กฐ๋ฆฝํ•˜์—ฌ ํ‘œ์‹œ

  • ๋‚ด์šฉ:

    • Follow TCP Stream์—์„œ ํ™•์ธํ•œ ์ฒซ ๋ฒˆ์งธ JSON ๋ฐ์ดํ„ฐ๊ฐ€ ์ด ํŒจํ‚ท๋“ค์— ๋‹ด๊ฒจ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์ƒˆ๋กœ์šด HTTP ์‘๋‹ต์ด ์•„๋‹ˆ๋ผ, ๊ธฐ์กด 200 OK ์‘๋‹ต Body์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

[Packet-895]: Client โ†’ Server (ACK)

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ฒซ ๋ฒˆ์งธ ์ด๋ฒคํŠธ ๋ฐ์ดํ„ฐ(890~894๋ฒˆ ๋‚ด์šฉ)๋ฅผ ๋ชจ๋‘ ์ž˜ ๋ฐ›์•˜์Œ์„ ์˜๋ฏธํ•˜๋Š” ํŒจํ‚ท์ž…๋‹ˆ๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์ˆ˜์‹ ํ•œ ๋ฐ์ดํ„ฐ ๋ฐ”์ดํŠธ ๋ฒ”์œ„์— ๋Œ€ํ•ด ๋‹ค์Œ์— ๊ธฐ๋Œ€ํ•˜๋Š” ์‹œํ€€์Šค ๋ฒˆํ˜ธ๋ฅผ ACK๋กœ ์‘๋‹ตํ•œ ํŒจํ‚ท์ž…๋‹ˆ๋‹ค.

  • Len=0 โ†’ Payload ์—†์Œ

[Packet-900]: Client โ†’ Server (FIN, ACK)

ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ ์ข…๋ฃŒ ์˜์‚ฌ (Active Close)

  • ์ƒํ™ฉ:

    • ์‚ฌ์šฉ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ํƒญ์„ ๋‹ซ์•˜๊ฑฐ๋‚˜, ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ "์ด์ œ ์—ฐ๊ฒฐ ๋Š์„๊ฒŒ์š”."๋ผ๊ณ  ์„ ์–ธํ–ˆ์Šต๋‹ˆ๋‹ค.

  • FIN ํ”Œ๋ž˜๊ทธ:

    • "ํด๋ผ์ด์–ธํŠธ๋Š” ๋” ์ด์ƒ ์„œ๋ฒ„ํ•œํ…Œ ๋ณด๋‚ผ ์š”์ฒญ(๋ฐ์ดํ„ฐ)์ด ์—†์–ด์š”. ํด๋ผ์ด์–ธํŠธ์˜ ๋งํ•˜๊ธฐ(Write) ๊ธฐ๋Šฅ์€ ๋Œ๊ฒŒ์š”."

    • ์ด ์‹œ์ ์—์„œ ํด๋ผ์ด์–ธํŠธ๋Š” FIN_WAIT_1 ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

    • FIN์€ ์—ฐ๊ฒฐ ์ „์ฒด ์ข…๋ฃŒ๊ฐ€ ์•„๋‹ˆ๋ผ, ์†ก์‹  ๋ฐฉํ–ฅ(write side) ์ข…๋ฃŒ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

[Packet-901]: Server โ†’ Client (ACK)

์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ FIN ํŒจํ‚ท ์ˆ˜์‹  ํ™•์ธ

  • ์ƒํ™ฉ:

    • ์„œ๋ฒ„์˜ OS(TCP ๊ณ„์ธต)๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ FIN ํŒจํ‚ท์„ ์ˆ˜์‹ ํ•˜๊ณ , ํ™•์ธํ–ˆ๋‹ค๋Š” ์‘๋‹ต ํฌํ•จ

  • ์ƒํƒœ ๋ณ€ํ™”:

    • ์„œ๋ฒ„๋Š” CLOSE_WAIT ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

    • ์ค‘์š”: OS๋Š” ์•Œ์•˜์ง€๋งŒ, ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(Spring ๋“ฑ)์ด ์•„์ง ์†Œ์ผ“์„ ์•ˆ ๋‹ซ์Œ, ์‘๋‹ต ์ŠคํŠธ๋ฆผ๋„ ์œ ์ง€ ์ค‘

    • ํด๋ผ์ด์–ธํŠธ๋Š” FIN_WAIT_2 ์ƒํƒœ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

[Packet-1676 ~ 1680]: Server โ†’ Client (๋‘ ๋ฒˆ์งธ ์ด๋ฒคํŠธ ์ „์†ก)

  • ์ด๋ฒคํŠธ: id:2 ๋ฉ”์‹œ์ง€ ๋ฐœ์ƒ

  • ๋™์ž‘:

    • ์ฒซ ๋ฒˆ์จฐ ์ด๋ฒคํŠธ ์ „์†ก๊ณผ ์™„์ „ํžˆ ๋™์ผํ•œ TCP ์ „์†ก ๊ณผ์ •(PSH, ACK)์„ ๊ฑฐ์นฉ๋‹ˆ๋‹ค.

    • 1676๋ฒˆ(ํ—ค๋” ๋ถ€๋ถ„) + 1678๋ฒˆ(๋ฐ”๋”” ๋ถ€๋ถ„)์œผ๋กœ ๋‚˜๋‰˜์–ด ์ „์†ก๋œ ํ›„, 1680๋ฒˆ์—์„œ ํ•˜๋‚˜๋กœ ์กฐ๋ฆฝ(Reassembled)๋˜์–ด ๋ณด์ž…๋‹ˆ๋‹ค.

  • Point:

    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ FIN์„ ๋ณด๋ƒˆ์Œ์—๋„ ์„œ๋ฒ„๋Š” ์—ฌ์ „ํžˆ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์„œ๋ฒ„๋Š” ์•„์ง CLOSE_WAIT ์ƒํƒœ

    • ์‘๋‹ต ์ŠคํŠธ๋ฆผ์„ ๋‹ซ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์“ฐ๊ธฐ(write)๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

[Packet-1681]: Client โ†’ Server (ACK)

์•ž์—์„œ ํด๋ผ์ด์–ธํŠธ๋Š” ์ด๋ฏธ Packet-900์—์„œ FIN์„ ๋ณด๋ƒˆ๋Š”๋ฐ, ์™œ ์ดํ›„์— ์„œ๋ฒ„๊ฐ€ ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ๋‹ค์‹œ ACK(ํ˜„์žฌ ํŒจํ‚ท, 1681)๋ฅผ ๋ณด๋‚ผ๊นŒ์š”?

์›์ธ์€ TCP Half-Close ๋™์ž‘ ๊ทœ์น™์— ์žˆ์Šต๋‹ˆ๋‹ค.

TCP์—์„œ FIN์€ ์—ฐ๊ฒฐ ์ „์ฒด ์ข…๋ฃŒ๊ฐ€ ์•„๋‹ˆ๋ผ ์†ก์‹  ๋ฐฉํ–ฅ ์ข…๋ฃŒ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, Client FIN (Packet-900)๋Š” ๋” ์ด์ƒ ์„œ๋ฒ„๋กœ ๋ณด๋‚ผ ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  • ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋” ์ด์ƒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์ง€ ์•Š๊ฒ ๋‹ค๋Š” ์˜๋ฏธ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

  • ํด๋ผ์ด์–ธํŠธ OS๋Š” FIN_WAIT_2 ์ƒํƒœ๋กœ, ๋“ค์–ด์˜ค๋Š” ๋ฐ์ดํ„ฐ์—๋Š” ACK ์‘๋‹ต์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

์„œ๋ฒ„๋Š” ์•„์ง ์†Œ์ผ“์„ ๋‹ซ์ง€ ์•Š์•˜๊ณ  ํด๋ผ์ด์–ธํŠธ ์—ญ์‹œ ์ˆ˜์‹  ๊ฒฝ๋กœ๋Š” ์—ด๋ฆฐ ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

[Packet-2879 ~ 2899]: Server โ†’ Client (์„ธ ๋ฒˆ์งธ ์ด๋ฒคํŠธ ์ „์†ก)

  • ์ด๋ฒคํŠธ: id:3 ๋ฉ”์‹œ์ง€ ๋ฐœ์ƒ

  • ๋™์ž‘:

    • ๋งˆ์ง€๋ง‰์œผ๋กœ count:3 ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

[PSH(PUSH) ํ”Œ๋ž˜๊ทธ์˜ ์˜๋ฏธ]

์ด ๊ตฌ๊ฐ„์˜ ์„œ๋ฒ„ ํŒจํ‚ท ๋‹ค์ˆ˜์—๋Š” PSH ํ”Œ๋ž˜๊ทธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Š” TCP ์Šคํƒ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜๋ฏธ๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.

  • โ€œ์ด ๋ฐ์ดํ„ฐ๋Š” ๋ฒ„ํผ์— ์Œ“์•„๋‘์ง€ ๋ง๊ณ โ€,

  • ์ฆ‰์‹œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต(๋ธŒ๋ผ์šฐ์ €)์œผ๋กœ ์ „๋‹ฌํ•˜๋ผ๋Š” ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค.

SSE๋Š” ์‹ค์‹œ๊ฐ„ ์ „๋‹ฌ์ด ํ•ต์‹ฌ์ด๊ธฐ ๋•Œ๋ฌธ์—, ์ด Phase์—์„œ PSH๊ฐ€ ์ž์ฃผ ๋“ฑ์žฅํ•˜๋Š” ๊ฒƒ์€ ์ •์ƒ์ ์ด๊ณ  ์˜๋„๋œ ๋™์ž‘์ž…๋‹ˆ๋‹ค.

Phase 4: Exceptional Termination (RST)

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์†ก์‹  ์ข…๋ฃŒ(FIN)๋ฅผ ํ–ˆ์Œ์—๋„ ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์† ๋ณด๋‚ผ ๋•Œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋งˆ์ง€๋ง‰ ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

[Packet-2900]: Client โ†’ Server (RST)

์ƒํ™ฉ:

  • ์„œ๋ฒ„๊ฐ€ ์„ธ ๋ฒˆ์งธ ๋ฐ์ดํ„ฐ(id:3)๋ฅผ ์ „์†กํ–ˆ์„ ๋•Œ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ด๋Š” ํŒจํ‚ท์ž…๋‹ˆ๋‹ค.

RST(Reset) ํ”Œ๋ž˜๊ทธ:

  • "๋‚˜๋Š” ์ด ์—ฐ๊ฒฐ์— ๋Œ€ํ•ด ๋” ์ด์ƒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์œผ๋‹ˆ, ์ฆ‰์‹œ ์—ฐ๊ฒฐ์„ ๊ฐ•์ œ ์ข…๋ฃŒ(Abort)ํ•˜๊ฒ ๋‹ค"๋Š” ๊ฐ•๋ ฅํ•œ ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค.

๋ฐœ์ƒ ์›์ธ:

  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ณ„์ธต์˜ ๋ถ€์žฌ: ํด๋ผ์ด์–ธํŠธ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด๋ฏธ ํƒญ์„ ๋‹ซ์•˜๊ฑฐ๋‚˜ ํŽ˜์ด์ง€๋ฅผ ์™„์ „ํžˆ ๋– ๋‚˜์„œ ์ˆ˜์‹  ๋ฒ„ํผ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•  ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‚ฌ๋ผ์ง„ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค.

  2. ๋ถ€์ ์ ˆํ•œ ๋ฐ์ดํ„ฐ ์ˆ˜์‹ : TCP ๊ณ„์ธต์€ ์‚ด์•„์žˆ์–ด ACK๋ฅผ ๋ณด๋ƒˆ๋”๋ผ๋„(1681๋ฒˆ), ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ด๋ฏธ ์†Œ์ผ“์„ ๋‹ซ์•„๋ฒ„๋ฆฐ ์ƒํƒœ์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ณ„์† ๋“ค์–ด์˜ค๋ฉด OS๋Š” RST๋ฅผ ๋ณด๋‚ด ์—ฐ๊ฒฐ์„ ํŒŒ๊ดดํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๋ก :

  • SSE๋Š” ์„œ๋ฒ„๊ฐ€ ์—ฐ๊ฒฐ์˜ ์ฃผ๋„๊ถŒ์„ ๊ฐ–์ง€๋งŒ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ข…๋ฃŒ๋ฅผ ์›ํ•  ๋•Œ ์„œ๋ฒ„๊ฐ€ ์ด๋ฅผ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•˜๊ณ  ๊ณ„์† ๋ฐ์ดํ„ฐ๋ฅผ ํ‘ธ์‹œํ•˜๋ฉด ์ด์ฒ˜๋Ÿผ RST์™€ ํ•จ๊ป˜ ์—ฐ๊ฒฐ์ด ๋น„์ •์ƒ์ ์œผ๋กœ ๋๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • ๋”ฐ๋ผ์„œ ์„œ๋ฒ„ ์ธก์—์„œ๋„ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ์ข…๋ฃŒ๋ฅผ ์ ์ ˆํžˆ ํ•ธ๋“ค๋ง(Exception Handling)ํ•˜์—ฌ ์ž์›์„ ํ•ด์ œํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

Summary

1. ์—ฐ๊ฒฐ ์ˆ˜๋ฆฝ (Handshake)

  • ํ‘œ์ค€ HTTP ํ™œ์šฉ:

    • WebSocket๊ณผ ๋‹ฌ๋ฆฌ 101 Switching Protocols ๊ณผ์ • ์—†์ด, ์ผ๋ฐ˜์ ์ธ GET ์š”์ฒญ์„ ์žฅ๊ธฐ ์œ ์ง€(Long-lived)ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

    • ๊ธฐ์กด HTTP 1.1 ์ด์ƒ์˜ ์ธํ”„๋ผ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฐฉํ™”๋ฒฝ์ด๋‚˜ ํ”„๋ก์‹œ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋„ ๋ณ„๋„ ์„ค์ • ์—†์ด ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฐ•๋ ฅํ•œ ์žฅ์ ์ด ๋ฉ๋‹ˆ๋‹ค.

  • ํ•„์ˆ˜ ํด๋ผ์ด์–ธํŠธ ํ—ค๋”:

    • Accept: text/event-stream: ์„œ๋ฒ„์—๊ฒŒ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ ํ˜•์‹์˜ ์‘๋‹ต์„ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค.

    • Cache-Control: no-cache: ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด์ „ ์ด๋ฒคํŠธ๋ฅผ ์บ์‹ฑํ•˜์ง€ ์•Š๊ณ  ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ›๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

    • Connection: keep-alive: TCP ์—ฐ๊ฒฐ์„ ๋Š์ง€ ์•Š๊ณ  ๊ณ„์† ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

2. ๋ฐ์ดํ„ฐ ์ „์†ก ๋ฐฉ์‹

  • ๋‹จ๋ฐฉํ–ฅ(Unidirectional): ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ๋งŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ์—์„œ ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ผ ๋•Œ๋Š” ๋ณ„๋„์˜ HTTP ์š”์ฒญ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์‹ค์‹œ๊ฐ„์„ฑ ๋ณด์žฅ (PSH Flag): TCP ๊ณ„์ธต์—์„œ PSH ํ”Œ๋ž˜๊ทธ๋ฅผ ์ ๊ทน์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ, ๋ฒ„ํผ๋ง ์—†์ด ์ฆ‰์‹œ ์ƒ์œ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

  • ์ž๋™ ์žฌ์—ฐ๊ฒฐ(Auto Reconnect): ๋ธŒ๋ผ์šฐ์ €์˜ EventSource API๋Š” ์—ฐ๊ฒฐ์ด ๋Š๊ธฐ๋ฉด ์ž๋™์œผ๋กœ ์žฌ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•˜๋ฉฐ, ์„œ๋ฒ„๊ฐ€ id ๊ฐ’์„ ํ•จ๊ป˜ ๋ณด๋‚ด์ฃผ๋ฉด ๋งˆ์ง€๋ง‰ ๋ฐ›์€ ์ง€์ ๋ถ€ํ„ฐ ๋ณต๊ตฌ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

3. ์—ฐ๊ฒฐ ์ข…๋ฃŒ ๋ฐ ์ž์› ๊ด€๋ฆฌ

  • Half-Close์˜ ํ•จ์ •: ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํƒญ์„ ๋‹ซ์•„ FIN์„ ๋ณด๋‚ด๋”๋ผ๋„, ์„œ๋ฒ„๋Š” ์ด๋ฅผ ๊ฐ์ง€ํ•˜๊ธฐ ์ „๊นŒ์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ณ„์† ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • RST ํŒจํ‚ท์˜ ๊ฒฝ๊ณ : ํด๋ผ์ด์–ธํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ด๋ฏธ ์ข…๋ฃŒ๋œ ์ƒํƒœ์—์„œ ์„œ๋ฒ„๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘ธ์‹œํ•˜๋ฉด RST ํŒจํ‚ท์ด ๋ฐœ์ƒํ•˜๋ฉฐ ๊ฐ•์ œ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

  • ์„œ๋ฒ„ ์ธก ๋Œ€์‘: ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์—ฐ๊ฒฐ ์ƒํƒœ๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ ํ™•์ธํ•˜๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ ์†ก์‹  ์‹œ ๋ฐœ์ƒํ•˜๋Š” ์˜ˆ์™ธ(Broken Pipe ๋“ฑ)๋ฅผ ์บ์น˜ํ•˜์—ฌ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ์—ฐ๊ฒฐ์„ ์ฆ‰์‹œ ์ •๋ฆฌํ•ด์•ผ ์„œ๋ฒ„ ์ž์› ๋ˆ„์ˆ˜๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์‚ฌ์šฉ์ค‘์ธ ์Šค๋ ˆ๋“œ ๋“ฑ

Last updated