241004 TIL - 의존성 주입과 Jest & 다시보는 네트워크 계층 & 웹소켓 뭐야 대체?!

LIHA·2024년 10월 4일
0

내일배움캠프

목록 보기
71/108
post-thumbnail
post-custom-banner

면접준비 & 240919 스탠다드반 네트워크 계층(2) 복기

240919 스탠다드반은 아파서 듣지 못했다. 그날은 TIL도 없어 영상을 보고 다시 공부 중...

IP 주소는 논리적 주소라서 여러 장치가 같은 IP일 수 있다

어? 그럼 연결된 기계가 여러개면 어떻게 해요? -> MAC 주소로 구분한다.
택배 전송 시 수신지 주소가 IP, 수신자가 MAC 주소인 것. 이때 수신지 주소가 우선하는 것 처럼, IP가 MAC 주소보다 우선한다.

  • 문제는 단일 IP에 MAC 주소가 여러개인 경우가 문제이다. 이땐 어떡하지? 🤔

이때를 위해 ARP 등장 - IP 주소를 통해 MAC 주소를 알아내는 프로토콜!

동일 네트워크 내에 있는 송수신 대상의 IP 주소를 통해 MAC 주소를 알아낼 수 있다.
ARP의 동작 과정은 다음과 같다.

ARP 요청 -> ARP 응답 -> ARP 테이블 갱신

  • 호스트는 네트워크 내의 모든 호스트에게 브로드캐스트로 메시지를 보낸다. 확성기 장착하고 모두에게 ARP 요청 패킷 발사!
    -> 이때 보내는 메시지가 ARP 요청이라는 ARP 패킷이다. (야 나 맥주소좀 찾을라는데 10.0.0.3의 맥주소가 뭐야아아ㅏㅏ)
    -> 송신지는 ff:ff:ff:ff:ff:ff 이다. 모든 MAC 어드레스에게 보내는 브로드캐스트 주소인 셈.

  • 그러면 수많은 컴퓨터 중에 10.0.0.3이 나 여깄어!🤸‍ 하고 본인 맥주소를 담은 ARP 응답 패킷을 보낸다.

  • 이 응답을 수신한 호스트는 IP와 MAC 주소를 적은 ARP 테이블이라는 것에 이 내용을 기록해둔다.

IP주소가 있고 MAC 주소가 있는데, MAC주소를 알아내기 위해 ARP라는 걸 이용한다.
전체 메시지 뿌리고 응답 오는거 기록해두고. 예전에 MAC주소 기록할 때도 이렇게 했었다. (라우팅 테이블 작성할 때)

IP 주소는 네트워크 부분과 호스트 부분으로 구분된다

  • 네트워크 부는 호스트가 속한 특정 네트워크를 식별하는 역할을 하고, 호스트 부는 네트워크 내에서 특정 호스트를 식별하는 역할이다. 한 네트워크 안에 여러 컴퓨터(호스트)가 붙어있을 수 있으니까!
    -> 예를들어 내 학번이 202334-000071 이라면,
    내 소속은 2023년에 입학한 컴퓨터과학과(34)이고 (이게 네트워크),
    그때 그 학과로 입학한 71번째 학생이다. (이게 호스트)

네트워크 부와 호스트 부가 독특한 것이, 경계가 유동적이다.
4자리의 IP 숫자 중 어디까지가 네트워크고 어디까지가 호스트인지가 정해진 게 없고 움직인다는 것.
-> 그래서 호스트 수가 많아져버리면 내 장비가 4대뿐이라고 할때 호스트 주소가 너무 낭비되어 버리고,
-> 그렇다고 네트워크 부가 많아져버리면 내 장비가 1000대인 경우 장비를 다 등록하지 못 할 수도 있는 것!

IP와 호스트 갯수를 어떻게 관리하지? - 문제 해결을 위해 클래스 개념 도입

클래스는 네트워크 크기에 따라 IP 주소를 분류하는 기준이다.
필요한 호스트 IP 갯수에 따라 네트워크 크기를 가변적으로 조정해서 네트워크 부와 호스트 부를 구획할 수 있다.
A, B, C, D, E가 있는데 D는 멀티캐스트용, E는 특수목적용이라 몰라도 되고 A, B, C만 알면 된다.

  • 일반적으로 A에서 C로 갈 수록 네트워크의 갯수가 커진다 = 호스트부가 줄어든다.
    -> 보통 우리는 C클래스를 쓰기 때문에 네트워크 3옥텟, 호스트 1옥텟 이라고 보면 된다. 서브넷마스크는 255.0.0.0 (/24)

