전송 계층
OSI 4계층인 전송 계층은 종단 간의 데이터 전송을 위한 계층이다. 네트워크 계층이 데이터를 최적의 경로로 다른 네트워크로 보내준다면 전송 계층은 종단 간의 데이터 전송이 원활하게 되도록 제어한다.
핵심 기능 : 종단 간 데이터 전송의 오류제어, 흐름제어
오류 제어와 흐름 제어
전송 계층의 핵심 기능은 종단 간 데이터 전송의 오류제어와 흐름제어이다. 오류제어와 흐름제어 덕분에 우리는 신뢰성 있는 통신을 할 수 있다. 그런데 2계층인 데이터링크 계층의 핵심 기능도 인접한 노드(네트워크 장비)간의 오류제어와 흐름제어다. 왜 비효율적으로 같은 작업을 반복할까?
예를 들어 아래의 상황이 발생하면 오류를 감지하고 오류 회복 기능이 수행되어야하지만 데이터링크 계층은 아래 상황 발생 시 어떠한 오류도 감지할 수 없다. 데이터링크 계층은 단순히 수신측에서 송신측이 보낸 데이터 프레임이 전송매체로 오류없이 보내졌는지만 확인한다. 따라서 종단 간 데이터 전송을 관리 감독하는 책임자가 필요하다. 그 책임자가 전송 계층이다.
- 오작동하는 라우터가 패킷 수정
- 패킷이 중간에 삭제됨(ex : TTL이 초과되어 라우터가 삭제함), 데이터 프레임이 중간에 삭제됨(ex : 이더넷은 오류가 발생한 데이터 프레임을 폐기)
- 패킷들이 원래 순서를 잃음
아래는 데이터링크 계층에서 정상적으로 오류를 감지하는 경우와 오작동하는 라우터가 패킷을 수정할 시 전송 계층에서 오류를 감지하는 경우를 나타낸 그림이다.
연결형 통신, 비연결형 통신
전송 계층은 연결형 통신과 비연결형 통신을 지원한다.
- 연결형 통신 : 종단 간의 데이터를 정확하고 신뢰성 있게 전송하는 통신이다. 전송 계층의 연결형 통신 프로토콜로 TCP가 있다.
- 비연결형 통신 : 종단 간의 데이터를 빠르고 효율적으로 전송하는 통신이다. 데이터를 정확하고 신뢰성 있게 전송하는 걸 보장하지 않지만 그 대신 빠른 전송을 해준다. 전송 계층의 비연결형 통신 프로토콜로 UDP가 있다.
웹 검색, 메신저, 메일 등 대부분의 인터넷 서비스는 TCP를 기반으로한 응용 계층의 프로토콜을 사용한다. 이 같은 서비스들은 통신 속도보다 데이터가 오류 없이 전송되는 것이 더 중요하기 때문이다. 하지만 멀티미디어 스트리밍, 인터넷 전화, 온라인 게임 등의 인터넷 서비스는 UDP를 기반으로 한 응용 계층의 프로토콜을 사용한다. 이 같은 서비스들은 데이터가 오류 없이 전송되는 것보다 통신 속도가 더 중요하기 때문이다.
TCP (Transmission Control Protocol)
전송 계층의 연결형 통신 프로토콜이다.
데이터에 TCP 헤더가 붙은 것을 세그먼트(segment)라 한다. 위 그림에서 Data를 제외한 나머지 필드가 TCP 헤더이다.
Port
IP/TCP 통신의 출발지와 목적지는 정확하게 말하면 호스트가 아닌 호스트 내 프로세스이다. 데이터를 전송하고 받는 주체는 프로세스이다. 따라서 데이터가 호스트까지 왔다면 어느 프로세스로 보낼지 구분해야한다. 포트란 네트워크를 통해 데이터를 주고 받는 프로세스를 식별하기 위한 번호이다. 포트 번호라고도 부른다. 포트를 통해 호스트에 도착한 데이터를 어느 프로세스로 보낼지 구분할 수 있게 된다.
프로세스가 네트워크 상의 다른 프로세스와 통신하려면 양쪽 프로세스 모두 소켓을 만들어 연결(connetion)해야한다. 소켓이란 두 개의 프로세스간 양방향 통신의 종착점(EndPoint)이며 운영체제의 자원이다. 소켓을 만들기 위해서는 IP 주소, 포트 넘버, 프로토콜이 필요하며 위 정보가 소켓에 할당(binding)된다. 프로세스는 소켓으로 다른 프로세스와 데이터 송수신한다.
0 ~ 1023번 포트는 well-known port라고 부르며 주요 프로토콜 전용으로 예약되어있다. 1025번 이상은 랜덤포트라 부르며 클라이언트 측의 송신 포트로 사용된다.
3-way handshaking
TCP로 통신하기 위해서는 먼저 연결(connection)이 되야한다. 연결 시 3-way handshaking이 발생한다. 3-way handshaking 이란 연결 시 총 3번의 걸친 세그먼트 교환 과정을 뜻한다. 3-way handshaking은 아래와 같이 진행된다.
TCP 헤더의 코드 비트에는 연결의 제어 정보가 저장된다. 총 6개의 비트(URG, ACK, PSH, RST, SYN, FIN)로 초기값은 0이며 활성화되면 1이 된다. 이 중 SYN은 연결 요청, ACK는 확인 응답, FIN은 연결 종료 요청을 뜻한다.
위의 3-way handshaking 진행 과정을 분석해보자
- SYN : 호스트 1은 호스트 2와 연결하기 위해 연결 요청(SYN)을 보낸다. SYN 메세지는 SEQ를 랜덤으로 설정한다.
- SYN + ACK : 호스트 2는 호스트 1에게 연결을 허가하는 확인 응답(ACK)와 함께 연결 요청(SYN)을 보낸다.
- ACK : 호스트 1은 호스트 2에게 확인 응답(ACK)를 보낸다.
이로써 두 호스트는 연결되며 전이중통신을 할 수 있게 된다. 보통 클라이언트 프로세스의 소켓이 서버 프로세스의 소켓으로 연결요청(SYN)을 보낸다 .
데이터 전송, SEQ, ACK
데이터 전송 과정은 아래와 같다. 호스트 A에서 호스트 B로 200바이트의 세그먼트를 2번 보내는 과정이다.
TCP는 데이터를 분할해서 보내는데 TCP 헤더의 SEQ(Sequence Number)는 데이터의 연속된 번호로 수신 측에 몇 번째 데이터부터 보낸다는 걸 알린다. TCP 헤더의 ACK(Acknowledgement number, ACK 비트와 다름)는 몇 번째 데이터까지 수신했고 이제 이 번호의 데이터를 보내라고 알려준다. 만약 확인 응답(ACK)이 오지 않는다면 송신 측은 일정 시간 후 세그먼트를 재전송한다. 즉 TCP 소켓은 ACK 응답을 요구하는 세그먼트 전송 시 타이머를 동작시키고 해당 타이머가 Time-out 되면 세그먼트를 재전송한다. 확인 응답(ACK)를 받으면서 세그먼트를 보내는 TCP의 특징으로 인해 데이터 전송의 신뢰성과 정확성이 보장된다.
4-way handshaking
연결을 종료할때에는 연결할 때와 비슷하게 4번의 세그먼트 교환 과정이 이루어진다. 이를 4-way handshaking이라 한다.
Window Size
세그먼트를 보낼 때마다 확인 응답(ACK)을 기다려야 한다면 송신 효율이 좋지 않다. 때문에 세그먼트를 수신 측의 버퍼에 한꺼번에 보내고 확인 응답을 받으면 송신 효율을 높일 수 있다. 하지만 세그먼트를 너무 많이 보낸다면 수신 측의 버퍼를 초과해(오버플로우) 데이터가 유실된다. 이 때문에 Window Size 헤더가 사용된다. Window Size는 자신의 버퍼 최대 크기이다. 3-way handshaking 시 서로의 버퍼 최대 크기를 알려주기에 상대방의 버퍼가 초과하지 않도록 세그먼트를 한꺼번에 보낸다.
UDP
전송 계층의 비연결 통신 프로토콜이다.
UDP 헤더가 붙은 데이터를 UDP 데이터그램이라 한다. 위 그림에서 Data를 제외한 나머지 필드가 UDP 헤더이다. 기능이 많지 않아 TCP에 비해 헤더 크기가 작다. 확인 응답을 받지 않으면서 세그먼트를 보내기에 신뢰성과 정확성이 보장되진 않지만 전송 속도가 빠르다. 또한 UDP는 연결하지 않기에 불특정 다수에게 보내는 통신에 유리하며 브로드캐스트와 멀티캐스트가 지원된다.
TCP VS UDP
TCP와 UDP의 특성을 잘 이해한 다음 자신의 어플리케이션이 어떤 프로토콜을 기반으로 할지 선택해야한다. 정확성과 신뢰성이 중요하다면 TCP를 빠른 전송이 중요하다면 UDP를 고려해볼만 하다. 다음은 TCP와 UDP를 비교한 표이다.
'Computer Science > Network' 카테고리의 다른 글
[데이터통신 - 12] 데이터통신 전체 흐름 (0) | 2022.09.18 |
---|---|
[데이터통신 - 11] 응용 계층 (0) | 2022.09.17 |
DMZ (0) | 2022.09.02 |
사설망, NAT (0) | 2022.08.30 |
[데이터통신 - 9] 네트워크 계층 (2) (0) | 2022.08.17 |