์ผ๋‹จ ํ•˜๊ณ  ๋ณด๋Š” ์‚ฌ๋žŒ

๋‚˜์ค‘๋ณด๋‹จ ์ง€๊ธˆ์— ์ง‘์ค‘ํ•˜๋˜, ์ง€๊ธˆ๋ณด๋‹จ ๋‚˜์ค‘์— ์™„๋ฒฝํ•ด์ง€์ž๐Ÿ’ช๐Ÿป

๐ŸŒ Network ๊ธฐ๋ณธ๋ถ€ํ„ฐ ์ฐจ๊ทผ์ฐจ๊ทผ

[์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ] TCP ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž!

JanginTech 2024. 10. 1. 15:57

TCP ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ๊ทธ๋žจ

1.1. TCP ํด๋ผ์ด์–ธํŠธ ํ”„๋กœ๊ทธ๋žจ ๊ตฌํ˜„(์ž‘์„ฑ) ์ ˆ์ฐจ

 

ํด๋ผ์ด์–ธํŠธ๋Š” socket()์œผ๋กœ ์†Œ์ผ“์„ ๊ฐœ์„คํ•˜๋Š” ๊ฒƒ์„ ์‹œ์ž‘์œผ๋กœ ํ•œ๋‹ค. 

 

์—ฐ๊ฒฐํ˜• ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด connect()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ

์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ์„ ์š”์ฒญํ•˜๊ณ  ์—ฐ๊ฒฐ์ด ์ด๋ฃจ์–ด์ง€๋ฉด

send()์™€ recv()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์†ก์ˆ˜์‹ ํ•˜๊ณ 

์ž‘์—…์ด ์ข…๋ฃŒ๋˜๋ฉด close()๋กœ ์†Œ์ผ“์„ ๋‹ซ๋Š”๋‹ค.

 

์ด๊ฑฐ๋ฅผ ๋‹จ๊ณ„๋ณ„๋กœ ์ƒ์„ธํžˆ ์ •๋ฆฌํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

 

 

 

 

1. socket(), ์†Œ์ผ“ ๊ฐœ์„ค

์‚ฌ์šฉํ•  ํ”„๋กœํ† ์ฝœ(TCP, UDP ์†Œ์ผ“)์„ ์„ ํƒํ•œ๋‹ค.

ํ”„๋กœํ† ์ฝœ ์†Œ์ผ“
TCP SOCK_STREAM
UDP SOCK_DGRAM

 

ํด๋ผ์ด์–ธํŠธ๋Š” ๋จผ์ € socket()์œผ๋กœ ์†Œ์ผ“์„ ๊ฐœ์„คํ•ด์•ผ ํ•˜๋Š”๋ฐ ์ด๋•Œ ํ”„๋กœํ† ์ฝœ ์ฒด๊ณ„๋ฅผ PF_INET๋กœ ์„ ํƒํ•˜๊ณ , ์„œ๋น„์Šค ํƒ€์ž…์€ SOCK_STREAM์œผ๋กœ ์„ ํƒํ•œ๋‹ค.

 

socket() ํ˜ธ์ถœ ์‹œ ํŠธ๋žœ์ŠคํฌํŠธ ํ”„๋กœํ† ์ฝœ๋งŒ์„ ์ง€์ •ํ•˜๊ฒŒ ๋˜๋Š”๋ฐ socket() ์ˆ˜ํ–‰ ์‹œ ๋‚ด๋ถ€์ ์œผ๋กœ ๋ฐœ์ƒํ•˜๋Š” ๋™์ž‘์€ ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™๋‹ค.

 

1.2. socket() ํ˜ธ์ถœ์‹œ ์†Œ์ผ“ ๋ฒˆํ˜ธ์™€ ์†Œ์ผ“ ์ธํ„ฐํŽ˜์ด์Šค์˜ ๊ด€๊ณ„

 

์†Œ์ผ“ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ์œ„ํ•ด์„œ๋Š” 5๊ฐ€์ง€ ์š”์†Œ๋ฅผ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

1. ์‚ฌ์šฉํ•  ํŠธ๋žœ์ŠคํฌํŠธ ํ”„๋กœํ† ์ฝœ(์ŠคํŠธ๋ฆผ or ๋ฐ์ดํ„ฐ๊ทธ๋žจ)

2. ์ž์‹ ๊ณผ ์ƒ๋Œ€๋ฐฉ์˜ IP ์ฃผ์†Œ

3. ์ž์‹ ๊ณผ ์ƒ๋Œ€๋ฐฉ์˜ port ๋ฒˆํ˜ธ

 

