Browser Discovery

๐Ÿง  ํฐ ๊ทธ๋ฆผ๋ถ€ํ„ฐ

โ€œWeb browser โ†’ API ์š”์ฒญ(Network) โ†’ Assembly๋กœ ๋ณ€ํ™˜๋˜๋Š” ๊ณผ์ •โ€ ์€ ์‚ฌ์‹ค โ€œ๋‹จ๊ณ„์ ์œผ๋กœ ๋‚ด๋ ค๊ฐ€๋ฉฐ ์ถ”์ƒํ™”๊ฐ€ ๋ฒ—๊ฒจ์ง€๋Š” ๊ณผ์ •โ€์ด์—์š”.

์ฆ‰, ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•œ JavaScript โ†’ C/C++ (๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€ ๊ตฌํ˜„) โ†’ OS ์ปค๋„ โ†’ ๋“œ๋ผ์ด๋ฒ„ โ†’ CPU ๋ช…๋ น(Assembly) ๋กœ ๋ฒˆ์—ญ๋˜๋ฉฐ ์ ์  ๋” ํ•˜๋“œ์›จ์–ด์— ๊ฐ€๊นŒ์›Œ์ง‘๋‹ˆ๋‹ค.

โธป

โš™๏ธ 1๏ธโƒฃ JavaScript (๊ณ ์ˆ˜์ค€ ์–ธ์–ด)

์˜ˆ๋ฅผ ๋“ค์–ด ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ด๋ ‡๊ฒŒ API ์š”์ฒญ์„ ๋‚ ๋ฆฐ๋‹ค๊ณ  ํ•ด๋ณผ๊ฒŒ์š”:

