개발 · 컴퓨터공학 / / 2021. 9. 7. 20:13

네트워크 프로그래밍 - TCP란?

728x90
반응형

TCP는 Transmission Control Protocol(TCP)의 약자이다.

TCP는 Transport Layer에 있으며, TCP와 UDP가 대표적이다.

 

TCP를 이해하기 위해서는 먼저 Port에 대해서 이해를 해야하는데,

인터넷을 사용하는 모든 프로그램은 각자의 번호를 부여받아야만 통신이 가능하다. 프로세스를 구별하기 위해서 필요한 번호가 포트번호이다.

 

클라이언트가 서버로 접속하기 위해서는 source to destination이므로 IP주소는 반드시 알아야하고, 포트번호를 알아야 접속할 수 있다. IP주소가 대표전화, 포트번호가 내선전화에 비유할 수 있겠다.

 

위와 같이 대표적으로 쓰이는 TCP들의 포트번호 할당이 있고, 가장 많이 사용하는 웹서버의 경우 80번 포트가 할당이된다. 웹서버에 접속하기 위한 포트는 80번으로 알고있으니 IP주소만 알면 웹서버에 접속할 수 있다. 

 

클라이언트가 서버에 접속하기 위해서는 앞에서 말한바와 같이 IP주소와 port번호가 필요한데, 보통은 시스템에서 포트번호를 자동으로 처리해주기 때문에, 클라이언트의 포트번호는 신경쓰지 않아도 된다. 0~1023번 포트까지는 이미 지정이 되어있고 그 이후의 포트중에서 자동으로 할당하는 것이다.

 

TCP를 이해하기 위해 필요한 개념 중 하나로 Stream delivery가 있다.

 

 

위 그림을 이해하기 위해서 먼저 UDP에 대해서 알아보자.

 

UDP에서는 boundary delivery로 데이터를 보내는데, application에서 만들어진 데이터들의 boundary(경계)들이 유지되는 상태로 뭉쳐져 전달되는 형태를 boundary delivery 라고 한다. 

 

하지만 TCP에서는 application에서 만들어진 데이터들의 boundary들이 유지되지 않고 다른 단위로 잘려서 전송된다. 예를들어 application에서는 정보를 3덩이로 보냈는데 받은 입장에서는 2덩이로 단위로 받을 수 있다는 것이다. 이를 Stream delivery라고 한다.

 

TCP는 양방향으로 주고 받고 모두 할 수 있고, process에서 buffer를 거쳐 보내고 buffer를 통해 받는 위치의 process가 받아서 처리한다. 보내는 위치의 버퍼를 sending buffer, 받는 위치의 버퍼를 receving buffer라고 한다.

 버퍼는 크게 세 가지 영역이 있다. Sent / Not sent / Empty의 세 영역이다.

Sent 영역

버퍼가 데이터를 보낼 때 만약 특정 부분이 제대로 전달되지 않았다면 buffer가 process에게 데이터를 다시 요청해야하는데 그렇지 않으려면 buffer 자체가 보낸 데이터에 대한 copy(사본)를 가지고 있어야 한다. 이 영역에 해당하는 것이 Sent 영역이다. 

Not sent 영역

 버퍼가 아직 보내지 않은 데이터들이 담겨있는 영역이다. 

Empty 영역

process에게서 받을 데이터를 담기 위한 비어있는 영역이다.

 

 

stream of bytes라고 되어있는 부분은 사실 연속적인 것이 아니라 각각의 패킷으로 나뉘어서 다음 그림과 같이 전송한다.

 

 TCP가 있는 Transport Layer에서는 패킷을 segment라고 부르고, receving buffer에서 데이터를 받을 때, 각각의 segment를 받아 처리하다가 잃어버리거나 문제가 생긴 segment가 있다면, 그 전까지 정상적인 데이터만을 process에게 보낸다. 

 

Transport Layer에서 패킷의 분실에 대한 책임을 지기 때문에, TCP에 의해서 전송되는 byte단위의 데이터들(segment / packet)들은 각각 번호가 매겨진다. 이 번호는 임의의 생성번호로 시작된다.

 

5,000byte의 정보를 보내는데 segment의 크기가 1,000byte라고 하자. 총 5개의 segment가 만들어지고, 첫번째 byte는 10,001로 번호를 매겼다고 하면 위와 같다.

 

패킷 즉 segment에 부여하는 번호는 Sequence Number라고 한다. Sequence Number를 결정하는 방법은 이렇다.

 첫번째 segment의 시작번호는 임의로 결정되고, 그 다음 segment부터 byte마다 번호가 부여된다. 다음 segment가 시작되는 위치의 byte번호가 즉 Sequence Number가 된다.

 위 그림으로 예를 들면 시작번호가 10,001 segment크기가 1,000byte이므로, segment1은 10,001 ~ 11,000까지 byte번호가 부여되고, 두 번째 segment가 시작하는 byte번호가 11,001이므로 두 번째 segment의 Sequence Number는 11,001이다.

 

segment에 Sequence Number filed의 값은 segment안의 first data byte가 할당된다.

 

Segment가 Data와 Header로 구성되어있고, 대략 20~60 byte 를 차지하는 Header안에 Sequence Number라는 영역에 번호를 부여한다. 부여되는 Sequence Number는 Data의 첫번째 byte가 할당된다.

728x90
반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유