전송 계층에 위치한 대표 프로토콜 TCP/UDP는 공통적으로 크게 두가지 역할을 수행한다.
- multiplexing/demultiplexing
- error checking
전송 계층의 역할
multiplexing / demultiplexing
- multiplexing
여러 소켓으로 부터 데이터를 모아 헤더를 구성해 다음 계층으로 전달하는 역할
- 헤더에는 목적지 IP 주소와 목적지 포트가 포함된다.
- demultiplexing
헤더 정보를 바탕으로 올바른 socket에 데이터를 전달하는 역할
- TCP 통신은 송신 IP, 송신 포트, 수신 IP, 수신 포트 정보를 모두 고려하여 해당하는 socket에 데이터를 전달한다.
- 반면에 UDP 통신은 수신 IP, 수신 포트만 활용해 해당 socket에 데이터를 전달한다. UDP는 송신측의 IP/Port별로 socket을 생성하지 않기 때문이다.
error checking
TCP와 UDP는 헤더 정보를 바탕으로 데이터의 오류 검증을 수행한다.
신뢰성 있는 데이터 전송(Reliable Data Transfer(RDT))을 위한 원칙
TCP는 UDP와 달리 신뢰성 있는 데이터 전송을 지원한다. 그러나 전송 계층에서 신뢰성 있는 연결을 구연한다 하더라도 그 하위 계층은 Unreliable Channel 이기 때문에 데이터 전송 오류 또는 손실이 발생할 수 있다.
데이터 오류 검증을 하기 위해선 다음과 같은 매커니즘이 필요하다.
- 에러 탐지
- 수신 측의 피드백
- ACK(긍정 응답)
- NAK(부정 응답)
- 재전송
그러나 위 매커니즘도 완전하지 않은데 왜냐하면 수신측의 피드백 또한 에러/손실이 발생할 수 있기 때문이다. 만약 수신측의 피드백에 에러가 있어 ACK가 제대로 전달되지 않으면 송신측은 데이터를 재전송하게 되고 수신측은 중복된 데이터를 받게 된다. 때문에 수신측에서 송신측이 보낸 데이터가 이미 수신한 데이터인지 판별하기 위해 데이터에 Seq를 부여해 데이터 전송 순서를 함께 전달한다.
Seq를 사용하면 NAK 응답이 없어도 된다. 수신측은 마지막에 받은 데이터의 Seq를 응답함으로써 송신측에 제대로된 데이터를 받았는지 알릴 수 있다. 만약 수신측이 응답한 Seq가 송신측이 마지막으로 보낸 데이터 Seq와 같지 않으면 송신측은 재전송하면 된다.
만약 수신측의 응답이 유실된다면 송신측은 무한히 응답을 기다리게 될 수도 있다. 이를 방지하기 위해 송신측은 일정 시간동안 수신측에서 응답이 오지 않는다면 무조건 재전송한다. 이때 수신측은 중복 데이터를 받게 될 수도 있는데 Seq 넘버로 데이터 순서를 구별하고 중복된 데이터는 폐기할 수 있다.
Time-wait
위에서 언급한 것처럼 패킷을 하나 전송하고 응답 올때까지 기다렸다가 그 다음 패킷을 전송하는 방식을 Time-wait 방식이라고 한다. 그러나 이 방식은 네트워크 대역폭을 충분히 활용하지 못한다는 측면에서 효용성이 매우 낮다. 이에 따라 현실 세계 TCP는 좀 더 복잡하게 동작한다. 실제 TCP는 패킷 여러개를 연속적으로 보낸뒤 연속적으로 응답을 받아 오류 검증을 하는 pipeline 형식으로 구현되어 있다.
Pipeline
Pipeline 방식을 지원하는 접근법은 대표적으로 두 방식이 있다.
- Go-Back-N
- Selective Repeat
Go-Back-N
Go-Back-N 방식은 다음과 같이 동작한다.
- 서버는 window size에 해당하는 데이터 패킷을 연속적으로 전송한다.
- 전송되는 데이터 패킷에는 Sequence Number가 부여된다.
- 패킷이 전송될 때 서버는 각 패킷에 응답까지 기다릴 timeout을 개시한다.
- Client는 마지막으로 받은 패킷의 Sequence Number를 응답한다.
- Client는 받아야할 패킷 Seq보다 더 큰 Seq 번호를 받으면 모두 폐기한다.
- 만약 0, 1, 2, 3 패킷 전송 후 ACK(2)가 오지 않아 timeout이 발동되면 서버는 패킷 2번부터 window size만큼 다시 재전송한다.
Go-Back-N은 이미 전송한 데이터가 성공적으로 Client에 도달하였다하더라도 이전 Seq 패킷이 한개라도 누락되면 그 이후 패킷은 모두 다시 전송해야한다는 점에서 비효율적이다.
Selective Repeat
Selective Repeat은 Go-Back-N 방식과 다르게 Client에 제대로 전달되지 않은 패킷만 재전송하는 방법이다.
Selective Repeat은 다음과 같이 동작한다.
- 서버는 window size에 해당하는 데이터 패킷을 연속적으로 전송한다.
- 전송되는 데이터 패킷에는 Sequence Number가 부여된다.
- 패킷이 전송될 때 서버는 각 패킷에 응답까지 기다릴 timeout을 개시한다.
- Client는 받은 패킷의 Sequence Number를 응답한다.
- Client는 패킷 Seq의 순서 대로 버퍼에 저장한다.
- ACK 응답을 받지 못한 서버 패킷이 timeout 상태가 되면 서버는 해당 패킷만 재전송한다.
- Client는 패킷을 온전히 전달받으면 어플리케이션 계층으로 올려보내고 버퍼를 비운다.
Selective Repeat dilemma
Seq 넘버는 무한정 늘릴 수 없기 때문에 적절한 범위를 설정해 반복해서 사용한다. 이때 Seq 넘버 범위를 너무 작게 잡으면 오류가 발생한 패킷 Seq와 Client가 받아야할 패킷 Seq가 충돌해 오류 제어가 제대로 되지 않을 수 있다.
따라서 적절한 Seq size는 2 * window size가 된다.
실제 TCP는 Go-Back-N이나 Selective Repeat으로 구현되어있지 않다. Go-Back-N은 비효율적이고 Selective Repeat처럼 각 패킷에 timeout을 설정하는 것은 너무 많은 컴퓨팅 리소스를 사용하기 때문이다.
'컴퓨터 사이언스 > 네트워크' 카테고리의 다른 글
네트워크 계층 - 라우팅 알고리즘 (0) | 2023.03.12 |
---|---|
네트워크 계층- IP (0) | 2023.03.09 |
전송계층 - TCP (0) | 2023.03.07 |
애플리케이션 계층 (0) | 2023.02.19 |
네트워크 구성 (0) | 2023.02.17 |
댓글