์‰ฝ๊ฒŒ๋งํ•ด, ์‚ฌ์šฉํ•  ํ”„๋กœํ† ์ฝœ์„ ์ง€์ •ํ•˜์—ฌ socket()์„ ํ˜ธ์ถœํ•˜๋ฉด ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ์†Œ์ผ“๊ณผ ์†Œ์ผ“๋ฒˆํ˜ธ๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค.

 

 

 

 

2. connect(), ์„œ๋ฒ„์— ์—ฐ๊ฒฐ ์š”์ฒญ

ํด๋ผ์ด์–ธํŠธ๋Š” connect()๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ์—ฐ๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ์„œ๋ฒ„์˜ ์ฃผ์†Œ๋ฅผ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

4๋ฐ”์ดํŠธ์˜ IP ์ฃผ์†Œ์™€ 2๋ฐ”์ดํŠธ์˜ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ํฌํ•จํ•˜๋Š” ์†Œ์ผ“ ์ฃผ์†Œ ๊ตฌ์กฐ์ฒด sockaddr_in์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค.

 

sockaddr_in: ์—ฐ๊ฒฐํ•˜๊ณ ์ž ํ•˜๋Š” ์„œ๋ฒ„์˜ ์ฃผ์†Œ ์ง€์ •(IP, port)

int connect (                        
  int s,                             // ์„œ๋ฒ„์™€ ์—ฐ๊ฒฐ์‹œํ‚ฌ ์†Œ์ผ“๋ฒˆํ˜ธ
  const struct sockaddr *addr,       // ์ƒ๋Œ€๋ฐฉ ์„œ๋ฒ„์˜ ์†Œ์ผ“์ฃผ์†Œ ๊ตฌ์กฐ์ฒด  
  int addrlen);                      // ๊ตฌ์กฐ์ฒด *addr์˜ ํฌ๊ธฐ

 

์ด๋•Œ ํด๋ผ์ด์–ธํŠธ๋Š” bind()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์‹ ์ด ์‚ฌ์šฉํ•  ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ์ง€์ •ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

TCP์™€ ๊ฐ™์€ ์—ฐ๊ฒฐํ˜• ํด๋ผ์ด์–ธํŠธ์—์„œ๋Š” conenct()๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ, TCP๊ฐ€ ์ž„์˜์˜ ํฌํŠธ ๋ฒˆํ˜ธ๋ฅผ ์ง€์ •ํ•ด ์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

1.3. connect() ํ˜ธ์ถœ์‹œ ์†Œ์ผ“ ๋ฒˆํ˜ธ์™€ ์†Œ์ผ“ ์ฃผ์†Œ์˜ ๊ด€๊ณ„

 

 

 

 

 

3. send(), recv(), ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹ 

TCP ์†Œ์ผ“์˜ ๋ฐ์ดํ„ฐ ์†ก์ˆ˜์‹  ๋ฉ”์„œ๋“œ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

๋ฌธ๋ฒ• ์ธ์ž
int send(int s, char* buf, int length, int flags); s ์†Œ์ผ“๋ฒˆํ˜ธ
buf ์ „์†กํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ๋ฒ„ํผ
length buf ํฌ๊ธฐ
flags default: 0
int write(int s, const void* buf, int length) s ์†Œ์ผ“๋ฒˆํ˜ธ
buf ์ „์†กํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ์ €์žฅ๋œ ๋ฒ„ํผ
length buf ๊ธธ์ด
int recv(int s, char* buf, int length, int flags); s ์†Œ์ผ“๋ฒˆํ˜ธ
buf ์ˆ˜์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋ฒ„ํผ
length buf ๊ธธ์ด
flags default: 0
int read(int s, void* buf, int length); s ์†Œ์ผ“๋ฒˆํ˜ธ
buf ์ˆ˜์‹  ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋ฒ„ํผ
length buf์˜ ๊ธธ์ด

 

๋ฉ”์‹œ์ง€ ์†ก์‹  ํ•จ์ˆ˜๋“ค์€ ์‹ค์ œ๋กœ ๋ฏธ์‹œ์ง€ ํฌ๊ธฐ๋ฅผ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๋ฆฌํ„ดํ•˜๋ฉฐ,

๋ฉ”์‹œ์ง€ ์ˆ˜์‹  ํ•จ์ˆ˜๋Š” ์‹ค์ œ๋กœ ์ฝ์€ ๋ฉ”์‹œ์ง€ ํฌ๊ธฐ๋ฅผ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๋ฆฌํ„ดํ•œ๋‹ค.

 

 

