문제보러가기

🕵️‍♀️ 문제


네트워크란 컴퓨터 상호 간에 정보를 교환할 수 있도록 연결된 형태를 의미합니다. 예를 들어, 컴퓨터 A와 컴퓨터 B가 직접적으로 연결되어있고, 컴퓨터 B와 컴퓨터 C가 직접적으로 연결되어 있을 때 컴퓨터 A와 컴퓨터 C도 간접적으로 연결되어 정보를 교환할 수 있습니다. 따라서 컴퓨터 A, B, C는 모두 같은 네트워크 상에 있다고 할 수 있습니다.

컴퓨터의 개수 n, 연결에 대한 정보가 담긴 2차원 배열 computers가 매개변수로 주어질 때, 네트워크의 개수를 return 하도록 solution 함수를 작성하시오.

 

 

제한사항

  • 컴퓨터의 개수 n은 1 이상 200 이하인 자연수입니다.
  • 각 컴퓨터는 0부터 n-1인 정수로 표현합니다.
  • i번 컴퓨터와 j번 컴퓨터가 연결되어 있으면 computers[i][j]를 1로 표현합니다.
  • computer[i][i]는 항상 1입니다.

 

 

🙋‍♀️ 풀어보자~


DFS와 BFS로 풀 수 있는 문제다.

두 가지 방법을 모두 해보자!

 

1. DFS로 풀어보면,,,

  • 방문을 했는지 확인을 도와줄 visited 배열을 사용한다.

 

def dfs(n, computers, com, visited):
  # dfs 돌기 위한 컴퓨터는 우선 방문했다고 찍는다.
  visited[com] = True
  
  # 컴퓨터들 개수만큼 for문 돌려서 com과 연결되어있고 방문한적 없는 것을 찾는다.
  # 찾으면 얘도 dfs돌린다.
  for connect in range(n):
    if connect != com and computers[com][connect] == 1:
      if visited[connect] == False:
        dfs(n, computers, connect, visited)


def solution(n, computers):
  answer = 0
  # 방문한 기록을 남기는 visited
  # 방문한 적이 없으면 False다.
  visited = [False] * n
  
  # 컴퓨터 한대씩 돌려보며 방문한 적 없는 컴퓨터를 찾아
  # dfs해주고, 한번 끝나면 answer에 1을 더해준다.
  for com in range(n):
    if visited[com] == False:
      dfs(n, computers, com, visited)
      answer += 1
      
  return answer;

 

 

2. BFS로 풀어보면,,,

dfs와 달리 deque 덱을 import 해줘야 한다.

 

from collections import deque

def bfs(n, computers, com, visited):
  # 덱에 현재 com 번호를 넣어준다.
  q = deque([com])
  
  # 방문했다고 표시해
  visited[com] = True
  
  # q를 돌리면서 popleft 해주고... 들려줘야하는 애면 append해준다
  while q:
    com = q.popleft()
    for connect in range(n):
      if connect!=com and computers[com][connect]==1 and not visited[connect]:
        q.append(connect)
        visited[connect] = True

def solution(n, computers):
  answer = 0
  visited = [False] * n
  for com in range(n):
    if visited[com] == False:
      bfs(n, computers, com, visited)
      answer += 1

  return answer;
OSI 7계층

표준화를 통해 이질적인 포트 문제나 프로토콜 등으로 인한 문제를 해결하여 비용을 절감했다.
또한, 계층별의 기능과 통신 과정을 단계별로 나누어서 쉽게 알 수 있고, 특정한 곳에 이상이 생기면 그 단계만 수정할 수 있기 때문에 편리하다.



 

 

 

1) 물리(Physical)

리피터, 케이블, 허브 등

주로 전기적, 기계적, 기능적인 특성을 이용해서 통신 케이블로 데이터를 전송하는 역할을 한다.

 

 

 

 

 

 

 

 

 

2) 데이터 링크(Data Link)

브릿지, 스위치 등

물리 계층을 통해 송, 수신되는 정보의 오류와 흐름을 관리하여 안전한 정보의 전달을 수행할 수 있도록 도와주는 역할을 한다.

MAC 주소를 이용해 통신한다.

