웹개발에 대해서 공부하면서 네트워크 지식이 부족하다보니 주먹구구식으로 블로그 글들만 슬쩍 읽고 지나치는 개념들이 많아졌다. 지금 다 기억을 못 해도 어쨌든 검색하는 시간이라도 줄일 수 있도록 알아야할 개념을 정리해야겠다.
인터넷을 통해 컴퓨터들이 서로 정보를 공유하는 방식도 프로토콜이 정해져있고, 이것을 Internet Protocol Suite
한다. 이 프로토콜을 7계층 모델 혹은 4계층의 추상화된 모델로 설명하는데 먼저 OSI 7 계층 모델 먼저 정리해봐야겠다.
Open System Interconnection
의 약자로, 개방형 시스템 상호연결을 의미하며 네트워크에서 통신이 일어나는 과정을 7단계로 나눈 모델이다.모든 파일과 프로그램은 0과 1로 나열되어있다. 컴퓨터와 컴퓨터가 통신할 때 서로 0과 1을 주고받으면서 정보를 나눈다.
이때 서로 통신하는 두 대의 컴퓨터 (A와 B 컴퓨터)가 "전선"을 통해 물리적으로 연결되어있다고 생각해보자.
그리고 통신할 때 전선에 다른 전기신호를 보냄으로서 0과 1을 구분한다.
0과 1만 전달할 수 있으면 사실상 모든 데이터를 주고받을 수 있기 때문에 A 컴퓨터와 B 컴퓨터는 서로 통신이 가능하게된다!
그럼 모든 컴퓨터들이 이렇게 전선으로 연결되어있기 때문에 우리는 서로 통신이 가능한걸까? 전선으로 연결되어있긴 하지만 그게 전부는 아니다.
우리가 생각하는 신호는 전자기파 (파동)의 형태로 전선을 통과하게 된다.
전자기파의 주파수 값은 일정하지 않는데, 파동이 초당 몇번을 진동하는지에 따라 주파수 (hertz)는 달라지기 때문이다.
그럼 어떠한 전자기파를 통해 우리가 데이터를 전달한다고 했을 때, 해당 전자기파의 주파수가 최소 1Hz ~ 10Hz
라고 가정해보자.
이렇게 생긴 전자기파를 전선을 통해 전달하는 것이다.
문제는 모든 전선이 모든 주파수를 통과시킬 수 없다는 것!
A 컴퓨터와 B 컴퓨터가 연결된 전선은 5Hz ~ 8Hz
만 통과시킬 수 있다고 해보자.
위 전자기파의 주파수가 1Hz ~ 10Hz
일때 저 전선을 통해 신호를 주고 받는다면 특정 구간의 전자기파만 통과된다. 그럼 처음에 보낸 신호와 나중에 받은 신호가 달라지게 되는 것이다. (데이터 소실)
당연히 아니다. 모든 범위의 주파수를 커버할 수 있는 전선이 없기 때문에 특정 주파수를 가진 아날로그 신호로 0과 1을 변형해서 전선을 통과시킨다.
어떠한 데이터가 0101 0101
형태라고 할 때, 이 데이터를 위와 같은 아날로그 신호로 정말 0과 1만 정의해서 전선을 통해 신호를 전송한다. 그리고 수신을 받은 컴퓨터는 전달된 아날로그 신호를 해석해서 0101 0101
이라는 결과값을 얻는다.
이때 각 컴퓨터에 있는 Encoder / Decoder는 PHY칩이라는 부품에 구현되어있다. PHY칩이라는 하드웨어에서 데이터라는 인풋을 아날로그 신호라는 아웃풋으로 변경하거나 아날로그 신호라는 인풋을 데이터라는 아웃풋으로 변경하는 것이다.
그럴리가... 이때 등장하는 개념이 바로 "라우터"
이다.
라우터 이전에 "스위치"
라는 개념이 있는데, 여러개의 컴퓨터가 특정 허브에 연결되어있다고 생각해보자.
여기서 예림이라 혜림이에게 데이터를 전달하고 싶다고 한다면, 이 스위치는 송신자가 데이터를 보내는 수신자를 인식해서 신호가 다른 사람이 아니라 특정 수신자에게 도착할 수 있게 해준다.
이렇게 하나의 스위치에 연결되어 있는 것을 "네트워크"
라고 한다.
그럼 스위치와 스위치를 연결함으로서 통신을 진행하는데, 그것을 "라우터"
라고 한다.
그리고 이 라우터가 공유기에 해당된다.
이렇게 수 많은 네트워크들이 라우터를 통해 연결된것이 우리가 생각하는 "인터넷"
인 것!
이런 통신을 진행하기 위해 실제로 해저 케이블이 전선의 역할을 하게된다. 해저 케이블을 통해 세계는 진짜 실제로, 물리적으로 연결이 되어있다!!! 해저 케이블 관리자분들 화이팅! 💪
이제 실제로 전선을 통해 두 대의 컴퓨터가 데이터를 주고 받는다는 것을 알게되었다. 그럼 여러 대의 컴퓨터가 데이터를 주고 받기 위해선 어떤 과정이 필요할까?
만약 예림이라 여러명의 친구들과 채팅을 하고 있다고 가정해보자.
0101
이라는 데이터, 1111
이라는 데이터, 0001
이라는 데이터를 보낸다010111110001
이라는 데이터가 도착하는 걸까? 수신자의 컴퓨터는 각 컴퓨터가 보낸 데이터를 똑바로 구분해서 읽어야 하는데, 데이터를 구분할 수 있도록 송신자의 컴퓨터는 보내고자하는 데이터의 앞뒤로 특정한 비트열을 붙이게 된다.
예를 들어 0101
데이터를 보낸 송신자의 컴퓨터는 데이터의 앞뒤로 1111
과 0000
을 붙여 111101010000
형식의 데이터를 보내는 것.
아까 예림이가 3대의 컴퓨터로부터 받은 데이터는 111101010000 111111110000 111100010000
의 형태로 받아서 데이터를 구분할 수 있다.
이렇게 원본 데이터를 특정한 비트열로 감싸는 과정을 "Framing"
이라고 한다.
특정 컴퓨터에게 데이터를 전송하기 위해 송신자 컴퓨터는 수신자 컴퓨터의 IP 주소를 알고있어야 한다. 목적지인 IP 주소를 전달하고자 하는 데이터 앞에 붙이게 되는데 이것을 "패킷(packet)"
이라고 한다.
IP 주소가 55.10.54.75 인 컴퓨터로 데이터를 전달한다고 가정해보자.
그럼 송신자 컴퓨터는 55.10.54.75 data
형태의 데이터를 내보낸다. Framing까지 완료된 데이터는 포장된 패킷이 되어 라우터에 전달된다.
라우터는 해당 패킷을 뜯어보고 자신과 직접적으로 연결된 컴퓨터 중 IP주소가 같은 컴퓨터가 있는지 확인한다.
이때 해당하는 수신자 컴퓨터가 없을 때 라우터는 자신 상위의 라우터에게 패킷을 다시 포장해서 전달한다. 그리고 상위 라우터는 자신과 연결된 수 많은 라우터 중 어디로 보내야할지 결정하게 된다.
라우터가 데이터의 목적지를 선택하는 과정을 "라우팅(Routing)"
이라고 한다. 라우터는 라우팅 테이블이라는 어떠한 표를 갖고 있고, 이 표에는 자신과 연결된 목적지의 주소들이 나열되어있다.
라우터는 패킷의 헤더에서 목적지에 대한 정보를 얻고, "라우팅 프로토콜(Routing Protocol)
을 통해 패킷을 식별해서 전달해야하는 네트워크 경로를 선택한다.
이제 컴퓨터는 전세계 어디에서든 데이터를 송수신할 수 있다. 하지만 특정 컴퓨터가 데이터를 여러개를 전달 받는다고 했을 때, 해당 데이터들이 어떤 프로그램(프로세스)을 위한 데이터인지 어떻게 구분할 수 있을까?
아래 사진처럼, 3가지 데이터를 받는다고 하고, 사용자의 컴퓨터엔 현재 2개의 프로그램이 실행중이라고 한다면, 어떤 데이터가 어떤 프로그램에 사용되는 데이터인지 컴퓨터는 구분해야만한다.
데이터를 받는 프로세스들은 각자 "포트번호"
를 갖고 있다.
송신자는 데이터를 보낼 때 해당 데이터가 도달해야하는 프로세스의 포트번호가 포함되어야 한다.
이렇게 1~4단계를 통해 두 대의 컴퓨터가 데이터를 주고 받는 "통신"을 진행한다. 이때 해당 통신의 시작과 종료를 담당하는 계층이 바로 Session Layer다.
통신이 시작될 때부터 종료될 때까지의 시간을 세션이라고 하기 때문에 해당 작업을 담당하는 계층이 세션 레이어가 되는 것!
세션 계층은 교환되고 있는 모든 데이터를 전송할 수 있도록 충분히 오랫동안 세션을 개방한 다음 리소스를 낭비하지 않기 위해 세션을 즉시 닫을 수 있도록 조취를 취해야한다.
또한 세션 계층은 데이터 전송을 체크포인트와 동기화하는 작업을 담당한다.
프레젠테이션 계층은 데이터의 변환, 암호화, 압축을 담당한다. 송신 측과 수신 측 사이에서 데이터의 형식(png, jpg 등)을 정하고, 받은 데이터를 코드 변환, 구문 검색, 인코딩 - 디코딩 및 암호화, 압축의 과정을 통해 올바른 표준 방식으로 변환한다.
서로 통신하는 두 개의 통신 장치는 서로 다른 인코딩 방법을 사용하고 있을 수 있으므로, 계층 6은 수신 장치의 애플리케이션 계층이 이해할 수 있는 구문으로 수신 데이터를 변환하는 일을 담당하는 것이다.
장치가 암호화된 연결을 통해 통신하는 경우, 계층 6은 최종 송신자에게 암호화를 추가할 뿐만 아니라 최종 수신자에게 암호화를 디코딩하여 암호화되지 않은 읽기 쉬운 데이터로 애플리케이션 계층을 제시할 수 있도록 하는 역할을 맡기도 한다.
운영체제의 Transport Layer에서 제공하는 API를 활용해 통신 가능한 프로그램을 만드는 것을 네트워크 프로그래밍이라고 한다. (TCP / IP 소켓 프로그래밍이라고도 한다.)
이 프로그래밍만으로도 클라이언트 프로그램과 서버 프로그램을 따로따로 만들어서 동작시킬 수 있다. 또한 누구나 자신만의 Application Layer 인코더와 디코더를 만들 수 있다.
"HTTP 프로토콜"
이다.출처