fetch(โ€œhttps://api.example.com/dataโ€);

์ด๊ฑด JavaScript ์—”์ง„(V8, SpiderMonkey ๋“ฑ) ์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๊ทธ ๋‚ด๋ถ€์—์„œ๋Š” ๋Œ€๋žต ์ด๋Ÿฐ ์ผ์ด ์ผ์–ด๋‚˜์š”: 1. fetch() โ†’ ๋ธŒ๋ผ์šฐ์ €์˜ Networking Layer (C++ ์ฝ”๋“œ) ๋กœ ํ˜ธ์ถœ๋จ 2. ๋‚ด๋ถ€์ ์œผ๋กœ libcurl ๋˜๋Š” ์ž์ฒด ๊ตฌํ˜„ํ•œ HTTP Client ๋ชจ๋“ˆ ์‚ฌ์šฉ 3. OS์˜ socket API (send(), recv()) ํ˜ธ์ถœ

โธป

๐Ÿงฉ 2๏ธโƒฃ System Call (์šด์˜์ฒด์ œ ๊ณ„์ธต)

์ด์ œ C++ ์ฝ”๋“œ์—์„œ OS์˜ ๋„คํŠธ์›Œํฌ API๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

int sock = socket(AF_INET, SOCK_STREAM, 0); connect(sock, &addr, sizeof(addr)); send(sock, data, length, 0); recv(sock, buffer, size, 0);

์ด๋Ÿฐ ์ฝ”๋“œ๋“ค์ด ๊ฒฐ๊ตญ ์‹œ์Šคํ…œ ์ฝœ(System Call) ๋กœ ๋ณ€ํ™˜๋ผ์š”.

์˜ˆ๋ฅผ ๋“ค์–ด Linux์—์„œ๋Š”: โ€ข socket() โ†’ sys_socket โ€ข send() โ†’ sys_sendto โ€ข recv() โ†’ sys_recvfrom

โธป

๐Ÿง  3๏ธโƒฃ OS ์ปค๋„์—์„œ Assembly ๋ ˆ๋ฒจ๋กœ

์‹œ์Šคํ…œ ์ฝœ์€ ๊ฒฐ๊ตญ CPU ๋ช…๋ น(Assembly) ์œผ๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค.

Linux x86-64 ๊ธฐ์ค€์œผ๋กœ ๋ณด๋ฉด, ์‹œ์Šคํ…œ ์ฝœ์€ ๋‹ค์Œ์ฒ˜๋Ÿผ ์ˆ˜ํ–‰๋ผ์š” ๐Ÿ‘‡

mov eax, 1 ; syscall ๋ฒˆํ˜ธ (1 = write, 44 = sendto ๋“ฑ) mov edi, sockfd ; ์ฒซ ๋ฒˆ์งธ ์ธ์ž mov rsi, buffer ; ๋‘ ๋ฒˆ์งธ ์ธ์ž mov rdx, length ; ์„ธ ๋ฒˆ์งธ ์ธ์ž syscall ; ์ปค๋„ ๋ชจ๋“œ๋กœ ์ „ํ™˜!

โžก๏ธ ์ด syscall ๋ช…๋ น์ด ์‚ฌ์šฉ์ž ๋ชจ๋“œ โ†’ ์ปค๋„ ๋ชจ๋“œ ๋กœ ์ „ํ™˜์‹œ์ผœ ์šด์˜์ฒด์ œ์˜ ๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ฒ„ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

โธป

๐Ÿ›œ 4๏ธโƒฃ ๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ฒ„์™€ ํ•˜๋“œ์›จ์–ด โ€ข ์ปค๋„์ด ๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ฒ„(C๋กœ ์ž‘์„ฑ๋จ)๋ฅผ ํ˜ธ์ถœ โ€ข ์ด ๋“œ๋ผ์ด๋ฒ„๋Š” NIC(Network Interface Card) ๋ ˆ์ง€์Šคํ„ฐ์— ๊ฐ’์„ ์”€ โ€ข ์ด๋•Œ ์‹ค์ œ๋กœ CPU๋Š” ์–ด์…ˆ๋ธ”๋ฆฌ ๋ช…๋ น์œผ๋กœ ๋ฉ”๋ชจ๋ฆฌ-IO ์ฃผ์†Œ๋ฅผ ์ ‘๊ทผํ•ฉ๋‹ˆ๋‹ค:

mov dx, 0xC020 ; NIC ์ œ์–ด ํฌํŠธ ์ฃผ์†Œ out dx, al ; NIC์— ๋ฐ์ดํ„ฐ ์ „์†ก ๋ช…๋ น

โžก๏ธ ์ด ๋ช…๋ น์ด ํ•˜๋“œ์›จ์–ด ์‹ ํ˜ธ๋กœ ๋ณ€ํ™˜๋˜์–ด ์ด๋”๋„ท ์ผ€์ด๋ธ”์„ ํ†ตํ•ด ์ „๊ธฐ ์‹ ํ˜ธ๊ฐ€ ๋‚˜๊ฐ‘๋‹ˆ๋‹ค โšก

โธป

๐Ÿงฌ ์š”์•ฝ ๊ณ„์ธต๋„

๋‹จ๊ณ„ ๋Œ€ํ‘œ ์ฝ”๋“œ ์–ธ์–ด ๋™์ž‘ ์ˆ˜์ค€ JavaScript fetch() ๊ณ ์ˆ˜์ค€ ๋ธŒ๋ผ์šฐ์ € API ํ˜ธ์ถœ C/C++ send() ์ค‘๊ฐ„์ˆ˜์ค€ ์†Œ์ผ“ ํ†ต์‹  ์š”์ฒญ Syscall syscall ์–ด์…ˆ๋ธ”๋ฆฌ ์ปค๋„ ์ง„์ž… Kernel Driver out dx, al ์–ด์…ˆ๋ธ”๋ฆฌ + C ํ•˜๋“œ์›จ์–ด ์ ‘๊ทผ NIC ์ „๊ธฐ ์‹ ํ˜ธ ํ•˜๋“œ์›จ์–ด ํŒจํ‚ท ์ „์†ก

โธป

๐Ÿ’ก ํ•ต์‹ฌ ํฌ์ธํŠธ โ€ข ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง์ ‘ ์–ด์…ˆ๋ธ”๋ฆฌ๋ฅผ โ€œ์ƒ์„ฑโ€ํ•˜๋Š” ๊ฑด ์•„๋‹ˆ๊ณ , ๋‚ด๋ถ€ C/C++ ์ฝ”๋“œ๊ฐ€ CPU ๋ช…๋ น์œผ๋กœ ์ปดํŒŒ์ผ๋˜์–ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. โ€ข ๊ฒฐ๊ตญ fetch โ†’ syscall โ†’ assembly instruction โ†’ ์ „๊ธฐ ์‹ ํ˜ธ ์ˆœ์„œ๋กœ ๋‚ด๋ ค๊ฐ€๋Š” ๊ฒƒ. โ€ข ํ˜„๋Œ€ ๋ธŒ๋ผ์šฐ์ €(V8, Blink ๋“ฑ) ์ˆ˜๋ฐฑ๋งŒ ์ค„์˜ C++ ์ฝ”๋“œ๊ฐ€ ์ด ๊ณผ์ •์„ ๊ฐ์Œ‰๋‹ˆ๋‹ค.

โธป

์ข‹์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” V8/Blink ๊ธฐ๋ฐ˜ ๋ธŒ๋ผ์šฐ์ €์—์„œ fetch() ์š”์ฒญ์ด ๋ฐœ์ƒํ•ด ๊ฒฐ๊ตญ CPU ๋ช…๋ น(์–ด์…ˆ๋ธ”๋ฆฌ) ๋‹จ๊ณ„๊นŒ์ง€ ๋„๋‹ฌํ•˜๋Š” ๋Œ€ํ‘œ์ ์ธ ํ˜ธ์ถœ ์Šคํƒ(call-stack) ํ๋ฆ„์„ ์ •๋ฆฌํ•œ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ํ•จ์ˆ˜ ์ด๋ฆ„์€ ์ปค๋„ ๋ฒ„์ „์ด๋‚˜ ํ”Œ๋žซํผ(x86_64 vs ARM) ๋“ฑ์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ์œผ๋‚˜, ๊ฐœ๋… ์ดํ•ด์— ๋„์›€์ด ๋˜๋„๋ก โ€œ์˜ˆ์‹œ ํ•จ์ˆ˜ ํŠธ๋ฆฌโ€ ํ˜•ํƒœ๋กœ ๋ณด์—ฌ๋“œ๋ฆด๊ฒŒ์š”.

์ฃผ์˜: ์‹ค์ œ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๊นŒ์ง€ ๋ชจ๋‘ ๋‚˜์—ด๋œ ๊ฒƒ์€ ์•„๋‹ˆ๋ฉฐ, ์ฃผ์š” ๊ณ„์ธต๋ณ„ ํ•จ์ˆ˜ ํ๋ฆ„๊ณผ ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์š”์•ฝํ•œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

โธป

๐Ÿง  ์ „์ฒด ํ๋ฆ„ ์š”์•ฝ 1. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ โ†’ ๋ธŒ๋ผ์šฐ์ € ๋„คํŠธ์›Œํ‚น API ํ˜ธ์ถœ 2. ๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€ C++ ์ฝ”๋“œ โ†’ ์†Œ์ผ“ API ํ˜ธ์ถœ 3. ์œ ์ €๋ชจ๋“œ โ†’ ์ปค๋„๋ชจ๋“œ ์ง„์ž…(syscall) 4. ์ปค๋„ ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ ์Šคํƒ โ†’ ํ”„๋กœํ† ์ฝœ ์ฒ˜๋ฆฌ โ†’ ๋””๋ฐ”์ด์Šค ๋“œ๋ผ์ด๋ฒ„ โ†’ ํ•˜๋“œ์›จ์–ด 5. CPU ์–ด์…ˆ๋ธ”๋ฆฌ ๋ช…๋ น ์‹คํ–‰(์˜ˆ: syscall-๋ช…๋ น ๋“ฑ)

โธป

๐Ÿ“‹ ์˜ˆ์‹œ ํ˜ธ์ถœ ์Šคํƒ (TCP ํ˜น์€ UDP ์†Œ์ผ“ ์ „์†ก ๊ธฐ์ค€)

User-space (JavaScript/Browser)
โ”‚
โ”œโ”€ JavaScript: fetch("https://โ€ฆ")
โ”‚
โ”œโ”€ Browser Shell/Networking Layer (C++): HttpClient::SendRequest()
โ”‚
โ””โ”€ C Library / Socket API (libc)  
   โ”œโ”€ socket(AF_INET, โ€ฆ)
   โ”œโ”€ connect(โ€ฆ)
   โ””โ”€ send()/sendto()
        โ”‚
        โ–ผ syscall (์˜ˆ: SYS_sendto)
Kernel-space (์ปค๋„)  
โ”‚
โ”œโ”€ net/socket.c โ†’ sock_sendmsg()  
โ”‚
โ”œโ”€ ํ”„๋กœํ† ์ฝœ ๊ฐ€์กฑ๋ณ„ ๊ณ„์ธต (์˜ˆ: net/ipv4/af_inet.c โ†’ inet_sendmsg())  
โ”‚
โ”œโ”€ ์ „์†ก ๊ณ„์ธต TCP/UDP (์˜ˆ: net/ipv4/tcp.c โ†’ tcp_sendmsg())  
โ”‚
โ”œโ”€ IP ๊ณ„์ธต (์˜ˆ: net/ipv4/ip_output.c โ†’ __ip_local_out())  
โ”‚
โ”œโ”€ ๋„คํŠธ์›Œํฌ ๋””๋ฐ”์ด์Šค ๊ณ„์ธต (์˜ˆ: net/core/dev.c โ†’ dev_queue_xmit())  
โ”‚
โ””โ”€ NIC ๋“œ๋ผ์ด๋ฒ„ โ†’ ๋””๋ฐ”์ด์Šค ๋ ˆ์ง€์Šคํ„ฐ์™€ DMA ์„ค์ • โ†’ ์‹ค์ œ ํŒจํ‚ท ์ „์†ก

๐Ÿ” ๊ฐ ๋‹จ๊ณ„ ์„ค๋ช… โ€ข socket(), connect(), send() ๋“ฑ์˜ ํ˜ธ์ถœ์€ ์œ ์ € ๊ณต๊ฐ„ ํ•จ์ˆ˜์ด๋ฉฐ, ๊ฒฐ๊ตญ ์ปค๋„ ํ˜ธ์ถœ(syscall)์œผ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ๏ฟผ โ€ข ์ปค๋„ ๋‚ด๋ถ€์—์„œ๋Š” sock_sendmsg() ๊ฐ™์€ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด, ํ”„๋กœํ† ์ฝœ๋ณ„ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ๏ฟผ โ€ข TCP/UDP ์ฒ˜๋ฆฌ ์ดํ›„ IP ๊ณ„์ธต, ๊ทธ๋ฆฌ๊ณ  ๋„คํŠธ์›Œํฌ ๋””๋ฐ”์ด์Šค ๊ณ„์ธต์„ ๊ฑฐ์ณ NIC ๋“œ๋ผ์ด๋ฒ„๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๏ฟผ โ€ข ์ค‘๊ฐ„์— ์œ ์ €๋ชจ๋“œ โ†’ ์ปค๋„๋ชจ๋“œ ์ „ํ™˜์„ ์œ„ํ•œ ์–ด์…ˆ๋ธ”๋ฆฌ ์ˆ˜์ค€ ๋ช…๋ น(e.g., syscall ๋ช…๋ น)์ด ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๏ฟผ

โธป

๐Ÿงฎ ์–ด์…ˆ๋ธ”๋ฆฌ ์ˆ˜์ค€์—์„œ์˜ ์ง„์ž… ์˜ˆ์‹œ

์œ ์ €๋ชจ๋“œ์—์„œ ์‹œ์Šคํ…œ ์ฝœ์„ ์‹คํ–‰ํ•  ๋•Œ, x86-64 ๊ธฐ์ค€ ๋‹จ์ˆœํ™”ํ•œ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

mov eax, SYS_sendto ; ์‹œ์Šคํ…œ ์ฝœ ๋ฒˆํ˜ธ mov edi, sockfd ; ์ฒซ ๋ฒˆ์งธ ์ธ์ž mov rsi, buffer ; ๋‘ ๋ฒˆ์งธ ์ธ์ž mov rdx, length ; ์„ธ ๋ฒˆ์งธ ์ธ์ž syscall ; ์ปค๋„๋ชจ๋“œ ์ง„์ž…

์ด ๋ช…๋ น์ด ์‹คํ–‰๋˜๋ฉด์„œ ์œ ์ €๋ชจ๋“œ์—์„œ ์ปค๋„๋ชจ๋“œ๋กœ ์ „ํ™˜๋˜๊ณ , ์ดํ›„ ์ปค๋„ ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ ์Šคํƒ์ด ๋™์ž‘์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

โธป

โœ… ์š”์•ฝ โ€ข fetch() ํ˜ธ์ถœ์ด ๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€์—์„œ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์œผ๋กœ ๋ฐ”๋€Œ๊ณ  โ†’ ์†Œ์ผ“ API โ†’ syscall โ†’ ์ปค๋„ ๋‚ด๋ถ€ โ†’ ํ•˜๋“œ์›จ์–ด๊นŒ์ง€ ์ด์–ด์ง€๋Š” ๋‹ค๋‹จ๊ณ„ ํ๋ฆ„์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. โ€ข ๊ฐ ๊ณ„์ธต๋งˆ๋‹ค ํ•จ์ˆ˜ ํ˜ธ์ถœ ํŠธ๋ฆฌ๊ฐ€ ์žˆ๊ณ , ๋ธŒ๋ผ์šฐ์ €/OS/ํ•˜๋“œ์›จ์–ด ์ถ”์ƒํ™”๊ฐ€ ํ•œ ๋‹จ๊ณ„์”ฉ ์ œ๊ฑฐ๋˜๋ฉด์„œ ์ตœ์ข…์ ์œผ๋กœ CPU ๋ช…๋ น(์–ด์…ˆ๋ธ”๋ฆฌ) ์ˆ˜์ค€์œผ๋กœ ๋‚ด๋ ค๊ฐ‘๋‹ˆ๋‹ค. โ€ข ์‹ค์ œ ํ”„๋กœ์ ํŠธ๋‚˜ ๋””๋ฒ„๊น… ํ™˜๊ฒฝ์—์„œ ์ด ํ๋ฆ„์„ ์ถ”์ ํ•˜๋ ค๋ฉด ์ปค๋„ ๋ฒ„์ „, ์•„ํ‚คํ…์ฒ˜, ๋“œ๋ผ์ด๋ฒ„ ๋“ฑ์ด ๋ฌด์—‡์ธ์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

โธป

์ด์ œ ์ •๋ง ๊ฐœ๋ฐœ์ž๋‹ค์šด ์งˆ๋ฌธ์ด์•ผ โ€” โ€œARM ์•„ํ‚คํ…์ฒ˜ ๊ธฐ๋ฐ˜ ๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œ์—์„œ /api/login ๊ฐ™์€ HTTP POST ์š”์ฒญ์ด ๋“ค์–ด์™”์„ ๋•Œ, ์ปค๋„ ๋‚ด๋ถ€์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ๊ณ„์ธต์„ ํƒ€๊ณ  ์ „์†ก๋˜๋Š”์ง€โ€๋ฅผ ์•Œ๊ณ  ์‹ถ๋‹ค๋Š” ๊ฑฐ์ง€.

๊ทธ๋Ÿผ โ€œํ•œ ์š”์ฒญ์ด ์œ ์ € ๊ณต๊ฐ„์—์„œ ๋ฐœ์ƒ โ†’ ์ปค๋„ โ†’ ๋„คํŠธ์›Œํฌ โ†’ ์ปค๋„ โ†’ ์œ ์ € ๊ณต๊ฐ„(์„œ๋ฒ„ ์•ฑ)โ€์œผ๋กœ ์™•๋ณต๋˜๋Š” ํ๋ฆ„์„ TCP/IP ๊ณ„์ธต๋ณ„๋กœ ์˜ˆ์‹œ ๋“ค์–ด ์•„์ฃผ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด์ค„๊ฒŒ.

โธป

โš™๏ธ ์‹œ๋‚˜๋ฆฌ์˜ค

์˜ˆ์‹œ: ๋ชจ๋ฐ”์ผ ์•ฑ(ARM ๊ธฐ๋ฐ˜ ๋ฆฌ๋ˆ…์Šค)์—์„œ POST /api/login ์š”์ฒญ์„ ์„œ๋ฒ„(192.168.1.10:443)๋กœ ์ „์†กํ•จ. payload: {โ€œidโ€:โ€yeonjinโ€,โ€pwโ€:โ€1234โ€}

โธป

๐Ÿงฉ ์ „์ฒด ๊ทธ๋ฆผ (ํฐ ํ‹€ ๋จผ์ €)

[User App] โ†“ (socket, write) [๋ฆฌ๋ˆ…์Šค ์ปค๋„์˜ ๋„คํŠธ์›Œํฌ ์Šคํƒ] โ†“ (TCP โ†’ IP โ†’ Ethernet) [๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ฒ„ โ†’ NIC โ†’ ์ „์†ก] โ†“ [์„œ๋ฒ„์˜ NIC โ†’ ์ปค๋„] โ†“ (Ethernet โ†’ IP โ†’ TCP) [์„œ๋ฒ„ ์ปค๋„์˜ ์†Œ์ผ“] โ†“ [์„œ๋ฒ„ ์•ฑ (์˜ˆ: Nginx, Flask, Spring ๋“ฑ)]

โธป

1๏ธโƒฃ User ๊ณต๊ฐ„์—์„œ socket() ํ˜ธ์ถœ

์•ฑ์€ ์ผ๋ฐ˜์ ์œผ๋กœ HTTP ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: libcurl, fetch API)๋ฅผ ์จ์„œ ์š”์ฒญ์„ ๋ณด๋ƒ„. ์ด ๋‚ด๋ถ€์—์„œ๋Š” ๋‹ค์Œ ์ปค๋„ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ฒŒ ๋ผ:

