데이터 링크 계층에서 이더넷 규칙을 기반으로 데이터의 전송을 담당한다고 했다. 이 규칙에 따르면 같은 네트워크에 있는 컴퓨터로는 데이터를 전송하는데 문제가 없지만, 인터넷이나 다른 네트워크로 데이터를 전송할 수는 없다. 수많은 네트워크들이 얽히고 설킨 환경에서는 데이터 링크 계층의 기능만으론 다른 네트워크로 데이터를 전송하는데 한계가 있기 때문이다. 이 시점에서 네트워크 간의 통신을 가능하게 하는 것이 바로 네트워크 계층의 역할이다. 이 계층을 통해 다른 네트워크로 데이터를 전송하려면 라우터라는 네트워크 장비가 필요하다. 라우터는 데이터의 목적지가 정해지면 해당 목적지까지 어떤 경로로 가는 것이 좋은지 알려주는 일종의 내비게이션 역할이다. (스위치는 각 갈림길마다 있는 이정표같은 역할) 그러나 데이터를 보내려는 상대가 어디 있는지 모르면 라우터 역시 목적지까지의 경로를 알려줄 수 없다. 편지를 보낼때 받는 사람 주소를 모른다면 배송할 수 없는 것처럼 말이다. 즉 네트워크에서도 데이터를 보내려면 목적지 주소가 필요하다는 것이다! 이 때 이 주소는 데이터 링크 계층에서 다룬 MAC주소를 말하는 것이 아니다! 랜에서는 MAC주소만으로도 통신이 가능하지만 다른 네트워크로는 MAC주소만으로 보내기엔 무리가 있는데, 이 때 사용하는 것이 MAC주소가 아닌 네트워크를 식별하는 주소인 IP주소다.

 

  IP주소는 어떤 네트워크의 어떤 컴퓨터인지 구분할 수 있도록 해주는 주소로 이 IP주소가 있다면 다른 네트워크에 있는 목적지를 정할 수 있다. 다만 목적지를 IP주소로 정했다고 바로 데이터를 보낼 수 있는 건 아니고, 목적지까지 가는 무수히 많은 길 중 어떤 경로로 보낼지도 결정해야 하고 이 작업을 라우팅이라고 한다. 이를 라우터가 하며, 라우터엔 라우팅 테이블이 있어 경로 정보를 등록하고 관리한다. 

 

  네트워크 계층에는 IP(Internet Protocol)이란 프로토콜이 있는데, 이 IP를 통해서 다른 네트워크의 컴퓨터로 데이터를 보낼 수 있다. 네트워크 계층에서 캡슐화할 때 붙이는 헤더가 IP헤더이며, 여기엔 출발지 IP주소와 도착지 IP주소를 비롯한 다양한 정보들이 들어간다. 데이터링크 계층에서 이더넷 헤더와 트레일러를 붙인 덩어리를 프레임이라고 부른 것처럼 네트워크 계층에선 이 IP헤더를 붙인 덩어리를 IP 패킷이라고 부른다.

 

  IP주소는 네트워크ID를 통해 "어떤 네트워크"인지 나타내고, 호스트ID를 통해 "어떤 컴퓨터"인지 나타낸다.

 

.. 추후 추가 예정..

물리계층에서 하는 일

0과 1만으로 이루어진 비트열을 전기 신호로 변환하고, 이것이 물리 계층을 통해 전달됨.  수신 측에선 전기 신호를 0과 1의 비트열 데이터로 복원.

 

컴퓨터는 네트워크를 통해 데이터를 송수신할 수 있도록 랜카드를 가지고 있음. 이를 통해 0과 1을(즉 비트열을) 전기 신호로 변환 가능.

 

암튼, 물리 계층은 컴퓨터와 네트워크 장비를 연결하고 이들간에 전송되는 데이터를 전기 신호로 바꿔주는 계층이다.

 

데이터링크계층에서 하는 일

랜에서 데이터를 정상적으로 주고 받으려면 데이터 링크 계층의 기술이 필요하다. 그 기술에 대해 알아보자.

 