A: 네트워크 1옥텟, 호스트 3옥텟. 식별용 상위비트는 0XXX XXXX. 그래서 맨 앞자리가 0~127 범위. 서브넷 마스크는 /8
B: 네트워크 2옥텟, 호스트 2옥텟. 식별용 상위비트는 10XX XXXX. 맨 앞자리가 128~191 범위. 서브넷 마스크는 /16
C: 네트워크 3옥텟, 호스트 1옥텟. 식별용 상위비트는 110X XXXX. 맨 앞자리가 192~223 범위. 서브넷 마스크는 /24
단, 0.0.0.0과 255.255.255.255는 특수목적으로 빠져있기 때문에 이 두 개를 빼야한다!
-> 0.0.0.0은 그 네트워크 자체를 나타내는 IP, 255.255.255.255는 브로드캐스트를 위한 IP

클래스풀 주소 체계의 장단점 - 유동적 관리라고 하지만 유명무실!

  • 장점: 네트워크 부, 호스트 부의 공간 관리를 유동적으로 할 수 있다
  • 단점: 클래스별 네트워크의 크기가 고정되어 여전히 다수의 IP 주소가 낭비될 가능성이 크다
    -> 예를들어 A클래스 네트워크 하나 당 할당 가능한 호스트 주소는 1600만개 이상이고, B클래스 네트워크 하나당 할당 가능한 호스트 주소는 6만개가 넘는다.
    -> 하지만 한 조직에서 6만개 이상의 호스트가 필요한 경우는 거의 없다. 그렇다고 여러 조직이 한 네트워크를 쓸 수도 없고...
    -> 하지만 C클래스 네트워크 하나 당 할당 가능한 호스트 주소는 254개 뿐이다(256개 - 0.0.0.0 & 255.255.255.255). 갑자기 규모가 확 줄어드네?

안녕 IP들? 해결사가 왔어!😎 클래스리스 주소 체계와 서브넷 마스크

'클래스 체계를 쓰니까 낭비되는 주소가 너무 많다! 그러니까 서브넷 마스크라는 체계를 써보자.' 라는게 CIDR의 핵심.
클래스풀 주소체계가 클래스를 이용해 네트워크 주소와 호스트 주소를 구분했다면, 클래스리스 주소체계는 '서브넷 마스크'라는 녀석을 이용해서 네트워크 주소와 호스트 주소를 구분한다.

서브넷 마스크가 뭔가요?
IP 주소 상에서 네트워크 주소는 1, 호스트 주소는 0으로 표기한 비트열.
네트워크 부에는 무조건 1을 넣어주고, 어 네트워크가 아니네? 이부분이 남아서 호스트 부로 할당되는구나? 라고 보면 된다.
-> 그래서 클래스풀 체계에서의 서브넷 마스크는 255.0.0.0와 같은 식으로 나온다.
-> 원래 비트열이었으니까 비트로 보면 11111111.000000000.00000000.0000000 이 되는 셈.

IP 주소와 서브넷 마스크에 비트 AND 연산을 해줘야 해요🤯🤯🤯

와 지난학기에 이산수학 겉핥기로라도 들어놔서 진짜 다행이다...
비트의 AND연산은 둘다 참일 때만 참이고 나머지는 모두 거짓인 연산이다.

다음과 같은 IP 주소와 서브넷 마스크가 있다고 가정해보자.

  • IP 주소 : 192.168.219.103
  • 서브넷 마스크 : 255.255.255.0

이 IP 주소와 서브넷 마스크를 2진수로 표기하여 비트 AND 연산을 수행하면 다음과 같습니다.

  • IP 주소 : 11000000.10101000.11011011.01100111
  • 서브넷 마스크 : 11111111.1111111.11111111.00000000
  • 비트 AND 연산 : 11000000.10101000.11011011.00000000 ⇒ 192.168.219.0 (네트워크 주소)

