본문 바로가기
Common/Network

TCP(Transmission Control Protocol)란?

by 근육곰돌이 2018. 11. 18.
728x90

TCP? - (Transmission Control Protocol) 

- 서버와 클라이언트간에 데이터를 신뢰성 있게 전달하기 위해 만들어진 프로토콜이다.  

- 데이터를 전송하기 전에 데이터 전송을 위한 연결을 만드는 연결지향 프로토콜이다.

- 데이터는 네트워크선로를 통해 전달되는 과정에서 손실되거나 순서가 뒤바뀌어서 전달될 수 있는데, TCP는 손실을 검색해내서, 이를 교정하고 순서를 재조합할수 있도록 해준다. 

특징 

1) 신뢰성 

  • TCP의 가장 중요한 특징은 신뢰할 수 있는 말단 장치간 데이터 전달이다. 신뢰성을 제공 하려면, TCP는 손상되거나 없어지거나 중복되거나 네트워크 계층에서 순서가 틀어져서 전달된 데이터를 복구해야 한다. TCP는 신뢰성을 실현하기 위해 적극적 수신, 통지, 재전송 체계를 사용한다. 

2) 흐름 제어 

  • TCP 데이터 세그먼트를 송수신하는 컴퓨터는 CPU와 네트워크 대역폭의 차이 때문에 서로 다른 데이터 속도로 작동할 수 있다. 결국 수신자가 처리할 수 있는 것처럼 훨씬 더 빠른 속도로 송신자가 데이터를 보낼 가능성이 많다. TCP는 송신자가 보낸 데이터의 양을 제어하는 흐름 제어 메커니즘을 구현한다. 

3) 다중화 

  • TCP에서는 한 라우터의 많은 프로세스가 TCP 통신 서비스를 동시에 사용할 수 있다. 

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

4) 연결형 서비스 

  • 응용 프로그램 프로세스는 TCP를 사용하여 데이터를 보낼 수 있는 상태가 되려면 먼저    연결을 설정해야 한다. 

5) TCP 연결은 데이터를 양방향으로 운반할 수 있다. 

  • , 하나의 전송선로에서 데이터가 동시에 양쪽방향으로 전송될 수 있는 것을 의미한다. 

6) TCP 연결은 3way handshake 절차를 사용하여 열린다. 

   - SYN과 ACK 플래그는 다음과 같은 패킷을 나타내기 위해 사용된다.                          

         SYN = 1 및 ACK = 0 연결 열기 패킷 

         SYN = 1 및 ACK = 1 연결 열기 수신 통지 

         SYN = 0 및 ACK = 1 데이터 패킷 또는 ACK 패킷 

    

  - 연결을 설정하는 절차는 동기화(SYN) 제어 플래그를 이용하며, 3way handshake 라는 세 메시지를 교환하게 된다 

 


프로토콜 헤더 (Protocol Header) 구조 

 

필드 

기능 

Source Port 

데이터를 보내는 호스트의 TCP 포트. 

Destination Port 

데이터를 받는 호스트의 TCP 포트. 

Sequence Number 

TCP 세그먼트에 있는 데이터의 첫번째 바이트에 대한 순번. 

Acknowledgment Number 

바이트에 대한 순번, 데이터를 보내는 측은 연결된 다른 측 호스트에서 이 값을 전달 받을 것을 기대합니다. 

Window 

TCP 세그먼트를 보내는 호스트의 현재 TCP 버퍼 크기. 

TCP Checksum 

TCP 데이터와 TCP 헤더의 정확성 확인 

 


3way handshake 

 

TCP 연결은 세가지 방법의 핸드쉐이크에 위해 초기화됩니다.  

세가지 방법의 핸드쉐이크의 목적은 순번을 동기화하고 연결의 양측에서 순번을 확인하고 TCP 윈도우의 크기를 교환하고 최대 세그먼트 크기와 같은 기타 TCP 옵션을 교환하는 것입니다.  

 

 

 

1. Client에서 Server에 연결 요청을 하기위해 SYN 데이터를 보낸다. 

 

2. Server에서 해당 포트는 LISTEN 상태에서 SYN 데이터를 받고 SYN_RCV로 상태가 변경된다. 

 그리고 요청을 정상적으로 받았다는 대답(ACK) Client 포트를 열어달라는 SYN  같이 보낸다. 

 

3. Client에서는 SYN+ACK 를 받고 ESTABLISHED로 상태를 변경하고 서버에 요청을 잘 받았다는 ACK 를 전송한다. 

ACK 받은 서버는 상태가 ESTABLSHED 변경된다. 

 

위와 같이 3번의 통신이 정상적으로 이루어지면, 서로의 포트가 ESTABLISHED 되면서 연결이 되게 된다. 

 

  • 상태 : 현재의 포트 상태 확인은 netstat 명령어로 할 수 있다. 

- Closed 

닫힌 상태 

- LISTEN 

 포트가 열린 상태로 연결 요청 대기 중 

- SYN_RCV 

 SYNC 요청을 받고 상대방의 응답을 기다리는 중 

- ESTABLISHED 

 포트 연결 상태 

    3way handshake 패킷 분석 

    • [SYN] Packet 구조 

     

    • [SYN/ACK] Packet 구조 

    • [ACK] Packet 구조 


4way handshake 

4-way handshake 맺어진 TCP 세션을 종료하기 위해 수행되는 절차입니다. 

 