데이터 링크 계층은 네트워크 장비 간에 신호를 주고받는 규칙을 정하는 계층이다. 이 규칙들 중 가장 많이 사용되는 것은 이더넷이며, 허브와 같은 장비에 연결된 컴퓨터와 데이터를 주고받을 때 이더넷을 사용한다. (허브는 약해진 전기신호를 다시 복원사쿄 전달받은 포트를 제외한 나머지 포트에 전기 신호를 전달하는 장치. 즉 허브는 일종의 경유지느낌인데, 경유지를 거쳐 목적지에만 딱 가야 하지만 경유지를 거치는 모든 집에 다 가게 되는 것임). 다만 허브 특성상 A입장에서는 B에만 보내고 싶지만 허브에서 갈 수 있는 다른 집들도 다 데이터가 보내지기 때문에, 목적지 정보를 추가해서 전송하여 목적지 이외의 컴퓨터들로 하여금 데이터를 받더라도 무시하도록 한다.

 

근데 이 허브에서 컴퓨터 여러 대가 동시에 데이터를 보낸다면 충돌이 일어날 수도 있는데, 이를 방지하기 위해 CSMA/CD라는 방법을 통해 데이터를 보내는 시점을 늦춘다. 즉 조절하는 것. 데이터를 보내려고 하는 케이블에 신호가 흐르고 있는지 확인한 다음, 흐르고 있지 않다면(즉 해당 통로를 누가 쓰고 있는 게 아니라면) 그 때 보내는 식이다. But..지금은 효율이 안 좋아서 CSMA/CD는 거의 안 쓴다고 함. 스위치라는 효율적인 장비가 생겼기 때문!

 

MAC주소?

랜카드는 비트열을 전기 신호로 변환한다고 앞서 설명했다. 이 랜카드에는 MAC주소라는 번호가 정해져 있는데, 이는 각 랜카드마다 고유하다 즉 전세계에서 유일한 번호로 정해진다. 내 랜카드의 번호가 001이면 지구상의 다른 랜카드 중에서 001이란 MAC주소를 갖는 랜카드는 없는 것이다. 

 

데이터 송신 시 각 계층에서 헤더를 붙여 더 큰 덩어리로 만들어 다음 계층으로 보낸다고 했는데, 데이터 링크 계층에서는 헤더 말고도 트레일러를 붙인다고 했었다. 정확히 말하면 데이터 링크 계층에선 이더넷 헤더와 트레일러를 붙이는데, 이더넷 헤더는 목적지의 MAC주소와 출발지의 MAC주소 그리고 유형이라는 3가지 정보를 갖는다. 유형은 프로토콜 정보를 식별하는 번호라고 이해하면 됨. 트레일러는 FCS(Frame Check Sequence)라고도 부르며, 데이터 전송 도중 오류가 발생하는지 확인하는 용도로 쓴다. 암튼 뭐..이처럼 이더넷 헤더와 트레일러가 추가된 덩어리를 프레임이라고 부른다. 네트워크를 통해 이 프레임이 전송되는 것..! 더 구체적으론 물리 계층에서 이 프레임 비트열을 전기 신호로 바꾼 다음 네트워크를 통해 전송하는 것임. 참고로 아까 허브 구조에서 송신자는 데이터에 목적지 정보를 추가해서 목적지 이외의 다른 컴퓨터들로 하여금 데이터를 받더라고 무시하도록 한다고 했는데 이 때 목적지 정보가 목적지 MAC주소를 의미. 수신 계층에서는 물리 계층에서 전기 신호로 전송된 데이터를 비트열로 변환하고 데이터 링크 계층에서 이더넷 헤더와 트레일러를 분리한다.

 

스위치?

데이터 링크 계층에서 동작하는 장치이며 스위칭 허브라고도 부른다. 스위치 내부에는 MAC주소 테이블이란 것이 있는데, 이 테이블엔 스위치에 있는 포트 번호와 해당 포트에 연결된 컴퓨터들의 MAC주소가 등록된다. 아까 프레임 전송시 이더넷 헤더에 출발지의 MAC주소를 보낸다고 했는데, 이걸 보고 출발지 MAC주소를 그 포트와 함께 등록하는 식으로 MAC주소 테이블이 형성된다. 

 

