1. TCP란?

1-1. TCP (Transmission Control Protocol)


TCP란 IP 프로토콜 위에서 연결형 서비스를 지원하는 전송 계층의 프로토콜이다.
[TCP 특징]

  • 연결 지향 방식으로 패킷 교환 방식과 가상 회선 방식 사용한다.
  • 3-way handshaking 과정을 통해 연결을 설정하고 4-way handshaking을 통해 해제한다.
  • 흐름 제어 및 혼잡 제어
  • 높은 신뢰성 보장한다.
  • 전이중(Full-Duplex), 점대점(Point to Point)방식 방식을 사용한다.

패킷이란?
인터넷 내에서 데이터를 보내기 위한 경로배정(라우팅)을 효율적으로 하기 위해서 데이터를 여러 개의 조각들로 나누어 전송을 하는데 이때, 이 조각을 패킷이라고 한다.

1-2. TCP vs UDP

1-3. TCP 헤더 구조


TCP 헤더의 크기는 최소 20바이트, 최대 40바이트이다.

  • 발신지 포트 주소,목적지 포트 주소 : TCP로 연결되는 가상회선 양단의 송수신 프로세스에 할당된 네트워크 포트 주소를 의미한다. 
  • Sequence number(순서 번호) : 송신 프로세스가 지정하는 순서 번호. 세그먼트 전송 과정에서 전송되는 바이트의 수를 기준으로 증가한다. 최대 범위가 2의 32승이라 중복의 염려가 없다.
  • Acknowledgement Number(응답 번호) : 수신 프로세스가 제대로 수신한 바이트의 수를 응답하기 위해 사용한다.
  • Data Offset(이미지 HLEN) : TCP 세그먼트가 시작되는 위치를 기준으로 데이터의 시작 위치를 나타내므로 TCP헤더의 크기가 된다.
  • Reserved(예약) : 예약 필드
  • Window(윈도우) : 슬라이딩 윈도우 프로토콜에서 수신 윈도우의 버퍼 크기를 지정하기위해 사용하며 수신 프로세스가 수신할 수 있는 바이트의 수를 표시한다.
  • Checksum : TCP 세그먼트에 포함되는 프로토콜 헤더와 데이터 모두에 대한 변형 오류를 검출하는데 사용한다.
  • Ugent Pointer(긴급 포인터) : 긴급 데이터를 처리 위해 사용한다.

1-4. TCP 헤더 플레그 비트

  • URG : Urgent Pointer 필드가 유효한지를 나타냄. 긴급데이터가 도착했다는 의미로 수신 프로세스가 얼마나 많은 긴급데이터가 오는지 알 수 있음
  • ACK : Acknowledgement Number 필드가 유효한지 나타냄.
  • PSH : 현재 세그먼트의 데이터를 즉시 상위 계층에 전달하도록 지시할 때 사용. 
  • RST : 연결의 리셋이나 유효하지 않은 세그먼트에 대한 응답용으로 사용 -> 연결이 재설정되었을 때 재전송 되어야 함
  • SYN : 연결 설정 요구를 하는 플래그 비트로 가상 회선 연결시에 사용됨
  • FIN : 한쪽 프로세스에서 더이상 전송할 데이터가 없어 연결 종료의사를 알릴 때 사용. 연결해제는 양쪽 프로세스 모두 FIN플래그를 전송해야 완료됨
  • 혼잡 제어
           ECE(ECN-Echo) : 네트워크 트래픽이 많아질 때 라우터가 송신 프로세스에 명시적으로 혼잡함을 알릴 때 사용. 
           CWR : ECE비트를 수신한 송신 프로세스가 송신 윈도우 크기를 줄였음을 통지하는게 목적, 더이상 ECE를 전송하지 말라는 뜻

2. TCP의 동작 원리

2-1. 연결 설정


TCP 프로토콜은 전이중 방식을 채택해 가상 회선으로 연결된 두 프로세스가 동시에 데이터를 전송할 수 있음 (피기배팅 기능 사용)
3-way handshake 방식
1. 프로세스가 SYN플래그를 지정한 세그먼트 전송해 연결 설정을 요구한다
2. 프로세스가 긍정 응답 시 ACK필드에 SYN의 순서번호 10과 1을 더한 11을 지정해 회신한다
3. 프로세스가 전송한 수락 세그먼트가 제대로 도착했음을 알린다. 데이터가 있으면 바로 데이터도 함께 보낸다

