시스템 프로그래밍 내용 정리(Part 4_개요/IP 주소와 포트 번호)

이지우·2024년 12월 10일
post-thumbnail

TCP/IP 프로토콜

  • 인터넷의 확산으로 산업 표준
  • 개발 초기부터 유닉스 시스템에 통합되어 서비스를 제공하고 있으며 리눅스에서 기본적으로 제공
  • 계층 구조: 5개 계층(4개 계층으로 구분하기도 함)
    • 응용 계층(application layer): 사용자에게 서비스를 제공하기 위한 계층(Telnet, FTP, HTTP, SMTP, DNS 등)
    • 네트워크 계층(network layer): 인터넷 계층이라고도 하며 패킷이 전달되는 경로를 담당(IP, ICMP, ARP 등)
    • 네트워크 접속 계층 / 하드웨어 계층: 물리적인 네트워크와의 연결을 담당(이더넷 카드, 랜 카드)
    • 전송 계층(transport layer): 패킷의 전송을 담당하는 계층(TCP, UDP)

TCP와 UCP의 차이점

TCPUDP
연결지향형비연결형
신뢰성 보장신뢰성을 보장 X
흐름 제어 기능 O흐름 제어 기능 X
순서 보장순서를 보장 X

IP 주소와 포트 번호

포트 번호(port number)

  • 전송되어오는 데이터를 어느 프로세스가 수신해 서비스를 제공할 것인지를 알려줌
  • 0~65535(2바이트 정수)
  • 일반 프로그램: 1024~65535 사용

포트(well-known)

  • 이미 지정되어 있는 포트 번호
    ( 인터넷에서 자주 사용하는 서비스는 포트 번호가 지정되어 있음 )
  • 0~1023
서비스포트 번호
Telent23
FTP21
HTTP80

소켓 인터페이스

  • 응용 계층에서 전송 계층의 기능을 사용할 수 있도록 제공하는 응용 프로그래밍 인터페이스(API)
  • 응용 프로그램과 TCP 계층을 연결하는 역할
  • 전송 계층이나 네트워크 게층이 복잡한 구조를 몰라도 쉽게 작성 가능

IP주소

  • 데이터가 전송될 목적지 호스트를 알려주는 역할
  • 인터넷을 이용할 때 사용하는 주소
  • 점(.)으로 구분된 32비트 숫자로 표시
  • 네트워크 주소(인터넷 주소)라고도 함
  • A,B,C,D,E 클래스 중 A,B,C 클래스만 사용(D,E는 멀티캐스트용, 연구용으로 사용)

호스트명

  • 시스템에 부여된 이름
  • 인터넷: '호스트+도메인명' 형태로 구성

호스트명과 IP 주소 변환

  • /etc/hosts 파일 또는 DNS, NLS 등
  • /etc/nsswitch.conf 파일에 주소변환을 누가 할 것인 지정
    *DNS: 호스트명과 도메인명을 관리하는 시스템
    NIS: 사용자와 호스트명과 같은 시스템 구성 데이터를 여러 곳에 제공해주는 서비스

호스트명과 주소 읽어오기

#include <netdb.h>

struct hostnet *gethostent(void);
void sethostent(int stayopen);
void edhostent(void);

stayopen: IP 주소 데이터베이스를 열어둘 것인지 여부를 나타내는 값

gethostent: 호스트명과 IP 주소를 읽어서 hostent 구조체에 저장하고 해당 주소를 리턴
sethostent: 데이터베이스의 현재 읽기 위치를 시작 부분으로 재설정
endhostent: 데이터 베이스를 닫음

hostent 구조체

struct hostent{
	char *h_name;
    char **h_aliases;
    int h_addrtype;
    int h_length;
    char **h_addr_list;
};
  • h_name: 호스트명 저장
  • h_aliases: 호스트를 가리키는 다른 이름 저장
  • h_addrtype: 호스트 주소의 형식을 지정
  • h_length: 주소의 길이 저장
  • h_addr_list: 해당 호스트의 주소 목록 저장

호스트명으로 정보 검색: gethostbyname(3)

: 호스트명을 인자로 받아 데이터베이스에서 해당 항목을 검색해 hostent 구조체에 저장하고 그 주소를 리턴

#include <netdb.h>

struct hostent *gethostbyname(const char *name);

name: 검색하려는 호스트명

IP 주소로 정보 검색: gethostbyaddr(3)

: IP주소를 인자로 받아 데이베이스에서 해당 항목을 검색해 hostent 구조체에 저장하고 그 주소를 리턴

#include <netdb.h>
#include <sys/socket.h>

struct hostent *gethostbyaddr(const void *addr, socklen_t len, int type);

addr: 검색하려는 IP주소
len: addr 길이
type: IP주소 형식

포트 정보 읽어오기: getservent(3), setservent(3), endservent(3)

#include <netdb.h>

struct servent *getservent(void);
void setservent(inst stayopen);
void endservent(void);

stayopen: 포트 정보 데이터베이스를 열어둘 것인지 여부를 나타내는 값

getservent: 포트 정보를 읽어서 servent 구조체에 저장하고 그 주소를 리턴
setservent: 데이터베이스의 현재 읽기 위치를 시작 부분으로 재설정
endservent: 데이터 베이스를 닫음

servent 구조체

struct serven{
	char *s_name;
    char **s_aliases;
    int s_port;
    char *s_proto;
};
  • s_name: 포트명을 저장
  • s_aliases: 해당 서비스를 가리키는 다른 이름들을 저장
  • s_port: 포트 번호를 저장
  • s_proto: 서비스에 사용하는 프로토콜의 종류를 나타냄

서비스명으로 정보 검색: getservbyname(3)

: 포트명을 인자로 받아 데이터베이스에서 해당 항목을 검색해 servent 구조체에 저장하고 그 주소를 리턴

#include <netdb.h>

struct servnet *getservbyname(const char *name, const chat *proto);

name: 검색할 포트명
proto: "tcp" 또는 "udp"

포트 번호로 정보 검색: getservbyport(3)

: 포트 번호를 인자로 받아 데이터베이스에서 해당 항목을 검색해 servent 구조체에 저장하고 그 주소를 리턴

#include <netdb.h>

struct servent *getservbyport(int port, const char *proto);

port: 검색할 포트 번호
proto: "tcp" 또는 "udp"

0개의 댓글