3.1 트랜스포트 계층 서비스 및 개요
애플리케이션 프로세스로부터 수신받은 메시지를 세그먼트로 변환한다.
세그먼트는 네트워크 계층으로 넘겨줄 때 패킷으로 변환된다.
1) 트랜스포트 계층과 네트워크 계층 사이의 관계
트랜스포트 계층 프로토콜은 애플리케이션 계층과 네트워크 계층간에 메시지를 운반할 뿐이다. 각 계층은 하위 계층에서 무슨 작업을 하는지 신경 쓸 필요가 없다.
2) 인터넷 트랜스포트 계층의 개요
트랜스포트 계층은 TCP와 UDP 두 가지의 프로토콜이 있다.
두 프로토콜의 기본적인 기능은 IP 전달 서비스를 Host-to-Host에서 Process-to-Process로 확장하는 것이다. (다중화와 역다중화)
TCP는 UDP와 다르게 신뢰적 데이터 전달과 혼잡제어를 제공한다.
3.2 다중화와 역다중화
메시지를 알맞는 목적지 프로세스에 전달해주는 작업이다.
UDP와 TCP 모두 지원하는 개념이지만 작동 원리가 조금 다르다.
- 다중화 : 세그먼트들을 네트워크 계층으로 전달하는 작업. 애플리케이션 계층에서 트랜스포트 계층으로 소켓을 통해 메시지가 전달될 때, 하나의 세그먼트로 캡슐화 하여 네트워크 계층으로 전달하는 과정이다.
- 역다중화 : 세그먼트들을 애플리케이션 계층의 올바른 소켓으로 전달하는 작업. 세그먼트의 헤더 정보를 읽어서 올바른 소켓을 판단한다.
UDP는 TCP와 다르게 소켓과 소켓이 1:1 매핑 되지 않는다. (connectionless)
그래서 헤더 정보의 목적지 포트번호만을 보고 전달된다.
TCP는 목적지 포트가 모두 80인데도 불구하고 서로 다른 소켓으로 간다.
그 이유는 "TCP 소켓은 고유의 포트번호가 아닌 고유의 ID(집합)를 가지기 때문"이다.
집합은 출발지의 IP주소/포트번호, 목적지의 IP주소/포트번호 4개 요소로 이루어진다.
4개 요소중 하나라도 다르면 다른 소켓으로 인식하기 때문에 포트번호가 같더라도 역다중화를 통해 올바른 소켓으로 전달된다.
3.3 비연결형 트랜스포트: UDP
UDP가 비연결, 비신뢰성이라고 하더라도 간단한 오류 검출 기능은 가지고 있다.
데이터가 유실될지언정 잘못된 데이터가 전달되지는 않는다.
에러가 없으면 세그먼트를 바로 목적지 포트 소켓으로 넘겨준다. 매우 단순한 구조이다.
단순한 구조인 만큼 오버헤드가 적다.
3.4 신뢰성 있는 데이터 전송의 원리
신뢰성 있는 데이터 전송은 TCP의 중요한 개념중 하나이다.
TCP는 트랜스포트 계층의 애플리케이션 계층에 대한 데이터의 신뢰성을 보장한다. 하지만 하위 계층에서는 데이터의 신뢰성을 보장할 수 없다.
1) 신뢰적인 데이터 전달 프로토콜의 구축
비신뢰적인 데이터 전달이라 함은 데이터의 에러 또는 유실 둘 중 하나가 발생할 수 있다는 의미이다.
◾ 완벽하게 신뢰적인 채널 상에서의 데이터 전송: rdt1.0 (reliable data transfer)
하위 채널이 완전히 신뢰적이라고 가정한다. 이 경우에는 각 레이어가 송수신을 바로 진행시키면 된다. 완전히 신뢰적인 채널에서는 수신 측이 송신 측에게 어떠한 피드백도 제공할 필요가 없고 '천천히' 라는것도 요청할 필요가 없다.
◾ 비트 오류가 있는 채널 상에서의 신뢰적 데이터 전송: rdt2.0
패킷 안의 비트들이 하위 채널에서 손상될 수 있지만 송신 순서대로 수신된다고 가정한다. 전화통화의 예를 생각해보면 된다.
상대방의 말을 잘 들었다면 확인 응답을 해준다(수신자 피드백, ACK). 상대방의 말이 잘 안들리면(에러 검출) 다시 말해달라고 요청하고(수신자 피드백, NAK) 상대방은 같은 말을 다시 해준다(재전송). 이 세가지가 자동 재전송 요구(ARQ) 프로토콜에 요구된다.
송신자 프로토콜은 수신자의 피드백을 받아야 다음 행동을 결정할 수 있으므로 ACK/NAK 패킷을 기다려야 한다.
단, rdt2.0은 피드백 패킷이 손상되어 송신측으로 들어오는 치명적인 문제가 발생할 수 있다.
피드백 패킷이 손상되어 송신자가 ACK/NAK를 판별하지 못할 때, 재전송을 한다면 수신자는 패킷의 중복 수신이 발생하므로 패킷에 순서번호(sequence number)를 추가해서 수신자가 중복 수신을 처리하게 한다. 순서번호는 최소 1비트면 충분하다. 이 개선사항을 rdt2.1이라고 하자. 순서번호 비트인 0, 1을 처리하기 위해 기존의 상태보다 2배 많은 상태를 가지게된다.
여기서 한발 더 나아가서 오류검출 및 중복 수신을 송신자 측에서도 같이 처리한다면 NAK 없이 ACK 처리만으로 구현이 된다. (rdt2.2: NAK-free protocol)
수신자에서 오류 검출시 NAK가 아닌 ACK와 함께 마지막으로 수신된 순서번호를 함께 송신자에게 보낸다.
송수신자의 순서번호가 다르면 재전송을 하게 된다.
◾ 비트 오류와 손실 있는 채널 상에서의 신뢰적 데이터 전송: rdt3.0
손실은 수신자에게 가는 메시지가 유실되거나 송신자에게 돌아오는 피드백이 유실되는 두 가지 경우가 존재한다.
어떤 경우간에 송신자 입장에서는 같은 현상이다. 이 때 시간 제한(timeout)을 걸어서 재전송을 하면 손실은 해결할 수 있다.
rdt1.0 : 모든 채널이 완벽하게 신뢰적일 때. 호출 받는대로 바로 송수신이 이루어진다.
rdt2.0 : 채널에서 비트 오류가 발생할때. 오류 검출, 수신자 피드백, 재전송이 포함된 ARQ 프로토콜에 의해 송수신이 이루어진다.
rdt2.1 : 피드백이 손상될 때. 송신자가 순서번호를 추가하여 수신자에서 중복 패킷을 처리한다.
rdt2.2 : 피드백에 순서번호를 포함시켜서 송수신자 양쪽에서 판별한다. ACK 피드백만 존재한다.
rdt3.0 : 손실이 발생할 때. 송신자 rdt 2.2에 타이머를 추가하여 타임아웃시 재전송한다.
(d)는 유실이 발생하지는 않았지만 피드백이 지연이 생겨서 늦게 도착하는 바람에 타임아웃이 발생한 경우이다.
rdt3.0까지 구축하며 기능적으로 정확한 신뢰적 데이터 전송 프로토콜을 완성시켰지만 성능에는 만족하기 어렵다.
전송 후 대기 방식이기 때문에 속도가 너무나도 느리다.
2) 파이프라인된 신뢰적 데이터 전송 프로토콜
전송 후 대기 방식은 한번에 하나의 패킷만 보내기때문에 속도가 매우 느리므로 파이프라이닝화 시켜서 효율을 높인다.
3) N부터 반복(Go-Back-N, GBN)
수신자는 받은 올바른 패킷에 대해서만 ACK 피드백을 보내주고 해당되지 않는 패킷은 모두 버리기 때문에 수신측은 버퍼가 필요없다.
- 송신자가 SEQ 1,2,3,4,5를 보냈을 때, 2가 유실되었다면 수신자는 ACK 1,2,2,2를 보내고 전달받은 SEQ 3,4,5를 버린다.
- 송신자측에서 ACK 2를 받지 못해 타임아웃이 일어나면 SEQ 2,3,4,5를 재전송한다.
- 수신자는 ACK 3,4,5,5를 보낸다.
패킷 하나의 손실때문에 많은 패킷을 다시 재전송하는 단점이 존재한다.
4) 선택적 반복(Selective Repeat, SR)
GBN과 다르게 수신자도 버퍼를 가지고 ACK를 받지 못한 패킷마다 타이머를 계산한다.
수신자는 받은 패킷의 순서와 상관없이 받은 패킷에 대해 무조건 ACK를 피드백한다.
- 송신자가 SEQ 1,2,3,4,5를 보냈을 때, 2,4가 유실되었다면 수신자는 ACK 1,3,5를 보내고 전달받은 SEQ 3,5를 버퍼에 저장한다.
- 송신자 측에서 ACK 2,4를 받지 못해 타임아웃이 일어나면 SEQ 2,4를 재전송한다.
- 수신자는 ACK 2,4를 보내고 버퍼에 있는 SEQ 3,5를 처리한다.
ACK가 손실되는 경우 송신자의 타이머가 만료되어 재전송되지만 수신자는 이미 받은 패킷이므로 별도의 저장 없이 ACK만 다시 피드백해준다.
'이론 > 네트워크' 카테고리의 다른 글
네트워크 계층: 제어 평면 (0) | 2022.11.20 |
---|---|
네트워크 계층 : 데이터 평면 (0) | 2022.11.19 |
트랜스포트 계층 (2) (0) | 2022.11.18 |
애플리케이션 계층 (0) | 2022.11.15 |
컴퓨터 네트워크와 인터넷 (0) | 2022.11.08 |