그러나 처음 데이터를 보내는 경우 출발지 MAC주소와 포트는 등록했지만, 도대체 어느 포트로 보내야 목적지 MAC 주소로 보내지는지 알 수 없을 수밖에 없다. 이 때는 뭐다? 일단 다 보내본다. 하나는 들어맞을 거니까..이렇게 일단 무지성으로 다 보내는 것을 플러딩(flooding)이라고 한다.

 

만약 목적지 MAC주소가 어느 포트번호가 매핑되는지에 대한 정보가 MAC주소 테이블에 있다면, 이를 참조해 다른 포트에는 안 보내고  그 포트에만 프레임을 보낸다. 이것이 허브와의 가장 큰 차이점이다. 허브는 일단 다 보내는데 목적지 MAC과 다른 MAC주소를 갖고 있으면 무시하도록 한 것이기 때문에 아무튼 다 보내진다는 단점이 있지만 스위치는 딱 필요한 데만 보내기 때문. 이를 MAC주소 필터링이라고 한다.

 

케이블에 데이터가 아무리 많이 전송되어도 충돌하지 않는 이유?

먼저 통신 방식은 두 개로 분류할 수 있다. 첫 째는 데이터의 송수신을 동시에 하는 전이중 통신 방식이고, 둘째는 회선 하나로 수신과 송신을 번갈아가며 하는 반이중 통신 방식이다. 컴퓨터 A, B를 직접 랜케이블로 연결한다면 전이중 통신 방식을 사용하게 되지만(즉 양측에서 동시에 데이터 송신 가능. A가 송신하는 케이블은 B에겐 수신케이블이고,  A가 수신하는 케이블은 B에겐 송신케이블임) 허브는 송수신용 케이블이 나누어져 있지 않기 때문에 동시에 데이터를 보내면 충돌이 일어난다. 즉 이땐 회선 하나를 수신과 송신이 번갈아가며 사용하는 반이중 통신 방식이 사용된다.

 

B U T  스위치는 포트별로 수신통로와 송신통로가 별도로 있기 때문에, 전이중 통신 방식 즉 동시에 송수신이 가능하다. 

 

암튼 다시 허브로 돌아와서, 반이중 방식으로 동시에 데이터를 전송하면 충돌이 나는데 이 충돌의 영향이 미치는 범위를 충돌 도메인이라고 한다. 허브는 연결되어 있는 컴퓨터 전체가 충돌 도메인이 된다. 스위치는 데이터를 동시에 송수신 가능한 전이중 통신 방식이므로 충돌이 일어나도 충돌 도메인의 범위가 훨씬 좁다. 내(A)가 C에게 송신하려는데 C가 이미 B로부터 뭔가 받고 있다면 나만 기다리면 되는 거고 D, E이런 애들은 상관 없는 거니까.

 

 

 

네트워크 : 두 대 이상의 컴퓨터가 연결된 것

인터넷 : 전 세계를 아우르는 거대한 네트워크. 이를 통해 해외 웹 사이트도 볼 수 있는 것

 

네트워크 or 인터넷에서 데이터를 주고 받으려면 규칙이 필요하고 이 규칙엔 packet을 사용. 패킷은 컴퓨터 간에 데이터를 주고받을 때 네트워크를 통해 전송되는 데이터의 작은 조각을 말함. 큰 데이터가 있더라도 작게 나누어 보내는 게 원칙. 

※ 큰 데이터를 나눠서 보내는 이유? : 그대로 보내면 그 데이터가 네트워크의 대역폭을 너무 많이 차지해 다른 패킷의 흐름을 막을 수도 있어서. 즉 도로의 너비에 비해 차가 너무 뚱뚱하면 막힌다는 것

 

따라서 목적지에서는 받은 패킷들을 다시 조립해 원래 데이터를 만드는 작업이 수반됨. 다만 순서대로 패킷이 도착하지도 않고 몇 개는 누락되기도 함. 때문에 송신 측에서 패킷에 순서대로 번호를 붙여 보내고, 수신 측에서는 번호 순대로 패킷들을 정렬해 조립함. 

 

