[네트워크 프로그래밍] 주소체계와 데이터 정렬 ch.3

2023. 3. 24. 17:02_Study/Network

728x90

#0324 #네트워크프로그래밍

해당 자료는 강의 학습 자료입니다.

🐇¸.•*¨*•¸.•*¨*•¸.•*¨*•¸.•*¨*•


 

Chapter 3. 주소체계와 데이터 정렬

 

인터넷 주소

인터넷상에서 컴퓨터를 구분하는 목적으로 사용되는 주소

4 바이트 주소체계 : IPv4

16 바이트 주소체계 : IPv6

 

네트워크 주소와 호스트 주소로 나뉜다.

 

네트워크 주소를 이용해서 네트워크를 찾고, 호스트 주소를 이용해서 해당 네트워크에서 호스트를 검색한다.

subnet mask : 같은 네트워크인지 구분 가능함

 

 

IP주소 : 컴퓨터를 구분하는 목적

 

첫번째 바이트 정보만 참조해도 구분이 가능하게 만들었으며 C언어 개발시 비트연산이 필요하다.

2진수 표현을 보면 어떻게 분리했는지 확인 가능하다. 0, 10, 110, 1110, 1111

내가 사용하는 주소가 어디에 해당하는지 파악

외울필요 x

local loopback : 127.0.0.0

 

 

소켓의 구분에 활용되는 Port 번호

 

Port 번호 

IP주소 : 컴퓨터를 구분하는 용도로 사용

Port번호 : 소켓을 구분하는 용도로 사용

 

하나의 프로그램 내에서는 둘 이상의 소켓이 존재할 수 있으므로,

둘 이상의 Port가 하나의 프로그램에 의해 할당될 수 있음

 

Port번호는 16비트로 표현, 따라서 그 값은 0~65535 이하

0~1023은 잘 알려진 PORT라 이미 용도가 결정되어 있다.

 

 

 

Port Scan

nmap(Network Mapper) 포트 스캔, 호스트 탐지

Linux 설치 :

sudo apt install nmap

 

Mac 설치 :

brew install nmap

 

 

 

 

IPv4 기반의 주소표현을 위한 구조체

 

sockaddr_in 구조체 변수를 이용하고 있다.

 

sorckaddr_in 구조체 멤버는

sin_family : 주소체계 저장

sin_port : 16비트 Port 번호 저장, 네트워크 바이트 순서로 저장 

sin_zero[8] : 특별한 의미를 지니지 않는 멤버, sockaddr 구조체와 크기를 맞추기 위해 사용, 반드시 0으로 초기화 할 것

 

 

 

 

구조체 sockaddr_in 활용의 예

sockaddr_in: bind() 함수의 인자로 전달

- bind() 함수의 매개변수 타입이 sockaddr 이므로 형변환이 필요

 

구조체 sockaddr

- 다양한 주소 체계의 주소 정보를 저장할 수 있도록 정의되어 있음

- Ipv4의 주소 정보를 저장하기 불편

-- 이에 동일한 바이트 크기를 가지는 구조체 sockaddr_in을 정의

-- 구조체 sockaddr_in을 사용하여 쉽게 IPv4의 주소 정보를 저장함.

 

 

 

 

바이트 순서(Order)와 네트워크 바이트 순서

 

빅 엔디안(Big Endian)

 - 상위 바이트 값을 작은 번지수에 저장

 - 상위 바이트의 값을 앞에 위치

리틀 엔디안(Little Endian)

 - 하위 바이트의 값이 작은 번지수에 저장

 - 상위 바이트 값을 큰 번지수에 저장

 - Intel, Apple silicon

 

네트워크 바이트 순서 : 통일된 데이토 송수신 기준을 의미

- 빅 엔디언 사용

데이터 송수신 과정 : 바이트 단위로 데이터를 전송, 바이트 변환 과정이 필요 없음.

 

 

바이트 순서의 변환 (Endian Conversions)

- 바이트 순서 변환 함수

 

 

htonl() 소스코드

Big Endian System 사용자인 경우, htonl()을 호출해야 할까?

 

 

 

바이트 변환의 예

 

 

inet_addr() 함수

inet_addr(const char *string)

- 211.214.107.99 와 같이 10진수(dotted decimal) 형태로 표시된 문자열 네트워크 바이트 순서의 32 비트 정수형으로 반환