TCP

김하영·2021년 3월 24일
0

TCP(Transmission Control Protocol)란?

  • 서버와 클라이언트간에 데이터를 신뢰성있게 전달하기 위해 만들어진 프로토콜이다.
  • 데이터를 전송하기 전에 데이터 전송을 위한 연결을 만드는 연결지향 프로토콜이다.
  • 데이터는 네트워크를 통해 전달되는 과정에서 손실되거나 순서가 뒤바뀌어서 전달될 수 있는데, TCP는 손실을 검색해내서 이를 교정하고 순서를 재조합할수 있도록 해준다. 

TCP 특징

  • 연결형 (connnection-oriented) 서비스로 연결이 성공해야 통신이 가능하다.
  • 데이터의 경계를 구분하지 않는다. (바이트 스트림 서비스)
  • 데이터의 전송 순서를 보장한다. (데이터의 순서 유지를 위해 각 바이트마다 번호를 부여)
  • 신뢰성있는 데이터를 전송한다. (Sequence Number, Ack Number를 통한 신뢰성 보장)
  • 데이터 흐름 제어(수신자 버퍼 오버플로우 방지) 및 혼잡 제어(패킷 수가 과도하게 증가하는 현상 방지)
  • 연결의 설정(3-way handshaking)과 해제(4-way handshaking)
  • 전이중(Full-Duplex), 점대점(Point to Point) 서비스
  • UDP보다 전송속도가 느리다.

소켓 통신 과정

  • 서버 : 소켓을 생성, 주소 할당, 연결 요청 기다림, 요청에 대한 응답

  • 클라이언트 : 소켓을 생성, 주소 할당, 연결 요청

TCP 헤더 구조

TCP Handshake (3Way, 4Way)

- 연결 과정(3-way-handshaking)

  1. 두 시스템이 통신을 하기 전에 클라이언트는 포트가 Close상태, 서버는 해당 포트로 항상 서비스를 제공할 수 있도록 Listen 상태

  2. 처음 클라이언트가 통신을 하고자 하면, 임의의 포트 번호가 클라이언트 프로그램에 할당, 클라이언트는 SYN Sent 상태가 됨, 서버에 연결을 하고싶다는 의사 표시

  3. 서버는 클라이언트의 연결 요청을 받고, SYN Received 상태가 되고, 연결을 해도 좋다는 의미로 SYN+ACK패킷을 보낸다

  4. 마지막으로 클라이언트는 연결 요청에 대한서어븽 응답을 확인했다는 표시로 ACK 패킷을 서버에 보낸다

    Client SYN -> Server SYN+ACK -> Client ACK -> Server

- 해제 과정(4-way-handshaking)

  1. 두 시스템이 통신을 하는 중에는 클라이언트와 서버 모두 Established 상태

  2. 통신을 끊고자 하는 클라이언트가 서버에 FIN 패킷 전송 이떄 클라이언트는 Close Wait 상태가 됨

  3. 서버는 클라이언트의 연결 종료 요청을 확인하고, 응답으로 ACK 패킷을 보낸 뒤, 서버도 클라이언트의 연결을 종료하겠다는 의미로 FIN 패킷을 보냄, 그후 Close Wait 상태가 됨

  4. 마지막으로 클라이언트는 연결 종료 요청에 대한 서버의 응답을 확인했다는 의미로 ACK 패킷을 서보로 보낸다

    Client FIN -> Server ACK, FIN -> Client ACK -> Server

TCP 패킷 캡처하여 분석해보기

이전에 와이어 샤크를 사용해본적은 있지만 정확하게 어떤 원리로 패킷들을 목록화하는지는 모르겠다.
실행시키니 현재 네트워크에서 통신이 되고 있는 패킷들이 쭉 나열되었고 하나의 TCP 패킷을 잡아서 분석해보았다.

하단 회색 부분은 Ethernet header(src & dst MAC address), IP header(src & dst IP address) 정보와 함께, TCP header 부분의 정보가 담겨있다.

  1. Source Port ( 발신지 포트 필드)

: 발신지에서 오픈된 필드로, 58571 포트인 것을 확인할 수 있다.

  1. Destination Port (목적지 포트 필드)

: 수신지에서 오픈된 필드로, 443번 포트인 것을 확인할 수 있다. (SSL 포트)

(80번 / 443번 포트는 웹서버의 기본 포트이다.)

  1. Sequence number (순차 번호 필드)

: TCP 세그먼트의 첫번째 바이트에 부여되는 고유한 숫자 값으로 TCP 세그먼트들 간의 식별이 가능하며, 통신할 때 패킷 손실이 일어나는 것을 방지하는 목적으로 사용된다. 이 순차번호는 패킷에 포함되어있는 데이터만큼 증가한다.

  1. Acknowledgment number (확인 응답 번호 필드)

: 데이터 수신을 확인하는 번호로 수신한 마지막 바이트의 순서번호에 +1한 값이다.

  1. Header Length(데이터 오프셋 필드)

: TCP 헤더의 길이이다. 필드 값은 4bytes 씩 증가하므로 위의 패킷은 5*4=20(bytes)이다.

  1. Flags

[Reserved]

-> 미래에 사용하기 위해 남겨둔 예비 필드로 0으로 채워져야 함

[Flag Filed]

  • Nonce

    : Explicit Congestion Notification은 네트워크 상에서 일어날 가능성이 있는 혼잡을 미리 탐지하여 송신측에 전달하고 전송 속도를 조절하는데, 이 필드는 ECN-nonce를 은폐 및 보호한다.

  • Congeston Window Reduced

    : 호스트가 ECE 플래그가 포함된 TCP 세그먼트를 수신했고, 혼잡 제어 메커니즘에 의해 응답했음을 알림

  • ECN-Echo

    -> SYN=1 : TCP 상대가 ECN이 가능함 = 혼잡하다!!!

    -> SYN=0 : IP헤더셋에 혼잡 경험 플래그가 설정된 패킷이 정상적인 전송 중에 수신되었음

  • Urgent

    : 긴급하게 처리해야 하는 데이터 포함. 1로 설정되어 있는 패킷은 순서 상관없이 먼저 송신

  • Acknowledgment

    : 비트가 1이면 확인응답을 뜻하고, ack number는 다음에 받을 것으로 예상되는 데이터의 순서번호를 나타낸다.

  • Push

    : 데이터를 응용계층으로 보낼지의 여부 결정 (데이터의 강제전송 느낌)

  • Reset

    : TCP 연결 재설정 여부 결정

  • Syn

    : 호스트 간의 순서번호를 동기화하여라 (TCP hand shaking 단계)

  • Fin

    : finish 비트는 프로세스 완료. 아래 사진을 참고해보면 Calculated window size : 65536이 있는데 이것이 0이 되면 보내는 것을 중단하며 [FIN,ACK] 사인을 클라이언트가 보낼 때, Fin 플래그가 1로 설정되어 보내진다.

[Window Filed]

: TCP 수신 버퍼를 바이트 크기로 표시한 것으로, 0이면 프로세스의 전송을 중지한다. window 안에 표기된 크기만큼 전송했을 때 문제가 없다면 다음 전송 때 2배의 window 크기로 보낸다. 만약 수신측에서 window size를 보내면 그것에 맞춰서 전송속도를 조절한다.

[Checksum Field]

: TCP 데이터가 중간에 훼손되거나 변조되었는지 체크하는 필드이다.

profile
Back-end Developer

0개의 댓글