일반적으로 서비스를 요청하는 측을 클라이언트, 제공하는 측을 서버라고 한다. 웹 브라우저, 메일 프로그램 등은 사용지 측에서 사용하는 클라이언트 애플리케이션이고, 웹 서버 프로그램이나 메일 서버 프로그램 등은 서버 측에서 쓰는 서버 애플리케이션이라 볼 수 있다. 이러한 애플리케이션은 모두 응용 계층(application layer)에서 동작한다.

 

  물리 계층, 데이터링크 계층, 네트워크 계층, 전송 계층을 통해 상대방에게 데이터를 정확하게 전달할 수 있다는 것을 알게 됐다. 응용 계층은 애플리케이션과 데이터를 주고받기 위해 필요한 부분으로, 클라이언트의 요청(request)를 전달하기 위해 통신 대상(서버 등)이 이해할 수 있는 메세지(데이터)로 변환하고 이를 전송 계층으로 전달하는 역할을 한다. 웹 브라우저, 메일 프로그램 등과 같은 클라이언트 측 애플리케이션이 서버 측 애플리케이션과 통신하려면 응용 계층의 프로토콜을 사용해야 한다. 웹 사이트를 볼 땐 HTTP, 파일을 전송할 땐 FTP, 메일을 보낼 땐 SMTP, 메일을 받을 때는 POP3라는 프로토콜을 사용한다. 암튼 결국, 응용 계층은 각각의 애플리케이션에 대응되는 데이터를 전송 계층으로 전달하는 역할을 한다. 

 

HTTP란?

  클라이언트(웹 브라우저)는 웹 사이트를 보기 위해 서버(웹 서버 프로그램)의 80번 포트를 사용해 HTTP통신을 한다. 클라이언트 측에서 HTTP request를 보내고, 서버 측에서 HTTP response를 반환하는 식이다. 지금은 HTTP/2나 HTTP/1.1버전을 사용하지만 옛날에 쓰던 HTTP/1.0버전에서는 요청을 보낼 때마다 연결했다가 응답이 오면 연결을 끊고, 요청을 또 보내게 되면 새롭게 연결하는 방식을 사용했으나 HTTP/1.1버전부터는 keepalive라는 기능이 추가되면서 연결이 한 번 되면 데이터 교환을 마칠 때까지 연결을 유지하는 방식이 가능하게 됐다. HTTP/1.1버전은 요청을 보낸 순서대로 응답을 반환한다는 특징이 있어서 이전 요청을 처리하는 시간이 길어지면 다음 요청이 밀리는 단점이 있었는데. 2.0버전부터는 순서대로 응답을 반환할 필요가 없어져서 콘텐츠를 더욱 빠르게 표시할 수 있게 됐다.

 

DNS?

  특정 사이트를 보고싶으면 특정 IP주소를 통해 웹 서버에 접속해 웹 사이트를 보는게 맞다. 네이버에 가고 싶으면 주소창에 www.naver.com을 쳐서 웹사이트를 본다. ..? 뭔가 이상하지 않은가? 네이버의 IP주소가 아니라 다른 걸 입력했는데 네이버의 웹사이트를 보고 있는 셈이니 말이다. 이것이 DNS덕분이다. 간단히 말해 DNS는 URL을 IP주소로 변환하는 시스템이다. www로 시작하는 저 url대신에 실제 네이버의 IP주소를 통해서도 물론 웹 서버에 요청을 보낼 수 있지만 네이버, 다음, 구글 등의 IP주소를 하나하나 기억하는 것은 쉬운 것이 아니다. 예를 들어 뭐..친구들 전화번호 다 외우고 있는 사람 없을 것이다. 다 전화번호부에 이름으로 저장해서 그 이름에 전화걸지..일일이 전화번호 외워서 전화거는 사람은 별로 없을 거란 얘기. DNS는 즉 일종의 전화번호부라고 생각할 수도 있겠다. 아무튼 특정 url을 사용해 웹 서버에 접속하도록 돕는 것을 DNS의 이름 해석이라고 말하며, 이는 내가 원하는 url의 IP주소를 알려주는 것을 의미한다. url을 입력하면 컴퓨터가 먼저 DNS서버에게 이 url의 IP주소를 알려달라고 요청하고, DNS서버는 컴퓨터에게 그 url의 IP주소를 반환한다. 이를 이용해 그 IP주소로 접속할 수 있는 것.

 

