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의-차이점

※ 파일디스크립터 ( fd - File Descriptor ) 란?

- 컴퓨터가 파일들을 관리하기 위해 지정해 놓은 숫자

- 일반적으로 [ 0, 1, 2 ] 는 이미 지정되어 있다!

0 : 표준 입력

1 : 표준 출력

2 : 표준 에러

3... : 사용자가 사용하는 파일을 최소숫자로 부여!

 

⚠️ 만약 잘못된 파일에 접근할경우 -1 을 반환한다! ⚠️

 

간단한 예로 fd 값을 살펴보자구요!

살펴보기 전에 먼저 open 함수를 간단히 알아봅시다!

* OPEN 함수란?
- 이미 생성되어 있는 파일 또는 새로운 파일을 생성하는 System call 함수!
open 함수를 사용하기 위해서는 flag 를 반드시 사용해야 합니다!
O_RDONLY : 파일을 읽기 전용으로 open합니다.
O_WRONLY : 파일을 쓰기 전용으로 open합니다.
O_RDWR : 파일을 읽고 쓰기를 모두 할 수 있도록 open합니다.

출처: https://www.it-note.kr/19 [IT 개발자 Note]

fd 값을 사용하기 위해 우리는 O_RDONLY 플래그만 사용해서 fd값을 살펴 보도록 해요!

먼저 우리는 임의의 파일 하나는 생성해 주자구요! 

touch 명령어를 통해 비어있는 파일 "hello" 를 만들어 줍니다!

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(void)
{
    int fd;
        
    fd = open("hello", O_RDONLY);
    printf("hello 파일의 fd값 = %d\n", fd);
}

그리고 간단한 코드 작성을 통하여 fd 값을 확인해 보자구요!

위에서 설명한대로 0 ~ 2 까지는 표준입력, 표준출력, 표준에러 로 이미 선점해 있기 때문에

파일 디스크립터 값은 3이 할당된걸 알수있죠!

 

그렇다면 올바르지 않은 파일이 들어왔을때 fd 값을 확인해 볼까요?

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(void)
{
    int fd;

    fd = open("hello_error", O_RDONLY);
    printf("hello_error 파일의 fd값 = %d\n", fd);
}

우리는 "hello" 라는 파일은 만들었지만 "hello_error" 라는 파일은 가지고 있지 않습니다!

그렇다면 해당 파일을 읽으려고 할때, fd 값은 어떻게 될까요?

위에 설명한대로 정말 -1을 반환하게 되네요!

 

그럼 여러개의 파일을 읽을때, fd 값은 어떻게 할당 될까요?

hello 하면 자연스레 따라오는.. world 라는 파일을 새로 만들어 줬습니다!

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

int main(void)
{
    int fd;
    int fd_2

    fd = open("hello", O_RDONLY);
    printf("hello 파일의 fd값 = %d\n", fd);
    
    fd_2 = open("world", O_RDONLY);
    printf("world 파일의 fd값 = %d\n", fd_2);
}

해당 값의 결과를 확인해보면

정말 순서대로 3 과 4 가 할당되네요!!

 

* 파일을 사용하고 난후 더이상 파일을 사용하지 않는데, 이런경우 fd 에서 제거할순 없나요?

--> 우리가 메모리 동적할당을 하기위해 malloc 함수를 사용하고 난후, free 함수를 통하여 해당 메모리를 해제해 주잖아요!?

open 함수도 이와 비슷한 함수가 존재합니다!

바로 close 함수 인데요!

 

close 함수는 " 나는 더이상 이파일을 사용하지 않고 접근도 하지 않을거야 그러니까 파일 디스크립터에서 제거해줘 "

정도로 생각하시면 될것 같아요!!

 

간단한 코드로 살펴봐요!

 

#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>

int main(void)
{
    int fd;
    int fd_2;

    fd = open("hello", O_RDONLY);
    printf("hello 파일의 fd값 = %d\n", fd);

	close(fd);
	printf("hello 파일 close\n");

    fd_2 = open("world", O_RDONLY);
    printf("world 파일의 fd값 = %d\n", fd_2);
}

자 이렇게 하고 난후 각각의 fd 값을 확인해보면!

hello 파일의 디스크립터가 3으로 선점되었지만

close 함수를 통하여 디스크립터에서 제거하고 world 파일을 디스크립터에 할당할때 

제일 적은숫자, 그러니까 3으로 할당됨을 볼수 있네요!

책을 보고있다

꼼꼼한 재은씨 책은 닉값을 한다!

 

엄청 꼼꼼히 설명되어 있다

 

이전에 들었던 강의에서

왜? 이게 왜?

하는 의문이 이책을 보니 다 해결되었다

 

책의 내용을 요약해서 올리고 싶지만 저작권의 문제때문에.

 

최대한 빨리 보고 실 프로젝트를 해봐야겠다

그리고 책을 다 본후 이해한 내용을 바탕으로 기본 개념을 다시 적는 형태로 블로그를 운영해야지

 

오늘 체크인 미팅을 진행하였다

 

아침 10시부터 열렸는데

Zoom 으로 1:1 이였다

 

미팅 내용은 간단한 신원확인

 

10시 15분 링크 메일이 왔다 오자마자 클릭! 을 했지만

4시간이 지난 2시 20분쯤 내 차례가됐다

 

4시간동안 아무것도 못하고 대기만  정말 짜증났지만 어쩔수 없으니

 

그러고 나서는 교육 영상과 QnA 시간을 갖게 되었다

 

사실 42서울을 추천해준 형의 도움과 같이 신청한 친구때문에 그냥 한번 해볼까?

라는 마음이였지만

 

QnA 시간을 갖게된후 너무나 간절한 마음이 생겼다

 

꼭 본과정까지 통과해서 IOS 개발 동아리에 들어가 이것저것 개발해보고 많은것을 배워봐야지

 

아 그전에 라피신 신청부터 신경쓰자

 

1) 구조체 선언

struct BasicInformation {
    let name: String
    var age: Int
}

Swift 에서 변수와 상수의 선언은 let 과 var 로 구성한다.

var 는 나중에 바뀔수도 있는 값!

let 은 나중에 바꿀수 없는 값!

 

예를들어..

let a: Int = 5
var b: Int = 5

a = 6		// 상수(let)기 때문에 오류가 발생한다

b = 6		// 변수(var) 이기 때문에 b 의 값은 6이 된다!

위와 같이 된다

 

앞서 선언한 BasicInformation 구조체를 사용해보자!

var hongInfo: BasicInformation = BasicInformation(name: "hong", age: 27)

// print 는 단순 데이터의 값만 출력!
print(hongInfo)
/*
BasicInformation(name: "hong", age: 27)
*/

// dump 는 데이터의 자세한 정보까지 출력해준다!
dump(hongInfo)
/*
▿ BasicInformation
  - name: "hong"
  - age: 27
*/

 

2) Class (클래스) 선언

class Person {
    var height: Float = 0.0 // 키 의 정보
    var weight: Float = 0.0 // 몸무게 의 정보
}

Person 이라는 클래스는 키 와 몸무게의 정보를 가지고 있다

 

Person 클래스를 사용해보자

let hong: Person = Person()
hong.height = 175.1
hong.weight = 95.3

print("hong : \(hong)")
/*
hong : Person
*/

dump(hong)
/*
▿ Person #0
  - height: 175.1
  - weight: 95.3
*/

 

기본적인 Swift 의 방향만 파악했다.

앞으로 공부하면서 더욱 자세히 알아보자!

+ Recent posts