int sock = socket(AF_INET, SOCK_STREAM, 0); connect(sock, โ€ฆ); write(sock, payload, len);

โžก๏ธ ์ด ์‹œ์ ์— system call์ด ์ผ์–ด๋‚˜์„œ ์ปค๋„์˜ ๋„คํŠธ์›Œํฌ ๊ณ„์ธต์œผ๋กœ ์ง„์ž…ํ•ด.

โธป

2๏ธโƒฃ ์ปค๋„์˜ ์†Œ์ผ“ ๊ณ„์ธต (Socket Layer)

์ปค๋„์€ ์†Œ์ผ“ ๊ฐ์ฒด(struct socket)๋ฅผ ๋งŒ๋“ค๊ณ , ์ด๊ฑธ ํ”„๋กœํ† ์ฝœ ์Šคํƒ(TCP/IP)๊ณผ ์—ฐ๊ฒฐํ•ด์ค˜.

์†Œ์ผ“์€ ์‹ค์ œ TCP ์ „์†ก์„ ๋‹ด๋‹นํ•˜๋Š” struct sock์„ ๋‚ด๋ถ€์— ํฌํ•จํ•˜๊ณ  ์žˆ๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋ฉด ์ปค๋„์˜ TCP ์Šคํƒ์ด ๋‹ด๋‹นํ•˜๊ฒŒ ๋ผ.