메일 서버의 구조

  메일을 송수신하기 위해서는 클라이언트 측의 메일 프로그램과 서버 측의 메일 서버 프로그램 간에 통신을 해야 한다. 이 때 사용되는 프로토콜의 종류에는 두 가지가 있는데 첫째는 메일을 보내는데 사용되는 SMTP고 둘째는 메일을 받는데 사용되는 POP3다. SMTP는 포트번호로 25번을, POP3는 포트 번호로 110번을 사용한다. 좀 더 정확히 설명하자면 컴퓨터 A, B와 메일 서버1, 메일 서버 2가 있을 때 SMTP를 이용해 A에서 메일서버1로 메일을 보내고, 마찬가지로 SMTP를 이용해 메일서버1에서 메일서버2로 메일을 보낸다음 POP3를 이용해 메일서버2에서 B로 메일을 보낸다. 

 

SMTP에 의한 메일 송신

  다음과 같은 순서로 진행된다

 

1) 세션 시작 통지

2) 송신자의 메일 주소 통지

3) 목적지 메일 주소 통지

4) 메일 본문 전송 통지

5) 메일 본문 송신

6) 세션 종료 통지

 

각 과정마다 응답을 받은 후 다음 과정이 진행되는 식. 방금 살펴본 것이 컴퓨터 A에서 메일서버1로 보내는 과정이었고, 메일서버1에서도 SMTP를 이용해 메일 서버2로 메일을 보낸다.

 

POP3에 의한 메일 수신

  메일 서버에는 메일 박스라고 불리는 메일을 보관해 주는 기능이 있다. 메일 서버2는 POP3를 사용해 메일 서버2의 메일박스에서 메일을 가져와 컴퓨터 B로 전송한다. B입장에서 메일 서버2로부터 메일을 수신할 때는 사용자 이름과 비밀번호를 이용한 사용자 인증이 필요하다. POP3 프로토콜로 110번 포트를 사용한다. POP3는 다음과 같은 순서로 진행된다. B가 메일서버2에게

 

1) 세션 시작 통지 -> 메일서버2가 확인응답 보냄

2) 수신자의 사용자이름 통지 -> 메일서버2가 확인응답 보냄

3) 수신자의 비밀번호 통지  -> 메일서버2가 확인응답 보냄

4) 메일을 확인  -> 메일서버2가 "있음"이라는 확인응답 보냄

5) 메일의 전송 요청 -> 메일서버2가 메일내용 전송

6) 세션 종료 요청

  네트워크 계층을 설명할 때 다른 네트워크로 데이터를 전송하려면 라우터가 필요하고, 라우터의 라우팅 기능을 사용해 전송할 수 있다고 했다. 문제는 이렇게 데이터를 전송하더라고 목적지에 잘 도착하지 않을 수도 있다는 것! 우리가 편지를 보낼 때도 예기치 못한 사고로 인해 배송이 지연되거나 중간에 분실되거나 할 수 있는 것처럼 말이다. 물리 계층, 데이터 링크 계층, 네트워크 계층을 통해서 목적지에 데이터를 보낼 수는 있지만, 배송 과정에서 데이터가 손상되거나 유실되더라도 이들은 아무것도 해주지 않는다 즉 책임을 지지 않는다. 참으로 괘씸하기 짝이 없다.  이 때 전송 계층(transport layer)는 목적지에 신뢰할 수 있는 데이터를 전달하기 위해 필요한 계층으로, 오류를 점검하는 기능이 있다! 이를 통해 오류가 발생하면 데이터의 재전송을 요청하기도 한다. 다시 말하면 네트워크 계층이 목적지까지 데이터를 전달하는 역할을 한다면 전송 계층에서는 데이터가 제대로 잘 갔는지 확인하는 역할을 하는 것이다. 

  

  전송 계층은 오류 점검말고도 한 가지 역할을 더 수행한다. 건물로 편지를 잘 보냈지만 그 건물 어느 호실에 편지를 전해야 할 지 모른다면 어떠겠는가? 마찬가지로 컴퓨터가 데이터를 받아도 어떤 애플리케이션에 전달해야 하는지 모른다면 곤란하게 된다. 전송계층에서는 전송된 데이터의 목적지가 어떤 애플리케이션인지 식별하는 역할 역시 수행한다.

 

  전송 계층의 특징을 간단히 설명하면 신뢰성/정확성효율성으로 구분할 수 있다. 신뢰성/정확성은 데이터를 목적지에 문제없이 전달하는 것을, 효율성은 데이터를 빠르고 효율적으로 전달하는 것을 의미한다. 이 때 신뢰할 수 있고 정확한 데이터를 전달하는 통신을 연결형 통신이라고 하고, 효율적으로 데이터를 전달하는 것을 비연결형 통신이라고 한다. 좀 더 설명하자면 연결형 통신은 상대편(수신자)와 하나하나 확인하면서 데이터를 전송하는 방식이고, 비연결형 통신은 일방적으로 데이터를 전송하는 방식이다.

 