랜과 왠의 차이

랜 : 건물 안이나 특정 지역을 범위로 하는 네트워크

왠 : 지리적으로 넓은 범위에 구축된 네트워크. ISP(인터넷 서비스 제공자. KT, LG U plus 등)가 제공하는 서비스를 사용해 구축된 네트워크를 말한다. 랜과 랜을 왠을 통해 연결한다고 생각할 수 있다.

가정과 회사에서 구축하는 랜 구성은 다르다. 가정은 뭐 알다시피 공유기를 통해 컴퓨터 핸드폰 등을 연결한 뒤 공유기가 ISP와 연결되는 구조인 반면, 회사는 방금 설명한 것에 더불어 웹 서버 / 메일 서버 / DNS서버와 같은 다양한 서버를 아우르는 DMZ 네트워크 영역(외부에 공개하기 위한 네트워크)들로 구성된다. DMZ는 가정에서의 랜 구조와 ISP 중간에 위치하는 네트워크라 보면 된다. 

 

네트워크에서도 문제없이 통신하려면 규칙이 필요하다. 이 규칙을 프로토콜이라고 한다. 데이터를 이런 형태로 가공하고, 데이터를 이렇게 보내고, 받는 곳에선 어떻게 하고 뭐 이런 규칙들을 하나하나 만들었고 이들을 아울러 프로토콜이라 하는 것. 

 

OSI모델?

네트워크 기술의 기본이 되는 모델(표준)이다. 데이터의 송수신은 곧 컴퓨터로 데이터를 주고받는 것을 말하는데, 이 때 컴퓨터 내부에선 다음과 같이 일곱 개 계층으로 나누어 작업을 해야 한다는 모델이 OSI모델이다.

 

응용계층

표현계층

세션계층

전송계층

네트워크계층

데이터링크계층

물리계층

 

통신할 때 데이터는 맨 위 응용 계층부터 맨 아래 물리계층까지 순차적으로 전달된다. 각 계층의 역할은 다음과 같다.

 

응용계층 : 이메일 & 파일 전송, 웹 사이트 조회 등 애플리케이션에 대한 서비스 제공

표현 계층 : 문자 코드, 압축, 암호화 등의 데이터를 변환

세션계층 : 세션체결, 통신 방식을 결정

전송계층 : 신뢰할 수 있는 통신을 구현

네트워크계층 : 다른 네트워크와 통신하기 위한 경로 설정 및 논리 주소를 결정

데이터 링크 계층 : 네트워크 기기 간의 데이터 전송 및 물리 주소 결정

물리 계층 : 시스템 간의 물리적인 연결과 전기 신호를 변환 및 제어

 

참고 : 일반적으로 표현 / 세션 계층은 응용 계층에 포함하여 생각할 수 있음

송신 측에서는 상위계층 ~ 하위계층으로 데이터를 전달하고, 수신 계층에선 하위 계층 ~ 상위계층으로 데이터를 받는다. 각 계층은 독립적이어서 데이터가 전달되는 동안 다른 계층의 영향을 받지 않는다. 

 

TCP/IP모델?

OSI의 7계층을 4계층으로 표현한 모델.

 

응용계층(응용 + 표현 + 세션)

전송계층

인터넷 계층(네트워크 계층)

네트워크 접속 계층(데이터링크 + 물리)

 

각각 계층엔 다양한 프로토콜(통신 규칙)이 있다. 데이터를 주고받는 것에 있어 어떤 계층들을 거치게 하기로 정해뒀고, 각 계층에서 정해진 규칙들을 따르도록 만들었다고 생각하면 됨. 

데이터를 보낼 때, 상위계층 ~ 하위계층으로 데이터를 보낸다고 했다. 각 계층에서 데이터의 앞 부분에 필요한 정보를 붙여서 다음 계층으로 보내는데, 이때 붙이는 정보들을 헤더라고 한다. 헤더에는 데이터를 전달받을 상태에 대한 정보도 포함되어 있다. 이렇게 헤더를 붙여 나가는 것을 캡슐화라고 한다. 반대의 작업은 역캡슐화.

 

