이전 시간에 IP 프로토콜을 소개하면서 한계점들을 다루었는데, 아래 게시물을 참고!
인터넷 통신 & IP(인터넷 프로토콜) / [섹션 1. 인터넷 네트워크] 인프런 김영한 - 모든 개발자를 위
어떤식으로 인터넷 통신이 이루어지는가, 그리고 그것을 위해 IP, TCP, UDP, 포트, DNS에 대해서 알아보자. 먼저 인터넷에서 두 대의 컴퓨터는 어떻게 통신할까? 예를 들어서, 서버와 클라이언트가
easpop.tistory.com
IP 프로토콜의 한계를 해결해 주기 위해서, TCP 프로토콜이 역할을 해준다.
먼저 인터넷 프로토콜 스택의 4계층을 알아보자.
인터넷 프로토콜 스택의 4계층은 위에서 부터
애플리케이션 계층 - HTTP, FTP
전송 계층 - TCP, UDP
인터넷 계층 - IP
네트워크 인터페이스 계층 이 있다.
쉽게 설명을 하자면,
애플리케이션 계층에는 크롬과 같은 웹 브라우저나, 네트워크 게임, 채팅 프로그램 등이 있다.
그 밑에는 TCP나
랜카드, 실제 네트워크 랜 드라이브 등을 포함한 네트워크 인터페이스 계층이 있다.
상황을 예시를 들어보자.
예를 들어, 채팅 프로그램으로 미국에 있는 유저에게 hello world 메세지를 전송한다고 하자.
그러면, 먼저 프로그램이 Hello, world 라는 메세지를 생성할 것이고,
SOCKET 라이브러리를 통해서 OS 계층에다가 hello 라는 메세지를 전달한다.
그 다음에 OS 게층에서 TCP가 hello 라는 메세지에다가 tcp 정보를 생성해서 tcp 정보를 씌우고,
또 IP 관련 데이터들을 씌워서, IP 계층으로 내려준다.
그렇게 IP 패킷이 생성이 된다. 그래서 결국 IP 패킷을 보면 IP 정보가 있고, 그 안에 또 TCP 정보가 있고,
그 안에 내가 실제 만든 메시지가 있게 된다.
그래서 네트워크 인터페이스인 랜카드를 통해서 나갈 때, 이더넷 프레임이 포함이 돼서 나가서 목적지 서버로 전달된다.
참고로, 패킷은 수하물을 뜻하는 패키지(package)와 덩어리를 뜻하는 버킷(bucket)의 합성어라고 하는데 처음 알았다..
그래서 택배박스에 넣어서 물건 보내듯이 데이터 넣어서 보낸다고 생각하자!
IP 패킷 안에는 TCP 정보가 들어가는데,
그 내용은 출발지와 목적지의 포트정보, 전송 제어, 순서, 검증 정보 등이 들어가게 된다.
그래서 IP 만으로는 해결되지 않았던 순서 제어 문제 같은것 들이 해결이 된다.
그리고 TCP가 감싸고 있는 안에 전송 데이터를 넣어서 보내게 된다.
여기서 TCP는, TCP는 전송 제어 프로토콜(Transmission Control Protocol)이다.
그렇기 때문에 전송을 어떻게 할지 제어를 하는 역할을 한다.
TCP의 특징으로는, 크게 3가지가 있는데,
첫번째로, 연결지향적 특징이 있다. (TCP 3 way handshake - 가상 연결)
TCP는 예를 들어서, 메세지를 보낼 때, 연결을 먼저하고 메세지를 보낸다.
이렇게 되면 목적지 서버가 꺼져있으면 연결이 되지 않기 때문에, 먼저 연결을 한 다음에 메세지를 보내게 된다.
두번째는, 데이터 전달 보증을 해준다.
예를 들어서, 메세지를 보낼 때, 중간에 패킷이 누락이 됐다면 상대방이 메세지를 받지 못한것을 내가 알 수 있다.
세번째는, 순서를 보장해준다.
그렇기 때문에, TCP는 신뢰할 수 있는 프로토콜이고, 현재 대부분 애플리케이션에서 TCP를 사용한다.
앞서 언급한, 3 way handshake에 대해서 좀 더 살펴보자.
위에서 SYN은 Synchronize, ACK는 Acknowledge
TCP / IP 프로토콜로 연결을 하면, 클라이언트 -> 서버로 SYN (접속 요청) 메세지를 보낸다.
그러면 서버에서 메세지를 받았다는 ACK (요청 수락) 메세지와 SYN (접속 요청) 메세지를 다시 서버 -> 클라이언트로 보낸다.
마지막으로 클라이언트가 ACK (요청 수락) 메세지를 서버로 보낸다.
위와 같이 메세지를 3번 주고 받는다.
이렇게 3 way handshaking을 하게 되면 클라이언트도 서버를 믿을 수 있고, 서버도 클라이언트를 믿을 수 있게 된다.
그 다음에, 앞서 언급한 것과 같이, 연결이 되고 나서 데이터를 전송한다.
참고로 TCP / IP 연결은 SYN과 ACK를 주고 받으면서 서로 연결이 됐구나 라고 논리적으로 연결이 된 것이고,
중간에 거쳐가는 많은 노드들은 알지 못한다.
데이터 전달 보증은, 클라이언트에서 서버로 데이터를 전송을 완료하면,
서버에서 클라이언트로 데이터 잘 받았음을 알려준다.
그렇기 때문에 클라이언트는 서버로 메세지가 잘 전달이 됐는지 알 수 있다.
순서 보장은, 클라이언트에서 패킷 1, 2, 3 순서로 전송을 했는데,
서버에 1, 3, 2번 순서로 순서가 잘못되어서 도착을 한다면,
서버에서 1번은 잘 보내졌고, 2번 패킷부터 잘못되었으니, 2번부터 다시 보내라고 클라이언트에 전달한다.
그럼 클라이언트는 2번부터 다시 보내기 때문에 순서가 보장되게 된다.
그 다음에는, UDP에 대해서 알아보자.
UDP는 TCP랑 같은 계층이고 IP계층 바로 위에 있는 프로토콜이다.
근데, UDP는 하얀 도화지 같이... 기능이 거의 없다.
IP와 거의 같지만, 포트정보와 체크섬(메세지에 대해서 맞는지 검증해주는 데이터) 정도가 있다.
예를 들어서, 내 PC에는 IP가 하나가 할당이 되어 있을 것이다.
온라인 게임을 하고, 스트리밍 음악을 동시에 듣는다면, 게임용 패킷과 음악용 패킷을 구분할 때 쓰는 것이 포트이다.
이렇게 보면, 장점이 거의 없는것 같지만 쓰는 이유는,
TCP는 3 way handshaking과 같이 시간이 걸린다는 단점이 있고, 데이터 양도 크고 전송 속도를 빠르게 만들기 어렵다.
또한, 인터넷은 이미 tcp 기반으로 쓰고 있기 때문에 손을 댈 수 없다.
그렇기 때문에, 최적화를 하기 위해서는 UDP를 사용하면 된다.
UDP는 아무것도 안되어 있기 때문에, UDP 위에다가 내가 원하는 거를 애플리케이션 레벨에서 만들어내면 된다.
정리하자면, UDP는 TCP처럼 데이터 전달 및 순서가 보장되지는 않지만, 단순하고 빠르다는 장점이 있다.
댓글