TCP ์†Œ์ผ“ ์†ก์‹  ํ•จ์ˆ˜ ์‚ฌ์šฉ์‹œ,

TCP ์†Œ์ผ“์—์„œ write(), send()๋ฅผ ์‹คํ–‰ํ•˜๋ฉด ๋ฉ”์‹œ์ง€๋Š” TCP ๊ณ„์ธต์˜ ์†ก์‹  ๋ฒ„ํผ(send buffer)์— ์ €์žฅ๋œ๋‹ค.

์ฆ‰ write() ๋ฌธ์ด ๋ฆฌํ„ด๋˜๋ฉด, ์ž์‹ ์˜ TCP์— ์žˆ๋Š” ์†ก์‹  ๋ฒ„ํผ์— ๋ฉ”์‹œ์ง€๊ฐ€ ๋“ค์–ด๊ฐ„ ๊ฒƒ.

๊ทธ๋ฆฌ๊ณ  ์†ก์‹  ๋ฒ„ํผ์— ๋‹ด๊ธด ๊ฒƒ!= ๋ฉ”์‹œ์ง€ ์ „์†ก ์™„๋ฃŒ๊ฐ€ ์•„๋‹˜์„ ์ฃผ์˜ํ•ด์•ผ ํ•œ๋‹ค!

 

TCP ์†Œ์ผ“ ์ˆ˜์‹  ํ•จ์ˆ˜ ์‚ฌ์šฉ ์‹œ,

recv(), read()๋Š” ์ŠคํŠธ๋ฆผํ˜•(TCP) ์†Œ์ผ“์„ ํ†ตํ•˜์—ฌ ํŒจํ‚ท์„ ์†ก์‹ ํ•œ๋‹ค.

๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์‹ ํ•  ์†Œ์ผ“ ๋ฒˆํ˜ธ, ์ˆ˜์‹  ๋ฒ„ํผ, ์ฝ์„ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•˜์—ฌ, ์‹ค์ œ๋กœ ์ฝ์€ ๋ฐ์ดํ„ฐ ํฌ๊ธฐ๋ฅผ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ๋ฆฌํ„ดํ•œ๋‹ค.

 

 

โž•


์ŠคํŠธ๋ฆผ ์†Œ์ผ“์—์„œ๋Š”

ํ•˜๋‚˜์˜ IP ํŒจํ‚ท์ด ํ•œ ๋ฒˆ์— ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฉ”์‹œ์ง€ ํฌ๊ธฐ(MSS) ๋ณด๋‹ค ํฐ ๋ฉ”์‹œ์ง€๋ฅผ ์†ก์‹  ๋ฒ„ํผ์— ์ €์žฅํ•˜๊ณ  wirte()๋‚˜ send()๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ,

์ด๋•Œ ์ „์ฒด ๋ฉ”์‹œ์ง€๊ฐ€ MSS ํฌ๊ธฐ๋กœ ์ž๋™ ๋ถ„ํ•  ๋˜์–ด ์ „์†ก๋œ๋‹ค.

์ „์ฒด ๋ฐ์ดํ„ฐ๋ฅผ IP ํŒจํ‚ท ๋‹จ์œ„๋กœ (์ž๋™) ๋ถ„ํ•  ์ „์†กํ•˜๋ฉด ๋ถ„์‹ค ์—ฌ๋ถ€๋ฅผ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๊ณ  ํ•„์š”์— ๋”ฐ๋ผ ์žฌ์ „์†ก ์š”๊ตฌ ๊ฐ€๋Šฅ!(TCP ์‹ ๋ขฐ์„ฑ) ์ด๊ฒƒ์ด ์ŠคํŠธ๋ฆผ ์†Œ์ผ“์˜ ์žฅ์ 

 

 

 

๊ทธ๋Ÿฌ๋‚˜ ๋ฐ์ดํ„ฐ๊ทธ๋žจ(UDP) ์†Œ์ผ“์—์„œ๋Š”

์‚ฌ์šฉ์ž๊ฐ€ ์ „์†ก ์š”๊ตฌํ•œ ๋ฉ”์‹œ์ง€ ํฌ๊ธฐ๊ฐ€ UDP๊ฐ€ ํ•œ ๋ฒˆ์— ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ๋ฉ”์‹œ์ง€ ํฌ๊ธฐ๋ณด๋‹ค ํฌ๋ฉด

