검수요청.png검수요청.png

TCP

해시넷
이동: 둘러보기, 검색

TCP(티씨피)는 "Transmission Control Protocol"의 약자로서, 인터넷에서 사용되는 표준 통신 프로토콜이다. 한국어로 번역하면, 전송 제어 프로토콜이라는 뜻이다. 흔히 TCP와 IP를 결합하여, TCP/IP라고 사용한다. TCP와 유사한 프로토콜로 UDP가 있다. TCP가 1:1 연결을 통해 안전하게 데이터 를 교환하는 것과 달리, UDP는 1:N 방식으로 한쪽에서 다른 쪽으로 일방적으로 데이터를 전송한다. TCP가 전화와 비슷하다면, UDP는 일방적으로 보내는 소포와 비슷하다.

개요

TCP는 세계 통신표준으로 개발된 OSI 모형에서 4번째 계층인 전송계층(Transport Layer)에서 사용하는 프로토콜로, 보통 하위 계층(Network Layer)에서 사용되는 IP와 엮어서 TCP/IP로 표현한다. TCP는 군사적인 목적으로 어느 환경에서도 정상적으로 동작하는 네트워크를 개발하기 위해 만들어졌다. 이를 위해 패킷 교환(Packet Switching)방식을 사용했다. 목적지가 정해져 있지만 해당 목적지까지의 경로는 정해져 있지 않았다. 따라서 서로 연결이 가능한 회선 하나만 남아도 통신이 끊어지지 않고, 계속될 수 있는 통신환경을 구축하였다. 통신을 유지하는 것이 목적이었기에, 네트워크 환경의 안정성은 떨어질 수밖에 없었다. 이로 인해 데이터가 유실되거나 늦게 전달되는 등 신뢰성이 떨어지는 문제가 생겼는데, 이 문제를 해결하고자 신뢰성을 보장할 수 있는 통신 프로토콜인 TCP가 나오게 되었다.[1]

특징

신뢰성

신뢰성을 제공하기 위해, 패킷이 손실되거나, 중복되거나, 네트워크 계층에서 순서의 바뀜 등이 없도록 보장해야 한다. 또한, TCP는 신뢰성을 실현하기 위해 적극적 수신, 통지, 재전송 체계를 사용한다. TCP 하위계층인 IP 계층의 신뢰성 없는 서비스에 대해 다방면으로 신뢰성을 제공한다.[2][3]

흐름 제어

상대방이 받을 수 있을 만큼만 데이터를 효율적으로 전송하는 것을 의미한다. TCP 데이터 세그먼트를 송수신하는 컴퓨터는 중앙처리장치(CPU)와 네트워크 대역폭의 차이로 인해 서로 다른 데이터 속도로 작동할 수 있다. 결국, 수신자가 처리할 수 있는 것처럼 훨씬 더 빠른 속도로 송신자가 데이터를 보낼 가능성이 크다. TCP는 송신자가 보낸 데이터의 양을 제어하는 흐름 제어 메커니즘을 구현한다. 흐름 제어를 위해 슬라이딩 윈도우(Sliding Window) 방식을 사용한다. 이는 상대방이 수신 가능한 크기(Window size) 내에서 데이터를 연속해서 전송하는 방식으로 세그먼트(Segment) 전송 시마다 수신 확인 응답(ACK)을 수신한 후, 전송하게 되면 왕복 시간(RTT)이 길 경우 단위 시간당 데이터 전송량이 매우 떨어지므로 효율적으로 전송하기 위해 상대방이 받을 수 있는 범위 내에서 연속적으로 전송한다.[2][4]

오류제어

