참고
Youtube의 우아한Tech 강의 히히
https://www.youtube.com/watch?v=1pfTxp25MA8
블로그
https://snyung.com/content/2020-08-31--네트워크-기초-osi-7-계층과-tcp-ip-계층/
https://velog.io/@hidaehyunlee/데이터가-전달되는-원리-OSI-7계층-모델과-TCPIP-모델
https://server-engineer.tistory.com/582
OSI 7 계층이란
: 네트워크에서 통신이 일어나는 과정을 7단계로 계층화하여 나눈 것을 말한다.
- 7단계로 나눈 이유.
통신이 일어나는 과정을 단계별로 파악하여 특정한 곳에 이상이 생긴다면, 다른 단계의 장비 또는 소프트웨어를 건들이지 않고 이상이 생긴 단계만 고칠 수 있기 때문이다.
OSI 7 Layer는 다음과 같이 나뉜다.
- 하지만 OSI 7 Layer Model은 참조 모델일 뿐, 실제 사용되는 인터넷 프로토콜은 이 7계층 구조를 완전히 따르지 않는다. (왜? : OSI 모델이 TCP/IP 모델과의 시장 점유율에서 졌기 때문)
- 근래의 인터넷 프로토콜 스택(Internet Protocol Stack)은 현재 대부분 TCP/IP 모델을 따르며 이 TCP/IP 모델 또한 한번 업데이트 되어 TCP/IP Updated 모델을 이제 주로 쓴다고 한다.
따라서 이번에 살피는 OSI 7 모델과 TCP/IP 모델은 전부 다 살피는 것이 아닌, 근래에 많이 쓰이는 TCP/IP Updated 모델이다. 5계층 과 6계층의 Session Layer와 Presentation Layer는 Application Layer 하나로 뭉뚱그려 살펴볼 것이다.
1계층: Physical Layer
정의
0과 1로 이루어진 데이터 신호를 아날로그 신호로 바꾸어 전선으로 흘려 보내고(encoding) 아날로그 신호가 들어오면 0과 1의 나열로 해석하여(decoding) 물리적으로 연결된 두 대의 컴퓨터가 0과 1의 나열을 주고받을 수 있게 해주는 모듈(module)이다.
깊게 가보자
- 모든 파일과 프로그램은 0과 1의 나열로 이루어져 있다. 결국, 두 대의 컴퓨터가 서로 통신한다는 것의 의미는 두 대의 컴퓨터가 0과 1로 이루어진 데이터들을 주고 받는다는 의미이다.
- 그렇게 되기 위해서는 두 대의 컴퓨터를 물리적인 전선으로 연결할 필요가 있다. 두 대의 컴퓨터를 하나의 전선으로 연결한다고 가정할 때, 0과 1로 이루어진 데이터를 전송하는 방법은 한쪽에서 일정 이상의 전압을 가하면 1, 전압을 가하지 않는다면 0으로 해석하기로 이론상 약속할 수 있다.
- 이론상의 방식을 따른다면, 이런 방식으로 할 경우 x축이 시간, y축이 전압인, 곡선이 아닌 직선과 직각으로 이루어진 sin함수 비스무리한 형태의 전자기파 그래프처럼 통신을 해야한다.
- 하지만, 수직선과 수평선으로 이루어진 전자기파는 항상 0~무한대[Hz]의 주파수 범위를 가지기에 물리적으로 이러한 형태의 전기신호를 통과 시킬 수 있는 전선은 없다.
- 따라서 우리는 실제로 전송을 할 수 있는 형태인 아날로그 형태의 전기신호로 두 대의 컴퓨터를 연결해야 한다.
결론은 정의로 돌아온다.
- 0과 1로 이루어진 디지털 데이터들을 아날로그 형태로 바꾸어 전선으로 흘려 보내고,(encoding)
- 전선을 통해 들어온 아날로그 신호를 다시 0과 1로 이루어진 디지털 신호로 해석한다.(decoding)
- 따라서 Physical Layer라는 것은, 물리적으로 연결된 두 대의 컴퓨터가 전송하는 아날로그 신호를 디지털 신호로 변환하고/재변환을 해줄 수 있게 해주는 모듈(Module)이다.
어디에 구현이 되어 있는가?
PHY칩
위의 사진처럼 1계층 Physical Layer의 모듈은 사실, 하드웨어적으로 구현되어 있다.
즉, 물리적인 회로인 것이다.
2계층: Data Link Layer
위의 1계층 Physical Layer에서는 두 대의 컴퓨터를 전선 하나로 연결했었다. 하지만 만약에, 단순히 두 대의 컴퓨터가 아닌, 여러대의 컴퓨터를 연결하고자 한다면, 우리는 전세계의 수많은 컴퓨터들을 모두 전선으로 연결해야 할까?
그것은 너무나도 비효율적이기에 우리는 적은 수의 전선으로 여러 대의 컴퓨터와 연결을 할 수 있는, 보다 효율적인 방법을 모색해야 한다. 이를 위해 나온 것이 바로 버스 토폴로지(Bus Topology)와 스타 토폴로지(Star Topology)이다.
버스 토폴로지(Bus Topology)
버스 토폴로지는 모든 컴퓨터가 하나의 전선(Bus)에 연결되어 있으므로, 한 대의 컴퓨터가 전기신호로 데이터를 전송하게 된다면, 의도한 컴퓨터 외에 연결되어 있는 다른 모든 컴퓨터들 또한 데이터를 수신하게 된다.
스타 토폴로지(Star Topology)
스타 토폴로지는 버스 토폴로지의 컴퓨터들이 Bus에 접촉하는 부분들을 모두 모아서 하나의 중계장치에 구겨넣은 것과 같은 구조를 지닌다. 이때 구겨넣은 중앙의 중계기 역할을 하는 기계장치를 허브(Hub)라고 부른다.
허브의 역할은 자신이 수신한 신호를 자신에게 연결되어 있는 모든 컴퓨터들에게 전달하는 것이며, 많은 컴퓨터들에게 전달하기에 신호 강도를 유지하기 위해 신호 증폭을 수행한다.
이때, 연결된 모든 컴퓨터들에게 신호를 전달하는 것이 아닌, 원하는 특정한 컴퓨터에게만 신호를 전달할 수 있도록 허브를 개량한 것이 바로 스위치(Switch)이다.
이렇게 하나의 스위치를 중심으로 여러 대의 컴퓨터들이 연결되어 있는 구조를 네트워크라고 칭하자.
그렇다면, 각각 서로 다른 두 개의 네트워크 상에 위치한 두 대의 컴퓨터가 서로 데이터를 교환하고 싶을 때는 어떻게 하면 좋을까?
-> 스위치와 스위치를 연결하여 서로 다른 두 개의 네트워크를 연결한다. 이때 이를 가능하게 하는 장비를 라우터(Router)라고 한다. 이때 보통 스위치(Switch)와 라우터(Router)는 서로 결합되어 있으며, 이를 보통 공유기라고 부른다.
- 수많은 네트워크들을 연결하기 위해, 라우터와 라우터를 연결하며, 필요할 시 상위에 새로운 라우터를 두어 또다시 라우터와 라우터를 연결하여 전세계의 컴퓨터들이 계층구조로 연결된 거대한 네트워크 그물망이 바로 인터넷이다.
여담으로 국가와 국가간의 장거리 네트워크를 연결하기 위해 지어진 시설들이 바로 해저 케이블 같은 것들이다.
정의
같은 네트워크 상에 있는 여러 대의 컴퓨터들이 데이터를 주고 받기 위해서 필요한 모듈(Module)이다.
이때, Framing은 Data Link Layer에 속하는 작업들 중 하나이다.
깊게 가보자
- 스위치로 연결되어 있는 하나의 네트워크 내에 속한 한 대의 컴퓨터 A에게 나머지 컴퓨터들이 거의 동시에 데이터를 전송했다고 가정해보자.
- 그렇다면 그 컴퓨터 A가 받은 데이터는 대략 10101011010101010100101010101...이런 식으로 누가 보낸 데이터인지 구분할 수 없게 마구잡이로 연결되어 있을 것이다.
- 이렇게 뒤섞인 데이터를 구분할 방법이 필요함을 느끼고, 이를 해결하기 위해 생긴 것이 Framing이라는 작업이다.
- Framing: 송신자가 자신이 송신하는 데이터의 앞 뒤에 특정한 비트열을 붙이는 작업이다. 수신자는 이 비트열을 다른 데이터들과 구분할 수 있는 구분자로써 이용한다.
ex) 0101 0101이라는 데이터를 보낼 때, 앞에는 1111을, 뒤에는 0000을 붙이는 식이다.
- 이러한 방식으로 인해 컴퓨터 A는 순서를 알 수 없게 뒤섞인 데이터 열을 이제 구분할 수 있게된다.
어디에 구현이 되어 있는가?
랜카드
2계층 Data Link Layer 또한, 1계층처럼 하드웨어적으로 구현되어 있다.
3계층: Network Layer
네트워크 계층은 네트워크에서 아주아주 중요한 계층이다.
수많은 네트워크들의 연결로 이루어지는 inter-network 속에서 목적지로 지정한 컴퓨터로 데이터를 전송하기 위해 IP Address를 이용해서 길을 찾고(Routing) 자신 다음의 라우터에게 데이터를 넘겨주는 것(forwarding)이 바로 Network Layer가 담당하는 기능이다.
주소 부여(IP) / 경로 설정(Routing)
조금만 깊게 가보자
라우팅(Routing)
데이터를 목적지까지 안전하고 빠르게 전달하는 기능을 말한다.
- 수많은 네트워크들로 복잡하게 얽히고 계층화되어 있는 inter-network 속에서 목적한 컴퓨터를 향해 최소한의 경로와 시간으로 경로를 선택하고 주소를 정하고 그 경로에 따라 패킷을 전달해주는 것이 바로 라우팅이다.
- 네트워크 계층은 사용되는 프로토콜 종류도 다양하고 라우팅하는 기술도 다양하다. 더 많은 것을 알고 싶지만 굉장히 복잡하고 많은 공부량이 예상되므로 라우팅에 대한 자세한 내용은 다음에 공부해보자.
IP(Internet Protocol)
컴퓨터에게 데이터를 전송할 때는, 해당 컴퓨터의 주소를 알고 있어야 한다. 이때 네트워크 상의 주소(IP Address)를 지정해 주는 것이 IP(Internet Protocol)이다.
- 데이터 패킷은 목적지의 IP Address가 전송하고자 하는 데이터의 헤더에 붙어있는 형식으로 되어 있다. ->
55.109.xxx|Data
- 이또한 단순하게 이런 식으로 풀어보았지만, 더 자세히 접근하려면 많은 공부량이 예상되므로 이것도 다음으로 미루어본다. (ㅠㅠ 궁금하다...)
어디에 구현이 되어 있는가?
운영체제의 커널에 소프트웨어적으로 구현되어 있다.
4계층: Transport Layer
정의
Port 번호를 사용하여 IP Address로 명시된 목적지 컴퓨터의 최종 도착지인 프로세스(프로그램)에까지 데이터가 도달하도록 하는 모듈(module)이다.
- 4계층 Transport Layer은 말그래도 통신을 활성화하기 위한 계층이다. 양 끝단의 사용자들이 신뢰성 있는 데이터를 주고 받게 해주는 역할을 한다.
- 보통 TCP Protocol을 사용하며, Port를 열어서 원하는 프로세스가 데이터를 전송하고 받을 수 있도록 한다.
- 대표적인 프로토콜은 TCP와 UDP Protocol이 있다.
- 패킷 생성시 포트 번호를 데이터에 덧붙인다.
ex) IP Address|Port Number| Data
깊게 가보자.
1, 2, 3계층을 통해 이제 인터넷 상의 모든 컴퓨터가 서로 데이터를 교환하며 통신할 수 있게 되었다.
그러면 이제 받은 데이터를 활용해보자.
전세계로 부터 받은 데이터를 원하는 프로세스(실행중인 프로그램)에게 주기 위해서는 컴퓨터가 어떤 데이터를 어떤 프로세스에게 주어야 하는지 알고 있어야 한다.
-> 이를 위해 만들어진 가상의 관문이 바로 포트 번호(Port Number)이다.
- 포트란?(Port)
우리는 IP Address를 통해 원하는 서버(컴퓨터)를 찾아낸다. 포트는 IP Address를 통해 찾아낸 서버 내에서 원하는 프로그램으로 연결해주는 가상의 관문이다.
포트 번호(Port Number)는 어떠한 프로세스(프로그램)으로 접속할 것인지 컴퓨터에게 알려주는 역할을 한다.
- 송신자는 데이터를 보낼 때, 데이터를 받을 수신자 컴퓨터에 있는 프로세스의 포트 번호를 붙여서 보낸다. ex)
Port: 80|IP Address|Data
- 따라서 데이터 전송자는 목적지 프로세스의 포트 번호를 알고 있어야 한다. 하지만 각기 원하는 대로 포트 번호를 마구 지정하는 것을 방지하기 위해, 자주 쓰이는 포트 번호들과 임시로 지정하는 범위가 규격화되어 정해져 있다.
- 포트 번호 규정
- Well-known port 0 ~ 1023
의미 그대로 정말 잘 알려진 포트들을 의미한다. 80번의 http, 22 번의 ssh와 같이 자주 사용되는 포트들에 해당한다.
- Registered port 1024 ~ 49151
특정 용도로 사용하기 위해서 쓰이는 포트들로, 3306 포트의 mySQL, 80번 port 를 대체하기 위한 8080 포트 (웹서버가 2개 이상인 경우) 등이 있다.
- Dynamic port 49151 ~ 65535
특별히 지정되지 않은 포트들로 자유롭게 사용해도 무방하다.
어디에 구현이 되어 있는가?
3계층과 마찬가지로 운영체제의 커널에 소프트웨어적으로 구현이 되어 있다.
5계층: Session Layer + 6계층 Presentation Layer + 7계층: Application Layer => Application Layer
정의
사용자가 필요로 하는 인터페이스와 프로토콜을 제공하는 계층이다.
5계층 Session Layer와 6계층 Prsentation Layer와 7계층 Application Layer에 있는 기능을 결합한다.
- 사용자가 네트워크의 서비스를 쉽게 사용할 수 있도록 돕는다.
- 네트워크 기반 응용 프로그램을 개발하는데 이용된다.
- 사용자 로그인, 네트워크 장치 이름 지정, 메시지 및 이메일 형식 지정, 파일전송 등과 같은 서비스를 제공한다.
대표적인 프로토콜로는
- HTTP(HyperText Transfer Protocol): HyperMedia 데이터가 전송되는 방식을 정의한 프로토콜
- FTP(File Transfer Protocol): 클라이언트와 서버 간에 파일을 전송하기 위한 클라이언트/서버 기반 프로토콜
- SMPT(Simple Mail Transfer Protocol): 이메일을 보내고 받기 위한 프로토콜
- DNS(Domain Name System): Domain Name <-> IP Address 간의 변환 프로토콜
- TELNET: 네트워크를 통해 호스트에 원격 로그인을 위한 프로토콜
그 외
TCP/IP Socket Programming
- OS의 Transport Layer에서 제공하는 API를 활용하여 통신가능한 프로그램을 만드는 것을 TCP/IP Socket Programming, 또는 네트워크 프로그래밍이라고 한다.
- 소켓 프로그래밍 만으로도 클라이언트, 서버 프로그램을 따로따로 만들어서 동작 시킬 수 있다.
- TCP/IP Sockt Programming을 통해 누구나 자신만의 Application Layer 인코더와 디코더를 만들 수 있다. -> 누구든 자신만의 Application Layer Protocol을 만들 수 있다.
마치며
소프트웨어 아키텍처(Software Architecture) 중에 Layered 아키텍처라는 것이 있다.
그리고 이 Layered Architecture를 따르는 대표적인 예시가 바로 네트워크 시스템이다.
-> 네트워크 시스템은 하나의 거대한 소프트웨어이며 OSI 7 Layer는 이 거대한 소프트웨어의 구조를 설명하는 것이다.
독학을 하는 입장에서 잘 이해가 안가고 큰 그림에서 어떠한 부분을 차지하는지 잘 모르겠었던 부분인 OSI 7 Layer이었다. 그러던 와중 유튜브에서 우아한테크 채널의 히히님이 강의하신 OSI 7 Layer 강의를 되었고 내게 너무나도 큰 도움이 되었다. 강의에서 보았던 것, 그외에 내가 찾았던 것들을 정리하고파 이 글을 작성한다.
히히님 감사합니다!