Notice
Recent Posts
Recent Comments
Link
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
Archives
Today
Total
관리 메뉴

브래의 슬기로운 코딩 생활

네트워크 보안 7주차 정리 (UNIX 기본 함수) 본문

2-2/네트워크 보안

네트워크 보안 7주차 정리 (UNIX 기본 함수)

김브래 2023. 10. 17. 19:06

UNIX 기본 프로그래밍
- 시간처리 함수 -




초 단위 시간 정보 추출


초단위 현재 시간 추출

함수 : time()
• 현재 시각을 1970/01/01 00:00:00 +0000(UTC)을 기준으로 초 단위 값 추출
• UNIX 타임으로 통용
• time_t는 4바이트(현재)의 정수형 타입(int, int32_t)의 매크로
• 2038/01/19 03:14:07에 오버플로(Overflow) 발생

 

인자:
• *tloc : 시각정보가 저장될 변수(NULL이면 저장 안함)

 

결과 값:
• 성공 : 현재 시간(초단위)
• 실패 : -1


시간 표시 형식 변경


표시 형식 변경

함수 : localtime()
• 주어진 초 단위 시각정보를 구조체 tm 타입 정보로 변환
• 정적 영역(static memory)을 사용하여 해당 공간의 주소를 반환
– re-entrance 문제 주의
• 매뉴얼에서는 localtime_r() 함수 사용을 권고

 

인자:
• *timep : 초단위 시각정보

 

결과 값:
• 성공 : struct tm 타입의 주소 포인터
• 실패 : NULL

함수 : localtime_r()
• localtime()함수와 동일한 동작
• 단, 두번째 인자에 변환 결과를 기록

 

인자:
• *timep : 초단위 시각정보
• *result : 변환 결과가 반영될 포인터 변수

 

결과 값:
• 성공 : struct tm 타입의 주소 포인터
• 실패 : NULL


밀리초 단위 시간 정보 추출


밀리초 단위 현재 시간 추출

함수 : ftime()
• 현재 시각을 밀리초 단위의 값(2bytes)으로 추출
• 초단위의 값은 UNIX 타임기준

 

인자:
• *tp : 현재 시간이 저장될 변수

 

결과 값:
• 성공 : 현재 시간(초단위)
• 실패 : -1


마이크로초 단위 시간 정보 추출


마이크로초 단위 현재 시간 추출

함수 : gettimeofday()
• 현재 시각을 마이크로초 단위의 값으로 추출
• 초 단위의 값은 UNIX 타임기준

 

인자:
• *tv : 현재 시간이 저장될 변수
• *tz : 저장될 타임존

 

결과 값:
• 성공 : 0
• 실패 : -1


초 단위 시간 변환


초 단위 시간 변환

함수 : mktime()
• struct tm 형태의 시각정보를 변환
• 초 단위의 UNIX 시간 정보로 변환

 

인자:
• *tm : 입력할 struct tm 형태의 시각

 

결과 값:
• 성공 : 초 단위 시각
• 실패 : -1


시스템 시간 설정


시스템 시간 설정

함수 : stime()
• 시스템의 시간을 설정
• 시스템 관리자 계정으로 실행해야 함

 

인자:
• *t : 설정한 시간(UNIX 타임, 초단위)

 

결과 값:
• 성공 : 0
• 실패 : -1



네트워크용 기본 API
- 소켓과 바이트 배열 처리 -




파일 기술자


파일 기술자

File Descriptor라고 하고 POSIX(Potable Operating System Interface)에서 정의

 

파일 접근을 위해 운영체제가 프로세스에게 주어지는 ID
• 0, 1, 2는 표준입출력을 위해 미리 정해짐

 

파일, 소켓(socket), IPC(Inter-Process Communication) 외 기타 자원의 접근 때마다 운영체제는 파일기술자를 할당해 줌

POSIX에서는 소켓 또한 파일 기술자로 제공

 

소켓은 종류에 따라 IPv4 및 IPv6 기반의 네트워크 형태의 소켓 외, 데이터 링크 및 로컬에서 사용하는 여타 다양한
소켓들이 있음

 

소켓의 생성은 파일기술자로 할당되며, 이 파일 기술자를 통해 데이터의 읽기/쓰기 또는 송신/수신이 처리됨


네트워크 프로그래밍과 소켓


네트워크 프로그래밍

서로 다른 호스트에 있는 프로세스 간 상호 연동된 작업이나 자원 공유를 위한 기법

 

