가변인자란?

int main(int abc, ...) { }

위 코드의 main 함수의 인자중,  ...  가변 인자 혹은 가변 파라미터

매개변수로 아무것도 넘겨주지 않거나 여러 개를 넘겨줄 수도 있음

함수가 고정된 수의 필수 인수에 가변 수의 선택적 인수가 붙은 형식을 사용할때 적용

 

va_list, va_start, va_end, va_copy, va_arg 함수

1) va_list

가변 인자의 시작 주소를 의미하는 포인터

2) va_start

// va_start 함수 원형
void va_start(va_list ap, variable_name);

va_list로 만들어진 포인터에게 가변인자 중 첫 번째 선택적 인수(variable_name)의 주소를 가르쳐주는중요한 매크로이다.

va_arg(), va_copy(), va_end()에 대한 후속 호출에 대해 ap 포인터를 초기화한다.

  • ap: va_list 로 만든 포인터가 담긴다.
  • variable_name: 인수 목록의 첫 번째 인자 바로 앞에 오는 필수 매개 변수의 이름. 즉, 마지막 고정된 필수 인수가 담긴다.

3) va_copy

void va_copy(va_list dest, va_list src);

va_start()를 dest에 적용한 후 src의 현재 상태에 도달하는 데 이전에 사용된 것과 동일한 순서로 va_arg()를 사용한 경우와 같이 dest를 src의 사본으로 초기화한다. va_copy() 또는 va_start()는 동일한 dest에 대한 va_end()의 중간 호출 없이 dest를 다시 초기화하도록 호출해야 한다.

4) va_arg

var_type va_arg(va_list ap, var_type);

ap로 지정된 위치에서 지정된 var_type 값을 검색하고 리스트에서 다음 인수를 가리키도록 ap 를 증가 시켜 다음 인수가 시작 되는 위치를 결정한다. 즉, 특정 가변인자를 가리키고 있는 va_list의 포인터를 다음 가변인자로 이동시켜 주는 매크로이다. 

  • ap: va_list로 만든 포인터가 담긴다.
  • var_type: int나 long, double과 같은 타입 이름이 담긴다.

var_type을 설정할 때 char, short 의 경우에는 int로 대신 쓰고, flaot의 경우에는 double로 대신 쓴 이후 형 변환을 해주어야 한다.
ex) char ch = (char) va_arg(ap, int);

va_end

void va_end(va_list arg_ptr);

모든 인수가 검색 된 후 va_end 는 포인터를 NULL로 다시 설정 한다. 즉, 사용한 가변인자 변수를 끝낼때 사용.

4. 반환값

va_arg() 함수는 현재 인수를 리턴한다. va_copy(), va_end(), va_start() 함수는 값을 리턴하지 않는다.

1. DHCP

우리가 유동IP 를 사용할때 이 IP는 누가 결정할까? --> 바로 DHCP 가 결정하게 된다,

이 DHCP 는 임의의 임대기간을 설정하여 IP를 부여해주게 된다.

 

IP 를 사용하는동안 임대기간이 종료되게 되면, DHCP 서버에 임대기간 갱신을 요청하고, 

DHCP 는 이에 따라 임대기간을 갱신시켜준다.

 

1 - 1. DHCP 임대 절차

 

1) DHCP Discover

  • 패킷 방향 : 클라이언트 -> DHCP 서버
  • 브로드캐스트 패킷 : Destination MAC = FF:FF:FF:FF:FF:FF
  • 의미 : 클라이언트가 DHCP 서버를 찾기 위한 메시지. 그래서 LAN상에(동일 subent상에) 브로드캐스팅을 하여 "거기 혹시 DHCP 서버 있으면 내게 응답 좀 해 주세요"라고 단말이 메세지를 보낸다. 이 Discover 패킷에는 IP 주소가 필요한 호스트의 MAC 주소가 담겨져 있어서 DHCP 서버가 응답할 때 패킷을 수신할 수 있게 된다.
  • 주요 파라미터(패킷 내용) :
    • Client MAC : 클라이언트의 MAC 주소

