위의 설명을 봐도 정확히 전송 계층이 뭔지 아직 감이 잡히질 않는다.
우선 이전 OSI 3계층인 IP 계층을 다시 리마인드해보면
서로 다른 네트워크(WAN) 속에서 IP 주소를 통해 데이터들이 주고 받는다.
좀 더 자세히 설명하자면, IP 계층은 패킷이라는 단위로 송수신을 하는데,
패킷의 IP 헤더에는 출발지 IP 주소, 도착지 IP 주소가 포함되어 있기 때문에 여러 라우터들을 거쳐 데이터를 운반할 수 있는 것이다.
그리고, MTU라는 패킷의 최대 운반 크기(=통산 1500 Byte)만큼만 한 번에 운반이 가능하여, 그보다 데이터가 클 경우, 단편화를 진행하여 쪼개서 보내게 된다.
이 때, IP 헤더의 Identifucation / Flag / Fragment Offset 를 통해 단편화에 대한 정보를 담게 된다.
그러면 위 내용을 머릿속에 잘 그려놓고, 전송 계층이 정확히 무엇인지 알아가보자~
우리는 컴퓨터를 사용하면서 많은 프로그램을 사용한다.
예를 들어, 카카오톡, 게임, 유튜브, 웹서핑 등이 있다.
컴퓨터가 어떠한 데이터를 받았다고 했을 때, 이 데이터는 과연 어떤 프로그램의 데이터로 판단을 해야하는 지 알 수 있는가?
😢없다!
위 문제점을 해결하기 위해 Port 라는 새로운 주소 체계가 탄생하였다.
통신하고자 하는 애플리케이션 간에 가상의 연결 통로를 만드는 작업을 연결 확립이라 하고 연결 통로의 출입구, 즉 애플리케이션과 연결 통로의 인터페이스를 포트(Port)
라고 하며 포트를 식별하기 위한 주소를 포트 번호
라고 합니다.
위와 같이 Port 를 통해 클라이언트는 특정 애플리케이션과 상대방의 애플리케이션 서버와 논리적인 연결을 맺어 데이터를 통신하게 된다.
Port의 종류
- Port 번호 구간 : 0 ~ 65,535
- 1. Well-known Port
- 잘 알려진 포트로, 포트 번호에 이미 배정된 시스템이 예약되어 있다.(변경 불가능)
- 0 ~ 1,023 포트 번호의 구간을 가진다.
- IANA(인터넷 할당 번호 관리 기구)에 의해 관리되고 있다.
- <자주 볼 수 있는 Well-known Port>
- 2. Registered Port(=User Port)
- 특정 프로토콜이나 애플리케이션에서 사용하는 포트 번호
- 1,024 ~ 49,151 포트 번호의 구간을 가진다.
- 우리가 직접 사용 가능한 포트 번호지만, 몇몇은 이미 특정 프로토콜이 사용 중이므로 주의가 필요하다
- <자주 볼 수 있는 Registered Port>
- 3. Dynamic Port(=Private Port)
- 서버가 클라이언트를 식별할 때 사용합니다.
- 예를 들어, 클라이언트는 서버와 통신하기 위해 운영체가 할당해준 Dynamic Port 중 동적으로 하나의 포트 번호를 사용하여 서버와 통신을 하게 된다.
- 49,152 ~ 65,535 포트 번호의 구간을 가진다.
0101
)위의 TCP 헤더와 Payload(=데이터)를 붙여 TCP 프로토콜은 세그먼트(Segment) 단위로 데이터를 송수신한다.
MSS(Maximum Segment Size)란?
- TCP에서 데이터를 분할하는 단위를 뜻한다.
- 일반적으로 사용하는 표준 MSS의 크기는 1,460 Byte이다
- 이는 MTU(=1,500 Byte)에서 TCP header와 IP hearder의 크기를 뺀 값이다.
- TCP 프로토콜은 전송할 데이터가 클 경우, 여러 패킷으로 분할하고 각각 TCP 헤더를 붙어 세그먼트 단위로 보내게 된다.
위 그림은 송신 호스트가 MSS보다 큰 데이터를 보내게 될 경우의 통신 과정을 보여주고 있다.
1) 송신자는 MSS 크기보다 큰 데이터를 보낼려고 한다.
2) TCP 프로토콜은 데이터를 MSS 단위로 패킷 분할하고 각각 TCP 헤더를 붙여주어 세그먼트 단위로 캡슐화를 한다.
3) 하위 OSI 계층을 통해 수신 호스트에게 전달된다.
4) 수신 호스트는 여러 세그먼트를 수신한다.
5) TCP 헤더의 여러 정보들을 토대로 순서대로 재조립하여 본래의 데이터로 합친다.
지금부터는 TCP의 연결 시작 / 연결 종료 / 데이터 전송에 대한 과정을 살펴보면서
TCP의 특징인
1) 연결 지향
2) 정확성과 신뢰성이 보장
어떻게 가능한 지 알아보자
1) STEP 1 : Client ▶ SYN_SENT
2) STEP 2 : Server ▶ SYN_RECEIVED
3) STEP 3 : Client ▶ ESTABLLISHED
4) STEP 4 : Server ▶ ESTABLLISHED
5) 클라이언트와 서버는 3-way-handshake 과정을 통해 연결이 완료되었다.
위 그림은 Client가 Server와 연결을 종료하는 과정을 보여주고 있다.
1) STEP 1 : Client ▶ FIN_WAIT1
2) STEP 2 : Server ▶ CLOSE_WAIT
3) STEP 3 : Client ▶ FIN_WAIT2
4) STEP 4 : Server ▶ 못 보낸 패킷을 모두 보낸다.
5) STEP 5 : Server ▶ LAST_ACK
6) STEP 6 : Client ▶ TIMED_WAIT
서버의 연결 해지 준비가 되었다는 ACK Segment를 받고 확인했다는 ACK Segment를 서버에게 보낸다.
그리고 클라이언트는 TIMED_WAIT 상태가 된다.
※ 왜 클라이언트가 바로 연결을 종료하지 않고 TIMED_WAIT 상태를 거치는 이유
- 클라이언트가 서버로부터 FIN Segment를 받았다고 하더라도 네트워크 환경에 따라서
아직 서버가 CLOSE_WAIT 상태일 때 보낸 데이터가 아직 클라이언트에게 도착하지 않았을 가능성이 있다.
- 만약, TIMED_WAIT 상태 없이 바로 연결을 CLOSED 한다면, 아직 못받은 데이터는 유실되는 것이므로 TCP의 신뢰성이 깨지게 된다.
- 따라서, 클라이언트는 일정 시간동안의 TIMED_WAIT 상태에 머물러서 잉여 패킷을 받기 위해 기다리게 된다.
7) STEP 7 : Server ▶ CLOSED
8) STEP 8 : Client ▶ CLOSED
위 그림은 송신 측에서의 데이터 전송 과정을 보여준다.
위 그림은 수신 측에서의 데이터 수신 과정을 보여준다.
첫번째로 수신한 Segment의 Sequence Number(=순서 번호) + 1한 값을 Acknowledgment Number로 넣어 송신 측에게 전달한다.
그리고 수신 측의 ACK Segment를 받은 송신 측은 2번째인 세그먼트를 보내고
수신 측은 또 확인하여 ACK Segment를 보내는 과정을 반복한다.
만약, 데이터 전송 과정에서 문제가 발생하여 수신 측에 데이터가 오지 않을 경우, 아무런 ACK Segment를 보내지 않는다.
그러면 송신 측에서 보낸 Segment에 대한 ACK Segment가 일정 시간 동안 응답이 오지 않을 경우,
데이터를 재전송하여 데이터 전송의 "신뢰성"을 보장한다!
위의 TCP 데이터 전송 과정을 보면 송신측은 세그먼트를 보낼 때마다 송신 측의 응답을 확인하고 다음 세그먼트를 보내고 있다.
이렇게 되면 송신 측은 확인에 대한 응답이 돌아올 때까지 아무 일도 하지 않고 기다리게 되면서
결국 패킷의 전송 속도가 지연되게 된다!!!
이는 매우 비효율적인 전송 과정이기 때문에 TCP 프로토콜은 슬라이딩 윈도우 기법을 통해
흐름 제어(Flow Control) 기능을 제공하여 효율적이고 신뢰성있게 데이터를 전달한다.
TCP 헤더의 필드 중 Window를 보았을 것이다.
Window Size의 결정 시점
- 3-way-handshake 과정에서 수신자가 Window 크기에 대한 초기값을 헤더의 Window 필드에 기록하여 알려준다.
- 그 후, 지속적으로 ACK 확인 응답을 보낼 때마다 수신자는 자신의 수신 버퍼 여유 공간을 확인하여 알려준다.
UDP 프로토콜의 특징은 다음과 같다.
UDP 프로토콜은 TCP와 정반대의 성향을 가지고 있는 것 같다.
https://better-together.tistory.com/134 [변계사 Sam의 테크 스타트업!:티스토리]
https://better-together.tistory.com/140 [변계사 Sam의 테크 스타트업!:티스토리]
https://ghdwlsgur.github.io/docs/Network/TcpHeader [TCP 헤더 읽어드립니다]