ex) 연결형 통신

A : 보내도 돼?

B : 네, 보내세요

A : 보냅니다!

B : 받았슴다~!

A  : 확인~

 

ex) 비연결형 통신A : 보낸다~수고~

 

이는 당연한 얘기지만 연결형 통신은 신뢰성/정확성을 우선으로 하는 통신이고, 비연결형 통신은 효율성을 우선으로 하는 통신방식이기 때문에 그렇다. 그럼 여기서 궁금한 점이 생길 수 있다. 신뢰성과 정확성이 보장되지 않는 저 상도덕 없이 일방적으로만 보내는 비연결형통신을 사용하는 경우가 있는가? 정답은 당연히 Yes, 예를 들면 동영상을 시청할 때다. 동영상은 아무래도 빠른 전송이 필요하기 때문! 정확하게 하나하나 확인하면서 한다고 하면 데이터가 늦게 도착해 화면이 버벅거리는 영상을 보게 될텐데, 그것보다는 좀 유실되더라도 원활하게 보는 것이 낫기 때문이다. 이 연결형 통신의 프로토콜로는 그 유명한 TCP가 쓰이고, 비연결형 통신 프로토콜로는 UDP가 사용된다.

 

 

TCP의 구조 [1] 3-way handskake

  다른 계층과 마찬가지로 전송계층에서 TCP프로토콜로 데이터를 전송할 때도 데이터에 TCP헤더를 붙여서 덩어리를 만들어 보내며, 이 덩어리를 세그먼트라고 한다. 이 TCP헤더에는 출발지 포트 번호, 목적지 포트 번호, 일련번호, 확인 응답 번호..등과 같은 다양한 정보들이 담긴다. 앞서 말했듯 TCP는 꼼꼼하게 상대방을 확인하면서 데이터를 보내는 연결형 통신이기 때문에 사실 데이터를 전송하기 전에 해야 하는 작업이 있다. 그건 바로 데이터를 전송하기 위해 연결(connection)이라는 가상의 우리 둘만의♡(즉 독점적인) 통신로를 확보하는 것이다. 이 연결을 확보한 후에 데이터를 전송할 수 있다.

 

  이 연결을 그럼 어떻게 확보하는가? TCP헤더를 보면 107 ~ 112비트까지의 총 6비트로 구성된 '코드 비트'라는 정보가 있다. 이 코드 비트에 연결의 제어 정보가 기록되는데, 6개 비트가 각 비트별로 역할이 있다. 6개 각 비트들에는 URG, ACK등 각각을 칭하는 이름이 있으며 이들의 초깃값은 0이고 활성화되면 1이 된다. 이 때 우리가 원하는 '연결'을 확보하려면 이 중 SYNACK가 필요하다. SYN은 연결 요청, ACK는 확인 응답을 뜻한다. 이 두 녀석을 활용해 '연결'은 다음과 같이 3-way handshake로 확립된다.

 

ex)컴퓨터 A, B가 있고 A가 B랑 연결을 확보하고 싶은 상황.

 

1) A가 먼저 B에게 허가를 받아야 하므로 연결 확보 허가를 받기 위한 요청(SYN)을 보낸다2) B는 A가 보낸 요청을 받은 후 허가한다는 응답을 회신하기 위해 ACK를 A에게 보낸다. 이와 함께 B 역시 A에게 데이터 전송 허가를 받기 위해 연결 확보 허가를 받기 위한 요청(SYN)을 보낸다.3) B의 요청을 받은 A는 허가한다는 응답(ACK)를 B에게 보낸다.

 

