📌 이 포스팅에서는 OSI 모델의 4계층인 전송 계층(Transport Layer)에 대해 정리하였습니다.
🔥 전송 계층의 역할
🔥 TCP의 구조
🔥 재전송 제어 및 포트번호의 구조
🔥 UDP의 구조
✔️ 물리계층, 데이터 링크 계층, 네트워크 계층의 3계층으로는 목적지에 데이터를 보낼 수 있지만, 데이터가 손실되거나 유실되더라도 이들 계층에서는 책임지지 않는다. 이에 신뢰할 수 잇는 방식으로 데이터를 전달하기 위해 전송 계층이 필요하다.
✔️ 전송 계층에서는 오류를 검증할 수 있는 기능이 있어 오류가 발생하면 데이터를 재전송하도록 요청한다. 즉, 목적지에 도달한 데이터가 제대로 도착했는지 확인을 거친다.
✔️ 또한 해당 데이터가 어떤 애플리케이션(웹브라우져, 메신저, 게임 등)에게 전달되어야할지 포트 번호를 통해 식별한다.
✔️ 전송 계층의 특징은 신뢰성/정확성과 효율성으로 구분할 수 있다.
- 신뢰성/정확성 : 데이터를 문제없이 목적지에 전달하는 것(=연결형 통신, TCP 프로토콜)
- 효율성 : 데이터를 빠르고 효율적으로 전달하는 것(=비연결형 통신, UDP 프로토콜)
✔️ 연결형 통신은 신뢰성/정확성이 우선이기 떄문에 여러번 확인하고 데이터를 보내는데 반해, 비연결형 통신은 효율성이 우선이기 때문에 확인 절차 없이 일방적으로 데이터를 보낸다.
✔️ 일반적으로 정확한 데이터 전송보다 빠른 전송이 필요한 동영상 전송과 같은 경우 비연결 통신을 사용한다. 데이터가 약간 유실되더라도 버벅거리는 영상을 보는 것 보다 낫기 때문이다.
✔️ 서로 장단점이 존재하기 때문에 정확한 데이터 전송이 필요한 애플리케이션일 경우 연결형 통신을 사용하고, 효율적인 데이터 전송이 필요한 애플리케이션일 경우 비연결형 통신을 사용하면 된다.
✔️ 전송된 데이터의 목적지가 어떤 애플리케이션에 도달해야하는지 제어하는 것은 전송 계층의 역할 중 하나다.
✔️ TCP 헤더에 출발지 포트 번호와 목적지 포트 번호를 담기 때문에 포트 번호를 통해 웹 브라우저에 전달해야할지, 메신저 프로그램에 전달해야할지 알 수 있다.
✔️ 포트 번호는 0~65535번을 사용할 수 있고, 0~1023번 포트는 주요 프로토콜이 사용하도록 예약되어 있다. 이러한 포트를 잘 알려진 포트(well-know posts)라 한다.
- SSH : 22번
- SMTP : 25번
- DNS : 53번
- HTTP : 80번
- POP3 : 110번
- HTTPS : 443번
✔️ TCP는 신뢰성과 정확성을 우선시하는 전송계층의 연결형 통신 프로토콜이다.
✔️ TCP로 통신할 때, 전송계층에서 TCP 헤더를 붙이는데 이 TCP 헤더가 붙은 데이터를 세그먼트라 한다.
✔️ TCP 헤더는 아래와 같은 다양한 식별 정보를 갖고 있다.
- 출발지 포트 번호(16비트)
- 목적지 포트 번호(16비트)
- 일련번호(32비트)
- 확인 응답 번호(32비트)
- 헤더 길이(4비트)
- 예약 영역(6비트)
- 코드 비트(6비트) : URG, ACK PSH, RST, SYN, FIN
- 윈도우 크기(16비트)
- 체크섬(16비트)
- 긴급 포인터(16비트)
- 옵션
✔️ 연결형 통신은 꼼꼼하게 상대방을 확인하면서 데이터를 전송하는데, 데이터를 전송하기 위해 사전에 가상의 독점 통신로를 확보해야한다.
✔️ TCP 세그먼트 중 코드 비트(RG, ACK, PSH, RST, SYN, FIN)에는 연결과 관련한 정보가 기록된다.
✔️ 코드 비트는 각 비트별로 역할이 있는데, 초기값은 0이고 비트가 활성화되면 1로 변한다. 이 때, 가상의 독점 통신로를 확립하려면 SYN(연결요청)과 ACK(확인응답)가 활성화되어야 한다.
✔️ 데이터를 보내기 전 연결을 확립하기 위해 패킷 요청을 세 번 교환하는 것을 3-way handshake라 하는데 이는 아래와 같은 3개의 과정을 거친다.
- 클라이언트에서 서버로 연결 확립 허가를 받기 위한 요청(SYN)을 보낸다.
- 서버는 클라이언트의 요청을 받은 후 허가한다는 응답을 회신하기 위해 연결 확립 응답(ACK)과 함께 서버로 클라이언트에게 데이터 전송 허가를 받기 위해 연결 확립 요청(SYN)을 보낸다.
- 클라이언트는 서버의 요청을 받은 뒤, 서버를 허가한다는 응답으로 연결 확립 응답(ACK)를 보낸다.
✔️ 뿐만아니라, 연결을 확립할 떄는 SYN을 사용하고 연결을 종료할 때는 FIN을 사용한다. TCP 프로토콜은 신뢰성과 정확성을 중요시하기 때문에 연결을 종료할 때 마저 확인을 거친다.
✔️ TCP는 데이터를 분할해서 보내는데 일련번호는 수신 측에 '이 데이터가 몇 번째 데이터인지' 알려주는 역할을 한다. 즉, 일련번호는 분할된 데이터의 순서 정보를 담고 있다.
✔️ 확인 응답 번호는 수신측이 몇 번 쨰 데이터를 수신했는지 송신측에 알려주는 역할과 다음 번호의 데이터를 요청하는 기능을 맡는다.
✔️ 이에 일련번호와 확인 응답 번호를 통해 데이터가 손상되거나 유실된 경우 데이터를 재전송 받을 수 있는데, 이를 재전송 제어라 한다.
✔️ UDP 헤더가 붙은 데이터를 UDP 데이터그램이라하고, UDP 헤더는 아래와 같은 식별 정보를 가진다.
- 출발지 포트 번호(16비트)
- 도착지 포트 번호(16비트)
- 길이(16비트)
- 체크섬(16비트)
✔️ UDP는 효율성을 중요시하는 프로토콜로 TCP 처럼 신뢰성과 정확성을 요구하지 않기 때문에 헤더가 간결하다.
✔️ 또한 UDP는 랜에 있는 PC나 스위치로 연결된 PC로 일괄적으로 데이터를 보낼 수 있는데 이를 브로드캐스트 통신이라 한다.
✔️ TCP는 3-way 핸드쉐이크를 통해 응답 확인을 일일이 거쳐야하기 때문에 브로드캐스트와 같이 불특정 다수에게 보내는 통신에는 적합하지 않다.