-> 이때 남은 0번 부가 호스트 부이니, 실제로는 192.168.219.1부터 254까지가 할당 가능한 IP 주소가 된다. (전부 0 하고 전부 255인 것 뺀다고 했음)
-> 그러면 내 IP 주소는 .103으로 끝나니까 192.168.219.0 이라는 네트워크 주소 안에서 103번째 컴퓨터 라는 말이 된다.
-> 그러면 이렇게 표기할 수 있다! 192.168.219.103/24 -> /24만 봐도 얘는 C클래스임을 알 수 있다.

그거 알아? 서브넷 마스크는 255랑 0만 설정할 수 있는 거 아니다?😁

이건 또 뭔소리야?🤯🤯🤯🤯🤯🤯
우리가 클래스리스 주소 체계를 쓰기로 한 게, 이게 훨씬 유동적이고 낭비되는 주소 갯수가 적어서이기 때문이었다.
그렇다면 주소가 10개만 필요할 때, 30개만 필요할 때 가능한 그 수에 가까운 주소를 할당해줄 수 있는 시스템이어야 할 것이다.

  • 예시: 20대의 컴퓨터가 있는 소규모 네트워크의 IP와 서브넷 마스크 설정은 어떻게?🤔

예? 이게 무슨 소리에요???? 🤯🤯🤯🤯🤯🤯🤯
-> 224라는 숫자에 당황하지 말고 비트라고 생각해보자. 저 서브넷 마스크는 다음과 같을 것이다.

11111111.11111111.11111111.11100000
-> 서브넷 마스크가 이렇게 생겼다면 1인 자리에는 무조건 네트워크 부의 주소가 오니까, 나머지 0인 자리만큼 호스트 부를 할당할 수 있다.
-> 2^5 -> 32개 - 2개(0이랑 255) = 30개 할당 가능하니, 254개 할당보다 훨씬 적게 주소가 낭비된다.
-> 얘는 1이 24 + 3개이므로 /27 이라고 표기된다.

IP 주소의 고갈은 반은 맞고 반은 틀리다

우리가 IP가 고갈된다, 낭비된다고 말하는 IP는 고유한 IP인 '공인 IP'를 말한다.

  • 네트워크 간의 통신, 인터넷을 이용할 때 사용하는 IP 주소가 바로 공인 IP 주소. ISP나 공인 IP주소 할당 기관을 통해 받을 수 있다.

  • 사설 IP 주소는 사설 네트워크에서 이용하기 위한 IP 주소. 우리가 집에서 쓰는 대부분의 IP가 외부 네트워크에 공개되지 않은 네트워크이다.
    -> 우리가 쓰는 모든 네트워크 기기의 IP주소를 별도로 신청에서 할당받지는 않았을 것이다. LAN(Local Area Network)의 많은 호스트는 사설 IP 주소를 이용하기 때문임.
    -> 할당받은 사설 IP 주소는 해당 호스트가 속한 사설 네트워크 속에서만 유효하기 때문에, 얼마든 다른 네트워크 상의 사설 IP 주소와 중복될 수 있다.
    -> 중복되기 때문에 이런 사설 IP 주소만으로는 일반적인 인터넷 접속을 비롯한 외부 네트워크 간 통신이 어렵다!

  • 그러면 사설 IP 주소를 사용하는 호스트가 외부 네트워크와 통신하려면 어떻게 해야할까? 나도 게임하고 싶은뎅🤔
    -> 이때 이용되는 것이 NAT(Network Address Translation) 이라는 기술이다 ⭐⭐⭐

사설 IP여도 괜찮아, 내가 밖으로 보내줄게 - NAT(Network Address Translation)

  • NAT는 IP를 변환하는 기술인데, 네트워크 내부에서 사용되는 사설IP 주소와 네트워크 외부에서 사용되는 공인 IP 주소를 변환하는데 사용된다. 이거 굉장히 중요한 기술이다!
    -> NAT를 통해 사설 IP를 사용하는 여러 호스트는 적은 수의 공인 IP 주소를 공유하고 있는 셈.

대부분의 라우터 공유기는 NAT 기능을 내장하고 있다!