데이터의 오류나 누락 없이 안전한 전송을 보장하고, 오류 또는 누락이 발생했을 경우, 재전송을 수행하여 이를 보정한다.[4] 하지만 재전송이라는 작업이 했던 일을 다시 해야 하는 비효율적인 작업이기 때문에, 재전송 과정을 최대한 줄일 수 있는 여러 가지 방법을 사용하게 된다. Stop and Wait은 데이터를 보내고 제대로 받았다는 응답이 올 때까지 대기한 후, 다음 데이터를 보내는 방식이다. Go Back N 방법은 데이터를 연속적으로 보내다가 어느 데이터부터 오류가 발생했는지를 검사하는 방식이다. 이 방법을 사용하면 데이터를 연속적으로 보낸 후 한 개의 ACK나 NACK만을 사용하여 수신 측의 처리 상황을 파악할 수 있기 때문에, 연속적으로 데이터를 보낼 수 있는 흐름 제어 방식인 슬라이딩 윈도우와 잘 맞는다. 선택적 재전송은 에러 난 데이터만 재전송해주는 방식이다. 이 방식을 사용하는 수신 측의 버퍼에 쌓인 데이터가 연속적이지 않다는 단점이 존재한다.[5]

혼잡제어

네트워크의 혼잡 정도에 따라 송신자가 데이터 전송량을 제어하는 것을 의미한다. 혼잡 정도에 대한 판단 기준은 데이터의 손실 발생 여부로 판단한다. 네트워크가 혼잡하다고 판단될 때 송신율을 감속한다. 또한, 전송한 데이터에 누락이 발생하면, 네트워크가 혼잡한 상태로 판단하여 전송량을 조절한다. 이에 따른 여러 장치들을 다양한 TCP 버전에서 마련하고 있다. 주요 활동 기능은 느린 시작, 혼잡회피, 수신 윈도우 및 혼잡 윈도우 크기 결정 등이 있다.[3][4]

다중화

라우터의 많은 프로세스가 TCP 통신 서비스를 동시에 사용할 수 있는 것을 뜻한다. 이들 프로세스는 같은 네트워크 인터페이스에서 통신할 수 있음으로, 네트워크 인터페이스의 IP 주소로 식별된다. 하지만 한 컴퓨터의 같은 네트워크 인터페이스를 사용하는 모든 프로세스는 공통의 IP 주소를 가지고 있다. 네트워크 인터페이스의 IP 주소 외에도 더 많은 것이 필요하다. TCP는 TCP를 사용하는 응용 프로그램에 포트 번호 값을 연계시킨다. 각 연결은 서로 다른 포트 쌍을 사용하므로, 이 연관성은 원격 컴퓨터의 응용 프로그램 프로세스들 사이에 여러 연결이 존재할 수 있게 한다. 응용 프로그램 프로세스에 대한 포트의 바인딩은 각 컴퓨터에서 독립적으로 처리된다.[2]

연결형 서비스

물리적으로 전용회선이 연결된 것처럼 가상의 연결통로를 설정하여 통신하는 방식이다. 응용 프로그램 프로세스는 TCP를 사용하여 데이터를 보낼 수 있는 상태가 되려면 먼저 연결을 설정해야 한다. 가상의 연결통로를 가상회선이라 하는데, 가상회선 방식은 물리적으로 전용회선이 연결된 것처럼 논리적으로 동작하는 방식이다. 논리적인 연결통로를 통해 데이터를 주고받음으로써 데이터의 전송 순서를 보장해준다. 다른 말로는 순서 제어라고도 한다. 스트림 기반의 전송방식을 사용하고, 임의의 크기로 데이터를 나누어 연속해서 전송하는 방식을 사용한다.[2][4]

양방향성

종단 간 양 프로세스가 동시에 서로 세그먼트를 전달할 수 있다. 즉, 하나의 전송 선로에서 데이터가 동시에 양쪽으로 전송될 수 있다는 것을 의미한다. 양방향 각각에 대해 송수신 버퍼 및 데이터 흐름용 순서번호를 유지한다.[2][3] 바이트 스트림(byte stream)을 사용하여 데이터를 연속적인 바이트로 보고, 세그먼트 단위의 패킷으로 전송한다. 해당 세그먼트는 시퀀스 번호로 식별한다.[6]