2) DHCP Offer

  • 패킷 방향 : DHCP 서버 -> 클라이언트
  • 브로드캐스트 메시지 : Destination MAC = FF:FF:FF:FF:FF:FF 혹은 유니캐스트. 
  • 이는 클라이언트가 보낸 DHCP Discover 메시지 내의 Broadcast Flag의 값에 따라 달라지는데, 이 Flag=1이면 DHCP 서버는 DHCP Offer 메시지를 Broadcast로, Flag=0이면 Unicast로 보내게 된다.
  • 의미: DHCP 서버가 "저 여기 있어요~"라고 응답하는 메시지. 단순히 DHCP 서버의 존재만을 알리지 않고, 클라이언트에 할당할 IP 주소 정보를 포함한 다양한 "네트워크 정보"를 함께 실어서 클라이언트에 전달한다.
  • 주요 파라미터(패킷 내용) :
    • Client MAC: 단말의 MAC 주소
    • Your IP: 단말에 할당(임대)할 IP 주소
    • Subnet Mask (Option 1)
    • Router (Option 3): 단말의 Default Gateway IP 주소
    • DNS (Option 6): DNS 서버 IP 주소
    • IP Lease Time (Option 51): 단말이 IP 주소(Your IP)를 사용(임대)할 수 있는 기간(시간)
    • DHCP Server Identifier (Option 54): 본 메시지(DHCP Offer)를 보낸 DHCP 서버의 주소. 2개 이상의 DHCP 서버가 DHCP Offer를 보낼 수 있으므로 각 DHCP 서버는 자신의 IP 주소를 본 필드에 넣어서 단말에 보냄.

3) DHCP Request

  • 패킷 방향: 클라이언트 -> DHCP 서버
  • 브로드캐스트 메시지 : Destination MAC = FF:FF:FF:FF:FF:FF
  • 의미: 단말은 DHCP 서버(들)의 존재를 알았고, DHCP 서버가 단말에 제공할 네트워크 정보(IP 주소, subnet mask, default gateway등)를 알았다. 이제 단말은 DHCP Request 메시지를 통해 하나의 DHCP 서버를 선택하고 해당 서버에게 "단말이 사용할 네트워크 정보"를 요청한다.
  • 주요 파라미터(패킷 내용) :
    • Client MAC: 단말의 MAC 주소
    • Requested IP Address (Option 50): 난 이 IP 주소를 사용하겠다. (DHCP Offer의 Your IP 주소가 여기에 들어감)
    • DHCP Server Identifier (Option 54): 2대 이상의 DHCP 서버가 DHCP Offer를 보낸 경우, 단말은 이 중에 마음에 드는 DHCP 서버 하나를 고르게 되고, 그 서버의 IP 주소가 여기에 들어감. 즉, DHCP Server Identifier에 명시된 DHCP 서버에게 "DHCP Request" 메시지를 보내어 단말 IP 주소를 포함한 네트워크 정보를 얻는 것.

4) DHCP Ack

  • 패킷 방향: DHCP 서버 -> 클라이언트
  • 브로드캐스트 메시지 : Destination MAC = FF:FF:FF:FF:FF:FF 혹은 유니캐스트.
  • 이는 단말이 보낸 DHCP Request 메시지 내의 Broadcast Flag=1이면 DHCP 서버는 DHCP Ack 메시지를 Broadcast로, Flag=0이면 Unicast로 보내게 된다.
  • 의미: DHCP 절차의 마지막 메시지로, DHCP 서버가 단말에게 "네트워크 정보"를 전달해 주는 메시지. 앞서 설명한 DHCP Offer의 '네트워크 정보"와 동일한 파라미터가 포함된다.
  • 주요 파라미터(패킷 내용) : DHCP Request 패킷의 파라미터와 동일

 

2. DNS 

우리가 네이버 라는 사이트에 접속하기위해 일반적으로

www.naver.com  을 입력해서 접속하게된다,

 

그럼 naver 의 IP 주소가 www.naver.com   이 되는걸까? 

아니다, 원래의 IP 주소는 따로 있고, 이에 접속하기위해 우리는 DNS 라는것을 이용하는 것이다.

 

DNS 가 IP 주소로 찾아가는 과정은 다음과 같다.

DNS 에 관한 내용은 본 블로그 카테고리의

KITRI - 리눅스 에 보면 자세히 나와있다.

 

출처

https://velog.io/@hidaehyunlee/더-편리한-인터넷을-위해-DHCP-DNS-프로토콜#11-dhcp의-구성

