TCP/IP
저번 게시물 : https://learnote-dev.com/cs/OSI-7-Layer-Model/
서론
저번 게시물에서는 OSI 7 Layer에 대해서 알아봤습니다. OSI 7 모델이 개념적 표준이고, 실질적으로 사용되고있는 표준은 TCP/IP라고 했었습니다.
그렇다면 아무래도 실제로 사용하는 TCP/IP 프로토콜에 대해서도 잘 알아야겠죠? 그럼 TCP/IP란 무엇이고, 어떻게 동작하는지에 대해 알아보도록 합시다.
인터넷
먼저, 인터넷에 대해 알아야 합니다. 결국 TCP/IP는 인터넷을 통해 정보를 통신하기 위한 기술이므로, 이를 먼저 알아야 이해하기 쉽습니다.
인터넷에 대해 들어보지 못한 사람은 없겠지만, 막상 인터넷이 뭔지 설명하라고 하면 정확히 설명하라고 하면 애매하죠?
인터넷은 전 세계에 걸쳐 파일 전송 등의 데이터 통신 서비스를 받을 수 있는 컴퓨터 네트워크의 시스템입니다.
우리가 인터넷을 사용할 때는 반드시 인터넷 사업자들에게 비용을 지불해야 사용할 수 있습니다. 사업자가 깔아놓은 인프라를 이용해야 하기 때문이죠.
우리나라에는 KT, SKT, LG가 있는걸 알고 계실 겁니다. 이 회사들이 전국에 깔아놓은 인터넷 망에 우리가 접속함으로써 인터넷에 연결 되는 것이죠.
해외와는 해저케이블을 통해 연결되어, 우리는 우리나라뿐만 아니라 전세계와 파일을 전송하고 데이터를 통신할 수 있습니다.
그런데 데이터 통신을 하려면, 하나의 공통된 규약이 있어야 이들이 서로 통신할 수 있을 것입니다. 만약 각자의 기준을 하나씩 만들기 시작하면, 서로 사용하는 규약에 따라 통신이 되었다가 되지 않았다가 하게 되겠죠.
그래서 이러한 통신을 위해 만든 매뉴얼이 바로 TCP/IP입니다.
TCP/IP
OSI 7 레이어와 다르게 TCP/IP는 4개의 레이어를 갖습니다.
- Application
- Transport
- Internet
- Network Access
OSI 레이어에 비해서 레이어가 적습니다.
그렇다면 우리가 다른 서버에 접속해서 정보를 받아올 때 어떤 방식으로 TCP/IP 프로토콜에 따라서 통신이 일어나는 것일까요?
그러면 한번 네이버에 접속하는 것을 예시로 한번 TCP/IP의 통신방식을 알아보겠습니다.
우리가 www.naver.com을 주소창에 치면, 어떻게 되나요? 네이버 서버가 갖고있는 html 파일을 받아오겠죠. 지금 주소창에 치면 순식간에 파일을 받아와 브라우저로 확인 할 수 있겠지만, 실제로는 여러과정을 거칩니다.
한번 레이어를 하나씩 보며 어떻게 통신을 하는지 알아봅시다.
Applicaiton
여기서는 특정 서비스를 제공하기 위해서 애플리케이션끼리 정보를 주고 받습니다.
주로 FTP, HTTP, SSH, Telnet, DNS, SMTP가 사용됩니다.
**통신에 대한 내용도 포함되있지만, 어떤 행동을 하고 싶은지, 어떤데이터를 받고, 보내고 싶은지에 대한 내용이 포함되어있습니다. **
우리가 주로 사용하는 HTTP를 보면,
이렇게 GET 요청과 함께 받고싶은 data인 1.html의 정보와 요청하고 싶은 서버의 주소등이 담겨있죠?
이처럼 Application는 통신에 대한 정보와 함께 어떤데이터를 받고 싶은지를 어플리케이션 단에서 담아서 보내는 정보입니다.
Transport
Transport 레이어에서는 포트에 대한 정보가담깁니다. 포트란 무엇일까요?
컴퓨터에는 65535개의 포트를 갖고있습니다. 컴퓨터가 아파트라면, 포트는 호수인 셈입니다. 만약, 정보가 성공적으로 컴퓨터에 도착했다하더라도, 이 정보를 사용할 프로그램의 주소를 모른다면 컴퓨터에 도착한 정보는 갈 곳을 잃을 것입니다. 이를 해결하기 위해, 컴퓨터는 이러한 포트를 어플리케이션별로 할당함으로써 컴퓨터에 도착한 요청을 해당 어플리케이션으로 보내 처리합니다.
만약 우리가 www.naver.com을 주소창에 입력하면, 네이버의 서버 컴퓨터로 우리가 보낸 정보가 해당 컴퓨터의 서버 애플리케이션으로 전달됩니다. 우리는 포트 번호를 명시해준적이 없는데, 어떻게 우리의 요청이 알아서 네이버의 서버 애플리케이션으로 전달되는걸까요?
사실 우리가 브라우저 주소창에 http://www.naver.com을 친다는 것은 사실 http://www.naver.com:80 을 치는 것과 같습니다.
요즘은 보안을 위해서 대부분 https를 사용하지만 설명을 위해 http로 설명 하겠습니다.
만약 http://www.naver.com:81 과 같은 주소를 치게되면 접속이 되지 않는 것을 확인할 수 있는데요, 웹서버를 사용하는 포트는 80포트로 하기로 미리 약속해놓았기 때문에 모든 웹서버 어플리케이션을 사용하는 서버 컴퓨터는 서버 어플리케이션을 80포트에 할당해 놓습니다. 이 때문에 브라우저 프로그램에서는 주소를 치면 :80이라는 포트번호 명시를 우리가 해주지 않아도 웹서버는 모두 80포트이니, 알아서 :80을 대신 입력해주는 것입니다.
그래서 Transport 레이어에서는 이러한 도착 포트 번호와, 내 컴퓨터의 출발 포트 번호의 데이터를 추가합니다.
Transport 레이어에서는 TCP 혹은 UDP가 사용됩니다.
Internet
Internet 레이어에서는 Internet Protocol, IP의 정보를 추가합니다. 포트와 마찬가지로 요청을 보내는 컴퓨터의 IP와 요청의 도착지의 IP를 포함하는데요. 포트번호와 마찬가지로 우리는 도착할 컴퓨터의 IP를 명시해준 적도 없으며, 심지어는 머리로도 알지 못합니다. 브라우저는 또 그러면 이 IP는 어떻게 찾아서 보내는걸까요?
또 다시 우리가 www.naver.com을 주소창에 입력한다고 해봅시다. 그러면 우리는 123.123.123.123 이런 형식으로 되어있어야할 IP주소를 모르고도 해당 웹서버에 접속할 수 있을 것입니다.
우리가 www.naver.com을 주소창에 입력하게 되면, OS는 DNS서버로 요청을 보내게됩니다. DNS 서버는 Domain Name Server로, 우리가 입력한 도메인인 www.naver.com과 같은 도메인 주소에 해당하는 IP주소를 갖고있는 서버이죠. 이 DNS 서버도 마찬가지로 서버를 가진 컴퓨터이기 때문에 우리가 데이터를 보내려면 DNS서버의 IP주소도 알아야만 데이터를 보낼 수 있습니다. 그러면 또 DNS 서버의 IP는 어떻게 알고있는걸까요?
아래 사진은 제 맥북의 네트워크 설정입니다.
DNS서버 주소는 이미 컴퓨터의 위와같이 등록이 되어있습니다. 이미 DNS서버의 IP 주소를 알고 있기 때문에, 도메인이 필요하면 해당 IP의 DNS서버로 접속해서 해당 도메인에 해당하는 IP 주소를 가져오는 것이죠.
그럼 이제 우리가 네트워크로 보내야할 패킷에 우리 컴퓨터의 IP주소와 도착 컴퓨터의 IP주소가 패킷에 추가되었습니다.
Network Access
이제 IP주소까지 패킷에 포함되었으니, 네트워크에 접속하기 위한 정보가 필요합니다.
지금까지는 모두 어떤 정보들이었나요? 대부분 도착 서버 컴퓨터의 www.naver.com에 대한 정보였습니다.
하지만 Network Access 레이어에서는 도착 정보가 아닌, 내가 네트워크에 접근하기 위한 정보가 필요합니다.
즉, 내 컴퓨터가 현재 물리적으로 연결되어있는 공유기의 정보가 필요한 것이죠.
이러한 기기의 물리적 주소를 MAC 주소라고 합니다.
우리가 보통 IP를 이용한 통신이라함은, 각자가 연결되어있는 공유기까지의 과정을 말합니다. 보통 공유기 하나에 기기들이 연결되어있는 환경을 LAN(Local Area Network)환경이라고 하는데, 이 환경들은 외부에 공개되지 않은 private IP로 연결되어있습니다. 공유기의 Public IP만이 공개되어있고, 나머지 기기들의 IP는 private IP로 되어있는 것이죠.
Public IP에 데이터를 보내면, 공유기가 이 IP를 받아서 자신과 연결되어있는 기기의 MAC주소를 통해서 이 데이터를 넘겨주게 됩니다.
그렇다면 MAC 주소는 무엇이며, 또 어떻게 알 수 있을까요?
MAC 주소는 네트워크 장비 혹은 컴퓨터라면 갖게되는 고유 주소입니다. 논리적인 IP주소와 달리 MAC주소는 물리적인 주소이기 때문에, 물론 변경하려면 변경이 가능하지만, 논리적으로 계속 값이 바뀌는 IP주소와 다르게 정말 그 기기의 주소를 명확하게 나타내주죠.
예를들어, 행정주소를 생각해봅시다. 예전에는 지번을 기준으로 주소를 했지만 요즘은 모두 도로명 주소를 사용하죠? 이처럼 행정적인 주소의 기준은 바뀔수가 있습니다. 갑자기 우리집의 주소가 000-00 번지에서 00로 00길로 바뀐 것 처럼 말이죠.
하지만 우리집이 한강이 시작되는 곳 옆에 있다고 생각해봅시다. 행정적 주소가 변경된다고 해도 우리집의 물리적인 위치는 항상 한강이 시작되는 곳 옆입니다. 물리적으로 그 자리에 존재 하기 때문이죠.
이처럼 MAC 주소는 물리적인 주소를 사용함으로써 공유기의 도착한 정보를 해당기기에 확실하게 보내줍니다.
그럼 우리는 이러한 MAC 주소를 어떻게 알 수 있을까요??
바로 ARP(Address Resolution Protocol)프로토콜을 사용해서 알아냅니다. 이 ARP 프로토콜은 IP 주소와 MAC 주소를 일대일 매칭하여 LAN 환경에서 목적지 IP에 맞는 MAC 주소로 해당 데이터를 전달합니다.
그럼 만약에 우리가 원하는 목적지에 해당하는 IP가 LAN환경 안에 있다면 해당 기기의 MAC주소로 바로 정보를 보낼것이고, 만약 같은 LAN환경에 도착지 IP가 없다면 공유기를 통해 private IP가 public IP로 변환되어 네트워크로 나가게 되는 것입니다.
그럼 라우터가 계속 자신과 연결된 라우터에게 도착지에 해당하는 IP와 매칭되는 MAC 주소를 가진 라우터가 있는지를 찾아내게 되고, 만약 응답을 받게 된다면 해당 라우터로 데이터를 전달한 뒤, 이를 전달받은 라우터가 해당 기기의 MAC 주소로 데이터를 전달하게 되는것이죠.
자 이렇게 되면 대략 TCP/IP 프로토콜이 어떠한 정보들 담아서 네트워크와 통신하는지 알아봤는데요, 하나 더 알아두어야 할것이 있습니다. TCP는 연결지향형 프로토콜이라는 것이죠.
TCP/IP 3-Way-HandShacking
연결 지향형 프로토콜이란, 상대방과 통신할 준비과 되었는지를 확인하고 통신하는 프로토콜입니다. 연결 되는 과정이 따로 필요한 것이죠. 이러한 연결을 위해서 TCP/IP 프로토콜은 3-Way-HandShacking을 사용합니다.
아까 설명했던 Transport 레이어에서 사용하는 TCP 헤더에는, 플래그가 있습니다. 이러한 플래그하나 하나들을 컨트롤 비트라고 하는데, 이것을 사용하여 통신하기전의 확인 작업을 거친 후 연결이 안정한 것을 확인하면 그때부터 통신을 시작합니다.
이러한 연결 과정이 있기 때문에 TCP/IP 가 신뢰성 연결 지향 방식으로 불리는 것이죠.
위 그림이 TCP 헤더의 플래그인데요, 여기서 3-Way-HandShaking을 위해서는 2개의 플래그, SYN과 ACK을 사용합니다.
위 과정을 보시면 3번의 통신을 보내는데요, 먼저 client가 SYN이 설정된 플래그를 보내고 이것이 서버에 잘 도착되었다면 서버에서는 SYN과 ACK을 설정한 플래그를 보냅니다. 마지막으로 Client가 이를 잘 받았음을 확인하면, 마지막으로 ACK이 설정된 플래그를 보냄으로써 두 개의 기기가 통신할 준비가 완료되었음을 확인하는 것입니다.
이렇게 연결을 먼저 확인하고 통신을 시작하면 한쪽이 꺼져있다거나 문제가 있어서 데이터가 제대로 도착하지 못하는 오류를 방지 할 수 있을것입니다.
마무리하며…
이렇게 TCP/IP 프로토콜에 대해 알아봤는데요. 조금 디테일한 부분이 생략되긴 했지만 대략적으로 어떻게 TCP/IP를 사용한 통신이 이루어지는지 알아보았습니다.
물론 이것이 네트워크의 전부는 아닐 것입니다. 디테일한 부분들도 공부할게 무척 많으니, 하나 하나 천천히 다른 게시물에서 다뤄보도록 하겠습니다.
댓글남기기