TIL (Today I Learned)/Network

[TCP/IP] ํฌํŠธ(Port)

loki d 2021. 9. 11. 23:51
728x90

ํฌํŠธ(Port)

์ธํ„ฐ๋„ท์— ์—ฐ๊ฒฐ๋œ ์ปดํ“จํ„ฐ ๊ฐ„์— ์ด๋ฃจ์–ด์ง€๋Š” ์ž๋ฃŒ์˜ ๊ตํ™˜์€ ํด๋ผ์ด์–ธํŠธ/์„œ๋ฒ„ ๊ตฌ์กฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค.
ํด๋ผ์ด์–ธํŠธ์˜ ์„œ๋น„์Šค ์š”์ฒญ๊ณผ ์„œ๋ฒ„์˜ ์‘๋Œ€ ์ฒ˜๋ฆฌ๋Š” ๊ฐ๊ฐ์˜ ์†Œ์ผ“์ด ์—ฐ๊ฒฐ๋œ ํฌํŠธ๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง„๋‹ค.
์ปดํ“จํ„ฐ ์‹œ์Šคํ…œ์€ 0~65535๊นŒ์ง€์˜ ํฌํŠธ๋ฅผ ๋‘๊ณ  ์žˆ๋‹ค.

  • ์›น ์„œ๋ฒ„, ์ด๋ฉ”์ผ, FTP, ํ…”๋„ท(Telnet) ๋“ฑ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ์„œ๋น„์Šค์—์„œ ํ•ด๋‹น ์„œ๋น„์Šค๋ฅผ ์–ด๋А ์‹œ์Šคํ…œ์—์„œ ์ œ๊ณตํ•˜๋˜ ๊ฐ„์— ๋Œ€๋ถ€๋ถ„ ๋™์ผํ•œ ํฌํŠธ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค.
  • ์›น ์„œ๋ฒ„๋Š” ์›น ๋ธŒ๋ผ์šฐ์ €๊ฐ€ 80๋ฒˆ ํฌํŠธ์— ์—ฐ๊ฒฐํ•˜๋ฉด ์›น ์„œ๋ฒ„์— ์—ฐ๊ฒฐ๋œ๋‹ค. 'http://www.naver.com/index.html'์ฒ˜๋Ÿผ ํŠน์ • ํฌํŠธ๋ฅผ ๋ช…์‹œํ•˜์ง€ ์•Š์•„๋„ 80๋ฒˆ ํฌํŠธ์— ์—ฐ๊ฒฐ๋˜๋Š” ์ด์œ ๋Š” ๊ธฐ๋ณธ(default) ์„ค์ •์ด๊ธฐ ๋•Œ๋ฌธ
  • ๋งŒ์ผ ํ˜ธ์ŠคํŠธ A์—๋Š” ์›น์„œ๋ฒ„๊ฐ€ 80๋ฒˆ ํฌํŠธ์— ์—ฐ๊ฒฐ๋˜์–ด ์‹คํ–‰ ์ค‘์ด๊ณ , ํ˜ธ์ŠคํŠธ B์—๋Š” ์›น์„œ๋ฒ„๊ฐ€ 90๋ฒˆ ํฌํŠธ์— ์—ฐ๊ฒฐ๋˜์–ด ์‹คํ–‰ ์ค‘์ด๋ฉด ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ˜ธ์ŠคํŠธ A์™€ ํ˜ธ์ŠคํŠธ B์˜ ์›น ์„œ๋ฒ„์— ์—ฐ๊ฒฐ ํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ์›น ์„œ๋ฒ„์˜ ํฌํŠธ๋ฅผ ๋‹ค์‹œ ๋ช…ํ™•ํ•˜๊ฒŒ ํ•ด์•ผ ํ•œ๋‹ค.
  • http://www.naver.com:8090/index.html'์ฒ˜๋Ÿผ ํŠน์ • ํฌํŠธ๋ฅผ ๋ช…์‹œํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ข…์ข… ์žˆ๋‹ค.
  • ์ธํ„ฐ๋„ท ํ• ๋‹น ๋ฒˆํ˜ธ ๊ด€๋ฆฌ ๊ธฐ๊ด€ IANA(Internet Assigned Numbers Authority)S๋Š” ์„œ๋น„์Šค์™€ ํฌํŠธ ๋ฒˆํ˜ธ์— ๋Œ€ํ•œ ๊ทœ์•ฝ์„ ์ •ํ•˜๊ณ  ๊ด€๋ฆฌํ•œ๋‹ค.
  • IANA 3๊ฐœ ์˜์—ญ
    • Well-known Port, 0~1023
    • Registered Port, 1024~49151
    • Dynamic and/or Private Port, 19512~65535