우리의 사설 네트워크 상에서 만들어진 패킷 속의 사설 IP 주소는, 공유기를 거쳐 공인 IP로 변경되어 외부 네트워크로 전송된다.
반대로 외부 네트워크로부터 받은 패킷 속 공인 IP 주소는 공유기를 거쳐 사설 IP주소로 변경되어 우리의 사설 네트워크 속 호스트에게 도착하게 된다.
-> 사실 보다 정확한 것은 전송 계층에서 포트라는 개념을 익혀야 하는데, 이건 전송 계층 공부때 다시 보도록 하자.
(와, 봤는데 기억이 안나!😨)

  • ipconfig에 나오는 IP랑 인터넷 검색해서 나오는 IP랑 달라요!
    ipconfig에 나오는건 사설 IP이고 인터넷 검색해서 나오는 IP는 공인 IP 주소이기 때문이다. 빼앰😎

좋은 참고 블로그들

  • ARP vs Routing에 대한 블로그
    참고 블로그의 설명이 아주 재미있고 잘 되어 있었다. 참고 블로그를 토대로 정리하자면,

ARP는 MAC 주소와 IP 주소를 매칭시켜 주는 역할
Routing은 이 IP 주소와 통신하기 위해 어떤 IP에 연결해야 하는지 매칭시켜주는 역할
-> 하지만 IP끼리 통신하려면 결국 ARP를 통해 IP주소와 MAC 주소를 매칭시켜 전달해야 한다.
-> 즉, Routing을 하기 위해선 ARP가 꼭 필요한 것!


웹소켓

웹소켓 맛보기 특강 복기

  • 웹소켓은 HTTP는 당연히 아니고 TCP도 아니고 또다른 연결형태! TCP랑 비슷하긴 하다
  • 웹소켓은 패킷에 정해진 구조가 없어서 내가 주고받을 형태를 정해서 송수신 해야한다.

웹소켓은 패킷 처리 방법에 따라 2가지로 구분 - 이벤트 기반(이름), 핸들러 ID 방식

  • 이벤트 기반은 주고받을 이름이 정해져 있고, 그 이름으로 socket.on과 emit이 오가야 한다.
  • 핸들러 ID 방식은 주고받을 패킷의 구조를 내가 지정해줘야 한다.
  • 핸들러 ID 방식의 패킷 구조는 대충 이렇게 생겼다.
type packet = {
	handlerId: number;
	data: any;
};


// 1번
type updateLocation = {
	x: number;
	y: number;
	userid: string;
}

{
	handlerId: 11,
	data: {
		x: 0.227
		y: 10.3347
		userId: "cfgd8f73m"
	}
}

대강 이런 식으로 되어있는 것만 알자. 그러면 이건 패킷이고 서버 코드는 어떻게 생겼을까?

  • 핸들러 ID 방식의 서버코드
const handlerMapping = {
  11: () => {
	  비즈니스 로직
  },
};

const handleEvent = (io, socket, { handlerId, data }) => {
  const handler = handlerMapping[handlerId];
  // 적절한 핸들러가 없다면 실패처리합니다.
  if (!handler) {
    socket.emit('response', { status: 'fail', message: 'Handler not found' });
    return;
  }

  const response = handler(io, socket, data);
  io.emit('response', { status: 'success', handlerId, data: response });
};


socket.on('event', (data) => handleEvent(io, socket, data));

-> 지금은 핸들러 ID 방식이 되었으니 무조건 'event' 라는 이름으로 받고, 'response' 라는 이름으로 보내기로 약속했다.

이거 왜 받을땐 io.on이고 보낼땐 socket.emit이지?