그림으로 나타내면 다음과 같다.

데이터를 보내기 전에 연결을 확보하기 위해 패킷 요청을 총 3번 교환하므로 3-way handshake라고 부른다. 네트워크 분야에서 이 핸드셰이크(handshake)는 사람들이 상대방을 확인하고 악수하는 것처럼 데이터 통신에서도 확실하게 데이터가 전송됐는지 확인하며 이루어지는 통신 수단을 말한다. 데이터를 다 전송한 후엔(서로 볼 일 다 봤을 땐) 바로 손절하는게 아니라 젠틀하게 연결을 끊기 위한 요청을 교환하는데, 이 때는 FIN과 ACK를 사용한다.

 

TCP의 구조 [2] 일련번호와 확인 응답 번호의 구조

  3-way handshake를 했다면 이제 데이터 전송을 해야 된다. 데이터 전송을 할 땐 이 땐 TCP헤더에서 일련번호와 확인응답번호가 쓰인다(둘 다 32비트). TCP는 데이터를 분할해서 보내게 되는데 일련번호는 순서를 가진 연속된 번호로 송신측에서 수신측에게 "이 데이터가 몇 번째 데이터야"라고 알려줄 때 쓰인다. 이를 통해 수신자는 이 데이터가 원래 데이터의 몇 번째 데이터인지 알 수 있다. 확인 응답 번호는 수신자가 송신자에게 몇 번째 데이터를 수신했는지 알려줄 때 쓰이는 번호로, 10번 데이터를 받았다면 송신자에세 확인 응답 번호로 11번을 보낸다. 뭐 굳이 뜻을 붙이자면 "저는 10번 데이터를 받았으니, 그 다음 번호인 11번을 주시면 됩니다" 하는 것이다. 이 작업을 '확인 응답'이라고 부른다.

 

  좀 더 구체적으로 설명하자면, 일련번호는 내가 보내는 데이터의 첫 번째 바이트 번호이다. 3001번 ~ 3200번까지의 200바이트짜리 데이터를 보낸다고 하면 일련번호는 3001이 되는 것. 이를 받는 쪽은 3001 ~ 3200번까지의 200바이트 데이터를 받았으니 다음엔 3201번부터 받을 차례이므로 확인 응답 번호로 3201을 보낸다. 이를 통해 내가 보낸 데이터가 잘 갔는지 확인이 가능하다. 데이터가 항상 올바르게 전달되는 것은 아니므로 일련 번호와 확인 응답 번호를 사용해 데이터가 손상되거나 유실된 경우가 확인되면 데이터를 재전송할 수 있는 것! 이를 재전송 제어라고 한다.

 

  이때까지 설명한 것은 세그먼트 하나를 보낼 때마다 확인 응답을 한 번 반환하는 통신이었다. 그러나 이 방법은 당연히 효율이 좋지 않다. 애시당초 연결형 통신 자체가 신뢰성/정확성을 우선시하는 통신이긴 하지만 그럼에도 불구하고 너무나도 극악의 효율이라는 것이다. 그러나 매번 하나 보내고 확인 응답 기다리고..를 반복하는 것보단 세그먼트를 연속해서 촤라락 보내고 난 다음에 확인 응답을 반환한다면 어떨까? 효율이 더 높아질 것이다! 그러나 이 경우 상대방 쪽에선 세그먼트가 점점 쌓일 것이라는 문제를 제기할 수 있는데, 받은 세그먼트를 일시적으로 보관할 수 있는 장소인 버퍼(buffer)가 있어서 괜찮다. 이 버퍼 덕분에 송신자 측에서 세그먼트를 연달아 보내도 수신 측은 대응이 가능하고 확인 응답의 효율이 높아진다. 

 

  그러나 버퍼의 크기는 정해져있기 마련이므로 너무 대량의 세그먼트를 받으면 처리하지 못하는 경우도 생긴다. 버퍼가 넘치게 되는 현상을 오버플로(overflow)라고 부르며, 이 오버플로가 발생하지 않도록 버퍼의 한계 크기를 알고 있어야 한다. 이것이 TCP헤더의 윈도우 크기 정보에 해당하는 부분이다. 윈도우 크기는 버퍼가 얼마나 많은 용량의 데이터를 저장해 둘 수 있는지에 대한, 즉 확인 응답을 일일이 하지 않고 연속해서 송수신 가능한 데이터 크기를 말한다. 이 윈도우 크기의 초깃값은 3-way handshake를 할 때 판단하며, 보내는 쪽의 윈도우 크기를 담아서 보내게 된다. 

 