ํฌํŠธ๋ณ„ ์„œ๋น„์Šค ๋‚ด์—ญ์„ ์ถœ๋ ฅํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ

/etc/services ํŒŒ์ผ์—์„œ ์ •๋ณด๋ฅผ ์ฝ์–ด์˜ค๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๊ตฌํ˜„

ํ•จ์ˆ˜

#include <netdb.h>

struct servent *getservent(void);

๋ฐ˜ํ™˜๊ฐ’

  • ์„ฑ๊ณต ์‹œ : servent ๊ตฌ์กฐ์ฒด์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ
  • ์‹คํŒจ ์‹œ : NULL

๊ตฌ์กฐ์ฒด

struct servent{
  char *s_name;       // ์„œ๋น„์Šค ๊ณต์‹ ๋ช…์นญ
  char **s_aliases;   // ๋ณ„๋ช… ๋ช…์นญ
  int s_port;         // ํฌํŠธ ๋ฒˆํ˜ธ
  char *s_proto;      // ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœํ† ์ฝœ
#include <stdio.h>
#include <netdb.h>

int main() {
        struct servent *p;
        int n;

        while(1){
                if (!(p = getservent())) break;

                printf("%s\t %d/%s \t", p->s_name, ntohs(p->s_port), p->s_proto);
                for(n=0; p->s_aliases[n] != NULL; n++)
                        printf("%s ", p->s_aliases[n]);
                printf("\n");
        }
}

IP ์ฃผ์†Œ ๋ณ€ํ™˜

ํ•จ์ˆ˜

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

int inet_aton(const char *cp, struct in_addr *inp);

๋ฐ˜ํ™˜ ๊ฐ’

  • ์„ฑ๊ณต ์‹œ : 0์ด ์•„๋‹Œ ๊ฐ’
  • ์‹คํŒจ ์‹œ : 0

    ์ธ์ž

  • cp: 10์ง„์ˆ˜์™€ ์ ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ฌธ์ž์—ด ํ˜•์‹์˜ IP ์ฃผ์†Œ
  • inp : ๋„คํŠธ์›Œํฌ ๋ฐ”์ดํŠธ ์ˆœ์„œ๋กœ ๋œ ์ด์ง„ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” 32๋น„ํŠธ IP

๊ตฌ์กฐ์ฒด

struct in_addr {
  u_longs_addr;       //IP ์ฃผ์†Œ(๋„คํŠธ์›Œํฌ ๋ฐ”์ดํŠธ ์ˆœ์„œ์˜ ์ด์ง„ ๊ฐ’)
}

ํ•จ์ˆ˜

#include <arpa/inet.h>

char * inet_ntoa(struct in_addr in);

๋ฐ˜ํ™˜ ๊ฐ’

  • ์„ฑ๊ณต ์‹œ : 10์ง„์ˆ˜์™€ ์ ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋ฌธ์ž์—ด ํ˜•์‹์˜ IP ์ฃผ์†Œ
  • ์‹คํŒจ ์‹œ : -1

    ์ธ์ž

  • in : 32 ๋น„ํŠธ IP ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•  ๊ตฌ์กฐ์ฒด ๋ณ€์ˆ˜
#include <stdio.h>
#include <arpa/inet.h>

int main() {
        struct                  in_addr inp;
        const char *    ipAddr = "203.249.39.3";
        char                    *addr;

        inet_aton(ipAddr, &inp);
        printf("ip (dotted decimal_[%s] -> ip(binary)[0x%x]\n", ipAddr, ntohl(inp.s_addr));

        addr = inet_ntoa(inp);
        printf("ip(binary[0x%x] -> ip(dotted decimal)[%s]\n", ntohl(inp.s_addr), addr);
}

๊ฒฐ๊ณผํ™”๋ฉด

image