socket.js 코드를 보다 보니 미묘한 것이 보인다.

  io.on('connection', (socket) => {
    console.log(`안녕, 너 이 아이디로 연결됐어: ${socket.id}`);
    socket.emit('connection', { id: socket.id });

-> 받는건 서버가 받는거니 전역의 모든 클라이언트에게 귀를 열어놔야 하니까 io이고, 특정 클라이언트가 연결되었다면 그녀석에게만 연결 안내를 해줘야 하니 socket.emit으로 답장해준다.
(다만 구현 내용 따라서 이게 채팅방이나 카톡 오픈챗 같은거라면 'ㅁㅁ님이 입장하셨습니다' 라고 io.emit으로 알려줄 수도 있지 않을까 싶다)

    socket.on('chat-message', (data) => {
      io.emit('chat-message', { id: socket.id, msg: data });
    });

그리고 상기 접속 핑퐁에 이어 이런 핑퐁이 보인다. 특정 소켓에게 귀 기울여 데이터를 받고, 그 소켓에게 받은 데이터와 소켓 id를 io.emit으로 서버 전역에 뿌려주는 것.
-> 야 {socket.id} 가 {data} 라는 말을 하더라! 라는 구조이다.
이건 또 뭘까? 🤔

-> 맛보기 강의에서 구현중인 건 이런 채팅방이다. 그러니 한명이 채팅을 입력하면 모두에게 보여야 한다.
-> 다만 호영 튜터님 말씀이 io.emit은 이 서버에 천명이 있든 만명이 있든 그 모두에게 메시지를 보내는 것이라 한다. 이를테면 카톡 유저가 2000만명이라 쳤을때 2000만명 전체에게 보내는 것이라는 것.
-> 그렇다면 이 채팅방 안의 유저들에게만 보내고 싶을 땐 어떻게 할까? 이건 스스로 알아보라고 하셨다.


면접

소감 : 와 정말 떨려서 아무 생각도 안 난다! IP가 뭐였지? 몰?루. 처음부터 절다니 어흑흑

면접질문 복기

  • IP가 무엇인지?
    -> 인터넷 프로토콜. 네트워크 계층의 통신규약. (이 외엔 대답 못한듯. 엉엉 🥺)

  • IP주소 체계?
    -> 32비트인 IPv4와 128비트인 IPv6가 있는데 일반적으로 IPv4 사용. 8비트의 숫자를 10진수로 나타내고 점으로 구분. 0.0.0.0 ~255.255.255.255 까지 존재.

  • 브라우저에서 네이버 쳤을 때 네트워크 상에서 일어나는 과정?
    -> 우리는 도메인을 알지만 실제로 네트워크가 접근하려면 IP가 필요. 그래서 IP 이름 풀이 과정에 돌입.
    DNS 서버들에 IP를 물어보는 재귀적 질의나 반복적 질의같은 과정이 있지만 너무 번거로움.
    그래서 우리는 DNS 캐시를 이용. 브라우저 -> 운영체제 -> 라우터 -> ISP 캐시까지 살핀 후 그래도 없으면 질의과정 돌입.

  • 그것은 IP를 얻어오는 방법. 그래서 IP 얻어온 다음에 뭘 하는지?
    -> GET 방식의 리퀘스트가 들어오면 핸들러 맵핑하여 맵핑 되었을 시 비즈니스 로직 돌아감. 돌아간 결과가 나오면 뷰 리졸버에 뷰 네임을 제공하는 식으로 리스폰스를 돌려줌. 이 대답이 맞는지 모르겠음. 죄송.
    (이건 자바스프링 할때 기억하고 있던 MVC 패턴에 대한 로직같은데 이게 맞는지 모르겠는데 아닌거 같음. 아무말 대잔치 한 것 같고 한강 따뜻한지 알고싶음. )

  • 클래스풀 주소 체계?
    -> A, B, C 클래스로 나뉨. 네트워크부와 호스트부의 비율 차이. 네트워크부 8비트면 A, 16비트면 B, 24비트면 C. D와 E도 있는데 특수목적이라 사용되지 않음.

  • 서브넷 마스크는 왜 썼는지?
    클래스풀 주소체계 사용 시 낭비되는 주소가 너무 많아 유동적으로 관리하기 위해.

  • 서브넷 마스크 써도 클래스풀이랑 다른게 없지 않나? 낭비되는 건 똑같은데.
    -> 클래스풀은 /8, /16, /24로 고정이지만 서브넷 마스크는 네트워크부와 호스트부의 비율을 바꿀 수 있음.

  • 라우터와 라우팅?
    -> 라우터는 L3 네트워크 계층에서 라우팅을 하기 위한 특수한 하드웨어. '라우팅'을 시켜주는 장비.
    라우팅은 일종의 길 찾기. 단순히 길을 찾는건 L2 스위치로도 가능하지만 '최적경로'를 찾는다는게 다름.
    길찾기라서 주소? 길안내? 가 필요한데 이게 기록되어 있는 것이 라우팅 테이블.
    라우팅 방법은 세 가지 있다고 알고있음. 정적 라우팅, 기본 라우팅, 동적 라우팅.
    이 라우팅 테이블을 개발자가 직접 작성하는 것이 정적 라우팅,
    기본 라우팅은 깊이 알진 못하지만 다음에 갈 수 있는 길이 하나밖에 없다고 가정하고 보내는 라우팅,
    프로토콜을 이용해 자동으로 기록하는 것이 동적 라우팅.

  • 그럼 동적 라우팅의 종류? or 방법?
    -> 죄송 잘 모르겠음.

  • 꼭 용어를 대답하지 않더라도 모르겠다 보다는 나름대로 생각&설명해보면 좋을 듯. 동적 라우팅에 어떤 방법을 쓴다고 생각하는지?
    -> 패킷을 뜯어서 각자 다른 길로 보낸 다음에 가장 빨리 도착하는 길을 찾아 다음에도 그 길로 갈것 같음.

면접 피드백

  1. (내 예상과는 다른 말씀이지만) 차근차근 설명을 잘 해주었다.
    긴장하거나 당황하면 굳거나 횡설수설 하는 경우도 많고 면접관은 보통 그런 곳을 파고드는데, 그렇지 않았다.
    (굉장히 굳고 횡설수설 한 것 같았는데...?🤔 어여삐 봐주신 것 같아 감사할 따름🥺 벼락치기 공부 뜨끔)
  2. 동적 라우팅 방법을 대답하지 못하고 모르겠다고 했다. 이건 면접에 나올 수 있으니 알아두면 좋다.
  3. 모르더라도 그냥 모른다고 말하는 것 보다는 나름대로 설명을 해보는 것이 좋다.
  4. 전반적으로 잘 대답했고 이대로만 공부하면 될 것 같다.
    (벼락치기 공부 뜨끔22)
  5. 알고리즘에 취약하다 말씀드리니 그것도 결국 토익같은 것 처럼 패턴 익히기라고 조언해 주셨다.

그래서, IP는 정확히 뭐였나?

240910 CS 글 참고
OSI 7계층 중 3계층(네트워크 계층)에서 인터넷을 통해 데이터를 주고 받을 때 사용되는 통신규약. 그래서 이름도 인터넷 프로토콜.
-> 네트워크 통신 시 데이터 전송경로 설정, 주소 지정 등을 담당하는 프로토콜이다.
-> IP는 데이터를 패킷으로 보내는 데에만 충실할 뿐이고 '어떻게' 보낼지까지는 관여하지 않는다.
-> 그래서 손실율이나 전송속도를 고려하지 않는다.

그래서, 동적 라우팅의 방법에는 뭐가 있나?🤔

참고 블로그1
참고 블로그2
IBM DOCS

동적 라우팅 프로토콜은 크게 내부 게이트웨이 프로토콜(IGP)과 외부 게이트웨이 프로토콜(EGP)으로 나뉜다.

IGP: 같은 AS 내부의 라우팅 정보 교환하는 프로토콜
EGP: 다른 AS 간 라우팅 정보를 교환하는 프로토콜

  • AS가 뭐에요? 액세스 시스템인가요? 🤔

Autonomous System : 라우팅 프로토콜의 자율 시스템

  • IGP의 대표적 예시: RIP와 OSPF

RIP: Routing Information Protocol. Rest In Peace기 아니다 내 동적 라우팅의 명복 아니다
최소 홉 카운트를 파악하여 라우팅하는 프로토콜. 거리 + 방향으로 길을 찾는 동적 라우팅 프로토콜.
OSPF: Open Shortest Path First.
지금 오픈된 길 중에 가장 짧은길 찾기. 최저 COST(최소시간) 경로를 최적 라우팅 경로로 결정하는 것. 가장 대표적인 링크 상태 프로토콜.

  • 링크 상태 프로토콜?🤔
    -> 연결돼있는 선들의 값을 더해서 최소값을 가지는 경로 계산 알고리즘을 쓴 프로토콜.
    여기서 사용되는 최단경로 계산에 쓰이는 알고리즘이 바로 다익스트라 알고리즘!
profile
갑자기 왜 춤춰?
post-custom-banner

0개의 댓글