์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ์•ž๋ถ€๋ถ„ ์ผ๋ถ€๋งŒ ์ „์†ก๋œ๋‹ค.(์‹ ๋ขฐ์„ฑ x)

 

 

 

4. close(), ์†Œ์ผ“ ๋‹ซ๊ธฐ

close()๋Š” ํด๋ผ์ด์–ธํŠธ๋‚˜ ์„œ๋ฒ„ ๋ˆ„๊ตฌ๋‚˜ ๋จผ์ € ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

close(s);

 

close()๋ฅผ ํ˜ธ์ถœํ•œ ์‹œ์ ์— ์„œ๋ฒ„๋‚˜ ํด๋ผ์ด์–ธํŠธ์— ์†ก์‹  ๋ฒ„ํผ์— ๋‹ด๊ฒจ ์žˆ์œผ๋‚˜ ์•„์ง ์ „์†ก ๋ชปํ–ˆ๊ฑฐ๋‚˜ ์ „์†ก ์ค‘์ธ ํŒจํ‚ท์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค!

๊ทธ๋Ÿด ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ close()๋Š” ๋””ํดํŠธ๋กœ ์ด๋Ÿฌํ•œ ํŒจํ‚ท๋“ค์„ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•œ ํ›„์— ์†Œ์ผ“์„ ๋‹ซ์„ ์ˆ˜ ์žˆ๋„๋ก ๋˜์–ด ์žˆ๋‹ค.

 

close() ํ˜ธ์ถœ ์ „์— shutdown() ์‹œ์Šคํ…œ ์ฝœ์„ ํ•˜์—ฌ directon ๊ฐ’์— ๋”ฐ๋ผ ์ข…๋ฃŒ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.

๊ฐ’ ์ข…๋ฃŒ
1 ํŒจํ‚ท ์ „์†ก ์ข…๋ฃŒ
0 ์ˆ˜์‹  ์ข…๋ฃŒ
2 ์†ก์ˆ˜์‹  ๋ชจ๋‘ ์ข…๋ฃŒ

 

shutdown(s, direction);

 

 

partial close

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋” ์ด์ƒ ์ „์†กํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์œผ๋ฉด direction=0์œผ๋กœ ํ•˜์—ฌ shutdown()์„ ํ˜ธ์ถœํ•˜๋ฉด ๋œ๋‹ค.

์ด๋ฅผ partial close๋ผ๊ณ  ํ•œ๋‹ค.

 

์ด๋•Œ ๋„คํŠธ์›Œํฌ ์‹œ์Šคํ…œ์—์„œ ์ƒ๋Œ€์ธก ์„œ๋ฒ„์—๊ฒŒ end-of-file ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด์–ด ์ด๋ฅผ ์ˆ˜์‹ ํ•œ ์„œ๋ฒ„๋„ ์ „์†กํ•  ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋‹ค๋ฉด ํ•ด๋‹น ์—ฐ๊ฒฐ์„ ์ข…๋ฃŒํ•˜๋ฉด ๋œ๋‹ค.

 

 

setsockopt()

close()ํ˜ธ ์ถœ์‹œ ๋ฏธ์ฒ˜๋ฆฌ๋œ ํŒจํ‚ท์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ํƒ€์ž„์•„์›ƒ์ด๋‹ค.

์ผ์ • ์‹œ๊ฐ„์„ ์ง€์ •ํ•˜์—ฌ ํ•ด๋‹น ์‹œ๊ฐ„ ๋™์•ˆ๋งŒ ๋ฏธ์ฒ˜๋ฆฌ๋œ ํŒจํ‚ท์„ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” close() ํ˜ธ์ถœ ์ „์— setsockopt()๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์†Œ์ผ“ ๋™์ž‘์˜ ์˜ต์…˜์„ ๋ฐ”๊ฟ”์ฃผ์–ด์•ผ ํ•œ๋‹ค.(์ด๊ฑด ์ถ”ํ›„ ๋‹ค์‹œ ๊ณต๋ถ€ํ•ด์„œ ์ •๋ฆฌํ•˜๊ฒ ๋‹ค^!^)

 

 

 

 

 

 

 


 

์˜ค๋Š˜ ๊ณต๋ถ€ํ•œ ๋‚ด์šฉ์„ ํ† ๋Œ€๋กœ TCP ์—์ฝ” ํ”„๋กœ๊ทธ๋žจ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค!

์ด๊ฑฐ๋Š” ๋‹ค์Œ ์žฅ์— ๊ธฐ๋กํ•ด์•ผ์ง€๐Ÿฅฐ๐Ÿฅฐ