ex) 컴퓨터 A가 B에게 SYN을 보낼 때 자신의 윈도우 크기를 담아서 보내고, B는 이를 통해 A의 윈도우 크기가 몇이구나를 알게 됨

 

이렇게 상대방의 윈도우 크기를 알게 됐다면 상대방 버퍼의 한계치를 알게 된 것이니, 세그먼트를 오버플로되지 않도록 보내면 되는 것!

 

TCP의 구조 [3] 포트 번호의 구조

  지금까지 연결 확보, 재전송 제어, 윈도우 크기에 대해 알아봤고 이들을 통해 TCP는 정확한 데이터 전송이 가능했다. 앞서 설명했듯 TCP는 이것 말고도 한 가지 역할을 더 하는데, 그건 바로 수신한 데이터가 어떤 애플리케이션에 가야 하는지 구분하는 역할이었다. 이를 위해 TCP헤더에는 출발지 포트 번호와 목적지 포트 번호에 대한 정보가 있고, 이를 통해 어떤 애플리케이션으로 가야 하는지 구분할 수 있다. 둘 다 16비트를 갖는  녀석으로 0 ~ 65535번까지의 포트번호를 쓸 수 있다고 생각할 수 있지만, 0 ~ 1023번 포트는 주요 프르토콜이 사용하도록 예약된 포트이다. 1024번은 예약되어 있지만 안 쓰는 포트고, 1025번 이상부터 랜덤 포트라고 부르며 클라이언트 측의 손싱 포트로 사용된다. 0 ~ 1023번 포트는 주로 서버 측 애플리케이션에서 사용된다.

 

  아무튼, 컴퓨터 상에서 애플리케이션들은 각각 포트 번호가 있어서 다른 애플리케이션과 구분되며, 데이터를 전송할 땐 상대방의 IP주소가 필요하지만 어떤 애플리케이션에게 줄 지를 결정하기 위해서 TCP는 꼭 포트 번호가 필요하다. 즉 일종의 창구 역할을 하는 것이 포트라고 생각할 수 있는 것. 

 

 

UDP의 구조

  UDP는 비연결형 통신이기 때문에 데이터를 전송할 때 TCP처럼 시간이 걸리는 확인 작업을 일일이 하지 않는다. 왜 why? 얘는 효율성을 더 우선시하는 통신방법이니까. 때문에 UDP의 장점은 데이터를 효율적으로 빠르게 보내는 것에 있기 때문에.

  

  TCP에서는 TCP헤더를 붙인 덩어리를 세그먼트라고 불렀던 반면 UDP는 UDP헤더를 붙인 덩어리를 UDP 데이터그램이라고 부른다. 이 녀석도 출발지 포트 번호, 목적지 포트 번호 등의 정보를 가진다. TCP와의 또 한 가지 차이점은 TCP는 번거롭게 여러 번 확인 응답을 보내며 전송하던 반면 UDP는 상대방을 확인하지 않고 연속해서 데이터를 보낸다! 즉 확인 응답 하지 않고 A쪽에서 B쪽으로 와다다다 데이터를 보내기만 하는 구조이다. 또한 UDP를 사용하면 랜에 있는 컴퓨터나 네트워크 장비에 데이터를 일괄로 보낼 수 있는데 이를 브로드캐스트(broadcast)라고 한다.

 

 

지금까지 전송계층에 대해 얘기했다. 다시 한 번 정리하자면, 전송 계층은 신뢰할 수 있는 데이터를 순차적으로 전달하는 역할을 하므로 상위 계층들이 데이터 전달의 유효성 등을(잘 전달됐을까..?) 신경스지 않도록 만들어준다! 상사한테 "신경쓰지 마십쇼. 제 선에서 처리하겠슴다"하면서 자기가 일일이 확인해주는 녀석.

 

 

  

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

 

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

전송계층

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

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

 

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

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

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

+ Recent posts