2-2. 데이터 전송


3번의 데이터 응답 단계에서 데이터를 전송할 수 있으며 window 필드를 통해 흐름제어가 이루어진다.

TCP는 부정 응답 기능을 사용하지 않는데, 데이터 전송 과정에서 오류가 발생할 경우 수신 프로세스에서 회신을 받을 수 없어 송신 프로세스의 타임아웃 기능에 의한 세그먼트 재전송이 이루어진다

2-3. 연결 해제

점진적 연결 해제 방식을 선택하고 있다.
해제하고자 하는 쪽에서 FIN플래그를 1로 전송하고, 수신 프로세스 측에서도 FIN 플래그를 1로 보내면 연결이 해제된다.
만약 수신 측에서 FIN을 보내지 않으면 연결이 계속 유지된 상태가 된다. 

3. Socket란?

3-1. Socket

어플리케이션과 네트워크 사이의 통신 창구 역할

  • 프로토콜
           어떤 시스템이 다른 시스템과 통신을 원활하게 수용하도록 해주는 통신 규약, 약속
  • IP
           전 세계 컴퓨터에 부여된 고유의 식별 주소
  • 포트
           같은 컴퓨터 내에서 프로그램을 식별하는 번호
           네트워크 상에서 통신하기 위해서 호스트 내부적으로 프로세스가 할당받아야 하는 고유한 숫자
           같은 호스트 내에서 서로 다른 프로세스가 같은 포트 넘버를 가질 수 없음

3-2. 소켓 통신 흐름

3-2-1. 서버 (Server)

클라이언트 소켓의 연결 요청을 대기한다.
연결 요청 시 클라이언트 소켓을 생성하고, 통신이 가능하게 한다.

1) socket() 함수를 이용하여 소켓을 생성한다
2) bind() 함수로 ip와 port 번호를 설정한다
3) listen() 함수로 클라이언트의 접근 요청에 수신 대기열을 만들어 몇 개의 클라이언트를 대기 시킬지 결정한다
4) accept() 함수를 사용하여 클라이언트와의 연결을 기다린다

3-2-2. 클라이언트 (Client)

클라이언트 소켓에서 실제로 데이터 송수신이 일어난다.

1) socket() 함수로 가장 먼저 소켓을 연다
2) connect() 함수를 이용하여 통신 할 서버의 설정된 ip와 port 번호에 통신을 시도한다
3) 통신 시도 시, 서버가 accept() 함수를 이용하여 클라이언트의 socket descriptor을 반환한다
4) 클라이언트와 서버가 서로 read(), write() 하며 통신한다
5) 4)의 과정을 반복한다

3-3. 소켓 종류

스트림 (TCP)

  • 양방향으로 바이트 스트림을 전송, 연결 지향성
  • 오류 수정, 전송 처리, 흐름제어 보장
  • 송신된 순서에 따라 중복되지 않게 데이터를 수신 → 오버헤드가 발생
  • 소량의 데이터보다 대량의 데이터 전송에 적합 → TCP를 사용

데이터그램 (UDP)

  • 비연결형 소켓
  • 데이터의 크기에 제한이 있음
  • 확실하게 전달이 보장되지 않음. 데이터가 손실돼도 오류가 발생하지 않음
  • 실시간 멀티미디어 정보를 처리하기 위해 주로 사용 ex) 전화

3-4. 자바에서의 사용

3-4-1. 개발자의 요청(애플리케이션 계층):

개발자가 new Socket() 코드 실행하면 JVM이 운영체제에게 “www.example.com의 80번 포트로 TCP 연결을 맺어달라고 요청한다.

3-4-2. 운영체제(전송 계층):

3-way handshake 과정 자동 수행

3-4-3.연결 수립 완료:

OS는 소켓의 상태를 ‘연결됨(ESTABLISHED)’으로 변경하고, 개발자는 소켓 객체를 통해 데이터를 주고받을 수 있게 된다.

profile
slow but steady

0개의 댓글