연결 과정

3방향 핸드셰이크

3-way Handshake로, TCP 연결은 세 가지 방법은 핸드셰이크에 의해 초기화된다. 순번을 동기화하고, 연결의 양측에서 순번을 확인하고, TCP 윈도의 크기를 교환하고, 최대 세그먼트 크기와 같은 기타 TCP 옵션을 교환하는 것이다. 서버에 연결요청을 하기 위해 SYN(Synchronize Sequence Numbers) 데이터를 보내고, 클라이언트는 SYN/ACK 응답을 기다리는 SYN_SENT 상태가 된다. 서버는 LISTEN 상태에서 SYN 요청을 받고, 클라이언트에게 ACK와 SYN 플래그를 발송한다. 서버는 클라이언트가 ACK 패킷으로 응답하기를 기다리는데, 이때 서버는 SYN_RECEIVED 상태가 된다. 클라이언트는 서버에게 ACK 패킷을 보내 데이터 송수신 상태인 ESTABLISHED로 된다.[2][7]

4방향 핸드셰이크

4-way Handshake로, 맺어진 TCP 세션을 종료하기 위해 수행되는 절차이다. 클라이언트가 연결을 종료하겠다는 FIN 플래그를 전송한다. 서버는 확인 메시지(ACK)를 보내고 자신의 통신이 끝날 때까지 기다린다. 서버가 통신이 끝났으면 연결이 종료되었다고 클라이언트에게 FIN 패킷을 전송한다. 클라이언트는 확인했다는 메시지(ACK)를 보낸다. 하지만 서버가 FIN 패킷을 전송하기 전에 전송한 ACK 패킷이 라우팅 지연이나 패킷 유실로 인해 재전송으로 FIN 패킷보다 늦게 도착할 수 있다. 클라이언트가 세션을 종료하고 뒤늦게 패킷이 도착하면, 데이터가 유실된다. 이러한 현상에 대비하여 클라이언트는 서버로부터 FIN을 수신하더라도 일정 시간 동안 세션을 남겨놓고 잉여 패킷을 기다린다. 이 상태를 TIME_WAIT이라고 한다.[2][7]

프로토콜 헤더 구조

Source Port는 데이터를 보내는 호스트의 TCP 포트이고, Destination Port는 데이터를 받는 호스트의 TCP 포트이다. 포트 번호는 16비트이며, 범위는 10진수로 환산 시 0~65535중 하나의 포트를 이용한다. 그리고 Sequence Number는 TCP 세그먼트에 있는 데이터의 첫 번째 바이트에 대한 순번이다. Acknowledgement Number는 바이트에 대한 순번, 데이터를 보내는 측은 연결된 다른 측 호스트에서 이 값을 전달받을 것을 기대한다. HLEN은 HeaderLength의 약자로, 헤더의 길이를 정의하는 부분이다. 또한, Reserved는 현재는 사용하지 않고, 나중을 위해 예약된 필드이다. CODE bits는 세그먼트의 용도와 내용을 결정하기 위해 사용된다. Window는 TCP 세그먼트를 보내는 호스트의 현재 TCP 버퍼 크기이고, TCP Checksum은 TCP 데이터와 TCP 헤더의 정확성을 확인한다. Urgent pointer는 긴급메시지라는 것을 표시한다. 급하게 처리할 때 봐야 하는 데이터의 위치정보를 가지고 있다.[2][8]

제어 플래그