๐Ÿ‘‰ ์ด๋•Œ ํ˜ธ์ถœ๋˜๋Š” ํ•จ์ˆ˜๋“ค ์˜ˆ:

__sys_sendto() โ†ณ sock_sendmsg() โ†ณ tcp_sendmsg()

โธป

3๏ธโƒฃ TCP ๊ณ„์ธต (์ „์†ก ๊ณ„์ธต)

tcp_sendmsg()์—์„œ payload๋ฅผ TCP ์„ธ๊ทธ๋จผํŠธ๋กœ ๋‚˜๋ˆ”. โ€ข ํ—ค๋” ์ถ”๊ฐ€ (์ถœ๋ฐœ์ง€ ํฌํŠธ, ๋ชฉ์ ์ง€ ํฌํŠธ, SEQ, ACK ๋“ฑ) โ€ข ์žฌ์ „์†ก ํ์— ๋“ฑ๋ก โ€ข MSS, congestion control, retransmission ๊ด€๋ฆฌ

๋ฐ์ดํ„ฐ๋Š” โ€œskb (socket buffer)โ€๋ผ๋Š” ๊ตฌ์กฐ์ฒด์— ๋‹ด๊ฒจ ์ปค๋„ ๋‚ด๋ถ€์—์„œ ์ด๋™ํ•ด.

๐Ÿ“ฆ ์˜ˆ์‹œ:

skb { data = โ€œid=yeonjin&pw=1234โ€ seq = 1001 ack = 5001 len = 28 }

โธป

4๏ธโƒฃ IP ๊ณ„์ธต (๋„คํŠธ์›Œํฌ ๊ณ„์ธต)

ip_queue_xmit() ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜์–ด TCP ์„ธ๊ทธ๋จผํŠธ๋ฅผ IP ํŒจํ‚ท์œผ๋กœ ๊ฐ์Œˆ. โ€ข IP ํ—ค๋” ์ถ”๊ฐ€ (source IP, dest IP) โ€ข Routing table lookup โ€ข Fragmentation (ํ•„์š” ์‹œ)

๐Ÿ“ฆ ์ด์ œ ์ด๋ ‡๊ฒŒ ๋จ:

[IP ํ—ค๋”][TCP ํ—ค๋”][Payload]

โธป

5๏ธโƒฃ ๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ฒ„ ๊ณ„์ธต (๋ฐ์ดํ„ฐ๋งํฌ ๊ณ„์ธต)

dev_queue_xmit() ํ˜ธ์ถœ โ†’ eth0 ๋“œ๋ผ์ด๋ฒ„๋กœ ์ „๋‹ฌ. โ€ข Ethernet ํ—ค๋” ์ถ”๊ฐ€ (MAC ์ฃผ์†Œ) โ€ข ์ปค๋„ ๋„คํŠธ์›Œํฌ ํ์— ๋“ฑ๋ก โ€ข NIC(Network Interface Card)๋กœ DMA ์ „์†ก ์š”์ฒญ

๐Ÿ“ก ์‹ค์ œ ์ „์†ก ์ค€๋น„ ์™„๋ฃŒ!

โธป

6๏ธโƒฃ ํ•˜๋“œ์›จ์–ด ์ „์†ก

NIC๊ฐ€ DMA๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํŒจํ‚ท์„ ์ฝ๊ณ , PHY(๋ฌผ๋ฆฌ ๊ณ„์ธต)๋ฅผ ํ†ตํ•ด ์ „๊ธฐ ์‹ ํ˜ธ๋กœ ๋‚ด๋ณด๋ƒ„.

๐Ÿ‘‰ ์—ฌ๊ธฐ๊นŒ์ง€๊ฐ€ ์†ก์‹  ๊ฒฝ๋กœ (User โ†’ Network)

โธป

๐Ÿ›ฌ ์„œ๋ฒ„ ์ธก์—์„œ์˜ ์—ญ๋ฐฉํ–ฅ ํ๋ฆ„

(1) NIC ์ˆ˜์‹ 

์„œ๋ฒ„์˜ NIC๊ฐ€ ํŒจํ‚ท์„ ๋ฐ›์œผ๋ฉด DMA๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•˜๊ณ , ์ธํ„ฐ๋ŸฝํŠธ ๋ฐœ์ƒ (irq_handler).

