인터넷 통신(TCP와 IP)
서로 다른 두 단말기는 어떻게 통신을 하는걸까? 가까운 거리에 있다면 선을 연결해서 통신을 할 수도 있겠지만 현실은 멀리떨어진 단말기에 통신을 하는 경우가 더 많다. 멀리 떨어진 두 단말기는 통신을 위해서 인터넷을 이용한다.
그렇다면 인터넷을 이용해서 어떻게 통신을 하는걸까?
통신을 위해 필요한 것들이 정말 많이 있지만 기본적인 몇 가지만 알아보도록 하자.
IP 프로토콜
기본적으로 우리가 사용하는 컴퓨터 또는 휴대폰 등의 기기에는 IP라는 통신을 위한 주소를 가지고 있다. 그렇기 때문에 목적지 IP만 있다면 멀리 떨어진 사람에게도 통신을 보낼 수 있을 것이다.
물론 주소가 있어도 간단하게 통신이 되지는 않는다. 도착지까지 가는 중간에 많은 서버들을 거쳐야 할 것이다.
대략 이런 그림으로 통신이 될 것이다. 통신을 하는 과정도 정해진 규약이 있기때문에 규약을 따라서 전송된다.
데이터를 보낼 때는 기본적으로 패킷이라는 통신단위로 전달하게 된다. IP패킷에는 정해진 규칙이 있는데 출발지IP, 도착지IP, 기타 등등의 내용을 넣어서 IP패킷을 만들어낸다. 이러한 내용이 담겨져있는 것을 IP헤더라고 부른다.
그런데 이렇게 IP로만 보내면 몇 가지 문제가 발생할 수 있다.
- 패킷을 받을 대상이 없거나 서비스 불능 상태여도 패킷은 전송됨
- 중간에 패킷이 사라지거나 순서대로 전달되지 않는경우
- 한 컴퓨터에서 게임, 웹 등 여러 작업을 할텐데 이럴경우 IP를 어떻게 구분하는가
이런 문제를 해결하기 위해서 TCP프로토콜이 존재한다.
TCP 프로토콜
TCP를 시작하기전에 네트워크 4계층 이라는 것에 대해 간단하게 알아보자.
인터넷 통신에서는 네트워크 계층 이라는 것이 있다. 총 4개의 계층으로 이루어져 있으며
- 4층 - 애플리케이션 계층(HTTP, FTP)
- 3층 - 전송 계층(TCP, UDP)
- 2층 - 인터넷 계층(IP)
- 1층 - 네트워크 인터페이스 계층(물리)
으로 이루어져 있다.
- 애플리케이션(4층) - 소프트웨어
- TCP, UDP(3층), IP(2층) - OS
- 물리(1층) - LAN
이런 느낌으로 이해하면 된다.
애플리케이션에서 전송할 데이터를 보내면 그 위에 TCP세그먼트를 씌우고 그 위에 IP패킷을 씌우고 마지막으로 이더넷프레임이라는 것을 씌워서 전송하게 된다.
이런 형태로 보내지게 된다.
앞에 IP패킷에도 규칙에 따라서 몇 가지 내용이 들어갔기때문에 TCP세그먼트에도 마찬가지로 몇 가지 정보를 넣는다.
- 출발지 포트
- 도착지 포트
- 전송제어
- 순서
- 검증정보
이러한 정보가 담긴 부분을 TCP헤더라고 부른다.
TCP에는 몇 가지 특징이 있다.
- 연결지향 - TCP 3 way handshake(가상연결)
- 데이터 전달 보증
- 순서 보장
(1) 연결지향 - TCP 3 way handshake(가상연결)
TCP는 IP와 다르게 연결이 된 것을 확인 한 후에 데이터를 전달한다.
총 3번의 과정을 거쳐서 연결을 확인하게 되는데
- SYN(클라이언트 -> 서버) :: 클라이언트가 서버에게 연결 요청
- SYN + ACK(서버 -> 클라이언트) :: 서버가 연결요청에 대한응답(ACK)을 보내면서 클라이언트에게 연결요청
- ACK(클라이언트 -> 서버) :: 클라이언트가 요청에 응답하는 ACK를 보내면서 연결
이러한 과정을 거쳐서 연결이 되는 것을 확인한 후 데이터를 전송한다.
이것은 물리적으로 연결된 것이 아니라 논리적으로만 연결된 것이라는 것을 기억해야한다.
(2) 데이터 전달 보증
클라이언트가 데이터를 보내면 서버에서 데이터를 잘 받은것에 대한 응답을 보낸다.
만약 응답이 없다면 데이터가 잘 전송되지 않았다는 것을 알 수 있다.
(3) 순서 보장
데이터를 보낼 때 데이터가 너무 커서 패킷을 3개로 나눠서 보낼 수 있다.
그런데 중간에 많은 서버들을 거치면서 패킷이 클라이언트가 보낸 순서대로 서버에 도착하지 않을 수 있다. 이런 경우에는 데이터의 순서가 꼬여버리기 때문에 순서가 잘못된 패킷부터 다시 보내줘야 할 것이다.
- 클라이언트 :: 1번, 2번, 3번 패킷 ---> 서버 :: 1번, 3번, 2번 패킷
이렇게 서버가 패킷의 순서를 잘못받았을 때 클라이언트에게 다시 2번패킷부터 보내도록 요청할 수 있다.
TCP가 이러한 특징을 가질 수 있는 이유는 TCP헤더에 전송제어, 순서, 검증정보 등의 내용들이 있기 때문이다. TCP의 이런 특징들 덕분에 TCP를 신뢰성있는 프로토콜이라고 부른다.
여기서 한 가지 의문을 가질 수 있다.
데이터를 보낼 때 받는사람의 IP주소로 데이터를 보내는데 만약 여러종류의 데이터라면 받는사람은 이것을 어떻게 구분할 수 있을까??
예를들어, 게임 데이터의 패킷과 웹 데이터의 패킷은 다른 내용인데 데이터를 받는 컴퓨터는 어떻게 이것을 구분해서 바르게 처리할 수 있는가이다.
이 문제를 해결할 수 있는 것이 바로 포트(PORT)이다.
PORT
포트는 전달되는 통신을 구분해주는 역할을 한다.
그림에서 선에 연결되어있는 번호는 포트번호이다.
- 게임 통신을 할 때는 상대방의 200.200.200.1의 IP의 8009번 포트로 데이터를 보낼 것이다.
- 웹 브라우저 통신을 할 때는 상대방의 200.200.200.1의 IP의 31120번 포트로 데이터를 보낼 것이다.
이런식으로 각기 다른 데이터들을 정해진 포트로 보냄으로서 데이터를 구분하여 처리할 수 있게 하는것이다.
받은데이터에 대해서 다시 응답할 때도 전달되는 TCP헤더에 출발지 포트번호가 있었으므로 해당 포트번호로 보내면 되는것이다.
포트번호를 사용할 때는 주의 할 것이 있다.
- 0~65535 : 할당가능
- 0~1023 : 잘 알려진 포트
- FTP - 20, 21
- TELNET - 23
- HTTP - 80
- HTTPS - 443
포트번호는 0~65535까지의 번호중에서 선택하여 지정할 수 있다. 하지만 0~1023까지는 이미 많이 사용하고있는 포트들이므로 이 포트를 사용하면 문제가 생길 수 있기 때문에 내가 서버를 만드는 입장이라면 이 포트들은 피해서 사용하는 것이 좋다.
이렇게 IP와 TCP에 대해서 간단하게 알아보았다. 통신을 위해서는 2개의 프로토콜이 없어서는 안 될 것이다.
IP프로토콜은 IP주소를 가지고 있고
TCP프토토콜은 포트번호를 가지고있고 IP의 단점을 해결해주고 있다.
이렇게 2개의 프로토콜은 항상 함께해야하기 때문에 통상적으로 TCP/IP 프로토콜이라고 부르고있다.