한 번 더 설명하자면, 응용계층에서 데이터에 헤더를 붙여 만든 덩어리를 전송계층으로 보내고, 전송에서도 헤더를 붙여 만든 더 커진 덩어리를 네트워크 계층으로 보내고..결국 마지막엔 물리 계층에선 이 커다란 덩어리를 전기신호로 수신측으로 보내는 것임. (데이터 링크 계층에선 헤더말고도 꼬리쪽에 트레일러를 따로 붙임)

 

 

 

 

 

 

 

 

 

 

 

 

 

https://programmers.co.kr/learn/courses/30/lessons/72410

 

코딩테스트 연습 - 신규 아이디 추천

카카오에 입사한 신입 개발자 네오는 "카카오계정개발팀"에 배치되어, 카카오 서비스에 가입하는 유저들의 아이디를 생성하는 업무를 담당하게 되었습니다. "네오"에게 주어진 첫 업무는 새로

programmers.co.kr

문제에서 요구하는 순서대로 구현해나가면 쉽게 풀이가 가능.

단 문자열을 좀 다룰 줄 알아야 했다.

풀면서 이번에 좀 알고가야겠다 싶은 메소드들을 정리해봤다.

def solution(new_id):
    can_ch = set(['-', '_', '.'])
    
    new_id = new_id.lower()
    answer = ''
    
    for ch in new_id:
        if ch.isalnum() or ch in can_ch:
            answer += ch
            
    while ".." in answer:
        answer = answer.replace("..", ".")
        
    answer = answer.strip(".")

    if len(answer) == 0:
        answer = "a"
    elif len(answer) >= 16:
        answer = answer[:15]
        if answer[-1] == '.':
            answer = answer[:14]

    while len(answer) <= 2:
        answer += answer[-1]
    return answer

1. isalnum() 메소드

문자열이 숫자 또는 알파벳으로만 구성돼있다면 True리턴. "1", "a", "123ab"이런 거 죄다 True뱉는다는거임.

비슷하게 숫자로만 구성돼있다면 True리턴하는 isdigit(), 알파벳으로만 구성돼있다면 True를 리턴하는 isalpha()도 있다.

 

2. replace() 메소드 (참고 : replace된 문자열을 리턴함. 원본 자체를 replace해주는 건 X)

문자열 내의 특정 문자열들을 모조리 임의의 문자열로 치환해주는 기능. 첫 파라미터가 바뀔 문자열, 두 번째 파라미터가 바꿀 문자열이다. 세 번째 파라미터는 옵셔널로 몇 개의 문자열을 바꿀지를 결정해준다.

주의할 점은 replace를 통해 새롭게 꽃단장을 한(?) 문자열에도 내가 바꾸고 싶어하는 문자열이 남아있을 수 있다.

예를 들어 "..."이란 문자열에서 ..을 .으로 바꿔야 한다고 해보자.

example_string = "..."
example_string = example_string.replace("..", ".") // ..

 사실 위 문자열에서 ..은 0 ~ 1번 인덱스, 1 ~ 2번 인덱스 이렇게 2개가 있는 상황으로 서로 1번 인덱스가 겹치는 상황인데 replace는 이런 상황을 방지?하기 위해 ..을 찾았다면 그 다음 위치부터 ..을 찾는 것 같다. 즉 0 ~ 1번 인덱스가 ..이니 2번 인덱스부터 ..을 다시 찾는것. 따라서 위 상황에선 0 ~ 1번 인덱스의 ..만 교체대상이라 판단한 후 교체해주는데, 교체된 후 새로 태어난 ..에 대해선 ..이 있는지 없는지 그런 건 검사하지 않는다는 것! 

 아마 내 예상으론 앞에서부터 탐색해나가며 교체대상 문자열을 마주칠때마다 바꾸는 게 아니라 위 방법처럼 "교체대상 찾으면 그 다음 인덱스부터 찾아나가기" 방식으로 바꿔야할 애들만 다 찾아놓은 후 한꺼번에 바꾸는 식으로 하는 것 같다.

 