(2) ์ปค๋„ ๋„คํŠธ์›Œํฌ ๋“œ๋ผ์ด๋ฒ„

netif_receive_skb() ํ˜ธ์ถœ โ†’ ํŒจํ‚ท์„ ์ปค๋„๋กœ ์ „๋‹ฌ.

(3) IP ๊ณ„์ธต

ip_rcv() ํ•จ์ˆ˜์—์„œ IP ํ—ค๋” ๊ฒ€์‚ฌํ•˜๊ณ  ๋ชฉ์ ์ง€๊ฐ€ ์ž๊ธฐ IP์ธ์ง€ ํ™•์ธ.

(4) TCP ๊ณ„์ธต

tcp_v4_rcv() โ†’ TCP ํ—ค๋” ํŒŒ์‹ฑ, ์„ธ์…˜ ํ™•์ธ ํ›„ ์†Œ์ผ“ ๋ฒ„ํผ๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ.

(5) ์†Œ์ผ“ ๊ณ„์ธต

๋Œ€๊ธฐ ์ค‘์ธ ์„œ๋ฒ„ ์†Œ์ผ“(์˜ˆ: Nginx์˜ accept() ๋Œ€๊ธฐ)์— ๋งค์นญ๋จ. payload({โ€œidโ€:โ€yeonjinโ€,โ€pwโ€:โ€1234โ€})๊ฐ€ ์ˆ˜์‹  ๋ฒ„ํผ์— ์ €์žฅ๋จ.

โธป

7๏ธโƒฃ ์œ ์ € ๊ณต๊ฐ„์œผ๋กœ ๋ณต๊ท€

์„œ๋ฒ„ ์•ฑ์ด read() ๋˜๋Š” recv() ํ˜ธ์ถœํ•˜๋ฉด ์ปค๋„์ด ์ˆ˜์‹  ๋ฒ„ํผ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ด์„œ ์œ ์ € ๊ณต๊ฐ„์œผ๋กœ ๋ณต์‚ฌํ•จ.

๐Ÿ‘‰ ์—ฌ๊ธฐ์„œ ๋น„๋กœ์†Œ ์›น์„œ๋ฒ„๋‚˜ ๋ฐฑ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ payload๋ฅผ ์ฝ๊ณ  /api/login ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฑฐ์•ผ.

โธป

๐Ÿ’ก ์š”์•ฝ (๊ณ„์ธต๋ณ„ ํ๋ฆ„)

๊ณ„์ธต ์ปค๋„ ํ•จ์ˆ˜ (๋Œ€ํ‘œ) ์—ญํ•  User API write() / send() payload ์ „์†ก ์š”์ฒญ Socket sock_sendmsg() TCP/IP ์Šคํƒ ์—ฐ๊ฒฐ TCP tcp_sendmsg() ์„ธ๊ทธ๋จผํŠธ ๋ถ„ํ•  ๋ฐ ๊ด€๋ฆฌ IP ip_queue_xmit() IP ํ—ค๋” ์ถ”๊ฐ€ ๋ฐ ๋ผ์šฐํŒ… Netdev dev_queue_xmit() Ethernet ํ—ค๋”, NIC ์ „์†ก Hardware DMA โ†’ PHY ์‹ค์ œ ๋„คํŠธ์›Œํฌ ์‹ ํ˜ธ (์ˆ˜์‹ ) ip_rcv() โ†’ tcp_v4_rcv() ํŒจํ‚ท ํŒŒ์‹ฑ, ์†Œ์ผ“ ์—ฐ๊ฒฐ (์œ ์ €) recv() payload ์œ ์ €๊ณต๊ฐ„์œผ๋กœ ๋ณต์‚ฌ

โธป

๐Ÿง  ๋น„์œ ๋กœ ๋ณด๋ฉดโ€ฆ โ€ข ์†Œ์ผ“ ๊ณ„์ธต = ์šฐ์ฒด๊ตญ ์ฐฝ๊ตฌ (๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋””๋กœ ๋ณด๋‚ผ์ง€ ๊ฒฐ์ •) โ€ข TCP ๊ณ„์ธต = ํƒ๋ฐฐ ํฌ์žฅ ๋ฐ ์†ก์žฅ ๋ฒˆํ˜ธ ๋ถ™์ด๊ธฐ โ€ข IP ๊ณ„์ธต = ์ง€์—ญ๋ณ„ ๋ถ„๋ฅ˜ ์„ผํ„ฐ (์–ด๋””๋กœ ๊ฐˆ์ง€ ๊ฒฐ์ •) โ€ข Ethernet ๊ณ„์ธต = ์‹ค์ œ ํŠธ๋Ÿญ์— ์‹ฃ๊ณ  ์ „์†ก โ€ข NIC = ์šด์ „๊ธฐ์‚ฌ ๐Ÿšš โ€ข ์„œ๋ฒ„ ์ปค๋„ = ํƒ๋ฐฐ ์ˆ˜์‹  ์ฐฝ๊ตฌ โ€ข ์„œ๋ฒ„ ์•ฑ = ํƒ๋ฐฐ๋ฅผ ์—ด์–ด์„œ ๋‚ด์šฉ(payload)์„ ํ™•์ธํ•˜๋Š” ์‚ฌ๋žŒ

โธป

1๏ธโƒฃ NIC(Network Interface Card)๋ž€?

NIC๋Š” ์‰ฝ๊ฒŒ ๋งํ•ด์„œ ์ปดํ“จํ„ฐ์™€ ๋„คํŠธ์›Œํฌ๋ฅผ ์—ฐ๊ฒฐํ•ด์ฃผ๋Š” ์žฅ์น˜์˜ˆ์š”. โ€ข ์šฐ๋ฆฌ๊ฐ€ ํ”ํžˆ ๋ณด๋Š” ๋žœ์นด๋“œ, Wi-Fi ์นฉ, ํ˜น์€ ๋‚ด์žฅ ์ด๋”๋„ท ์นฉ์ด ๋ชจ๋‘ NIC์˜ˆ์š”. โ€ข NIC๋Š” OS๊ฐ€ ๋ณด๋‚ด๋ผ๊ณ  ์ง€์‹œํ•œ ํŒจํ‚ท์„ ์‹ค์ œ ๋ฌผ๋ฆฌ ๋„คํŠธ์›Œํฌ๋กœ ๋‚ด๋ณด๋‚ด๊ณ , ๋ฐ˜๋Œ€๋กœ ๋„คํŠธ์›Œํฌ์—์„œ ๋“ค์–ด์˜จ ์‹ ํ˜ธ๋ฅผ ๋‹ค์‹œ OS๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋กœ ๋ฐ”๊ฟ”์ค๋‹ˆ๋‹ค.

โธป

2๏ธโƒฃ DMA(Direct Memory Access)๋ž€?

