Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

하마롱크의 블로그

TCP 본문

Network

TCP

하마롱크 2021. 12. 22. 08:57

OSI 7계층 중 4계층에서 동작하는 프로토콜의 목적은 목적지 단말 안에서 동작하는 여러 애플리케이션 프로세스 중 통신해야 할 목적지 프로세스를 정확히 찾아가고 패킷 순서가 바뀌지 않도록 잘 조합해 원래 데이터를 만들어내는데 있습니다.

이번 포스팅에서는 TCP/IP  프로토콜 스택의 4계층에서 동작하는 TCP 프로토콜에 대해 다루겠습니다.

 

4계층 프로토콜(TCP, UDP)와 서비스 포트

데이터를 주고받는 인캡슐레이션과 디캡슐레이션 과정에서 각 계층별로 정의하는 헤더가 추가되고 여러 정보들이 들어갑니다. 그 중에서 우리가 기억해야할 중요한 두 가지 정보는 다음과 같습니다.

- 각 계층에서 정의하는 정보

    - 수신 측의 동일 계층에서 사용하기 위한 정보

    - 송신 측에서 추가한 2계층 헤더의 MAC 주소 정보는 수신 측의 2계층에서 확인 및 사용됨

    - 송신측에서 추가한 3계층 IP주소는 수신 측 3계층에서 사용

    - 4계층에서는 시퀀스 정보와 ACK 번호가 있음

 

- 상위 프로토콜 지시자 정보

    - 디캡슐레이션 과정에서 상위 계층의 프로토콜이나 프로세스를 정확히 찾아가기 위한 목적으로 사용됨

    - 2계층: 이더 타입 ex: 0x0800(IP)

    - 3계층: 프로토콜 번호 ex: 6(TCP) 

    - 4계층: 포트 번호 ex: 80(HTTP), 443(HTTPS)

 

- TCP/IP 프로토콜 스택 4계층인 전송 계층은 TCPUDP가 담당

- 2, 3계층과는 다르게 목적지를 찾아가는게 아닌 애플리케이션에서 사용하는 프로세스를 정확히 찾아가야하고 패킷을

  잘 쪼개서 보내고 잘 조립하는 것

- 패킷을 분할하고 조립하기 위해 TCP 프로토콜에서는 시퀀스 번호ACK 번호를 사용

 

- TCP/IP 프로토콜 스택에서 4계층의 상위 프로토콜 지시자는 포트 번호

- TCP/IP에서는 클라이언트-서버 방식으로 서비스를 제공하고 클라이언크용 프로그램과 서버용 프로그램을 구분해 개발

- 3계층의 프로토콜 번호, 2계층의 이더 타입과 같은 상위 프로토콜 지시자는 출발지/도착지 구분하지 않고 하나만 사용

- 그러나 4계층 프로토콜 지시자인 포트번호는 출발지와 목적지를 구분해서 처리해야 함

 

 

- 평소 우리가 표현하는 포트 번호 기준은 서버의 포트

- HTTP TCP 80, HTTPS TCP 443, SMTP TCP 25와 같이 잘 알려진 포트를 '웰 노운(Well Known) 포트'라 함

- 이 포트들은 인터넷 주소 할당기구인 IANA(Internet Assigned Numbers Authority)에 등록되고, 1023번 이하 포트 사용

 

- 다양한 애플리케이션에 포트 번호를 할당하기 위해 Registered Port 범위를 사용 - 1024~49151의 범위

- 포트 번호를 할당받기 위해 신청하면 IANA에 등록되어 관리됨

- 그러나 공식 번호와 비공식 번호가 혼재되어 있고, 사설 포트 번호로 사용되기도 함

 

- 동적, 사설, 임시 포트의 범위는 49152~65535

- 이 범위의 포트 번호는 IANA에 등록되어 사용되지 않음

- 자동 할당되거나 사설 용도로 할당되고 클라이언트의 임시 포트 번호로 사용됨

 

- 서비스 요청 시와 응답 시에는 출발지 IP와 목적지 IP가 반대가 되는 것처럼

  출발지와 도착지 포트 번호도 요청 패킷과 응답 패킷이 반대가 됨

- 서버 측에서 클라이언트 측의 요청에 대해 응답할 때는 출발지 포트, 도착지 포트가 클라이언트의 포트가 되어 전송

클라이언트-서버 통신에 따른 포트 번호

 

TCP

- 4계층의 특징을 대부분 포함

- 신뢰할 수 없는 공용망에서도 정보유실 없는 통신을 보장하기 위해 세션 연결, 데이터 분할과 패킷 전송여부를 확인하

  는 기능이 있음

- 패킷에 번호(Sequence Number)를 부여하서 전송 상태를 확인함

