이전 Network Layer에서는 다음과 같은 문제가 있었다.
1. 한 번에 하나의 통신만 가능 -> 여러 어플리케이션이 동시에 통신 불가능 (카톡, 유튜브, 인터넷)
2. 패킷등의 순서 보장 / 유실에 대한 대응 불가능
해당 문제를 해결하기 위해 전송 계층이 활용된다.
Transport Layer
- 통신 주체끼리 데이터 전달의 신뢰성을 확보하는 방법을 정의
- 주요 단위 : 세그먼트
- 주요 구성 요소 : TCP/UDP
TCP(Transmission Control Protocol)
- 패킷의 전달 과정에서 순서를 보장하고 유실되지 않도록 보장할 수 있는 통신 규약
-> 패킷 안에 세그먼트를 담아 주고 받아 로직을 처리
- 연결 지향
-> 지속적으로 채널을 수립하여 전달 여부를 확인하고 무결성을 확인
지속, 무결성을 확보하는 과정에서 비교적 느리고 복잡한 과정 필요
- 주요 사용 사례 : 웹 페이지(HTTP/HTTPS), 이메일, 파일 전송, SSH 등
Segment(세그먼트)
- TCP/UDP의 데이터 전달 단위
- Port (Source/Destination)
- Sequence/Acknowledgement Number : 통신 주체끼리 데이터를 주고 받았는지 확인에 사용
- Flags : Segment의 목적 등을 정의 (ACK, SYN, FIN)
- Window Size : 세그먼트를 만든 주체가 얼마나 많은 데이터를 받을지 전달
- Urgent Pointer : 세그먼트의 중요도를 설정
- 기타 (checksum 등), 실제 데이터
아래 그림은 네트워크 레이어에서 클라이언트가 데이터를 전송할 때 여러 노드를 거쳐서 전달하기 때문에 순서/복원이 보장되지 않는 상황을 나타낸다. 이를 해결 하기 위해서는 전송 계층이 필요하다.
TCP 프로토콜은 상대 클라이언트가 패킷을 수신 했는지를 확인한 이후, 다음 패킷을 보내는 방식으로 순서를 보장한다.
클라이언트 A가 B에게 1번 패킷을 보내면 클라이언트 B가 정상적으로 1번 패킷을 수령한 후, 다음 패킷을 받을 준비가 되었다는 ack 패킷을 보낸다.
무사히 전달된 패킷은 클라이언트에서 실행 중인 어떤 프로그램에게 도착한건지 패킷만으로는 확인이 불가능하다.
이를 확인하기 위해 Port를 사용한다.
Port
- IP 프로토콜에서 패킷을 올바른 프로세스로 라우팅 하기 위한 논리적 단위
- TCP Port / UDP Port로 구분
- Well Known Port : 주로 서버에서 사용하는 App/Protocol 별로 미리 지정된 포트
80 : HTTP, 443 : HTTPS
22 : SSH, 3306 : MySQL
- Ephemeral Port : 클라이언트에서 사용하는 포트로 연결할 때 마다 임의로 지정
TCP 프로토콜은 처음 연결될 때, TCP HandShake 과정을 거친다.
TCP Handshake
- TCP Protocol에서 통신을 수립하고 서로를 인식하는 첫 과정
- 3-Way-Handshake으로 부르며 3가지 과정으로 구분
1. Syn(Synchronize) : 첫 요청으로 사용할 첫 클라이언트 Sequence Number(CS)를 전달
2. Syn-Ack(Synchronize-Acknowledge) : Syn에 대한 응답으로 CS+1과 서버 Sequence Number(SS)를 전달
3. ACK(Acknowledge) : 마지막 단계로 연결이 수립되었음을 알려주며 CS+1과 SS+1을 전달
TCP는 연결 지향 프로토콜이라면, 반대로 비연결 지향 UDP 프로토콜도 존재한다.
UDP(User Datagram Protocol)
- 빠르고 간단하게 데이터를 주고 받을 수 있는 방법을 정의
- 연결 지향과는 달리 데이터의 무결성, 순서, 전달여부를 체크하지 않음
- 패킷이 순서대로 오지 않거나, 중복, 유실될 수 있음
- 스트리밍, 보이스톡, 온라인 게임 등 패킷이 반드시 연속적이어야 할 상황이 아닌? 사용 사례
- TCP와 달리 세그먼트에 담겨진 정보가 적으므로 비교적 빠르다.
이번 시간까지 OSI 7 Layer중 하드웨어 계층을 담당하는 1-4 계층을 배웠다. 다음 시간에는 소프트웨어 계층을 알아보자.
출처 : 유튜브 AWS 강의실