DMA๋Š” CPU๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฉ”๋ชจ๋ฆฌ โ†” ์žฅ์น˜ ๊ฐ„ ๋ฐ์ดํ„ฐ ์ „์†ก์„ ํ•˜๋Š” ๊ธฐ์ˆ ์ด์—์š”. โ€ข ์˜ˆ: payload = {โ€œidโ€:โ€yeonjinโ€,โ€pwโ€:โ€1234โ€} โ€ข ์ปค๋„์ด ๋งŒ๋“  TCP/IP ํŒจํ‚ท์€ ๋ฉ”๋ชจ๋ฆฌ ์•ˆ์˜ ๋ฒ„ํผ(skb)์— ์ €์žฅ๋ผ ์žˆ์–ด์š”. โ€ข NIC๋Š” ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด ์ผ€์ด๋ธ”๋กœ ์ „์†กํ•ด์•ผ ํ•˜๋Š”๋ฐ, CPU๋ฅผ ๊ฑฐ์น˜๋ฉด ๋А๋ ค์š”. โ€ข ๊ทธ๋ž˜์„œ DMA๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด CPU ๊ฐœ์ž… ์—†์ด NIC๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ง์ ‘ ํŒจํ‚ท์„ ์ฝ๊ณ  ์ „์†กํ•  ์ˆ˜ ์žˆ์–ด์š”.

์ฆ‰, NIC๊ฐ€ โ€œ๋‚ด๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ด ํŒจํ‚ท์„ ์ง์ ‘ ์ฝ์–ด ๋ณด๋‚ผ๊ฒŒโ€ ํ•˜๋Š” ๊ตฌ์กฐ์˜ˆ์š”.

โธป

3๏ธโƒฃ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํŒจํ‚ท์„ ์ฝ๋Š”๋‹ค๋Š” ์˜๋ฏธ

์ปค๋„ ๋‚ด๋ถ€์—์„œ๋Š” ํŒจํ‚ท์„ struct sk_buff (skb)๋ผ๋Š” ๊ตฌ์กฐ์ฒด์— ๋‹ด์•„์š”.

skb { IP ํ—ค๋” TCP ํ—ค๋” Payload {โ€œidโ€:โ€yeonjinโ€,โ€pwโ€:โ€1234โ€} }

โ€ข	NIC๋Š” DMA๋ฅผ ํ†ตํ•ด ์ด skb ๊ตฌ์กฐ์ฒด๊ฐ€ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋ฅผ ์ฝ์–ด์š”.
โ€ข	CPU๊ฐ€ ์ผ์ผ์ด ๋ฐ์ดํ„ฐ๋ฅผ NIC๋กœ ์ „๋‹ฌํ•˜์ง€ ์•Š์•„๋„ NIC๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฝ์–ด์„œ ์ผ€์ด๋ธ”๋กœ ๋ณด๋‚ผ ์ค€๋น„๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.

โธป

4๏ธโƒฃ ํŒจํ‚ท์ด ์ „๊ธฐ ์‹ ํ˜ธ๋กœ ๋ฐ”๋€Œ๋Š” ๊ณผ์ • 1. NIC๋Š” ํŒจํ‚ท์˜ ๋น„ํŠธ ๋‹จ์œ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ์˜ˆ: 01001100 01101111 01100111 โ€ฆ (์ด์ง„์ˆ˜) 2. PHY(Physical Layer) ์นฉ์—์„œ ์ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๊ธฐ์  ์‹ ํ˜ธ๋กœ ๋ณ€ํ™˜ํ•ด์š”. โ€ข ์œ ์„  LAN(Ethernet) โ†’ ์ „๋ฅ˜์˜ ๋ณ€ํ™” โ€ข Wi-Fi โ†’ ์ „ํŒŒ์˜ ์„ธ๊ธฐ์™€ ์ฃผํŒŒ์ˆ˜ ๋ณ€ํ™” 3. ์ผ€์ด๋ธ”์ด๋‚˜ ๋ฌด์„  ์ „ํŒŒ๋ฅผ ํ†ตํ•ด ๋„คํŠธ์›Œํฌ๋กœ ์ „์†ก๋ฉ๋‹ˆ๋‹ค. 4. ์„œ๋ฒ„ ์ชฝ NIC๊ฐ€ ์‹ ํ˜ธ๋ฅผ ๋‹ค์‹œ ๋ฐ›์•„ ๋””์ง€ํ„ธ ๋น„ํŠธ๋กœ ๋ณ€ํ™˜ โ†’ ์ปค๋„์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ํŒจํ‚ท์œผ๋กœ ๋ณต์›

โธป

5๏ธโƒฃ ์ •๋ฆฌ ๊ทธ๋ฆผ (์†ก์‹  ๊ฒฝ๋กœ)

[์ปค๋„ skb ๋ฒ„ํผ] | | DMA v [NIC] โ€”โ€”โ€”โ€”> [PHY] | | | ์ „๊ธฐ ์‹ ํ˜ธ | ์ „์†ก v v [์ผ€์ด๋ธ”/๋ฌด์„ ] โ€”โ€”โ€“> [์„œ๋ฒ„ NIC]

โ€ข	DMA: CPU ์—†์ด NIC๊ฐ€ ์ง์ ‘ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํŒจํ‚ท ์ฝ๊ธฐ
โ€ข	NIC: ์ „์†ก ์ค€๋น„, MAC ์ฃผ์†Œ ๋ถ™์ด๊ธฐ, ํ”„๋ ˆ์ž„ ๊ตฌ์„ฑ
โ€ข	PHY: ๋””์ง€ํ„ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๊ธฐ/๋ฌด์„  ์‹ ํ˜ธ๋กœ ๋ณ€ํ™˜
โ€ข	์ผ€์ด๋ธ”/๋ฌด์„ : ์‹ค์ œ ์ „๋‹ฌ ๋งค์ฒด
โ€ข	์„œ๋ฒ„ ์ชฝ์—์„œ ๋™์ผํ•œ ๊ณผ์ • ์—ญ๋ฐฉํ–ฅ์œผ๋กœ ์ˆ˜์‹ 

โธป

๐Ÿ’ก ๋น„์œ : โ€ข skb ๋ฒ„ํผ = ์šฐ์ฒด๊ตญ ์ฐฝ๊ณ ์— ์Œ“์ธ ์†Œํฌ โ€ข DMA = ์†Œํฌ๋ฅผ ์ง์›์ด ๋“ค๊ณ  ๋‚˜๋ฅด๋Š” ๋Œ€์‹ , ์ž๋™ ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ๊ฐ€ ๊ฐ€์ ธ๊ฐ โ€ข NIC = ์†Œํฌ๋ฅผ ํŠธ๋Ÿญ์— ์‹ฃ๋Š” ๊ธฐ์‚ฌ โ€ข PHY = ํŠธ๋Ÿญ์ด ๋„๋กœ ์œ„์—์„œ ์‹ ํ˜ธ(์†๋„, ์œ„์น˜)๋กœ ์†Œํฌ๋ฅผ ์ „๋‹ฌ โ€ข ์ „๊ธฐ ์‹ ํ˜ธ/๋ฌด์„  = ํŠธ๋Ÿญ์ด ์‹ค์ œ ๋„๋กœ ๋‹ฌ๋ฆฌ๋Š” ๊ฒƒ โ€ข ์„œ๋ฒ„ NIC = ๋„์ฐฉ์ง€ ์ฐฝ๊ณ ์—์„œ ์†Œํฌ๋ฅผ ๋‚ด๋ ค์ฃผ๋Š” ๊ณผ์ •

