인터넷과 소켓프로그래밍

소켓 프로그래밍을 위한 알아야할 기능들

kang057 2024. 7. 25. 21:46

● Name Resolver

- gethostbyname()

  ○ 도메인 이름을 이용하여 IP 주소 및 관련 정보를 구함

- gethostbyaddr()

  ○ IP 주소를 이용하여 도메인 이름을 구함

#include <netdb.h>
struct hostent *gethostbyname (const char *hname);
struct hostent *gethostbyaddr (const char *in_addr, int len, int family);

 

● netdb.h - Host Entry 관련

#include <netdb.h>

struct hostent {
	char* h_name;  // 호스트 이름 
    	char** h_aliases; // 호스트 별칭
    	int h_addrtype; // 호스트 주소의 종류
    	int h_lenth; // 주소의 크기
    	char** h_addr_list; // IP 주소 리스트
};

#define h_addr h_addr_list[0] // 첫 번째(대표) 주소

 

● FTP (File Transfer Protocol) 기반 알FTP

1. ftp ice.anyang.ac.kr

/* name resolver */

2. hp = gethostbyname("ice.anyang.ac.kr");

3. Name resolver는 UDP를 이용하여 name server에게 query

4. IP address를 찾으면 응답 (129.254.0.150) 다음 name server에게 query

 

○ DNS (Domain Name System)을 이용한 주소 찾기

=> 인터넷에서 도메인 이름을 IP 주소로 변환하는 데 사용되는 시스템입니다. DNS를 이용하면 사용자가 기억하기 쉬운 도메인 이름을 통해 웹사이트에 접속할 수 있으며, 이 도메인 이름을 실제 네트워크 통신에 필요한 IP 주소로 변환해 준다.

 

DNS의 동작 원리

1. 도메인 이름 입력: 사용자가 브러우저의 주소 창에 도메인 이름을 입력한다.

2. DNS 쿼리 생성: 브러우저는 이 도메인 이름을 IP 주소로 변환하기 위해 DNS 쿼리를 생성

3. 로컬 DNS 캐시 확인: 먼저, 브러우저는 로컬 DNS 캐시에 이 도메인 이름이 저장되어 있는지 확인한다. 저장되어 있으면 캐시된 IP 주소를 사용한다.

4. 로컬 DNS 서버 요청: 로컬 캐시에 없으면, 브러우저는 설정된 DNS 서버(일반적으로 ISP의 DNS 서버)로 쿼리를 보낸다.

5. 재귀적 조회: 로컬 DNS 서버는 자체 캐시에 요청한 도메인이 없으면, 재귀적 조회를 수행하여 다른 DNS 서버에 쿼리를 전달한다. 이 과정은 다음과 같은 순서로 진행된다.

6. IP 주소 반횐: 로컬 DNS 서버는 얻은 IP 주소를 브라우저에 반환하고, 브라우저는 이 IP 주소를 사용하여 해당 웹 서버에 접속한다.

 

● netdb.h - Service Entry 관련

struct servent {
    char  *s_name;    // 공식 서비스 이름
    char  **s_aliases; // 서비스 이름 별칭 리스트
    int   s_port;     // 네트워크 바이트 순서의 포트 번호
    char  *s_proto;   // 사용하는 프로토콜 (e.g., "tcp", "udp")
};

 

● Byte Order (바이트 순서)
- CPU마다 메모리로 부터 데이터를 읽는 방식이 다름

- 0000000001010000

 

○ little endian : 높은 주소부터 읽는다.

- Intel 계열

- 2^14 + 2^12 = 20480

 

○ big endian : 낮은 주소부터 읽는다.

-  Motorola 계열

- 80

- 네트워크는 big endian를 사용한다.

 

● 바이트 순서를 바꾸는 함수

○ Network byte order

   - Big endian

 

○ 2바이트와 4바이트의 구분

  - Unsigned short integer 변환

htons() : host-to-network short 바이트 변환
ntohs() : network-to-host short 바이트 변환

 

  - Unsigned long integer 변환

htonl() : host-to-network long 바이트 변환
ntohl() : network-to-host long 바이트 변환

'인터넷과 소켓프로그래밍' 카테고리의 다른 글

TCP 에코 서버 (계속)  (0) 2024.07.28
소켓 개요 및 TCP 에코 서버  (0) 2024.07.26
포트번호와 주소변화  (0) 2024.07.24
서브넷 및 IPv6 주소  (3) 2024.07.23
IPv4  (0) 2024.07.20