네트워크로 연결되어 있는 두 프로세스간의 데이터 송수신

 

네트워크를 활용한 IPC

 

네트워크를 위해 소켓(Socket)을 이용
• 소켓: OS가 제공하는 원격 통신을 위한 매개체

소켓(Socket)

운영체제가 제공하는 응용 프로토콜 인터페이스

 

네트워크를 통해 프로세스간 통신이 가능토록 수단을 제공

 

네트워크 기반 프로그래밍을 위한 필수 요소*
• 프로토콜(Protocol)
• 소스 IP주소(Source IP Address)
• 소스 포트 번호(Source Port Address)
• 목적지 IP주소(Destination IP Address)
• 목적지 포트 번호(Destination Port Address)


포트 번호


포트

전송 계층의 기능을 수행하는 TCP와 UDP 기반의 각 종단 점(EP: End-Point)을 구분 짓기 위한 식별자(ID)

 

운영체제는 실행되고 있는 프로세스(process)를 구분 짓기 위한 값으로 할당


데이터 타입


POSIX 데이터 타입*

유닉스 계열의 운영체제를 위한 약속

 

표준화한 데이터 타입(확장성을 고려)


바이트 배열 처리 함수


바이트 배열 처리

바이트 기반의 자료형에 대한 일괄 초기화, 복사, 비교 등을 하는 API들

 

BSD 타입
• strings.h에 정의됨
• bzero*, bcopy*, bcmp* 등이 대표적

ANSI 타입
• string.h에 정의됨
• memset, memcpy, memcmp 등이 대표적


네트워크 주소 구조체


주소 구조체: 범용

소켓 주소를 위한 구조체(sockaddr)를 정의
• 헤더: sys/socket.h


범용소켓기반의 API에서 사용

 

Inet용인 sockaddr_in 구조체와 크기가 같음
• 16바이트로 동일
• 주소 복사방식으로 사용
• memcpy, bcopy를 통해 이들 간 쉽게 형 변환이 가능

주소 구조체: IPv4

- 인터넷(inet)용 소켓을 위한 구조체(sockaddr_in)를 정의(헤더: netinet/in.h)
- IPv4의 주소체계를 나타내는 구조체
- 총 16바이트로 구성
- 모든 멤버 변수의 내용물은 네트워크 바이트 순서(Byte Order)로 저장되어야 함

속성

멤버 : sin_family
• 주소 체계에 대한 정보(16비트)

 

• 값:
– AF_INET : IPv4 기반 인터넷(값: 2)
– AF_INET6 : IP6 기반 인터넷(값: 10)
– AF_LOCAL : 로컬 호스트내 IPC를 위한 UNIX 프로토콜

멤버 : sin_port
• TCP & UDP의 포트번호(16비트) 영역에 해당

 

멤버 : sin_addr
• IP 주소(32비트)를 위한 구조체 멤버

 

멤버 : sin_zero[8]
• 다른 주소 구조체의 크기를 맞추기 위한 패딩(padding)의 목적으로 두는 공간

주소 구조체 비교

sockaddr vs. sockaddr_in



네트워크용 기본 API
- 바이트 순서 및 주소체계 변환 -




표준 바이트 순서


엔디언(Endian)

다수의 바이트를 구성하는 2진수의 표시 체계에 대한 바이트들의 순서를 나타내는 방식

 

종류:

 

• 리틀 엔디언(Little-Endian)*
– 낮은 주소 위치에 LSB부터 저장
– Intel CPU 계열 데이터 처리 방식

 

• 빅 엔디언(Big-Endian)*
– 낮은 주소 위치에 MSB부터 저장
– Motorola/Sun Sparc CPU 계열 데이터 처리 방식
– 네트워크용 표준 저장 방식

주요 용어:
MSB(Most Significant Bit, 최대/최상위 유효 비트)* : 
– 2진법으로 표시된 수에 대하여 최상위의 숫자를 의미(가장 큰 단위)
– 예: 1101b -> 1101b

 

LSB(Least Significant Bit, 최소/최하위 유효 비트)* : 
– 2진법으로 표시된 수에 대하여 최하위의 숫자를 의미(가장 작은 단위)
– 예: 1101b -> 1101b

 

엔디언 값 예

값: 0x12345678 (4바이트 정수)

데이터 표현 방식에 따른 문제점

문제 해결안

Big-Endian 방식을 적용하기로 약속
네트워크 방식 -> Big-Endian