- 잘 전송되었는지에 대한 응답(Acknowledge Number)을 함

- 한번에 어느 크기로 보내야 수신자가 잘 처리할 수 있는지 전송 크기(Window Size)를 고려해 통신함

- 네트워크 상태를 크게 고려하지 않고 쉽고 안전하게 네트워크 사용 가능

 

 

패킷 순서, 응답 번호

- TCP에서는 분할된 패킷을 잘 분할하고 수신 측이 잘 조합하도록 패킷에 순서와 응답 번호를 부여

    - 시퀀스 번호: 패킷에 순서를 부여하는 것

    - ACK 번호: 응답 번호를 부여하는 것

- 두 번호를 이용해 패킷의 순서가 바뀌거나 중간에 손실된 패킷을 파악 가능

 

 

- 보내는 측에서 패킷에 번호를 부여하면 받는 측은 이 번호의 순서가 맞는지 확인 후 다음 번호의 패킷을 요청

    ->이 숫자를 ACK 번호라 함

- 송신 측에서 ACK 번호를 수신받으면 확인 후 다음 패킷에 번호를 부여해 송신

 

패킷 순서 및 ACK 번호의 기본 동작방식을 좀 더 자세히 살펴보면 다음과 같습니다.

 

1. 출발지에서 시퀀스 번호를 0으로 보냄(SEQ=0)

2. 수신 측에선 0번 패킷을 잘 받았기에 응답 번호(ACK)1을 적어 응답

   이때 수신 측에서는 자신이 처음 보내는 패킷이기에 자신의 패킷에 시퀀스 번호 0을 부여

3. 송신 측은 시퀀스 번호를 1로(수신 측이 ACK 번호로 1번 패킷을 달라고 요청했으므로),

   ACK번호는 상대방의 0번 시퀀스를 잘 받았다는 의미로 시퀀스 번호를 1로 부여해 다시 송신

 
 

 

윈도 사이즈와 슬라이딩 윈도

- TCP는 상대방이 패킷을 잘 받았는지를 확인하기 위해 ACK번호를 확인하고 다음 패킷을 전송

- 패킷이 잘 전송되었는지 확인하기 위해 별도 패킷을 받는 것 자체가 통신 시간을 늘리지만 송신자와 수신자가 먼 거리

  에 있는 경우 왕복지연시간(Round Trip Time, RTT)이 늘어나므로 응답 대기 시간이 더 길어짐

- 그러므로 많은 패킷을 한꺼번에 보내고 응답을 하나만 받음

- 최대한 많은 패킷을 한번에 보내는 것이 효율적이지만, 네트워크 상태가 안 좋은 경우 패킷 유실 가능성 커지므로 적절

  한 송신량을 결정해야 함

- 한 번에 받을 수 있는 데이터의 크기를 '윈도 사이즈'라고 함

- 네트워크 상황에 따라 윈도 사이즈를 조절하는 것을 '슬라이딩 윈도'라고 함

 

- TCP 헤더에서 윈도사이즈로 표현할 수 있는 최대 크기는 2^16이며, 64k만큼 윈도 사이즈를 가질 수 있다는 의미

- 회선의 안정성이 높아지고 고속회되는 현대 네트워크에서는 너무 작은 사이즈임

- 윈도 사이즈를 64K보다 늘려 통신하는데, TCP 헤더는 변경이 불가하므로 뒤의 숫자를 무시하는 방법으로 윈도 사이즈

   를 증가시켜 통신

    -> ex) 16bit 중 마지막 1bit를 무시한다고 하면, bit를 하나씩 shift시켜 2^17까지 표시 가능

        참고 : https://4network.tistory.com/entry/windowsize  

                https://blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=engmoose&logNo=220849493381 

- TCP에서 패킷 유실 발생 시 윈도 사이즈를 절반으로 낮추고, 정상적인 통신이 되는 경우 서서히 원래 사이즈로 늘림 

- 네트워크 경합이 발생해서 패킷 드롭이 생기면 작아진 윈도 사이즈로 인해 회선을 제대로 사용하지 못하는 경우 발생 

   가능

- 이런 경우 경합을 피하기 위해 회선 속도 증가, 경합을 임시로 피할 수 있게 하는 버퍼가 큰 네트워크 장비 사용, 

   TCP 최적화 솔루션을 통해 문제 해결 가능

 
 

 

 

3방향 핸드셰이크

TCP에서는 본격적인 통신을 하기 전 사전 연결작업을 진행합니다. 수신자가 아직 데이터를 받을 수 있는 준비가 안 된 상황에서 일방적으로 데이터를 전송하면 정상적으로 처리할 수 없으므로 데이터가 버려집니다. TCP 프로토콜은 이러한 상황을 방지하기 위해 본격적인 통신 전 데이터를 주고받을 준비가 되있는지 미리 확인하는 작업을 거칩니다.

