์ค๋์ UDP์ ๋ํด์ ์ ๋ฆฌํด๋ณด๋ ค๊ณ ํ๋ค
TCP๋ฅผ ์ข์ํ๋ ๋์๊ฒ UDP๋ฅผ ์๋ก ๋ง๋ค์ด์ผํ๋ ์ผ์ด ์๊ฒจ์
UDP๋ ๋๋ฌด ์๋ ์ ๋ด์ ๊ฐ๋ฌผ๊ฐ๋ฌผํด์ง
๊ฐ๋ณ๊ฒ ๋ฆฌ๋ง์ธ๋ํ๊ณ ๊ฐ๋ณด์์
๋ํ๊ต ๋ ์ด๊ฑธ๋ก ๋คํธ์ํฌ ์์ ๋ค์์๋๋ฐ
๊ต์๋ ๋ง์์ด ๋ค ์ณ์ผ์ จ๋ค...
1. UDP ๋?
TCP ( Transmission Control Protocol )
- OSI 7๊ณ์ธต์์ ์ ์ก์ธต (4๋ฒ์งธ ๊ณ์ธต)์ ํด๋น
- ์ ์ก์ ์ ์ดํ๋ ํ๋กํ ์ฝ
- ๊ฐ peer ๊ฐ ์ ๋ขฐ์ ์ธ ์ฐ๊ฒฐ ์งํฅ์ฑ ์๋น์ค ์ ๊ณต
- ์ ๋ขฐ์ฑ (์ฐ์X)
UDP (User Datagram Protocol)
- ์๋ OSI 7๊ณ์ธต์์ ์ ์ก์ธต์ ํด๋น๋จ
- ์ฌ์ฉ์์ Datagram์ ์ ์กํ๋ ํ๋กํ ์ฝ
- ์ ๋ขฐ์ฑ์ด ๋ฎ์ ํ๋กํ ์ฝ
- ์ฐ์์ฑ
TCP์ UDP ๋ชจ๋ ์๋๋ฐฉ์๊ฒ ์์ ์ ๋ฉ์์ง๋ฅผ ์ ๋ฌํ ๋ ์ฌ์ฉ๋๋ ํ๋กํ ์ฝ์ด๋ค
ํ๋ ์ง์ด ๋น์ทํ์ง๋ง, call ํด์ ์ฌ์ฉํ๋ ํจ์๋ ํ๋ฆ์ด ์กฐ๊ธ ๋ค๋ฅด๋ค
TCP์ UDP์ ๊ฐ์ฅ ํฐ ์ฐจ์ด์ ์ ์ ๋ขฐ์ฑ๊ณผ ์ฐ์์ฑ์ด๋ผ๊ณ ์๊ฐํ๋ค
TCP ํต์ ์ ์๋๋ฐฉ์ด ์ ๋ฐ์๋์ง ๋ชป ๋ฐ์๋์ง ํ์ธํ๋ ๊ณผ์ ์ ๊ฑฐ์น์ง๋ง
UDP ํต์ ์ ์ผ๋จ ์๊ธฐ๊ฐ ๋ณด๋ผ๊ฑฐ๋ฅผ ๋ณด๋ด๊ณ
๊ทธ ๋ค๋ ์๊ฐํ์ง ์๋๋ค
์์ธํ ์๊ธฐ๋ ํ๋ฆ์ ํตํด ๋ณด๋๋ก ํ๊ฒ ๋ค
2. UDP ํ๋ฆ
UDP ํ๋ก์ฐ๋ ๋คํธ์ํฌ ๊ณต๋ถ๋ฅผ ์กฐ๊ธ์ด๋ผ๋ ํ๋ค๋ฉด
ํ๋ฒ์ฏค์ ๋ดค์ ๊ทธ๋ฆผ์ด๋ค
↓
์ก์ ํธ์คํธ์ ์์ ํธ์คํธ ๊ฐ์ ํจํท ๊ตํ์ ๋ณด์ฌ์ฃผ๋ ๊ทธ๋ฆผ์ด๋ค
์ก์ ํธ์คํธ→ ์์ ํธ์คํธ๋ก ํจํท 123์ ๋ณด๋ด๊ณ ์๋๋ฐ,
์ฃผ๋ชฉํด์ผํ ๋ถ๋ถ์ ๋ง์ง๋ง (d)๋จ๊ณ์์ ํจํท ์์ค์ด ์ผ์ด๋ ๋ถ๋ถ์ด๋ค
๋๋ ๋ค ๋ณด๋๋ค๊ณ ์๊ฐํด๋ ๋ฐ๋ ์ชฝ์ ์ผ๋ถ๋ง ๋ฐ์์ ์๋ ์๋ค
๋ฐ๋ ์ชฝ์์๋ ์์ ์ด ์ผ๋ถ๋ง ๋ฐ์์ ์ ์๊ธฐ ๋๋ฌธ์,
์ด๋ฅผ ๊ณ ๋ คํด์ ํ๋ก๊ทธ๋จ์ ๋ง๋ค์ด์ผํ๋ค
(๋ ๊ทธ๋์ TCP๊ฐ ์ข๋ค)
๊ทผ๋ฐ ํจํท ์์ค์ด ์์ ์ ์๋๊ฑธ ์ ์จ???;;; ๋ผ๊ณ ์๊ฐํ ์๋ ์์ง๋ง
๋์ ์๋๊ฐ ๋น ๋ฅด๋ค
๋์์์ด๋ ํฌ๊ธฐ๊ฐ ํฐ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ์๋
๊ทธ๋์ UDP๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง๋ค
RTP์ RTCP๋ ๊ธฐ๋ณธ์ UDP๋ก ์ ์กํ๋ ๊ฑธ๋ก ๊ธฐ์ตํ๋ค...
** ์ฐธ๊ณ ) ์์๋๋ฉด ์ข์ Datagram๊ณผ Packet ์ฐจ์ด **
Datagram: ์์ํ ์ฌ์ฉ์์ ๋ฉ์์ง๋ฅผ ๋ํ๋
Packet: ์ฌ์ฉ์์ Datagram์ ์ด๋ค ๋จ์(MTU)์ ๋ง์ถฐ์ ํ ๋ง๋ธ ์ํ
3. UDP ํต์ ํจ์
/*๊ทธ๋ฆผ์๋ Server์ Client๊ฐ ์ ํด์ ธ ์๋๋ฐ,
๋ช ์นญ์์ด๊ณ UDP๋ ์๋ฒ ํด๋ผ์ด์ธํธ ๊ฐ๋ ๋ณด๋ค
ํธ์คํธ ๋ ํธ์คํธ๋ก ์๊ฐํ๋๊ฒ ๋ ์ข๋ค */
UDP ํต์ ์์ ์ฌ์ฉํ๋ ํจ์๋ ์์ ๊ทธ๋ฆผ์์ ๋ณด๋ ๊ฒ์ฒ๋ผ
socket(), bind, recvfrom(), sendto(), close()๋ก 5๊ฐ๊ฐ ์๋ค
ํ๋ํ๋ ์ดํด๋ณด์ฅ
(1) socket()
TCP๋ UDP ํต์ ์, endpoint๋ฅผ ๋ง๋ค์ด์ฃผ๋ ํจ์
#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);
Return
- ๋ง๋ค์ด์ง ์์ผ descriptor ๋ฒํธ
- ์คํจ์ -1 ๋ฐํ, errno(EACCES, EIO ๋ฑ)๋ฅผ ์ค์ ํจ
Parameters
1) domain
- ์์ฒญ๋ ์ฃผ์ ๋๋ฉ์ธ (AF_INET, AF_INET6, AF_UNIX ๋ฑ)
- IPv4๋ IPv6 ๊ฐ์ ํ๋กํ ์ฝ ์งํฉ(protocol family)๋ฅผ ์๋ฏธ
2) type
- ์์ฑ๋ ์์ผ ์ ํ (SOCK_STREAM, SOCK_DGRAM, SOCK_RAW ๋ฑ)
- TCP์ผ ๊ฒฝ์ฐ SOCK_STREAM์ ๋งค๊ฐ๋ณ์๋ก, UDP์ผ ๊ฒฝ์ฐ SOCK_DGRAM์ ์ฌ์ฉํ๋ฉด ๋จ
3) protocol
- UDP๋ TCP ๊ฐ์ ํน์ ํ๋กํ ์ฝ์ ๋ช ์ํจ (0, IPPROTO_UDP, IPPROTO_TCP)
- 0์ ์ฌ์ฉํ๋ฉด ์์์ ํด์ค์ ๋ณดํต 0์ ๋ง์ด ์
(2) bind()
socket()์ผ๋ก ๋ง๋ค์ด์ง ์์ผ(fd)์ ๋ก์ปฌ ์ด๋ฆ์ ๋ถ์ฌ์ค(binding)
#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
Return
- binding ์ฑ๊ณต/์คํจ ์ฌ๋ถ (์ฑ๊ณต์์๋ 0์ ๋ฐํ)
- ์คํจ์ -1 ๋ฐํ, errno(EACCES, EIO ๋ฑ)๋ฅผ ์ค์ ํจ
Parameters
1) sockfd
- socket() ํธ์ถ์์ ๋ฐํ๋ ์์ผ descriptor
2) const struct sockaddr
- socket์ ๋ถ์ฌ์ค ์ด๋ฆ์ ํฌํจํ๋ socketaddr ๊ตฌ์กฐ์ฒด์ ์ฃผ์
3) addrlen
- ๋๋ฒ์งธ ์ธ์์ธ sockaddr ๋ก ์์ฑํ ์ฃผ์ ํฌ๊ธฐ
- ex) sizeof(addr)
** bind๋ ๊ผญ ํ์ํ ๊น? **
bind๋ ์๋ฒ๋ ํด๋ผ์ด์ธํธ์์ ๊ผญ ์ฌ์ฉํ์ง ์์๋ ๋๋ค
์๋๋ฉด, bind์ ๋ชฉ์ ์ socket์ address์ port๋ฅผ ์ฐ๊ฒฐํ๋๊ฑฐ๋ค
์ฆ, ํจํท์ ์์ ํ ๋ ์ด๊ฑธ ์ด๋๋ก ๋ณด๋ผ๋? ํ๋๊ฑธ ์ ํ๋๊ฑฐ๋ค
OS๊ฐ ํจํท์ ์ด๋๋ก ์ ๋ฌํด์ผํ๋์ง ๋ชจ๋ฅผ ๋ ์ฌ์ฉํ๋ฉด ๋๊ณ ,
(recvfrom์ ๋จผ์ ํธ์ถํ๋ ๊ฒฝ์ฐ์ ํด๋น)
sendto๋ฅผ ๋จผ์ ํธ์ถํ ๋๋ OS๊ฐ ์์์ bind๋ฅผ ํด์ค์ ์์จ๋ ๋จ
(3) recvfrom()
์์ผ discriptor(์ด์ ๊ทธ๋ฅ ์์ผ FD๋ก ๋ถ๋ฅด๊ฒ ๋ค)๋ก๋ถํฐ ๋ฉ์์ง๋ฅผ ์์ ํด์ ๋ฒํผ์ ์ ์ฅ
#include <sys/types.h>
#include <sys/socket.h>
ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
struct sockaddr *src_addr, socklen_t *addrlen);
Return
- ๋ฉ์์ง ๋๋ ๋ฐ์ดํฐ ๊ทธ๋จ์ ๊ธธ์ด๋ฅผ Byte ๋จ์๋ก ๋ฐํ
- 0 ๋ฐํ์์๋ ์ฐ๊ฒฐ์ด close ๋์์ ์๋ฏธ
- ์คํจ์ -1 ๋ฐํ, errno(EACCES, EIO ๋ฑ)๋ฅผ ์ค์ ํจ
Parameters (๋๋ฌด ๋ง๊ธ)
1) int sockfd
- socket() ํธ์ถ์์ ๋ฐํ๋ ์์ผ fd
2) void *buf
- ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ๋ฒํผ์ ๋ํ ์ฃผ์
3) size_t len
- ๋๋ฒ์งธ ์ธ์์ธ buf์ ๊ธธ์ด (Byte ๊ธธ์ด)
- 4๋ฒ์งธ ์ธ์์ธ flag์ MSG_CONNTERM ํ๋๊ทธ ์ค์ ์ด ๋ ๊ฒฝ์ฐ์๋, len์ด 0์ด์ด์ผ ํจ
4) int flags
- ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋์ ์ฃผ๋ ์ต์
- 0, MSG_CONNTERM, MSG_PEEK, MSG_OOB ๋๋ MSG_WAITALL๋ก ์ค์ ํ ์์๋ ๋งค๊ฐ ๋ณ์
- ์ ๋ชจ๋ฅด๊ฒ ๋ค๋ฉด 0์ ์ฐ์
5) struct sockaddr *src_addr
- ๋ฐ์ดํฐ๊ฐ ์์ ๋๋ ์์ผ ์ฃผ์ struct์ ๋ํ ์ฃผ์
- ์ฐธ๊ณ ) source address ์๋ฏธ: ์ก์ ํ๋ ์ชฝ IP ์ฃผ์
6) socklen_t *addlen
- 5๋ฒ์งธ ์ธ์์ธ src_addr์ ํฌ๊ธฐ
- src_addr์ด NULL์ด๋ผ๋ฉด ๊ธธ์ด๋ ๋ฌด์๋จ
(4) sendto()
์์ผ fd๋ฅผ ํตํด ์์ ์์๊ฒ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ํจ์
#include <sys/types.h>
#include <sys/socket.h>
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
Return
- ๋ณด๋ธ ๋ฌธ์ ์๋ฅผ ๋ฐํ
- 0 ์ด์์ ๊ฐ์ ์ ์ก๋ Byte ์๋ฅผ ๋ํ๋ ( ์๋ฒฝํ๊ฒ ๋ค ๋ณด๋๋ค๊ณ ๋ ์ํ๋ค. ๋ณด์ฅ X )
- ์คํจ์ -1 ๋ฐํ, errno(EACCES, EIO ๋ฑ)๋ฅผ ์ค์ ํจ
Parameters (๋๋ฌด ๋ง๊ธ)
1) int sockfd
- socket() ํธ์ถ์์ ๋ฐํ๋ ์์ผ fd
2) const void *buf
- ์ ์กํ ๋ฉ์์ง๊ฐ ํฌํจ๋ ๋ฒํผ์ ๋ํ ์ฃผ์
- ๋ณด๋ผ ๋ฉ์์ง๋ ๋ณ๊ฒฝ๋๋ฉด ์๋๊ธฐ ๋๋ฌธ์ const๊ฐ ๋ถ๋ ๋ฏ
3) size_t len
- ๋๋ฒ์งธ ์ธ์์ธ buf์ ๊ธธ์ด (Byte ๊ธธ์ด)
4) int flags
- ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ผ ๋ ์ฃผ๋ ์ต์
- 0, MSG_OOB, MSG_DONTROUTE ๋ฑ
5) struct sockaddr *dest_addr
- ๋ฐ์ดํฐ๋ฅผ ๋ฐ์(์์ ์ธก) ํธ์คํธ์ ์ฃผ์ (์๋๋ฐฉ์ด๊ฒ ์ฅฌ?)
- ์ฐธ๊ณ ) destination address ์๋ฏธ: ์์ ํ๋ ์ชฝ IP ์ฃผ์
6) socklen_t *addlen
- 5๋ฒ์งธ ์ธ์์ธ dest_addr์ ํฌ๊ธฐ
(5) close()
์์ผ fd๋ฅผ close ํ๋ ํจ์
#include <unistd.h>
int close(int fd);
Return
- close ์ฑ๊ณต์ 0์ ๋ฐํ
- ์คํจ์ -1 ๋ฐํ, errno ๊ฐ ์ค์ ํด์ค
Parameters
1) int fd
- ๋ซ์ socket fd
- ๋๊ธฐ์ค์ธ ์ ๋ ฅ ๋ฐ์ดํฐ๊ฐ ์์ ๋๋ ์์ ํ ๋ซํ์ง ์๊ณ ์ฌ์ค์ ๋ ์๋ ์์
** ์ฐธ๊ณ )
TCP์ธ ๊ฒฝ์ฐ, socket() ์ผ๋ก ๋ง๋ค๊ณ setsocktopt() ์ต์ ์ผ๋ก SO_LINGER ์ค์ ์,
close๋ฅผ ํธ์ถํ์ฌ ๋ซ๊ธฐ๋ฅผ ์ํ ๊ฒฝ์ฐ ๋ฐ์ดํฐ๊ฐ ์กด์ฌ์ ์ฆ์ ์ข ๋ฃ๋์ง ์๊ฒ ํ ์ ์์
4. UDP Packet ๊ตฌ์กฐ
UDP ํจํท ๊ตฌ์กฐ๋ IP ํค๋์ UDP ํค๋์ ๋ฐ์ดํฐ๋ก ๊ตฌ์ฑ๋๋ค
๋ฐ์ดํฐ๋ ์ค์ ์ฐ๋ฆฌ๊ฐ ๋ณด๋ผ ๋ฐ์ดํฐ์ด๊ณ
๊ทธ ์์ UDP ํค๋๋ฅผ ๋ถ์ฌ์ UDP ์ฌ์ฉ์ ๋ช ์ํ๋ค
(TCP๋ฉด TCP ํค๋๊ฐ ๋ถ๊ฒ ์ฅฌ)
๊ทธ๋ฆฌ๊ณ ์ ๊ทธ๋ฆผ์์ UDP ํค๋ ๋ถ๋ถ์ ์๋๋ก ๊ตฌ์ฑ๋๋ค
๋ณด๋ด๊ณ ๋ฐ์ Port์ ์ ๋ณด์
๋ค์ ์ฌ ๋ฐ์ดํฐ์ ํฌ๊ธฐ ๋ฑ์ ๋ด๊ณ ์๋ค
TCP ํค๋์ UDP๋ฅผ ์ฐธ๊ณ ์๋ฃ๋ก ์ฒจ๋ถํ๊ณ ๋ง์น๊ฒ ๋ค
[ ์ฐธ๊ณ ์๋ฃ ]
** ์ฝ์ด๋ณด๋๊ฑฐ ๊ฐ์ถ!! **
https://www.ibm.com/docs/en/zos/2.3.0?topic=functions-socket-create-socket
'๐ Protocol' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
SOAP์ ์์๋ณด์ (0) | 2021.06.10 |
---|---|
HTTP Chunked Message๋ฅผ ์์๋ณด์ (0) | 2021.03.09 |
SMTP๋ฅผ ์์๋ณด์ (0) | 2020.12.16 |