Frame에 MAC 주소를 부여하고 에러검출, 재전송, 흐름 제어를 진행한다.

 

 

 

 

 

 

 

 

 

3) 네트워크(Network)

라우터, IP

여러 개의 노드를 거칠 때마다 경로를 찾아주는 역할을 하며, 다양한 길이의 데이터를 목적지까지 가장 안전하고 빠르게 전달하는 기능을 담당한다. (전송 계층이 요구하는 서비스 품질을 제공하기 위한 기능적, 절차적 수단을 제공한다.)

라우터를 통해 이동할 경로를 선택하여 IP 주소를 지정하고, 해당 경로에 따라 패킷을 전달해준다.

라우팅, 흐름 제어, 오류 제어, 세그먼테이션 등을 수행한다.

 

 

 

 

 

 

 

 

4) 전송 계층(Transport)

TCP, UDP

TCP, UDP 프로토콜을 통해 통신을 활성화 한다. 포트를 열어두고, 프로그램들이 전송을 할 수 있도록 제공해준다. 이를 통해 양 끝 단의 사용자들이 데이터를 주고 받을 수 있다.

  • TCP : 신뢰성, 연결 지향적
  • UDP : 비신뢰성, 비연결성, 실시간

 

TCP 프로토콜(Transmission Control Protocol)

 

OSI 계층모델의 관점에서 전송 계층(4계층)에 해당

 

양종단 호스트 내 프로세스 상호 간에 신뢰적인 연결지향성 서비스를 제공

- IP의 비신뢰적인 최선형 서비스에다가 신뢰적인 연결지향성 서비스를 제공하게 됨

. 신뢰적인 전송을 보장함으로써, 어플리케이션 구현이 한층 쉬워지게 됨

 

1. 신뢰성 있음 (Reliable)

 

패킷 손실, 중복, 순서바뀜 등이 없도록 보장

TCP 하위계층인 IP 계층의 신뢰성 없는 서비스에 대해 다방면으로 신뢰성을 제공

 

2. 연결지향적 (Connection-oriented)                                        ☞ TCP 연결

 

같은 전송계층의 UDP가 비연결성(connectionless)인 것과는 달리, TCP는 연결지향적 임

이 경우, 느슨한 연결(Loosly Connected)을 갖으므로 강한 연결을 의미하는 

가상회선이라는 표현 보다는 오히려 연결지향적이라고 말함

연결 관리를 위한 연결설정 및 연결해제 필요          ☞ TCP 연결설정, TCP 연결종료

양단간 어플리케이션/프로세스는 TCP가 제공하는 연결성 회선을 통하여 서로 통신

 

 

 

UDP 프로토콜(User Datagram Protocol)

 

전송 계층의 통신 프로토콜의 하나 (TCP에 대비됨)

- 신뢰성이 낮은 프로토콜로써 완전성을 보증하지 않으나,  

- 가상회선을 굳이 확립할 필요가 없고 유연하며 효율적 응용의 데이타 전송에 사용

 

1. 비연결성이고, 신뢰성이 없으며, 순서화되지 않은 Datagram 서비스 제공 

- 메세지가 제대로 도착했는지 확인하지 않음 (확인응답 없음)

- 수신된 메세지의 순서를 맞추지 않음 (순서제어 없음) 

- 흐름 제어를 위한 피드백을 제공하지 않음 (흐름제어 없음)

- 검사합을 제외한 특별한 오류 검출 및 제어 없음 (오류제어 거의 없음)

UDP를 사용하는 프로그램 쪽에서 오류제어 기능을 스스로 갖추어야 함

- 데이터그램 지향의 전송계층용 프로토콜 (논리적인 가상회선 연결이 필요없음)

비연결접속상태 하에서 통신 

 

2. 실시간 응용 및 멀티캐스팅 가능

- 빠른 요청과 응답이 필요한 실시간 응용에 적합

- 여러 다수 지점에 전송 가능 (1:多)

 

3. 헤더가 단순함

- UDP는 TCP 처럼 16 비트의 포트 번호를 사용하나,

- 헤더는 고정크기의 8 바이트(TCP는 20 바이트) 만 사용