패킷 네트워크에서는 동시에 많은 상대방과 통신하므로 정확한 통신을 위해서는 통신 전, 각 통신에 필요한 리소스를 미리 확보하는 작업이 중요합니다. TCP에서는 3번의 패킷을 주고 받으면서 통신을 서로 준비하는데 이를 '3방향 핸드셰이크'라 부릅니다.

 

TCP에서는 이런 3방향 핸드셰이크를 진행 상황에 따라 상태(State) 정보를 부르는 이름이 다릅니다.

- 서버에서 서비스를 제공하기 위해 클라이언트 접속을 받아들일 수 있는 LISTEN 상태

- 클라이언트에서 통신을 시도할 때 Syn 패킷을 보내는데 클라이언트는 이 상태를 SYN-SENT라 부름

- 클라이언트의 Syn 패킷을 받은 서버는 SYN-RECEIVE 상태로 변경되고, Syn, Ack로 응답

- 이 응답을 받은 클라이언트는 ESTABLISHED 상태로 변경, 그에 대한 응답을 서버로 다시 보냄

- 서버에서도 클라이언트의 응답을 받고 ESTABLISHED 상태로 변경

- ESTABLISHED 상태는 서버와 클라이언트 간의 연결이 성공적으로 완료되었음을 의미

 

 

 

3방향 핸드셰이크 과정이 생기다보니 기존 통신과 새로운 통신의 구분해야 합니다.

어떤 패킷이 새로운 연결 시도이고 기존 통신에 대한 응답인지 구분하기 위해서 헤더에 플래그(Flag) 값을 넣어 통신을 합니다.

TCP 플래그는 총 6가지가 있고, 통신의 성질을 나타냅니다. 초기 연결, 응답, 정상종료, 비정상 종료 등의 용도로 사용됩니다.

- SYN : 연결 시작 용도로 사용됨

          연결이 시작될 때 SYN 플래그에 1로 표시해 보냄

- ACK : ACK 번호가 유효할 경우 1로 표시해 보냄

         초기 SYN이 아닌 모든 패킷은 기존 메시지에 대한 응답이므로 ACK 플래그가 1로 표기됨

- FIN : 연결 종료 시 1로 표시됨 

         데이터 전송을 마친 후 정상적으로 양방향 종료 시 사용됨

- RST : 연결 종료 시 1로 표시됨 

         연결 강제 종료를 위해 연결을 일방적으로 끊을 때 사용됨

- UGR : 긴급 데이터인 경우, 1로 표시해 보냄

- PSH : 서버 측에서 전송할 데이터가 없거나

          데이터를 버퍼링 없이 응용 프로그램으로 즉시 전달 할 것을 지시할 때 사용됨

 

 

과정

  • 통신 최초 시도 시 송신자는 플래그에 있는 SYN 필드를 1로 표기해 패킷을 보내며 자신이 사용할 첫 시퀀스 번호를 적어 보냄
  • SYN 패킷을 받은 수신자는 SYN, ACK 비트를 플래그에 1로 표기해 응답
  • 수신자가 보내는 첫 패킷이기에 SYN을 1로 표기하고, 기존 송신자의 응답이기도 하기 때문에 ACK 비트도 함께 1로 표기 - 이 패킷은 송신자의 연결 시도를 허락하는 의미로 사용됨
  • 이때 자신이 사용할 시퀀스 번호를 적고, ACK 번호는 송신자가 보낸 시퀀스 번호에 1을 추가한 값을 넣어 응답ACK 번호는 10번까지 잘 받았으니 다음에 10+1번을 달라는 의미
  • 수신자의 응답(SYN, ACK)을 받은 송신자는 연결을 확립하기 위해 다시 응답을 보냄
  • 이때부터는 기존 메시지의 응답이기에 ACK 필드만 1로 표기됨 
  • 수신자가 ACK 번호를 20으로 표기해 보냈으므로 시퀀스 번호를 21로 표기해 보냄
  • 수신자의 시퀀스 번호 20에 대한 응답이므로 ACK 번호를 21로 보냄(20번을 잘 받았으니 다음 시퀀스 번호를 보내달라)
3방향 핸드셰이크 과정

 

 

<참고문헌>

IT 엔지니어를 위한 네트워크 입문

 

'Network' 카테고리의 다른 글

ARP(Adress Resolution Protocool)  (0) 2021.12.24
UDP  (0) 2021.12.23
IP 주소 (2)  (0) 2021.12.21
IP 주소 (1)  (0) 2021.12.20
MAC 주소  (0) 2021.12.19