jissue
SSUE's IT World
jissue
전체 방문자
오늘
어제
  • 분류 전체보기 (88)
    • CS (4)
    • 자료구조 (5)
    • 알고리즘 (30)
      • 백준 (28)
      • 프로그래머스 (2)
    • JAVA (0)
    • Spring Boot (0)
    • 가상화 (35)
      • VMware (23)
      • Docker (12)
    • sw 사관학교 정글 (13)
      • TIL (12)
    • 기타 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 글

티스토리

hELLO · Designed By 정상우.
jissue

SSUE's IT World

CS

CSAPP: 11.3

2023. 4. 13. 21:55
  • 관리
  • 글쓰기
  • 로그인
  • 로그아웃

11.3.1 IP v4 

ㅁ IP v4 란?

  1. 부호(- or +)를 갖지 않는 32bit 정수로 이루어져 있다.
  2. 네트워크 프로그램 내부에서는 IP 정보를 IP 주소 구조체에 저장한다. 
  3. IP 주소는 dotted-decimal 표기 형식으로 제시된다.

1. IP v4

IPv4(Internet Protocol Version4)는 32 bit로 이루어진 주소로 이루어져 장비간 통신을 위해 사용되는 프로토콜이다. 

/* IP address structure */
struct in_addr {
uint32_t s_addr; /* Address in network byte order (big-endian) */
};

 


 

2. IP 주소 구조체 

IP 주소 구조체를 알아보기 전에 바이트 순서의 의미를 알아야 한다. 컴퓨터들은 시스템마다 데이터를 표현하는 바이트 순서가 다른데 크게 빅-엔디안 방식과 리틀-엔디안 방식이 존재한다. 

  • 빅-엔디안 : 상위 바이트 값이 메모리 상에 먼저 표시되는 방법
  • 리틀-엔디안 : 하위 바이트의 값이 메모리상에 먼저 표시되는 방법

위와 같은 방법으로 메모리에 쓰여지는 바이트 순서를 호스트 바이트 순서라고 한다.

 

CPU에 따라 시스템이 빅-엔디안 방식을 쓸 수도 있고, 리틀-엔디안 방식을 쓸 수도 있다. 본인의 컴퓨터 내에서는 각각의 방식 중 하나를 이용하는 것은 문제가 안되지만 다른 컴퓨터 간 데이터를 주고 받을 때, 네트워크 상에서는 다양한 컴퓨터에서 사용하는 방식을 알 수 없어 문제가 발생하게 된다.

 

따라서, 이를 해결하기 위해서 네트워크를 통해 데이터를 전송할 때는 통일된 방식을 이용해 데이터를 전송하기로 약속했는데 이 방식이 바로 네트워크 바이트 순서다.

 

네트워크에서는 바이트 순서 방식을 빅-엔디안 방식만 사용하기로 약속했으며, 리틀-엔디안 방식을 사용하는 컴퓨터는 데이터를 송/수신 전 데이터를 빅-엔디안 방식으로 변환하여야 한다.

 

※ 호스트 바이트 순서 - 리틀-엔디안 방식인 경우

  • 데이터 송신 : 리틀-엔디안 -> 빅-엔디안으로 변경
  • 데이터 수신 : 빅-엔디안 -> 리틀-엔디안으로 변경
#include <arpa/inet.h>

// 1. Returns: value in network byte order
uint32_t htonl(uint32_t hostlong);
uint16_t htons(uint16_t hostshort);

// 2. Rturns: value in host byte order
uint32_t ntohl(uint32_t netlong);
uint16_t ntohs(unit16_t netshort);

컴퓨터 내에서는 호스트 바이트 순서<-> 네트워크 바이트 순서를 변환하기 위해서 위와 같은 함수들을 사용한다.

 

① htonl : 32비트 정수를 호스트 바이트 순서 -> 네트워크 바이트 변환

② ntohl : 32비트 정수를 네트워크 바이트 순서 -> 호스트 바이트 변환

③ htons / ntohs  : 16비트 정수에 대한 변환(나머지①②와 동일)

 


3. dotted-decimal 

IP 주소는 dotted-decimal 표기 방법으로 제시되는데 이 말은 32비트를 8비트로 나누어 4개의 자리에서 10진수로 표현한다는 말이다. (쉽게 말해서  32 비트로 이루어진 주소가 IP이고, dotted-decimal 방법을 사용하여 표기한다.)

리눅스 프로그램에서는 hostname 명령어를 통해 자신의 호스트에 대한 IP 주소를 확인 할 수 있다.

hostname - i # 10.0.0.1

 

