[Network] TCP

권용환·2021년 10월 7일
0

Network

목록 보기
1/2

TCP/IP 모델

TCP/IP 모델은 IP 기술을 중심으로 그 위에 TCP와 UDP라는 전송계층이 얹어진 형태입니다. 따라서 어떠한 통신 관련 하드웨어 기술이든 IP만 구현하면 되고, 어떤 응용 프로그램이든 IP 위에서만 동작하면 됩니다. 자세한 내용은 TCP/IP 모델이나 OSI 7계층으로 포스팅하도록 하겠습니다.

TCP

정의

  • IP 네트워크의 두 컴퓨터 간의 연결 지향 통신을 위한 전송 계층 호스트 간 프로토콜

  • IP가 데이터를 한 장소에서 다른 장소로 옮겨주는 역할을 한다면, TCP는 전체 데이터가 목적지에 잘 도착할 수 있도록 데이터의 흐름을 조절하고 이를 보장합니다

TCP 특징

  • 가상 회선 방식을 통한 연결형 서비스를 제공합니다

  • 3-way handshaking 과정을 통해 연결을 설정하고, 4-way handshaking 과정을 통해 연결을 해제합니다

  • 흐름 제어 및 혼잡 제어

  • 높은 신뢰성을 보장하지만 속도는 느리다

  • 바이트 스트림을 통한 연결

  • 전이중(Full-Duplex), 점대점(Point to Point) 방식

  • http, email, file transfer 등에 사용

TCP 서버 특징

  • 서버 소켓은 연결만을 담당

    • 처음 생성된 서버 소켓 인스턴스는 실제 통신을 담당하지 않고 클라이언트가 접속했는지의 여부만 확인합니다

    • 실제로 통신하는 소켓은 accept() 메서드로 활성화된 소켓이며, 이 활성화된 소켓은 데이터 전송에 필요한 스트림을 생성합니다

    • 추가적인 소켓 프로그래밍에 대한 내용은 추후 포스팅하겠습니다.

  • 연결 과정에서 반환된 클라이언트 소켓은 데이터의 송수신에 사용되며, 연결형 서비스로는 가상회선 방식을 제공한다

  • 서버와 클라이언트는 1대1로 연결된다

    • 하나의 서버에 여러 컴퓨터에서 client가 접속하는 경우, 각 client 당 하나씩의 서버 소켓이 생성됩니다

    • 예를 들어 1만개의 client가 접근할 때, 1만개의 서버 소켓이 생성되고, 1만번의 accept() 메서드가 수행되는 비효율적인 일이 발생합니다

    • 이를 해결하기 위해 스레드가 이용됩니다

    • 추후 소켓 프로그래밍에 대한 코드를 포스팅하도록 하겠습니다

  • 스트림 전송으로 전송 데이터의 크기가 무제한이다

    • 서로 다른 두개의 프로그램에서의 통신에서 데이터를 전달하기 위해서는 스트림을 사용해야 합니다
  • 패킷에 대한 응답을 해야하므로 성능이 낮다

    • 시간 지연, CPU 소모
  • Streaming 서비스에 불리

    • 손실된 경우 재전송 요청을 한다

TCP 헤더 정보

  • Source Port, Destination Port

    • 세그먼트의 출발지와 목적지를 나타내는 필드

    • 각각 16 bits 할당

    • 출발지와 목적지의 주소를 판별하기 위해서는 IP 주소와 포트 번호가 필요한데, IP 주소는 네트워크 계층에 있는 IP 헤더에 담기기 때문에 TCP 헤더에는 포트만 나타내는 필드만 존재

  • Sequence Number

    • 전송하는 데이터의 순서가 기록되어 수신자는 쪼개진 세그먼트의 순서를 파악해서 올바른 순서로 데이터를 재조립할 수 있다

    • 32 bits가 할당되므로 웬만해서는 중복되지 않는다

    • 송신자가 최초로 데이터를 전송할 때는 이 번호를 랜덤하게 초기화하고, 이후 보낼 데이터의 1 bytes당 시퀸스 번호를 1씩 증가시켜 데이터의 순서를 표현

  • Acknowledgement Number

    • 승인 번호는 수신자가 예상하는 다음 시퀸스 번호를 의미 (다음에 보내줘야 하는 데이터의 시작점)

    • 32 bits 할당

    • 연결 설정과 연결 해제의 handshake 과정에서는 상대방이 보낸 시퀸스 번호 + 1이지만, 실제로 데이터를 주고 받을 때는 상대방이 보낸 시퀸스 번호 + 자신이 받은 데이터(세그먼트)의 bytes로 승인 번호 생성

  • Data Offset

    • 전체 세그먼트에서 헤더가 아닌 데이터가 시작되는 위치를 표시

    • 32 bit word 단위를 사용하므로, 이 필드 값에 4를 곱하면 실제 데이터의 시작 위치를 알 수 있다

    • Data Offset은 Option 필드의 길이가 고정되어 있지 않기 때문에 반드시 필요하다

  • Reversed

    • 사용하지는 않지만 나중을 위한 예약 필드이며 0으로 채워져 있다
  • Flags

    • SYN, ACK, FIN 등의 제어 번호가 담겨있다

    • URG : Urgent Pointer 필드에 값이 있음을 알려주는 플래그이며, 포인터가 가리키는 긴급한 데이터는 먼저 처리된다

    • ACK : Acknowledgement 필드에 값이 있음을 알려주는 플래그이며, 0이면 승인 번호 필드를 무시한다

    • PSH : Push 플래그이며, 수신측에 데이터를 최대한 빨리 응용프로그램에 전달하라는 플래그

    • RST : Reset 플래그이며, 이미 연결이 확립된 ESTABLISHED 상태인 상대방에게 연결을 강제로 리셋해달라는 요청

    • SYN : Synchronized 플래그이며, 연결을 생성할 때 시퀸스 번호의 동기화를 맞추기 위해 존재

    • FIN : Finish 플래그이며, 연결을 종료하고 싶다는 요청

  • Window Size

    • 수신 윈도우의 버퍼 크기를 지정

    • 0이면 송신 프로세스의 전송 중지

  • Checksum

    • 프로토콜 헤더와 데이터에 대한 오류 검출
  • Urgent Pointer

    • 긴급 포인터이며, URG 값이 1이면 수신 측은 이 포인터가 가리키고 있는 데이터를 우선 처리한다
  • Options

    • TCP의 기능을 확장할 때 사용

    • 크기가 가변적이므로 Data Offest 필드가 필요하다

마치며

추후 포스팅에서 3-way handshaking, 4-way handshaking, UDP, 소켓 프로그래밍 등에 대해 더 자세하게 알아보겠습니다

참고

망나니개발자 님의 블로그
이대현 님의 블로그
코딩팩토리
Hackerrior 님의 블로그
Evans Library
쉽게 배우는 운영체제, 한빛 아카데미

profile
마구 낙서하는 블로그입니다

0개의 댓글