1. OSI 계층 

https://ai-hong.tistory.com/37?category=845057 

 

02. OSI 7Layer & TCP/IP 4Layer

OSI 7Layer 의 각 계층적 구조는 다음과 같다. Application 계층부터 Transport 계층까지를 Network Edge 라고 하며, Network 계층부터 Physcial 계층까지를 Nerwork Core 라고 한다. 1) Network Edge - 인터넷의..

ai-hong.tistory.com

예전에 정리해 놓은 개념이 있어 대체한다.

 

2. TCP

TCP는 OSI 7계층중 전송 계층에서 사용하는 프로토콜이다.

3 way handshake 를 통해 연결을 하며

4 way handshake 를 통해 연결을 종료한다.

--> 서로의 확인과정이 있기때문에 당연 1:1 통신만 가능하며, 신뢰성 연결을 할수있다 하지만 UDP 에 비해 확인과정을 거치기 때문에

연결 속도 전송 속도가 느릴수밖에 없다.

 

2 - 1. 연결과정

1. 연결을 위해 SYN 플래그 전송

2. 연결 확인을 위해 SYN + ACK 전송

3. ACK를 전송하여 연결 확인

 

2 - 2. 연결 종료

1. 사용 다했으니 FIN + ACK 전송

2. 서버는 클라이언트에게 확인 완료를 위해 ACK 플래그 전송

3. 서버는 클라이언트에게 아무 반응이 없다면 FIN + ACK 전송

4. 클라이언트는 서버에세 종료 확인을 위해 ACK 플래그 전송후 연결 종료

 

2 - 3. TCP 의 헤더

- Source Port: 출발지의 포트, 즉 데이터를 보내는 컴퓨터의 포트 정보입니다. 컴퓨터가 갖을 수 있는 포트는 65536개이므로 사이즈가 2바이트인것을 확인하세요.

 

- Destination Port: 반대로 목적지의 포트입니다. 

 

- Sequence Number : 송신 데이터의 일련 번호를 담고 있습니다. 

 

- Acknowledgement Number : 그전의 데이터를 잘 받았다는 표시로 상대방이 다음에 전송할 일련번호를 담고 있습니다. 줄여서 ACK라고 하겠습니다.

 

- HLEN(Header Length) : 헤더의 정보를 담고 있습니다. 4 bits의 워드 단위입니다. 헤더의 길이는 최소 20바이트 ~ 60바이트까지입니다.

 

- Reserved : 예약된 비트입니다. 아직 사용하지 않습니다. 나중을 위해서 남겨두는 비트인 셈이지요.

 

- Control Flags 

FLAG 설명
URG
(Urgent Pointer)
Urgent Pointer의 필드가 유요하다는 의미의 FLAG
ACK
(Acknowledgement)
수신 확인 응답 FLAG
PSH
(Request for push)
송수신 버퍼의 있는 데이터 즉시 처리 요청 FLAG
RST
(Reset the connection)
연결을 강제 중단합니다. TCP가 유지되고 있을때 이 FLAG를 사용하면 그 즉시 연결을 끊어 버립니다. 해커들이 Hijacking을 위해 피해자의 연결을 끊어버릴때 사용합니다. 보통의 정상적인 종료는 아래의 FIN FLAG를 설정합니다.
SYN
(Synchronize sequence number)
연결 설정 FLAG
FIN
(Terminate the connection)
정상 종료의 연결 종료 FLAG

 

- Window Size :  수신자에서 송신자로 보내는 수신자의 윈도우 사이즈입니다. 즉, 수신 버퍼의 여유공간 크기를 의미하게 되지요. 송신자는 이 윈도우 사이즈 범위 내에서 수신측의 수신 확인(ACK)을 확인하지 않고 연속적으로 데이터를 보낼 수 있습니다.

 

- Checksum : 오류를 검사하기 위한 필드입니다. 전체 데이터가 오류가 나 변형되었는지 확인합니다. 

 

- Urgent Pointer : 긴급 데이터의 위치값을 담고 있습니다. 

 

3. UDP

- 비연결성 프로토콜 로서 송신자는 수신자에게 데이터 전송만 할뿐 수신자는 확인과정을 거치지 않는다

- 이러한 특징 때문에 전송 속도가 TCP 보다 훨씬 빠른것을 알수있다.

 