즉, 헤더 처리에 많은 시간과 노력을 요하지 않음

 

 

 

 

 

 

 

 

5)세션(Session)

API, Socket

데이터가 통신하기 위한 논리적인 연결을 말한다. 통신을 하기위한 대문이라고 보면 된다.

하지만 4계층에서도 연결을 맺고 종료할 수 있기 때문에 우리가 어느 계층에서 통신이 끊어 졌나 판단하기는 한계가 있다. 

그러므로 세션 계층은 4 계층과 무관하게 응용 프로그램 관점에서 봐야 한다. 

세션 설정, 유지, 종료, 전송 중단시 복구 등의 기능이 있다.

 

세션 계층(Session layer)은 양 끝단의 응용 프로세스가 통신을 관리하기 위한 방법을 제공한다. 

동시 송수신 방식(duplex), 반이중 방식(half-duplex), 전이중 방식(Full Duplex)의 통신과 함께, 체크 포인팅과 유휴, 종료, 다시 시작 과정 등을 수행한다. 

이 계층은 TCP/IP 세션을 만들고 없애는 책임을 진다.

 

-> 

통신하는 사용자들을 동기화하고 오류복구 명령들을 일괄적으로 다룬다. 

통신을 하기 위한 세션을 확립/유지/중단 (운영체제가 해줌)

 

 

 

 

 

 

 

 

 

6) 표현(Presentation)

JPEG, MPEG 등

데이터 표현에 대한 독립성을 제공하고 암호화하는 역할을 담당한다.

코드 간의 번역을 담당하여 사용자 시스템에서 데이터의 형식상 차이를 다루는 부담을 응용 계층으로부터 덜어준다.

파일 인코딩, 명령어를 포장, 압축, 암호화한다.

 

 

 

 

 

 

 

 

7) 응용(Application)

HTTP, FTP, DNS 등

최종 목적지로 응용 프로세스와 직접 관계하여 일반적인 응용 서비스를 수행한다.

사용자 인터페이스, 전자우편, 데이터베이스 관리 등의 서비스를 제공한다.


WWW world wide web의 약자

인터넷을 통해 접근할 수 있는 정보 공간
URL로 문서등 리소스를 식별하고, 리소스 간 하이퍼링크로 연결될 수 있다

 

 

 

웹 통신 


 

  • 클라이언트 : 사용자가 서버에 접속하기 위해 사용하는 프로그램 또는 서비스. 웹 브라우저, 모바일 앱 등
  • 서버 : 클라이언트에게 네트워크를 통해 정보나 서비스를 제공하는 컴퓨터 시스템

 

 

 

 

 

 

 

 

웹 통신 과정


 

  1. 사용자가 웹 브라우저를 통해 URL을 입력한다
  2. 입력된 URL 중 도메인 네임을 DNS 서버에서 검색한다
  3. DNS 서버에서 해당 도메인 네임에 해당하는 IP 주소를 찾아 사용자가 입력한 URL 정보와 함께 전달한다
  4. 웹 페이지 URL 정보와 전달받은 IP 주소를 이용해 HTTP 요청 메시지를 생성한다
  5. 요청은 TCP를 통해 서버로 전송된다
  6. 서버는 클라이이너트의 요청을 받고 응답을 전송한다

 

 

 

 

 

 

 

 

 

 

 

DNS의 웹/앱 라우팅 과정


 

  1. 사용자가 웹 브라우저 주소창에 www.example.com을 입력
  2. www.example.com에 대한 요청이 인터넷 서비스 제공업체(ISP)가 관리하는 DNS 해석기로 라우팅
  3. DNS 해석기는 요청을 DNS 루트 이름 서버에 전달
  4. DNS 해석기는 요청을 .com 도메인 TLD(Top-level Domain) 네임 서버 중 하나에 다시 전달
  5. DNS 해석기는 요청을 Route 53 네임 서버에 다시 전달
  6. Route 53 네임 서버는 www.example.com 레코드를 찾아 IP주소를 DNS 해석기로 반환
  7. DNS 해석기는 웹 브라우저에 IP주소 반환

 

 

 

 

 

 

 