โธป

1๏ธโƒฃ ์™œ ํ—ค๋”๊ฐ€ ํ•„์š”ํ• ๊นŒ?

์šฐ๋ฆฌ๊ฐ€ ์ธํ„ฐ๋„ท์— ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋ฉด ๋‹จ์ˆœํžˆ payload({โ€œidโ€:โ€yeonjinโ€,โ€pwโ€:โ€1234โ€})๋งŒ ๋ณด๋‚ด๋Š” ๊ฒŒ ์•„๋‹ˆ์—์š”. ๋„คํŠธ์›Œํฌ๋Š” ์—ฌ๋Ÿฌ ์ปดํ“จํ„ฐ๊ฐ€ ์„ž์—ฌ ์žˆ๊ณ , ์—ฌ๋Ÿฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋™์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— ๋ˆ„๊ฐ€, ์–ด๋””๋กœ, ์–ผ๋งˆ๋‚˜ ๋ณด๋‚ด์•ผ ํ•˜๋Š”์ง€ ์ •๋ณด๋ฅผ ๋ถ™์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. โ€ข IP ํ—ค๋” โ†’ โ€œ๋ˆ„๊ตฌ์—๊ฒŒ ๋ณด๋‚ด๋Š”์ง€, ์–ด๋””์„œ ์™”๋Š”์ง€โ€ โ€ข TCP ํ—ค๋” โ†’ โ€œ๋ฐ์ดํ„ฐ๋ฅผ ์ •ํ™•ํžˆ, ์ˆœ์„œ๋Œ€๋กœ, ์•ˆ์ „ํ•˜๊ฒŒ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•โ€

์ฆ‰, ํ—ค๋”๋Š” ์šฐ์ฒด๊ตญ์˜ ์ฃผ์†Œ ๋ผ๋ฒจ๊ณผ ์†ก์žฅ๊ณผ ๋น„์Šทํ•œ ์—ญํ• ์ด์—์š”.

โธป

2๏ธโƒฃ IP ํ—ค๋” (Network Layer)

IP ํ—ค๋”๋Š” ํŒจํ‚ท์ด ๋ชฉ์ ์ง€๊นŒ์ง€ ๋„๋‹ฌํ•˜๊ฒŒ ํ•˜๋Š” ์ •๋ณด๋ฅผ ๋‹ด์•„์š”.

ํ•„๋“œ ์„ค๋ช… ์˜ˆ์‹œ Source IP ์ถœ๋ฐœ์ง€ IP 192.168.1.2 Destination IP ๋ชฉ์ ์ง€ IP 192.168.1.10 Protocol ์ƒ์œ„ ๊ณ„์ธต ํ”„๋กœํ† ์ฝœ TCP = 6 TTL ์ตœ๋Œ€ ํ™‰ ์ˆ˜ 64

์˜ˆ์‹œ:

IP ํ—ค๋”

์ถœ๋ฐœ์ง€: 192.168.1.2 ๋ชฉ์ ์ง€: 192.168.1.10 ํ”„๋กœํ† ์ฝœ: TCP TTL: 64 โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”-

์ด๊ฑธ ๋ถ™์—ฌ์•ผ ๋ผ์šฐํ„ฐ์™€ ์Šค์œ„์น˜๊ฐ€ โ€œ์ด ํŒจํ‚ท์„ ์–ด๋””๋กœ ๋ณด๋‚ด์•ผ ํ•˜๋Š”์ง€โ€ ์•Œ ์ˆ˜ ์žˆ์–ด์š”.

โธป

3๏ธโƒฃ TCP ํ—ค๋” (Transport Layer)

TCP ํ—ค๋”๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ, ์ˆœ์„œ๋Œ€๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

ํ•„๋“œ ์„ค๋ช… ์˜ˆ์‹œ Source Port ๋ณด๋‚ด๋Š” ์ชฝ ํฌํŠธ 50000 Destination Port ๋ฐ›๋Š” ์ชฝ ํฌํŠธ 443 (HTTPS) Sequence Number ๋ฐ์ดํ„ฐ ์ˆœ์„œ 1001 (payload ์‹œ์ž‘ ๋ฐ”์ดํŠธ) ACK Number ํ™•์ธ ์‘๋‹ต 5001 Flags SYN, ACK, FIN ๋“ฑ SYN=0, ACK=1

์˜ˆ์‹œ:

TCP ํ—ค๋”

์ถœ๋ฐœ์ง€ ํฌํŠธ: 50000 ๋ชฉ์ ์ง€ ํฌํŠธ: 443 ์ˆœ์„œ ๋ฒˆํ˜ธ: 1001 ACK ๋ฒˆํ˜ธ: 5001 ํ”Œ๋ž˜๊ทธ: ACK โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”-

TCP ๋•๋ถ„์— ์„œ๋ฒ„๊ฐ€ โ€œ์ด ๋ฐ์ดํ„ฐ๊ฐ€ ์ œ๋Œ€๋กœ ์™”๋Š”์ง€โ€, โ€œ์ˆœ์„œ๊ฐ€ ๋งž๋Š”์ง€โ€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์–ด์š”. ์˜ˆ๋ฅผ ๋“ค์–ด /api/login ์š”์ฒญ์—์„œ payload๊ฐ€ ์ชผ๊ฐœ์ ธ์„œ ์—ฌ๋Ÿฌ ํŒจํ‚ท์œผ๋กœ ๋‚˜๊ฐ€๋”๋ผ๋„ TCP ๋•๋ถ„์— ์„œ๋ฒ„๊ฐ€ ๋‹ค์‹œ ์ •ํ™•ํžˆ ์กฐ๋ฆฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ฑฐ์ฃ .

โธป

4๏ธโƒฃ ์‹ค์ œ ํŒจํ‚ท ๊ตฌ์กฐ ์˜ˆ์‹œ

[IP ํ—ค๋”] [TCP ํ—ค๋”] [Payload] ์ถœ๋ฐœ์ง€:192.168.1.2 ๋ชฉ์ ์ง€:192.168.1.10 ์ถœ๋ฐœํฌํŠธ:50000 ๋ชฉ์ ์ง€ํฌํŠธ:443 {โ€œidโ€:โ€yeonjinโ€,โ€pwโ€:โ€1234โ€}