IP주소를 2진으로 변환하여 dotted-decimal 과 IP 주소가 서로 동일하게 표기되어 있는지 확인하기 위해서 프로그램 안에서는 함수를 수행함으로써 결과값을 통해 판단할 수 있다.

#include <arpa/inet.h>

int inet_pton(AF_INET, const char *src, void *dst);
//Returns: 1 if OK, 0 if src is invalid dotted decimal, −1 on error

const char *inet_ntop(AF_INET, const void *src, char *dst, socklen_t size);
//Returns: pointer to a dotted-decimal string if OK, NULL on error

n은 network를 의미하고, p는 presentaion을 의미하는데 이 함수를 통해 IPv4 주소를 확인할 수 있다.

① inet_pton : 10진수로 이루어진 IP를 2진수로 변환하여 확인 (src(10진수) -> dst(2진수)로 변환)

② inet_ntop : 2진수로 이루어진 IP를 10진수로 변환하여 확인 (dst(2진수) -> src(10진수)로 변환)


11.3.2 인터넷 도메인 이름(Internet Domain Name)

Client-Server는 서로 통신 시 IP 주소를 사용한다. IP 주소를 사용하여 통신을 하면 좋겠지만 정수로 이루어진 주소는 사람들이 사용하기에는 어려움이 존재한다. 

 

따라서, 인터넷에서는 도메인 이름을 사용하여 사용하게 되는 것이다  (실제 통신은 IP로 진행)

 

도메인 이름은 계층적 구조로 이루어져 있다. 가장 위0  .(루트 도메인) 부터 우리가 찾는 도메인 이름까지 트리 구조로 이루어져 있다.

 예를 들어서 www.amazon.com.에 접속하는 경우 컴퓨터에 설정되어 있는 root 도메인과 통신해서 com에 해당하는 IP 주소를 가져오고, 다시 com에 요청해서 amazon 의 IP 정보를 응답받는다.

최종적으로 모든 도메인과 통신을 하면 우리가 원하는 IP주소를 얻어와 해당 도메인과 통신할 수 있게되는 것이다. 

 

이렇게 도메인을 통해 IP 주소를 얻을 수 있게 도와주는 것이 DNS(Domain Name Server)이며, 전 세계 데이터 베이스에 도메인에 맵핑된 IP 주소가 저장되어 있다.

 

리눅스의  NSLOOKUP 을 통해 찾는 도메인의 IP 주소를 확인할 수 있으며 간단하게 도메인 하나에는 IP 주소 하나만 매핑되어 있지만 대부분의 경우 도메인 하나의 여러 IP 주소가 맵핑되어 있다.

//주소가 하나인 경우
linux> hostname
whaleshark.ics.cs.cmu.edu

//주소가 여러개인 경우
linux> nslookup www.twitter.com
Address: 199.16.156.6
Address: 199.16.156.70
Address: 199.16.156.102

11.3.3 인터넷 연결

인터넷 클라이언트와 서버는 연결을 통해 데이터를 주고 받으며, Point to Point 방식으로 연결한다. 양방향으로 데이터를 주고 받으며 동일한 순서로 목적지에 도달한다.

 

ㅁ 소켓

네트워크 환경에서 데이터를 송수신 할 수 있도록 연결해주는 연결부를 소켓이라고 한다. 소켓은 IP 주소와 포트로 이루어진 소켓 주소를 가지며 IP:port number로 이루어져 있다.

 

클라이언트가 연결 요청시 커널이 자동으로 포트를 할당하며,  웹 서버는 대게 80을 DNS 는 53번 포트를 가지고 있다.

많이 사용해서 잘 알려진 포트는 /etc/services 파일에 보관되어 있으며, 클라이언트와 서버 간 통신 시 (Client IP : Server Port, Server IP : Server Port)의 튜플 쌍으로 식별하게 된다.

 

 

예를 들어  아래 그림과 같이 Client에서 서버에게 웹 서버 요청을 한다면 아래와 같은 방법으로 통신이 이루어지게 된다.

 

  1. Client가 서버에 웹 서비스 요청을 한다. (Client IP : 커널이 지정한 무작위 포트, Server IP : 80)
  2. Server은 요청을 확인하고 처리하여 다시 Client로 응답하게 된다.

'CS' 카테고리의 다른 글

CSAPP:11.1~2  (0) 2023.04.13
[CS] 프로세스와 스레드  (0) 2023.03.19
[CS] 동시성과 병렬성  (0) 2023.03.19
    'CS' 카테고리의 다른 글
    • CSAPP:11.1~2
    • [CS] 프로세스와 스레드
    • [CS] 동시성과 병렬성
    jissue
    jissue

    티스토리툴바