❗우리가 Chrome 을 실행시켜 주소창에 특정 URL 값을 입력시키면 어떤 일이 일어나는가?


in 브라우저

  1. url 에 입력된 값을 브라우저 내부에서 결정된 규칙에 따라 그 의미를 조사한다.
  2. 조사된 의미에 따라 HTTP Request 메시지를 만든다.
  3. 만들어진 메시지를 웹 서버로 전송한다.

이 때 만들어진 메시지 전송은 브라우저가 직접하는 것이 아니다. 브라우저는 메시지를 네트워크에 송출하는 기능이 없으므로 OS에 의뢰하여 메시지를 전달한다. 우리가 택배를 보낼 때 직접 보내는게 아니라, 이미 서비스가 이루어지고 있는 택배 시스템(택배 회사)을 이용하여 보내는 것과 같은 이치이다. 단, OS에 송신을 의뢰할 때는 도메인명이 아니라 ip주소로 메시지를 받을 상대를 지정해야 하는데, 이 과정에서 DNS서버를 조회해야 한다.

 

 

 

in 프로토콜 스택, LAN 어댑터

  1. 프로토콜 스택(운영체제에 내장된 네트워크 제어용 소프트웨어)이 브라우저로부터 메시지를 받는다.
  2. 브라우저로부터 받은 메시지를 패킷 속에 저장한다.
  3. 그리고 수신처 주소 등의 제어정보를 덧붙인다.
  4. 그런 다음, 패킷을 LAN 어댑터에 넘긴다.
  5. LAN 어댑터는 다음 Hop의 MAC주소를 붙인 프레임을 전기신호로 변환시킨다.
  6. 신호를 LAN 케이블에 송출시킨다.

프로토콜 스택은 통신 중 오류가 발생했을 때, 이 제어 정보를 사용하여 고쳐 보내거나, 각종 상황을 조절하는 등 다양한 역할을 하게 된다. 네트워크 세계에서는 비서가 있어서 우리가 비서에게 물건만 건네주면, 받는 사람의 주소와 각종 유의사항을 써준다! 여기서는 프로토콜 스택이 비서의 역할을 한다고 볼 수 있다.

 

 

in 허브, 스위치, 라우터

  1. LAN 어댑터가 송신한 프레임은 스위칭 허브를 경유하여 인터넷 접속용 라우터에 도착한다.
  2. 라우터는 패킷을 프로바이더(통신사)에게 전달한다.
  3. 인터넷으로 들어가게 된다.

 

 

in 액세스 회선, 프로바이더

  1. 패킷은 인터넷의 입구에 있는 액세스 회선(통신 회선)에 의해 POP(Point Of Presence, 통신사용 라우터)까지 운반된다.
  2. POP 를 거쳐 인터넷의 핵심부로 들어가게 된다.
  3. 수 많은 고속 라우터들 사이로 패킷이 목적지를 향해 흘러가게 된다.

 

 

 

in 방화벽, 캐시서버

  1. 패킷은 인터넷 핵심부를 통과하여 웹 서버측의 LAN 에 도착한다.
  2. 기다리고 있던 방화벽이 도착한 패킷을 검사한다.
  3. 패킷이 웹 서버까지 가야하는지 가지 않아도 되는지를 판단하는 캐시서버가 존재한다.

굳이 서버까지 가지 않아도 되는 경우를 골라낸다. 액세스한 페이지의 데이터가 캐시서버에 있으면 웹 서버에 의뢰하지 않고 바로 그 값을 읽을 수 있다. 페이지의 데이터 중에 다시 이용할 수 있는 것이 있으면 캐시 서버에 저장된다.

 

 

 

 

in 웹 서버

  1. 패킷이 물리적인 웹 서버에 도착하면 웹 서버의 프로토콜 스택은 패킷을 추출하여 메시지를 복원하고 웹 서버 애플리케이션에 넘긴다.
  2. 메시지를 받은 웹 서버 애플리케이션은 요청 메시지에 따른 데이터를 응답 메시지에 넣어 클라이언트로 회송한다.
  3. 왔던 방식대로 응답 메시지가 클라이언트에게 전달된다.

 

 


Reference.

link1 link2 

+ Recent posts