2009년 10월 8일 목요일

[TCP] TCP(Transport Control Protocol) 개요

TCP는 transport 계층의 연결 지향형(Connection Oriented) 프로토콜로서, 같은 transport 계층 프로토콜이면서 비연결형 서비스인 UDP와 자주 비교되곤 한다. 연결 지향형과 비연결형이라는 용어에서 알 수 있듯이 TCP와 UDP는 데이터 전송 방식에 있어서 큰 차이점이 있다. 이 차이점을 이해하고 그것에 필요한 프로토콜 요구 사항을 잘 숙지하게 되면 꼭 네트웍 프로토콜이 아니라 하더라도 다른 프로토콜을 공부해야할 때가 왔을 때 도움이 많이 될 것이다. 심지어 USB protocol에서도 UDP와 TCP의 컨셉과 비슷한 여러가지 통신 방식을 제공하고 있다. 우선 내가 블로그에서 설명하려 하는 것은 TCP이므로 UDP는 논외로 하도록 하겠다.

 

TCP는 매우 복잡한 protocol이지만, 연결 지향형이라는 프로토콜의 컨셉에 대해 아주 간략히 핵심만 정리하면 "네트웍이 제 기능을 하고 있는 한 무조건 안전하게 데이터를 보내준다"는 것이다. 즉 TCP를 사용하는 application에서는 자신이 보내려고 TCP layer로 넘겨준 데이터에 대해서는 목적지에 도착하지 않을 가능성에 대해 걱정할 필요가 없다는 것이다. 이와 같은 기능을 위해 TCP는 ACK & NAK, Ack number, Sequence number, GBN & Selective Repeat, Flow control 등의 매우 다양한 전송 기법을 사용하고 있다. 이 각각의 기법에 대한 설명은 뒤에 계속 하도록 하겠다.

 

 연결 지향형이라는 TCP의 컨셉은 비신뢰적인 하위 프로토콜인 IP로 인해 두드러진다. IP는 Best effort service를 제공하는데, 말 그대로 최선의 노력을 다하는 서비스를 제공한다. 여기서 최선을 다하는 서비스라는 것은 "넘겨준 데이터를 원하는 목적지로 최선을 다해서 보내기는 하겠지만, 만약에 전달이 안되면 그건 나도 어쩔 수 없다" 라는 의미를 가지고 있는데, 이것을 바꿔 말한다면 "보내고 싶으면 보내라. 전달을 하긴 하겠는데 잘 갈지는 모르겠다"라는 말과 동일한 것이다. 만일 TCP같은 프로토콜이 없다고 생각한다면 우리가 사용하고 있는 Telnet, HTTP, e-mail, FTP같은 수많은 application 들은 사용이 불가능하였을 것이다. 생각해보라. Telnet으로 서버에 로그인하려고 하는데 내가 타이핑한 password가 전송 도중에 깨진다던가, HTTP로, 혹은 FTP로 다운받는 파일이 깨지는 경우... 내가 보낸 e-mail이 전송 도중 데이터가 변경되어 엉뚱한 내용으로 전달이 되는 경우... 이러한 모든 경우는 우리가 결코 원하지 않는 상황인 것이다.

 

TCP의 또 다른 중요한 컨셉은 혼잡 제어(Congestion control)이다. 처음에 혼잡 제어를 공부할 때는 흐름 제어(Flow control)와 많이 혼동이 되었는데, 이것은 분명한 차이가 있는 것으로 혼잡제어는 송신자와 네트웍간의 관계이며, 흐름 제어는 송신자와 수진자 간의 문제인 것이다.

 

 혼잡 제어의 필요는 네트웍의 Band width를 효율적으로 사용하는 문제와 trade off의 관계에 있다. 예를 들어 초당 100byte를 전송할 수 있는 네트웍을 혼자 사용할 때에는 초당 100byte를 보냄으로써 네트웍이 제공하는 최고의 속도를 사용할 수 있다. 그러나 사용자가 2명으로 늘어난다면 둘은 공평하게 초당 50byte만을 보내야 할 것이다. 100byte/sec의 용량을 가진 네트웍이라고 해서, 둘 다 최대 속도로 전송한다면 네트웍은 과부하에 걸려 두 명 모두 인터넷을 사용할 수 없을 것이기 때문이다.

 

 TCP는 모든 TCP 사용자가 공평한 네트웍 사용률을 가지도록 하기 위해 사용자가 전송하는 데이터 량을 "사용자가 모르게" 조절한다. 이것은 내가 보내려고 시도하는 데이터 전송 속도가 네트웍의 혼잡도에 의해 TCP로부터 억제될 수 있다는 것이다. 이러한 TCP의 특성은 속도를 중요시하는 application 설계자로 하여금 TCP의 사용을 주저하게 만들 수 있다. 이와 대조적으로 UDP는 이러한 혼잡 제어 매커니즘을 가지고 있지 않으므로, TCP가 제공하는 신뢰적인 데이터 전송 기능을 application layer에서 구현을 한다면, TCP를 사용하면서 가지게 되는 속도 억제를 피하면서 traffic을 네트웍으로 내보낼 수 있다는 것이다.

 

 UDP가 어떻게 동작하는 지는 논외로 하고, 추후 TCP가 이러한 혼잡 제어를 위해 사용하는 여러 가지 기법, 즉 Slow start, adaptive round trip time, additive increase multiplicative decrease algorithm 등을 설명할 것이다.  

 

Reference : Computer Networking (A top down approach featuring the internet), James F. Kurose, Keith W. Ross 저.


댓글 없음:

댓글 쓰기