3 - 1. UDP 헤더

- Source Port / Destination Port

 Source Port는 메시지를 보내는 측에서 통신을 위해 사용하는 Port 번호

 Destination Port는 목적지, 즉 메시지를 받는 측의 통신 Port 번호

 

- Total Length

 헤더와 데이터를 합한 사용자 데이터그램의 전체 길이를 정의합니다. UDP 데이터그램의 헤더인 8바이트부터 65507바이트 사이의 값이 됩니다.

 

- Checksum

→ 헤더와 데이터를 모두 포함한 사용자 데이터그램 전체에 대해 오류를 탐지하기 위해 사용됩니다.

 

 

4. TCP 와 UDP 차이점

 

 

출처

https://joycecoder.tistory.com/20

https://velog.io/@hidaehyunlee/TCP-와-UDP-의-차이

https://hwan-shell.tistory.com/271

https://swalloow.tistory.com/77

1. 공인 IP (Public IP Address)

인터넷 사용자의 각각의 네트워크를 식별하기 위해 ISP(인터넷 서비스 공급자)가 제공하는 IP 주소

외부에 공개되어 있는 IP 주소이다.

  • 공인 IP는 전세계에서 유일한 IP 주소를 갖는다.
  • 공인 IP 주소가 외부에 공개되어 있기에 인터넷에 연결된 다른 PC로부터의 접근이 가능하다. 따라서 공인 IP 주소를 사용하는 경우에는 방화벽 등의 보안 프로그램을 설치할 필요가 있다.
  • 우리의 공인 IP를 확인하려면 간단하게 www.naver.com 에 접속하여 " 내 IP 주소 확인" 을 치면 공인 IP 주소를 알수있다.

2. 사설 IP (Private IP Address)

만일 모든 IP 주소가 공인IP 로 되어있다면 어떨까?, 요즘은 각 사람마다 통신할수있는 기기가 1대가 아니다, IP 주소는 2^32 만큼의 갯수 즉, 43억개 가량이 되지만, 한 사람이 아이패드, 노트북, 핸드폰, 데스크톱 총 네개를 가지고있다고 생각해보자

그럼 인당 4개의 IP주소가 할당되어야 하고, 집에서도 인터넷을 사용하기위해 여러개의 IP주소를 한사람이 사용해야한다, 

이렇게 되면 IP 주소가 부족하게되어 결국 모든사람이 인터넷을 사용할수 없게 될것이다 이를 위해 나온것이 사설IP이다, 하나의 IP 주소를 서브넷팅을 통하여 사설 IP로 할당한다,

이 사설IP는 외부에 공개되어 있는것이 아니기 때문에 내부 망 내에서는 자유롭게 통신을 할수 있게된다.

2.1. 사설IP 주소대역

사설IP 주소는 다음 3가지 주소대역으로 고정된다.

  • Class A : 10.0.0.0 ~ 10.255.255.255
  • Class B : 172.16.0.0 ~ 172.31.255.255
  • Class C : 192.168.0.0 ~ 192.168.255.255

그렇다면 사설 IP 만 가지고 외부와 통신을 할수 있을까? 

--> 물론 불가능 하다 사설IP 는 하나의 공인IP 를 서브넷팅을 통해 할당된 주소이다, 따라서 공인IP 를 가지고있는 라우터(공유기) 에서

사설 IP를 각각 뿌려주게 된다. 

그림을 보면 쉽게 이해가 될것이다!

즉, 사설망 끼리의 통신은 가능하고, 사설망에서 공인IP를 거치지 않고 외부의 IP 로는 접근이 불가능 하게 된다!

3. 고정 IP와 유동 IP

고정 IP : 컴퓨터에 고정적으로 부여된 IP로 한번 부여되면 IP를 반납하기 전까지는 다른 장비에 부여할 수 없는 IP 주소
유동 IP : 장비에 고정적으로 IP를 부여하지 않고 컴퓨터를 사용할 때 남아 있는 IP 중에서 돌아가면서 부여하는 IP

인터넷 상에서 서버를 운영하고자 할 때는 공인 IP를 고정 IP로 부여해야 한다는 것이 중요