1. 클라이언트가 연결을 종료하겠다는 [FIN(,ACK)] 플래그를 전송한다. 

2. 서버는 일단 확인 메시지[ACK] 보내고 자신의 통신이 끝날때까지 기다리는데  상태가 TIME_WAIT 상태다. 

3. 서버가 통신이 끝났으면 연결이 종료되었다고 클라이언트에게 [FIN(,ACK)] 플래그를 전송한다. 

4. 클라이언트는 확인했다는 메시지[ACK] 보낸다. 

 

그런데 만약 "Server에서 FIN을 전송하기 전에 전송한 패킷이 Routing 지연이나 패킷 유실로 인한 재전송 등으로  

인해 FIN패킷보다 늦게 도착하는 상황"이 발생하여Client에서 세션을 종료시킨 후 뒤늦게 도착하는 패킷이  

있다면 이 패킷은 Drop되고 데이터가 유실될 것이다이를 대비하여 Client는 Server로부터 FIN을 수신하더라도  

일정시간(디폴트 240초) 동안 세션을 남겨놓고 잉여 패킷을 기다리는 과정을 거치게 되는데 이 과정을 "TIME_WAIT" 라고 합니다. 

 

  • 4 way handshake 패킷 분석 

  • [FIN,ACK] Packet 구조 - Client 

  • [ACK] Packet 구조 - Server 

 

  •  

  • [FIN,ACK] Packet 구조 - Server 

 

  • [ACK] Packet 구조 - Client 

 

 


 래그  설명 

 ㅇ URG (Urgent) 
     - Urgent pointer 필드에 값이 채워져있음을 알림 
        . 송신측 상위계층이 긴급 데이터라고하면, 긴급비트를 1 로 설정하고, 
          순서에 상관없이 먼저 송신됨 
           .. 긴급 데이터의 마지막 바이트 위치가 Urgent pointer로 가리켜짐 
 

ㅇ ACK (Acknowledgement) 
     - 확인응답 필드에 확인응답번호(Acknowledgement Number) 값이 셋팅됐음을 알림 
        . 1로 셋팅되면, 확인번호 유효함을 뜻함 
        . 0로 셋팅되면, 확인번호 미포함 (즉, 32 비트 크기의 확인응답번호 필드 무시됨) 
     - SYN 세그먼트 전송 이후(TCP 연결 시작후) 모든 세그먼트에는 항상 이 비트가 1로 셋팅됨 
 

ㅇ PSH (Push) 
     - 버퍼링된 데이타를 가능한한 빨리 상위 계층 응용프로그램에 즉시 전달할 것 
        . 수신측은 버퍼가 찰 때까지 기다리지 않고,  
          수신 즉시 버퍼링된 데이터를 응용프로그램에 전달 
        . 例) telnet 세션에서 `q` 입력 만으로 세션 종료를 알릴 때 등 
     - 때론, 서버측에서 더이상 전송할 데이터가 없음을 나타내기도 함 
 

※ 아래 3개 비트 플래그(RST,SYN,FIN)는 TCP 연결설정 및 TCP 연결종료에 주체적으로 사용됨 
 

ㅇ RST (Reset)        [강제 연결 초기화 용도] 
     - 연결확립(ESTABLISHED)된 회선에 강제 리셋 요청  
        . 강제 리셋 : RST=1          (RST 세그먼트 또는 RESET 세그먼트) 
 

. 연결 상의 문제를 발견한 장비가 RST 플래그를 `1`로 설정한 TCP 세그먼트를 송출 
           .. LISTEN,SYN_RCVD 상태일때 => RST 수신한 경우에 => LISTEN 상태로 들어감 
           .. 그밖의 상태 일때 => RST 수신한 경우에 => 연결 끓고 CLOSED 상태로 들어감 
 

* 반 개방 또는 연결 문제 등의 상황 처리를 위한 특별한 초기화용 제어 비트 
 

ㅇ SYN (Synchronize)  [연결시작,회선개설 용도] 
     - TCP 연결설정 초기화를 위한 순서번호의 동기화  ☞ TCP 연결 설정 
        . 연결요청  : SYN=1, ACK=0   (SYN 세그먼트) 
        . 연결허락  : SYN=1, ACK=1   (SYN+ACK 세그먼트) 
        . 연결설정  : ACK=1          (ACK 세그먼트) 
 

* 즉, 송수신 간에 순서번호의 동기화 
 

ㅇ FIN (Finish)       [연결해제,회선종결 용도] 
     - 송신기가 데이타 보내기를 끝마침               ☞ TCP 연결 종료 
        . 종결요청 : FIN=1           (FIN 세그먼트) 
        . 종결응답 : FIN=1, ACK=1    (FIN+ACK 세그먼트) 
 

* 즉, 연결을 종료하고 싶다는 뜻을 상대에게 보내는 것 

 


 

참고 - 잘 알려진 포트 

TCP 포트 

TCP 포트는 TCP 세그먼트를 전달하기 위한 특정 지점을 제공합니다. 포트 번호 1024 이하는 잘 알려진(well-known) 포트로서 IANA(Internet Assigned Numbers Authority)에 의해 지정됩니다.  

 

잘 알려진 TCP 포트 

TCP 포트 번호 

설명 

20 

FTP (데이터 채널) 

21 

FTP (컨트롤 채널) 

23 

Telnet 

80 

WWW에 의해 사용되는 HTTP(HyperText transfer Protocol) 

139 

NetBIOS 세션 서비스 





반응형