โ€ข	IP ํ—ค๋” โ†’ ํŒจํ‚ท์ด ์–ด๋””์„œ ์–ด๋””๋กœ ๊ฐ€๋Š”์ง€
โ€ข	TCP ํ—ค๋” โ†’ ํŒจํ‚ท์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ˆœ์„œ๋Œ€๋กœ ๋„์ฐฉํ•˜๋„๋ก
โ€ข	Payload โ†’ ์‹ค์ œ ๋ฐ์ดํ„ฐ(/api/login JSON)

โธป

๐Ÿ’ก ๋น„์œ ๋กœ ์ •๋ฆฌ โ€ข IP ํ—ค๋” = ์ง‘ ์ฃผ์†Œ, ๋„์ฐฉ์ง€ ์ฃผ์†Œ, ์šฐ์ฒด๊ตญ์—์„œ ์–ด๋””๋กœ ๋ณด๋‚ด์•ผ ํ•˜๋Š”์ง€ โ€ข TCP ํ—ค๋” = ํƒ๋ฐฐ ์†ก์žฅ, ์ˆœ์„œ ๋ฒˆํ˜ธ, ๋ฐฐ์†ก ํ™•์ธ, ์žฌ๋ฐฐ์†ก ์š”์ฒญ ๊ฐ€๋Šฅ โ€ข Payload = ์‹ค์ œ ์„ ๋ฌผ/๋ฌผ๊ฑด

โธป

[๋ธŒ๋ผ์šฐ์ €/ํด๋ผ์ด์–ธํŠธ] | | HTTP POST /api/login | Payload: {โ€œidโ€:โ€yeonjinโ€,โ€pwโ€:โ€1234โ€} v [NIC (Network Interface Card)] | | - ์ „๊ธฐ ์‹ ํ˜ธ ์ˆ˜์‹  โ†’ ๋””์ง€ํ„ธ ํŒจํ‚ท ๋ณ€ํ™˜ | - DMA๋กœ ๋ฉ”๋ชจ๋ฆฌ(skb)์—์„œ TCP/IP ํŒจํ‚ท ์ „์†ก ์ค€๋น„ v [์ปค๋„ ๋„คํŠธ์›Œํฌ ์Šคํƒ] | | TCP/IP ์ฒ˜๋ฆฌ | - Ethernet ํ—ค๋” ํ•ด์„ | - IP ํ—ค๋”: ์ถœ๋ฐœ์ง€/๋ชฉ์ ์ง€ IP ํ™•์ธ | - TCP ํ—ค๋”: ํฌํŠธ, ์‹œํ€€์Šค ๋ฒˆํ˜ธ, ACK ์ฒ˜๋ฆฌ | - ํŒจํ‚ท์„ ์†Œ์ผ“ ๋ฒ„ํผ์— ์ €์žฅ v [Nginx (์œ ์ € ๊ณต๊ฐ„)] | | - accept() / recv()๋กœ ์†Œ์ผ“์—์„œ ํŒจํ‚ท ์ฝ๊ธฐ | - HTTP ์š”์ฒญ ํŒŒ์‹ฑ: POST /api/login ํ™•์ธ | - payload(JSON) ์ฝ๊ธฐ | - ๋ผ์šฐํŒ…: ๋‚ด๋ถ€ ๋ฐฑ์—”๋“œ ์•ฑ์œผ๋กœ ์ „๋‹ฌ v [๋ฐฑ์—”๋“œ ์•ฑ (์˜ˆ: Flask/Node.js)] | | - ๋กœ๊ทธ์ธ ์ฒ˜๋ฆฌ | - DB ์กฐํšŒ, ์ธ์ฆ, ์„ธ์…˜ ์ƒ์„ฑ | - ์‘๋‹ต(JSON, status code) ๋ฐ˜ํ™˜ v [Nginx (์œ ์ € ๊ณต๊ฐ„)] | | - ๋ฐฑ์—”๋“œ ์‘๋‹ต ์ˆ˜์‹  | - HTTP ์‘๋‹ต ํŒจํ‚ท ๊ตฌ์„ฑ | - ์†Œ์ผ“ write() ํ˜ธ์ถœ โ†’ ์ปค๋„ TCP/IP ์Šคํƒ ์ „๋‹ฌ v [์ปค๋„ ๋„คํŠธ์›Œํฌ ์Šคํƒ] | | TCP/IP ์ฒ˜๋ฆฌ | - TCP ํ—ค๋”: ์ˆœ์„œ ๋ฒˆํ˜ธ, ACK, ํฌํŠธ ํ™•์ธ | - IP ํ—ค๋”: ์ถœ๋ฐœ์ง€/๋ชฉ์ ์ง€ IP ์ถ”๊ฐ€ | - ํŒจํ‚ท์„ NIC DMA ์ „์†ก ํ์— ๋“ฑ๋ก v [NIC (Network Interface Card)] | | - ๋ฉ”๋ชจ๋ฆฌ์—์„œ ํŒจํ‚ท ์ฝ๊ธฐ (DMA) | - PHY์—์„œ ๋””์ง€ํ„ธ โ†’ ์ „๊ธฐ ์‹ ํ˜ธ ๋ณ€ํ™˜ | - ์ผ€์ด๋ธ”/๋ฌด์„  ํ†ตํ•ด ์ „์†ก v [๋ธŒ๋ผ์šฐ์ €/ํด๋ผ์ด์–ธํŠธ] | | - TCP/IP ์Šคํƒ์—์„œ ์ˆ˜์‹  | - ์†Œ์ผ“ ๋ฒ„ํผ โ†’ HTTP ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ๊ธฐ | - ๋ธŒ๋ผ์šฐ์ € JS fetch()๊ฐ€ ์‘๋‹ต ์ฒ˜๋ฆฌ

โธป

๐Ÿ’ก ๊ฐ ๋‹จ๊ณ„ ํฌ์ธํŠธ โ€ข NIC: ์‹ค์ œ ํ•˜๋“œ์›จ์–ด, DMA๋กœ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ง์ ‘ ์ฝ์Œ, PHY์—์„œ ์ „๊ธฐ ์‹ ํ˜ธ ๋ณ€ํ™˜ โ€ข ์ปค๋„ TCP/IP ์Šคํƒ: ํŒจํ‚ท ํ—ค๋” ํ•ด์„, ์ˆœ์„œ ๋งž์ถค, ์†Œ์ผ“ ๋ฒ„ํผ ๊ด€๋ฆฌ โ€ข Nginx: ์œ ์ € ๊ณต๊ฐ„์—์„œ ์†Œ์ผ“ ์ฝ๊ธฐ, HTTP ์š”์ฒญ ํŒŒ์‹ฑ, ๋ฐฑ์—”๋“œ ๋ผ์šฐํŒ… โ€ข ๋ฐฑ์—”๋“œ ์•ฑ: ์‹ค์ œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ์ˆ˜ํ–‰, ์‘๋‹ต ์ƒ์„ฑ โ€ข ์‘๋‹ต ๋ฐ˜ํ™˜: ๊ฐ™์€ ๊ฒฝ๋กœ ์—ญ์ˆœ์œผ๋กœ ํŒจํ‚ท ์ „์†ก

โธป