TCP 헤더에는 6개의 제어 플래그 필드가 있다. 이들은 논리적인 TCP 연결 회선 제어 및 데이터 관리를 위해 사용된다. 먼저 URG는 Urgent Pointer 필드에 값이 채워져 있음을 알려준다. 송신 측 상위 계층이 긴급 데이터라고 알려주면, 긴급 비트 URG를 1로 설정하고, 순서에 상관없이 먼저 송신된다. 긴급 데이터의 마지막 바이트 위치가 Urgent Pointer로 가리켜진다. ACK는 Acknowledgement로, 확인 응답 필드에 확인 응답 번호 값이 세팅되었음을 알린다. 1로 세팅되며, 확인번호가 유효함을 뜻하고, 0으로 세팅되면, 확인번호를 포함하지 않는다는 것을 뜻한다. 즉, 32비트 크기의 확인 응답 번호 필드가 무시된다. SYN 세그먼트 전송 이후 모든 세그먼트에는 항상 이 비트가 1로 세팅된다. PSH는 Push로, 버퍼링 된 데이터를 가능한 한 빨리 상위 계층 응용 프로그램에 즉시 전달한다. 수신 측은 버퍼가 찰 때까지 기다리지 않고, 수신 즉시 버퍼링 된 데이터를 응용프로그램에 전달한다. RST는 Reset으로 연결 확립(ESTABLISHED)된 회선에 강제 리셋을 요청한다. 연결 상의 문제를 발견한 장비가 RST 플래그를 1로 설정한 TCP 세그먼트를 송출한다. LISTEN, SYN_RECEIVED 상태일 때는 RST 수신한 경우 LISTEN 상태로 들어가고, 그 밖의 상태일 때는 연결을 끊고 CLOSED 상태로 들어간다. SYN은 Synchronize로, TCP 연결 설정 초기화를 위한 순서번호의 동기화이다. 연결 요청을 할 때 SYN은 1로, ACK는 0이고, 연결을 허락할 때는 SYN과 ACK 모두 1로, 연결 설정할 때는 ACK를 1로 설정한다. 즉, 송수신 간에 순서번호의 동기화이다. FIN은 Finish로, 송신기가 데이터 보내기를 끝마친다는 것이다. 종결요청을 할 때는 FIN을 1로, 종결을 응답할 때는 FIN과 ACK를 1로 설정한다. 즉, 연결을 종료하고 싶다는 뜻을 상대에게 보내는 것이다.[9]

UDP

User Datagram Protocol의 약자로, TCP와는 다르게 데이터를 패킷으로 나누고, 데이터를 보내기만 한다.[10]

비교

TCP와 UDP는 포트 번호를 이용하여 주소를 지정하고, 데이터 오류 검사를 위한 체크섬이 존재한다는 공통점이 있지만, TCP는 전송의 순서가 보장되는 반면, UDP는 전송 순서가 바뀔 수 있다. 또한, 연결형 서비스인 TCP와 반대로, UDP는 비 연결형 서비스이다. 패킷 교환 방식에서는 TCP는 가상 회선 방식이고, UDP는 데이터 그램 방식이다. 오류 제어와 흐름 제어가 TCP에는 있지만, UDP에는 없다. 전송속도는 UDP가 TCP보다 빠르다. TCP는 수신 여부를 확인하지만, UDP는 수신 여부를 확인하지 않고, 1:1 통신만 가능한 TCP와 달리, UDP는 1:1, 1:N, N:N 통시 모두 가능하다. UDP는 신뢰성이 낮고, TCP는 신뢰성이 높다.[3][10][11] UDP를 사용하는 애플리케이션 프로세스가 데이터를 UDP에 전달하자마자 데이터를 UDP 세그먼트로 만들고, 즉시 네트워크 계층으로 전송한다. 반면, TCP는 혼잡 제어 메커니즘을 가지고 있다. 따라서 네트워크가 혼잡해지면 TCP는 제어 정책에 따라 전송계층의 TCP Sender를 조절한다. 또한, TCP는 신뢰적인 전달이 얼마나 오래 걸리는지 상관없이 목적지가 세그먼트 수신 여부를 응답할 때까지 데이터 세그먼트 재전송을 계속할 것이다. TCP 데이터를 전송하기 위해 사전 연결 설정인 3-way handshake 과정이 필요하다. 반면, UDP는 예비 동작 없이 바로 전송한다. 그러므로 UDP 전송을 연결 설정 단계에서 어떠한 지연도 없다. 그리고 TCP는 엔드시스템(End System)에서 연결 상태를 유지한다. 이 연결 상태는 송수신 버퍼, 혼잡제어 파라미터, 순서번호와 확인 응답 번호 파라미터를 포함한다. 이러한 정보는 TCP가 신뢰적인 데이터 전송 서비스를 구현하고 연결 상태를 유지하기 위해 필수적이다. 반면에 UDP는 연결 상태를 유지하지 않는다. 따라서 어떠한 파라미터도 기록하지 않는다. TCP는 세그먼트마다 20바이트의 헤더 오버헤드를 갖지만, UDP는 8바이트의 오버헤드를 갖는다.[12]