일반적인 집에서 사용하는 인터넷 서비스 업체는 각 가정마다 공인 IP를 유동 IP로 부여하고, 공유기 내부에서는 사설 IP를 유동 IP로 부여하는 것이 일반적

 

출처 : https://velog.io/@hidaehyunlee/공인Public-사설Private-IP의-차이점

1. 넷마스크 ( NetMask )

※ 네트워크 주소 범위 부분을 2진수의 1로 치환한것

--> 네트워크주소를 구하기위해 IP 주소와 넷마스크를 AND 연산 ( 논리곱 ) 을 통해 구할수 있다!

 

위 예시를 보자 

IP 주소는 203.0.113.43 이다! ~> 해당 주소는 제일 처음이 203 인걸로 보아 C 클래스임을 알수있고,

C 클래스 의 네트워크 주소 범위는 24비트 이다 ( 110 으로 시작하고, 110을 포함한 24비트 까지가 네트워크 주소범위 )

따라서 넷마스크는 1111 1111 . 1111 1111 . 1111 1111 . 0000 0000 이 되고, 해당 IP 주소의 네트워크 주소를 구하기 위해

 

1100 1011 0000 0000 0111 0001 0010 1011

1111 1111 1111 1111 1111 1111 0000 0000

 

두 비트를 AND 연산하게되면

1100 1011 0000 0000 0111 0001 0000 0000     <--  네트워크 주소가 된다

이를 10진수 IP로 표기하면

203.0.113.0 이 되는데  이것이 네트워크 주소가 된다!!

 

2. 서브넷마스크 (subnet mask)

서브넷 마스크는 넷마스크와 유사하다.

각 클래스별 기본 서브넷 마스크는

A class - 255.0.0.0

B class - 255.255.0.0

C class - 255.255.255.0

이 된다.

 

즉 쉽게말해 네트워크 주소 범위를 모두 1비트로 사용하는것은 기본 서브넷 마스크 라고 하는데

이 서브넷 마스크는 클래스를 효율적으로 나누기 위해 사용한다고 한다.

--> 알기 쉽게 말하자면 IP 주소와 기본 서브넷 마스크를 AND 연산 하게되면, 해당 대역의 네트워크 주소를 구할수 있다,

이는 넷마스크와 비슷한데,

IP 주소 뒤에 /24 와 같이 표기하는것은 서브넷 마스크를 24비트 사용한다 라는 소리이다.

즉, 

192.168.0.12/24 --> 24비트를 서브넷마스크 ( 네트워크 주소 대역 ) 으로 사용한다는 소리이고 이와 같은 대역에서 통신하기위해 마지막 8비트만 달라야 한다.

 

 

3. 서브넷팅 ( Subnetting )

3 - 1. 네트워크 주소 구하기

: IP 주소에 해당 대역의 기본 서브넷마스크와 AND 연산하여 구할수 있다.

 

3 - 2. 브로드캐스트 주소 구하기

: 기본 서브넷마스크의 0부분을 모두 1로 치환하면 그 주소가 바로 브로드 캐스트 주소로 사용되게 된다.

-> 호스트 주소 부분을 1로 바꾼것과 같음

 

3 - 3. 서브넷팅 이란?

: 하나의 네트워크 주소 대역을 여러개의 네트워크 주소로 나누는 과정

--> 많은 IP 주소의 낭비를 방지하고, 더욱 효율적인 IP 주소 분배를 하기 위함

 

서브넷팅 계산하기!

194.139.10.7/25 라는 IP를 서브넷팅 해보자. /25는 서브넷 마스크가 25bit라는 의미로 255.255.255.128이 된다. 그럼 호스트에 IP를 할당할 수 있는 범위가 0~127, 128~255가 되며, 네트워크 영역은 194.139.10.0, 194.139.10.128가 되어 2개로 나누어지게 된다. 이 때, 네트워크 영역이 2개로 나누어진다는 의미는, 각 범위의 가장 첫 번째 IP를 네트워크 주소로 할당한다는 의미다. 결국 194.139.10.7/25가 속한 네트워크는 194.139.10.0/25 대역에 속하게 되며, 다른 서브넷팅 된 네트워크인 194.139.10.128과는 라우터를 통하여서만 통신할 수 있는 것이다.

 

 

출처 : https://velog.io/@hidaehyunlee/공인Public-사설Private-IP의-차이점

+ Recent posts