TCP/IP 란 IP(인터넷 프로토콜)와 TCP(전송 조절 프로토콜)의 묶음을 의미합니다.
TCP는 전송조절 프로토콜 IP는 인터넷 프로토콜로 두가지 프로토콜 방식을 조합하여 인터넷 통신하는 것을 TCP/IP라고 부르는 것입니다.
송신자가 수신자에게 IP 를 사용하여 최대한 빠르게 패킷을 전송하면 TCP를 활용하여 패킷을 정상적으로 수신받습니다.
TCP/IP는 인터넷을 통신하는데 있어 가장 기반이 되는 프로토콜이기 때문에 TCP/IP를 지원한다고 하면 인터넷에 연결하여 쓰는 기능이 포함되어있다고 생각하면 됩니다.
프로토콜 : 컴퓨터들 간의 원활한 통신을 위해 지키기로 약속한 규약을 말함. 인터넷을 통해서 전세계로 이메일을 보낼 수 있는 것은 SMTP(Simple Mail Transfer Protocol)이 규정되어있고, 이를 모두가 따르기 때문
그렇다면 여기에서 TCP란 무엇일까요? 이 얘기를 하기 전, TCP가 등장한 배경을 알아보려고합니다.
ARPANET 연구가 활발하던 당시 일반적인 통신방식은 두 단말을 연결하기 위해 회선을 먼저 설정하고 통신하는 이른마, 회선교환
방식이 일반적이었습니다.
회선교환
이란 송수신 단말 장치 사이에서 데이터를 전송할 때 마다 통신경로를 설정하여 데이터를 교환하는 방식을 말합니다. 하지만 회선교환 방식에는 문제가 있었는데요, 바로 접속이 되어있는 동안은 두 시스템간의 통신회선이 독점한다는 것과 회선을 사용하기 위해서는 매번 회선을 설정해주어야 한다는 문제가 있었습니다.
그렇기 때문에, 전쟁과 같은 사건이 일어나서 하나의 회선이 마비되어도 정상적으로 동작하는 네트워크에 대해 연구하기 시작했습니다.회선교환
방식이 아닌 다른 방식을 찾아 연구했던 것이죠.
그런 회선교환
방식의 문제를 해결하기 위해 사용된 통신방식이 바로 패킷교환
방식입니다.
패킷교환
방식의 경우 경로가 정해져 있지 않아 통신이 끊어져도 우회가 가능했습니다.
더불어 전송이 패킷단위로 독립적으로 이루어졌으며,네트워크 트래픽 상태 등에 따라 각기 다른 전송경로를 가질 수 있었습니다.
앞에서 말했던 하나의 회선이 마비되어도 정상적으로 작동할 수 있는 방법을 찾아낸 것이었습니다.
그러나, 통신을 유지하는것에 초점을 맞춘 방식이었기 때문에 네트워크 환경의 안전성이 떨어질 수 밖에 없었습니다.
즉, 데이터가 유실되거나 너무 늦게 전달되는 신뢰성의 문제가 발생한 것입니다.
여기에서 우리가 말하고싶었던 주제 TCP가 등장합니다 !
신뢰성이라는 키워드를 잘 기억하고 따라와주세요.
TCP는 전송계층을 담당하고 있으며 컴퓨터가 다른 컴퓨터와 데이터 통신을 하기 위한 규약의 일종입니다. 데이터의 신뢰성을 보장하기 위한 프로토콜이죠.
TCP는 신뢰성 있는 데이터 전송을 지원하는 연결 지향형 프로토콜입니다. 다른말로는 클라이언트와 서버가 연결된 상태에서 데이터를 주고받는 프로토콜이라고도 표현 할 수 있겠네요!
TCP는 흐름제어와 혼잡제어를 지원해 데이터의 순서를 보장하구요.
한 메시지가 여러개의 패킷으로 나누어진 경우 각 패킷들은 서로 다른 경로를 통해 전달됩니다 !
앞에서 말했던거 기억하시나요? TCP의 경우 패킷교환 방식을 사용합니다. 앞에 말했던 패킷교환 방식의 장점을 담고있는 것이지요. 거기에 TCP의 신뢰성
이 한스푼 추가됩니다 ! 이 얘기는 일단 TCP와 같이 전송계층에 있는 프로토콜인 UDP에 대한 얘기를 먼저하고 하겠습니다.
User Datagram Protocol(UDP)로 신뢰성이랑 거리가 먼 비연결 지향형 프로토콜입니다.
비연결 지향이란 데이터를 주고받을때 연결 절차를 거치지 않고 발신자가 일방적으로 데이터를 발신하는 방식을 의미합니다.
연결 과정이 없기 때문에 TCP 보다는 빠른 전송을 할 순 있지만 데이터 전달의 신뢰성은 좀 떨어집니다.UDP의 경우 발신자가 데이터 패킷을 순차적으로 보내더라도 이 패킷들은 서로 다른 통신 선로를 통해 전달될 수 있습니다.
먼저 보낸 패킷이 느린 선로를 통해 전송될 경우 나중에 보낸 패킷보다 늦게 도착할 수 있으며 최악의 경우 잘못된 선로로 전송되어 유실될 수도 있습니다.
그러나 UDP의 경우 중간에 패킷이 유실되거나 변조가 되어도 재전송을 하지 않습니다.
신뢰성
이 없기 때문이지요.
넷플릭스를 보고있는데,구석탱이에 있는 까만 점 하나 없다고 버퍼링이 걸린다고 생각해보세요. 그런일을 방지하기 위해 실시간 스트리밍 서비스에 UDP프로토콜을 사용합니다.
데이터 신뢰성 문제가 있는 프로토콜이라 우스갯소리로 Unreliable Damn protocol (믿지 못할 빌어먹을 프로토콜)이라고도 합니다.
지금까지 TCP와 UDP에 대해 간략하게 설명드렸는데 둘의 차이점이 보이시나요 ?
둘의 차이점은 신뢰성
을 주느냐 주지 못하느냐에서 나옵니다.
TCP의 경우 3 Way handshaking을 통해 클라이언트와 서버와 연결절차를 밟습니다.
이에 반해 UDP의 경우 한번의 리퀘스트에 여러개의 유저 응답이 돌아오죠.
신뢰성 검사를 하지 않고 일방적으로 데이터를 보내는거죠.
그렇다면 TCP에서 신뢰성을 보장하는 방법은 무엇일까요 ? 바로 방금도 언급했던 3 Way handshaking 을 이용해서 보장합니다.
거기에 대해서 자세히 알아봅시다.
Client에서는 syn + ack 를 받고 established로 상태를 변경하고 서버에 ack를 전송합니다.
ack를 받은 서버는 상태가 established로 변경됩니다.
이런 과정을 거치고 나면 client,server 포트가 established 되면서 연결이 됩니다.
SYN : synchronize sequence numbers
TCP에서 세션을 성립할 때 가장 먼저 보내는 패킷, 시퀀스 번호를 임의적으로 설정하여 세션을 연결하는데에 사용되며 초기에 시퀀스 번호를 보내게 된다.
ACK : acknowledgment
상대방으로부터 패킷을 받았다는 걸 알려주는 패킷, 다른 플래그와 같이 출력되는 경우도 있다. 받는 사람이 보낸 사람 시퀀스 번호에 TCP 계층에서 길이 또는 데이터 양을 더한 것과 ACK를 보낸다. (일반적으로 +1하여 보냄)
그렇다면 세션을 종료하기 위해 수행되는 절차는 어떻게 될까요?
세션을 종료하기 위해 수행되는 절차인 4 Way HandShaking에 대해서도 알아봅시다.
클라이언트에서 서버와의 연결 종료를 위해 FIN 패킷을 보내고 FIN_WAIT상태가 됩니다.
반대로 서버에서 먼저 끊을 수도 있습니다.
서버는 클라이언트로부터 FIN을 받고 응답 패킷 ACK를 보냅니다.이때 서버의 상태는 CLOSE_WAIT가 됩니다.
서버가 연결을 종료할 준비가 되면 클라이언트에게 FIN 패킷을 보내고 LAST_WAIT 상태가 됩니다.
클라이언트는 확인 패킷 ACK를 보내고 TIME_WAIT 상태가 됩니다.
이러한 과정을 통해서 세션이 종료됩니다.
근데, 만약에 서버에서 FIN을 전송하기 전에 전송한 패킷이 라우팅 지연이나 패킷 유실로 인한 재전송 등으로 인해 FIN 패킷보다 늦게 도착하는 상황이 발생한다면 어떻게 될까요?
세션을 종료시킨 후 뒤늦게 도착하는 패킷이 있다면 이 패킷은 드랍되고 데이터는 유실될것입니다.
이러한 상황에 대비하여 클라이언트는 서버로부터 FIN을 수신하더라도 일정시간 동안 세션을 남겨놓고 잉여패킷을 기다리는 과정을 거칩니다. 이 과정을 TIME_WAIT라고 합니다.
다음시간에는 이번에 공부한 내용을 바탕으로 면접 단골질문인 구글에서 검색하면 어떻게 될까를 준비해보려고 합니다 :)
읽어주셔서 감사합니다.
추신
공부하는 중이기 때문에 포스팅에 있어서, 잘못된 내용이 있다면 피드백 부탁드립니다. 감사합니다 :)
TCP vs UDP - How Are They Different?
What is a Three-Way Handshake? - Definition from Techopedia
[Network] TCP/IP 와 TCP/IP 4계층이란?
[TCP] 4-way Handshake란? / 와이어샤크, tcpdump 확인