용어

LISTEN은 서버의 데몬(Daemon)이 떠서 접속 요청을 기다리는 상태이다. SYN_SENT는 로컬의 클라이언트 애플리케이션이 원격 호스트에 연결을 요청한 상태이고, SYN_RECEIVED는 서버가 원격 클라이언트로부터 접속 요구를 받아 클라이언트에게 응답하였지만, 클라이언트에게 확인 메시지는 받지 않은 상태이다. ESTABLISHED는 3 방향 핸드셰이크가 완료된 후 서로 연결된 상태이다. 그리고 FIN-WAIT1, CLOSED-WAITFIN-WAIT2는 서버에서 연결을 종료하기 위해 클라이언트에게 종결을 요청하고 회신을 받아 종료하는 과정의 상태이다. TIME_WAIT은 연결이 종료되었지만, 분실되었을지 모를 느린 세그먼트를 위해 일정 시간 동안 소켓을 열어두고 있는 상태이다. CLOSING은 흔하지 않지만, 주로 확인 메시지가 전송 도중에 분실된 상태이다. CLOSED는 완전히 종료된 상태이다.[11]

각주

  1. (Network)IP, UDP, TCP란 무엇인가?〉, 《깃허브》, 2018-06-02
  2. 2.0 2.1 2.2 2.3 2.4 2.5 2.6 2.7 TCP(Transmission Control Protocol)란?〉, 《티스토리》, 2018-11-18
  3. 3.0 3.1 3.2 3.3 TCP Transmission Control Protocol〉, 《정보통신기술용어해설》
  4. 4.0 4.1 4.2 4.3 어서와 공대냥이, 〈(Network) TCP 프로토콜이란?〉, 《티스토리》
  5. 패킷의 흐름과 오류를 제어하는 TCP〉, 《깃허브》, 2019-11-22
  6. ss-won, 〈(네트워크) TCP와 UDP〉, 《velog》, 2020-10-09
  7. 7.0 7.1 jjewqm, 〈TCP 3-Way Handshaking〉, 《velog》, 20119-11-24
  8. ITsBee, 〈(네트워크 이해하기 Step4) TCP란?〉, 《네이버 블로그》, 2018-06-12
  9. TCP Control Flag TCP 제어 플래그〉, 《정보통신기술용어해설》
  10. 10.0 10.1 서버이야기, 〈TCP와 UDP란?〉, 《티스토리》, 2017-03-07
  11. 11.0 11.1 코딩팩토리, 〈(기타) TCP/UDP의 개념과 특징, 차이점〉, 《티스토리》, 2020-11-14
  12. JEFF Jeff_Kang, 〈신뢰적인 TCP보다 비신뢰적인 UDP를 사용하는 이유〉, 《티스토리》, 2019-05-15

참고자료

같이 보기


  검수요청.png검수요청.png 이 TCP 문서는 인터넷에 관한 글로서 검토가 필요합니다. 위키 문서는 누구든지 자유롭게 편집할 수 있습니다. [편집]을 눌러 문서 내용을 검토·수정해 주세요.