3. strip()메소드

문자열 양끝에 특정 문자가 있으면 그 녀석들을 제거해주는 메소드. 아무 인자도 전달하지 않으면 공백문자를 제거하는 것이 디폴트고 임의의 문자를 전달하면 그 문자들을 제거한다. 참고로  lstrip은 왼쪽 끝, rstrip은 오른쪽 끝을 제거함. 참고로 양 끝을 제거하긴 하는데, 제거한 후에도 양 끝에 파라미터로 전달받은 문자가 있으면 다시 제거하는 걸 반복한다.

어떠한 데이터들이 주어졌다. 이해를 돕기 위해 이 데이터들은 각각 1개의 원인 x와 1개의 결과 y를 가진다고 하자. 그럼 다음과 같이 좌표평면에 나타낼 수 있다.

그리고 이 데이터(검은 점들)을 대표하는 선이 있다고 하면 어떨까?

이 선을 이용한다면, 우리가 가지고 있지 않은 데이터가 있다고 해도 그 데이터의 x값을 이용해 y값을 예측해낼 수 있다. 

 그러나 과연 어떤 선이 '이 데이터들을 대표하는 선'이라 할 수 있느냐는 문제에 직면하게 된다. 이 선도 저 선도 어제 그은 그 선도 다 대표하는 선이라고 갖다 붙일 수 있을텐데 말이다. 이 때, 이 데이터들을 대표하는 선을 다음과 같이 정의한다면 어떨까.

 

"실제 데이터와의 오차들의 합이 가장 작은 선"

 

이렇게 되면 무수히 많은 선들 중 이 데이터를 대표하는 선은 딱 하나가 된다. 실제 데이터과의 오차란, 같은 x에 대해 내가 그은 선에서의 y값과 실제 데이터의 y값과의 차이를 의미한다. 따라서 임의의 직선 y = ax + b가 있을 때, 실제 데이터들과의 오차들의 합이 가장 작게 되는 a와 b를 찾게 된다면 이를 통해 임의의 x값에 대한 y값을 예측 가능하다. 이를 선형 회귀라 하며 영어로는 Linear Regression이라 한다.

 

참고 : 실제 데이터와의 오차들의 합이 가장 작으면 실제 데이터와의 오차 평균이 가장 작은 선이라고 할 수 있다. 또한 엄밀하게 말하자면 오차들은 양수가 될 수 있지만 음수가 될 수도 있으므로 오차합을 따지는 건 적절치 않다. 따라서 오차의 제곱들의 평균이 제일 작게 되는 선이라고 표현하는게 정확하다. 아니면 뭐 오차의 절댓값의 합이 가장 작은 이렇게 편하게 가도 되고..

 

그럼 관건은 이 a와 b값을 도대체 어떻게 찾느냐는 것이다. 최소 제곱법이란 공식을 통해 기울기 a와 y절편 b를 바로 구할 수 있는 방법이 있지만 세상은 그리 녹록치 않다. 방금까지는 일차함수 y = ax + b꼴만을 얘기했으니 원인에 해당하는 값이 1개인 경우만 본 거지만 실제 세상은 하나의 원인만으로 결과가 만들어지지 않기 때문이다. 즉 최소 제곱법으로 a와 b를 직빵으로 구하는 방법을 쓰기엔 처리해야할 입력값들이 너무 많은 것. 

 

그럼 도대체 어떻게 a, b를 찾으라는 건데? 그건 바로

 

"일단 선 하나 그어봐. 그리고 수정해 나가자고"

 

이거다. 가설을 하나 세운 후 이 가설이 주어진 요건을 충족하는지 따져보고, 조금씩 수정해보며 변화가 긍정적인 쪽으로 수정해나가며 오차가 최소가 될 때까지 반복해보는 것. 이것을 하는 대표적인 방법으로 경사하강법이 있으며, 이는 다음 글에서 소개하겠다.

+ Recent posts