3장 4절전

Download Report

Transcript 3장 4절전

Chapter 3: Transport Layer
2016-07-04.
Transport Layer
3-1
Chapter 3: Transport Layer
학습 목표:
 전송 계층 서비스의
원리 이해:




다중화와 역다중화
신뢰적인 데이터 전송
흐름 제어
혼잡 제어
 인터넷에서 전송 계층
프로토콜에 대하여 배운다.



UDP: 비연결형 전송
TCP: 연결지향형 전송
TCP 혼잡 제어
Transport Layer
3-2
전송 계층 서비스 개요
 서로 다른 호스트에서 동작되는
app. 프로세스들 간의 논리적
통신(logical communication) 을
제공한다.
 전송 계층 프로토콜은 종단
시스템에서 구현된다.
 송신 측: 송신 app.로 부터
수신한 메시지를 전송 계층
세그먼트인 패킷으로
변환하여 네트워크
계층으로 전달한다.
 수신 측: 네트워크 계층의
데이터그램으로부터
세그먼트인 패킷을
추출하고 app. 계층으로
세그먼트를 보낸다.
 인터넷은 전송 계층 프로토콜로
application
transport
network
data link
physical
network
data link
physical
network
data link
physical
network
data link
physical
network
data link
physical
network
data link
physical
application
transport
network
data link
physical
Transport Layer
3-3
전송계층과 네트워크 계층 사이의 관계
 네트워크 계층: 호스트 간의
논리적 통신
 전송계층: 서로 다른
호스트에서 동작하는
프로세스간의 논리적 통신



전송 계층 프로토콜은 종단
시스템에서 존재한다.
app. 프로세스에서 네트워크
경계(네트워크 계층)까지
메시지를 운반(반대
방향으로도)
하위 계층 프로토콜의
서비스 모델에 의해 제약을
받으며, 또한 향상된
서비스를 app.에게
제공한다.
두 집안에 대한 비유:
동부와 서부 두 집안의 사촌간의
각 12명의 아이들이 서로
간에 편지를 주고 받는다.
 processes = 사촌간인 두




집안의 24명의 아이들
app 메시지 = 봉투 안의 편지
호스트 = 집
전송 계층 프로토콜 = 앤 과
빌
네트워크 계층 프로토콜 =
우편 서비스
Transport Layer
3-4
인터넷에서의 전송 계층의 개요
 인터넷 프로토콜(IP): 최선형
전달(best-effort delivery) 서비스,
비신뢰적인 서비스.


세그먼트의 전달을 보장하지 않고
세그먼트가 순서대로 전달되지
않는다.
 전송 계층 프로토콜 UDP, TCP의
기본 기능



전송 계층 다중화와 역다중화:
“호스트 대 호스트” 전달을
“프로세스 대 프로세스” 전달로
확장
무결성 검사: 헤더에 오류 검출
필드 포함
이 두 가지가 UDP가 제공하는
서비스
application
transport
network
data link
physical
network
data link
physical
network
data link
physical
network
data link
physical
network
data link
physical
network
data link
physical
application
transport
network
data link
physical
 신뢰적이고 연결지향적인 TCP:
기본기능에 다음과 같은 추가기능
제공

신뢰적인 데이터 전달의 위한
Transport Layer
3-5
다중화와 역다중화
송신 측 호스트에서의 다중화:
수신 측 호스트에서의 역다중화:
수신 받은 세그먼트 데이터를 올바른
소켓에게 전달하는 작업
= 소켓
application
transport
network
link
호스트에서 소켓들로부터 데이터를
모으고,헤더 정보로 캡슐화하고,
네트워크 계층으로 전달하는 작업
= 프로세스
P3
P1
P1
application
transport
network
P2
P4
application
transport
network
link
link
physical
host 1
physical
host 2
physical
host 3
Transport Layer
3-6
역다중화 작업
 소켓은 유일한 식별자(포트번호)를 갖는다.
 각 세그먼트는 적절한 소켓을 가리키는
특별한 필드를 가진다.

근원지 포트번호 필드, 목적지 포트번호
필드
 포트번호: 16비트 정수


0-1023: 잘 알려진(well-known)포트번호로
잘 알려진 app. 프로토콜로 예약되어 있다.
새 app. 개발 시 포트번호 할당
 역다중화 작업 과정



각 소켓은 포트번호 할당
전송 계층은 세그먼트 안의 목적지
포트번호를 검사하고 상응하는 소켓으로
세그먼트를 전달
세그먼트 데이터는 소켓을 통해 해당
프로세스로 전달
32 bits
근원지 포트번호목적지 포트번호
기타 헤더 필드
app. 데이터
(message)
TCP/UDP segment format
Transport Layer
3-7
비연결형 다중화와 역다중화
 포트번호를 갖는 소켓을 생성
DatagramSocket mySocket1 = new
DatagramSocket(99111);
DatagramSocket mySocket2 = new
DatagramSocket(99222);
 UDP 소켓은 목적지 IP address와
목적지 포트번호로 구성된 요소의
집합에 의해서 식별된다.
 호스트가 UDP 세그먼트를
수신하면(역다중화 과정):
1.
 UDP소켓 생성 후 호스트가
데이터 전송을 원하면: (다중화
과정)
1.
2.
UDP 전송계층은 근원지,
목적지 포트번호를 포함한
전송계층 세그먼트를 생성하고,
만들어진 세그먼트를 네트워크
계층에 전달
2.
UDP 전송계층은 세그먼트에서
목적지 포트번호를 확인한다.
포트번호를 갖는 소켓에게 UDP
세그먼트를 전달한다.
 근원지 IP address나 근원지
포트번호가 다르더라도 목적지 IP
address와 목적지 포트번호가
같으면 UDP 세그먼트는 동일한
프로세스로 향한다.
 근원지 IP주소 및 포트번호의 용도 :
질의에 대한 응답 시 “복귀주소”로
사용.
Transport Layer
3-8
비연결형 다중화와 역다중화
•클라이언트 A가 서버 B로 하나의 HTTP 세션을 초기화
•클라이언트 C가 서버 B로 하나의 HTTP 세션을 초기화
•역다중화 시 두개의 요소(목적지 IP address와 목적지 포트번호)를
사용하여 소켓식별
•두 요소가 같기 때문에 세그먼트가 같은 소켓으로 전달.
P2
SP: 6428
SP: 6428
DP: 9157
DP: 5775
SP: 9157
client
IP: A
P1
P1
P3
DP: 6428
SP: 5775
server
IP: B
DP: 6428
Client
IP:C
Transport Layer
3-9
연결지향형 다중화와 역다중화
 TCP 소켓은 4개의 요소로 된
집합으로 식별된다.:




근원지 IP address
근원지 port number
목적지 IP address
목적지 port number
 수신 호스트는 적당한
소켓으로 세그먼트를
전달하기 위해(역다중화
과정에서) 4개 값을 모두
사용한다.
 서버 호스트는 동시에 많은 TCP
소켓을 지원한다.

각 소켓은 자신의 4 요소에
의해서 식별된다.
 웹 서버는 각각의 연결된
클라이언트마다 서로 다른
소켓을 생성한다.


비지속 HTTP는 각 응답마다
서로 다른 소켓을 갖는다.
UDP와는 다르게 같은 목적지
IP address와 목적지
포트번호를 갖더라도 서로 다른
소켓으로 TCP 세그먼트가
전달된다.
Transport Layer 3-10
연결지향형 다중화와 역다중화
•클라이언트 C가 서버 B로 두 개의 HTTP 세션을 초기화
•클라이언트 A가 서버 B로 하나의 HTTP 세션을 초기화
•역다중화 시 4개의 요소를 모두 사용하여 소켓식별
•서버는 각각의 연결에 따라 새로운 프로세스를 생성
•프로세스 마다 각자 서로 다른 연결 소켓을 갖는다.
P1
P4
P5
P2
P6
P1P3
SP: 5775
DP: 80
S-IP: B
D-IP:C
SP: 9157
client
IP: A
DP: 80
S-IP: A
D-IP:C
SP: 9157
server
IP: B
DP: 80
S-IP: B
D-IP:C
Client
IP:C
Transport Layer
3-11
연결지향형 다중화와 역다중화 :
Threaded Web Server
•Threaded 웹 서버는 하나의 프로세스에 첨부된 많은 연결 소켓이 동시에 존재
•새로운 클라이언트 연결을 위해 새로운 소켓과 스레드(서브프로세서)들 생성
P1
P2
P4
P1P3
SP: 5775
DP: 80
S-IP: B
D-IP:C
SP: 9157
client
IP: A
DP: 80
S-IP: A
D-IP:C
SP: 9157
server
IP: B
DP: 80
S-IP: B
D-IP:C
Client
IP:C
Transport Layer 3-12
비연결형 트랜스포트: UDP[RFC 768]
 전송계층 프로토콜이 할 수 있는 최소
기능으로 동작



다중화와 역다중화
간단한 오류 검사 기능
비연결형 :
왜 UDP인가?
 연결설정이 없다. (which can
add delay)
 UDP 송신자와 수신자 사이에
 연결상태가 없다.
핸드세이크를 사용하지 않는다.
 작은 패킷 헤더 오버헤드
 DNS의 UDP
 혼잡제어가 없다.: 실기간
1. DNS 클라이언트가 질의 메시지를 작성
app.에 적당한 프로토콜이다.
2.
3.
4.
5.
UDP에게 메시지를 넘겨준다.
핸드세이킹 없이 메시지에 헤더필드
추가 후 네트워크 계층으로
넘겨준다.(다중화)
네트워크 계층은 데이터그램으로
캡슐화하여 네임서버에 송신
질의에 대한 응답을 기다린다.
응답이 없으면 다른 네임 서버에
송신하거나, 응답수신불능을 통보.

신뢰성을 app. 자체에서
제공하고 UDP는 혼잡제어에
의한 전송률 억제를
강요당하지 않는다.
Transport Layer 3-13
UDP
 streaming multimedia
apps에 자주 사용
헤더를 포함하는
 손실 허용
UDP 세그먼트의
길이(바이트 단위)
 최소 전송율 요구
 세그먼트의 전송지연이
없어야 한다.
 다른 UDP 사용 app.
 DNS
 SNMP
 UDP사용 시 신뢰적인
데이터 전송: 신뢰성에 대한
기능을 app. 자체에서 제공
32 bits
근원지 포트번호목적지 포트번호
길이
검사합
Application
data
(message)
UDP segment format
Transport Layer 3-14
UDP 검사합(Checksum)
목적: 전송된 세그먼트의 비트변경에 의한 오류를 검출
송신측:
 검사합: 세그먼트 안의 모든
16비트 워드합을 1의 보수를
수행, 덧셈과정에서 발생하는
오버플로우는 결과값에
합산된다.
 송신자는 겁사합 연산 결과를
UDP 세그먼트의 검사합 필드에
삽입하여 전송한다.
수신측:
 수신 받은 세그먼트에서 겁사합을
포함한 모든 16비트 워드를
합산한다.
 합산한 결과에서 0이 있으면
오류가 있는 걸로 검출된다.
Transport Layer 3-15
검사합 예
 Note

덧셈과정에서 발생하는 오버플로우는 결과값에 합산된다
 Example: add two 16-bit integers
1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0
1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1
wraparound 1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1
sum 1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 0 0
checksum 1 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1
Transport Layer 3-16
신뢰성 있는 데이터 전송의 원리
 신뢰적인 데이터 전송 프로토콜(reliable data transfer(rdt) protocol)

데이터가 변형되거나 손실되지 않고, 전송순서대로 전달된다.
 하위 계층의 비신뢰적인 채널의 특성이 신뢰적인 데이터 전송 프로토콜의
복잡도를 결정한다.
Transport Layer 3-17
신뢰성 있는 데이터 전송 프로토콜
:reliable data transfer(rdt) protocol
rdt_send(): 위 계층(app. 계층)에
의해서 호출
send
side
udt_send(): 비 신뢰적인
채널을 통해 수신자에게 패킷을
전송할 때 호출
deliver_data(): 상위 계층에
데이터를 전달하려고 할 때
호출
receive
side
rdt_rcv(): 패킷이 채널의 수신
측으로부터 도착했을 때 호출
Transport Layer 3-18
신뢰적인 데이터 전송 프로토콜의 구축
신뢰적인 데이터 전송(rdt) 프로토콜의 구축방법을 위한 가정
 송신 측으로부터 수신 측까지의 데이터 전송인 단방향
데이터 전송의 경우만을 고려한다. (단.제어 패킷은
양방향으로 전송된다.)
 송신자와 수신자를 정의하기 위해 유한 상태 머신(finite
state machines: FSM)을 사용한다.
상태변화를 일으키는 이벤트
이벤트가 발생했을 때 취해지는 행동
상태1
event
actions
상태2
Transport Layer 3-19
Rdt1.0: 오류없는 채널에서의 신뢰적인 데이터 전송
 하위 채널이 완전히 신뢰적인 가장 간단한 경우


데이터 변형이 없다.(비트 에러가 없다.)
패킷의 손실이 없다.
 송신자와 수신자가 분리된 FSM:

송신 측
• rdt_send(data) 이벤트: 상위계층으로부터 데이터를 받아들인다. 상위
계층에서 프로시저 호출
• packet=make_pkt(data): 데이터를 포함한 패킷을 생성
• udt_send(packet):패킷을 채널로 송신

수신 측
• rdt_rcv(packet) 이벤트: 하위계층 채널로부터 패킷을 수신, 하위 계층에서
프로시저 호출.
• extract(packet, data): 패킷으로 부터 데이터를 추출.
• deliver_data(data): 데이터를 상위계층으로 전달.
상위로부
터 호출을
기다림
rdt_send(data)
packet = make_pkt(data)
udt_send(packet)
sender
하위로부
터 호출을
기다림
rdt_rcv(packet)
extract (packet,data)
deliver_data(data)
receiver
Transport Layer 3-20
Rdt 2.0: 비트 오류가 있는 채널에서의 신뢰적인
데이터 전송
 패킷 안의 비트들이 하위 채널에서 변형되는 모델


검사 합으로 비트 오류를 검출
패킷은 모두 순서대로 수신된다고 가정.
 오류 정정 방법: 자동재전송요구(Automatic Repeat reQuest:
ARQ)


acknowledgements (ACKs): 송신자가 수신자에게 패킷이 정확하게
수신됐다는 것을 알린다.
negative acknowledgements (NAKs): 송신자가 수신자에게 패킷에
비트오류가 발생했음을 알린다. 송신자는 NAK를 수신하면 패킷을
재전송한다.
 rdt1.0과 비교한 rdt2.0의 새로운 기능:



오류 검출 : 검사합 필드 사용
수신자 피드백: 수신자로부터 송신자로 ACK와 NAK 패킷을 전송
재전송: NAK를 수신하면 송신자가 해당 패킷을 재전송
Transport Layer 3-21
Rdt 2.0 : FSM의 정의
rdt_send(data)
snkpkt = make_pkt(data, checksum)
udt_send(sndpkt)
rdt_rcv(rcvpkt) &&
isNAK(rcvpkt)
상위로부터
ACK
호출을
또는
udt_send(sndpkt)
기다림
NAK
응답을
기다림
rdt_rcv(rcvpkt) && isACK(rcvpkt)
L
sender
receiver
rdt_rcv(rcvpkt) &&
corrupt(rcvpkt)
udt_send(NAK)
하위로부터
호출을
기다림
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)
Transport Layer 3-22
Rdt 2.0 : 오류 없을 때 동작
rdt_send(data)
snkpkt = make_pkt(data,
checksum)
rdt_rcv(rcvpkt) &&
udt_send(sndpkt)
isNAK(rcvpkt)
상위로부터
ACK
호출을
또는
udt_send(sndpkt)
기다림
NAK
응답을
기다림
rdt_rcv(rcvpkt) && isACK(rcvpkt)
L
sender
receiver
rdt_rcv(rcvpkt) &&
corrupt(rcvpkt)
udt_send(NAK)
하위로부터
호출을
기다림
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)
Transport Layer 3-23
Rdt 2.0 : 오류 있을 때 동작
rdt_send(data)
snkpkt = make_pkt(data,
checksum)
rdt_rcv(rcvpkt) &&
udt_send(sndpkt)
isNAK(rcvpkt)
상위로부터
ACK
호출을
또는
udt_send(sndpkt)
기다림
NAK
응답을
기다림
rdt_rcv(rcvpkt) && isACK(rcvpkt)
L
sender
receiver
rdt_rcv(rcvpkt) &&
corrupt(rcvpkt)
udt_send(NAK)
하위로부터
호출을
기다림
rdt_rcv(rcvpkt) &&
notcorrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
udt_send(ACK)
Transport Layer 3-24
rdt2.0: transition
rdt_send(data)
송신측
udt_send(data)
수신측
rdt_rcv(data)
오류검사하고
없으면
deliver_data(data)
패킷을 만들고
udt_send(ACK)
rdt_send(data)
rdt_rcv(ACK)
udt_send(data)
rdt_rcv(data)
오류검사하고
있으면
재전송
udt_send(NAK)
rdt_rcv(NAK)
udt_send(data)
rdt_rcv(data)
udt_send(ACK)
rdt_rcv(ACK)
오류검사하고
없으면
deliver_data(data)
Transport Layer 3-25
Rdt 2.0의 결함
ACK/NAK패킷이 전송 시 비트
오류 발생하면,
 송신 측은 수신 측의 패킷 전송
오류 여부를 알 수 없다.
 단순한 재전송은 중복 전송을
야기시킨다.
해결책
 송신자가 ACK/NAK의 오류 검출
및 정정이 가능한 검사 합비트를
추가.
-> 패킷 손실인 경우 문제.
 송신자가 ACK/NAK의 오류 검출
후 재전송한다. ->중복 패킷을
전송할 수 있다.(송신 측에
ACK가 오류로 인하여 NAK로
수신되면) 따라서 수신 측은
전송된 패킷이 새로운 데이터의
패킷인지 재전송 패킷인지
식별할 수 없다.
중복 전송의 해결책:
 송신자는 순서번호필드를
패킷에 추가.
 만약 ACK/NAK에 오류가 검출
되면 송신자는 현재 패킷을
재전송한다.
 수신자는 순서번호필드를
확인하여 최근에 수신한 패킷의
순서번호와 동일하면 재전송,
그렇지 않으면 새로운 패킷으로
간주하여 중복패킷을 상위
계층으로 전달하지 않는다.
stop and wait
송신자는 패킷을 보내고 나서
수신자의 응답을 기다린다.
Transport Layer 3-26
Rdt 2.1 : 송신자
1-1 rdt_send(data)
sndpkt = make_pkt(0, data, checksum)
udt_send(sndpkt)
2-1
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) || isNAK(rcvpkt) )
Wait for call
0 from
above
4-2 rdt_rcv(rcvpkt)
1
Wait for ACK
or NAK 0
udt_send(sndpkt)
2
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt)
L
4-1 rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
isNAK(rcvpkt) )
udt_send(sndpkt)
Wait for 4
ACK or NAK
1
3
2-2
L
Wait for
call 1 from
above
3-1 rdt_send(data)
sndpkt = make_pkt(1, data, checksum)
udt_send(sndpkt)
Transport Layer 3-27
Rdt 2.1: 수신자
1-2 rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq0(rcvpkt)
1-1
rdt_rcv(rcvpkt) && (corrupt(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
sndpkt = make_pkt(NAK, chksum)
udt_send(sndpkt)
1-1
sndpkt = make_pkt(NAK, chksum)
udt_send(sndpkt)
Wait for
0 from
below
rdt_rcv(rcvpkt) &&
not corrupt(rcvpkt) &&
has_seq1(rcvpkt)
rdt_rcv(rcvpkt) && (corrupt(rcvpkt)
2-1
1
2
Wait for
1 from
below
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
2-2 rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
rdt_rcv(rcvpkt) &&
not corrupt(rcvpkt) &&
has_seq0(rcvpkt)
2-1
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
&& has_seq1(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK, chksum)
udt_send(sndpkt)
Transport Layer 3-28
Rdt2.1: 검토
송신자:
 순서번호를 패킷에 추가
 0,1 두 개의 순서번호로
문제 해결이 가능하다.
 ACK/NAK응답이
비트오류가 있는지를
확인
 Rdt 2.0보다 두 배 많은
상태를 갖는다.
수신자:
 수신된 패킷이
중복패킷인지 확인
 최근에 수신한 패킷의
순서번호와 동일하면
재전송, 그렇지 않으면
새로운 패킷으로 간주
Transport Layer 3-29
Rdt2.2: a NAK-free protocol
 NAK를 사용하지 않고 ACK만 사용, 그 외는 Rdt2.1과 같은 기능
 NAK대신에, 수신자는 최근에 정확하게 수신된 패킷의 ACK를 송신.

수신자는 이전에 정확하게 수신된 패킷의 순서번호를 포함시켜 ACK를
보내야 한다.-> Rdt2.1과 차이점
 송신자는 두 번 ACK되고 있는 패킷의 다음 패킷을 정확하게
수신하지 못했다는 것을 알고 재전송한다.
Transport Layer 3-30
Rdt2.2 : 송신자
rdt_send(data)
sndpkt = make_pkt(0, data, checksum)
udt_send(sndpkt)
Wait for call
0 from
above
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt,1)
udt_send(sndpk
t)
Wait for ACK
0
udt_send(sndpkt)
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt,0)
L
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
isACK(rcvpkt,0) )
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
isACK(rcvpkt,1) )
Wait for call
1 from
above
Wait for
ACK
1
L
rdt_send(data)
sndpkt = make_pkt(1, data, checksum)
udt_send(sndpkt)
Transport Layer 3-31
Rdt2.2 : 수신자
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq0(rcvpkt)
L
oncethru=1
rdt_rcv(rcvpkt) &&
corrupt(rcvpkt) &&
has_seq1(rcvpkt)
if(oncethru==1)
udt_send(sndpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK, 0, chksum)
udt_send(sndpkt)
oncethru=0
Wait for
0 from
below
Wait for
1 from
below
rdt_rcv(rcvpkt) &&
corrupt(rcvpkt) &&
has_seq0(rcvpkt)
udt_send(sndpkt)
rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)
&& has_seq1(rcvpkt)
extract(rcvpkt,data)
deliver_data(data)
sndpkt = make_pkt(ACK, 1, chksum)
udt_send(sndpkt)
Transport Layer 3-32
Rdt3.0: 비트오류가 있는 손실 채널에서의
데이터 전송
새로운 가정: 하위 채널이 패킷
(data or ACKs)을 손실하는
경우

검사합, 순서번호, ACK
패킷, 재전송의
사용(Rdt2.2)은 패킷 손실이
발생했을 때 대안은 되나,
패킷 손실 검출이 불가능
하다.
접근 방법: 송신자는 ACK 응답을
받기 위한 충분한 시간을
기다린다.
 설정된 시간 안에 ACK 응답이
수신되지 않으면 패킷을 재전송
한다.
 만일 데이터나 ACK 패킷이 손실된
게 아닌 큰 지연이 발생한
것이라면i:
 중복 데이터 패킷이 재전송에
의해서 발생할 수 있으나, 순서
번호로써 중복 패킷의 문제점을
해결할 수 있다.
 수신자는 Ack 패킷에
순서번호를 포함시켜 보낸다.
 주어진 시간 경과 후 기다리는
송신자를 인터럽트Transport
할 수 있는
Layer 3-33
카운트다운 타이머가 필요하다.
Rdt3.0 : 송신자
1-1 rdt_send(data)
sndpkt = make_pkt(0, data, checksum)
udt_send(sndpkt)
start_timer
rdt_rcv(rcvpkt)
L
4-2
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt,1)
timeout
udt_send(sndpkt)
start_timer
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
isACK(rcvpkt,0) )
L
L
Wait
for
2 ACK0
Wait for
call 0from
above 1
2-2
3 Wait for
Wait 4
for
ACK1
rdt_send(data)
2-1
timeout
udt_send(sndpkt)
start_timer
rdt_rcv(rcvpkt)
&& notcorrupt(rcvpkt)
&& isACK(rcvpkt,0)
stop_timer
stop_timer
4-1
rdt_rcv(rcvpkt) &&
( corrupt(rcvpkt) ||
isACK(rcvpkt,1) )
call 1 from
above
3-1
rdt_rcv(rcvpkt)
L
sndpkt = make_pkt(1, data, checksum)
udt_send(sndpkt)
start_timer
Transport Layer 3-34
Rdt3.0 : 무손실 동작과 패킷 손실동작
Transport Layer 3-35
Rdt3.0 : ACK 손실과 조급한 타임아웃
Transport Layer 3-36
Rdt3.0의 성능
 rdt3.0은 기능적으로는 우수하나, 오늘날 고속네트워크환경에서는
적당하지 않다.
 1 Gbps 전송률(R)을 가진 채널, 15 ms의 종단간 전파지연, 1KB
패킷을 전송한다면:
RTT(왕복전파지연) = 30ms
T transmit =
U
L (패킷 크기, bit)
R (전송율, bps)
sender
=
L/R
RTT + L / R
=
=
8kb/pkt
109 b/sec
.008
30.008
= 8 us
= 0.00027
microsec
onds
송신자 이용률 – 송신자는 전체 전송소요시간의 0.00027동안만
채널이용.
 대략 30 ms마다 1KB 패킷이 전송 -> 1 Gbps link에서 267kbps 유효
처리량을 갖는다.
 네트워크 프로토콜들이 하위 네트워크 하드웨어가 제공하는 용량을
제한하게 된다.
Transport Layer 3-37
 U
sender:
Rdt3.0: 전송 후 대기 프로토콜
송신자
수신자
송신되는 첫 번째 패킷의 첫 번째
비트,
t = t0=
송신되는 첫 번째 패킷의 마지막
비트,
L/R
전송 지연 시간
첫 번째 패킷의 첫 번째 비트
도착
첫 번째 패킷의 마지막 비트 도착,
ACK 전송
RTT
ACK 도착 후에 다음 패킷
전송,
t = RTT + L / R
U
=
sender
L/R
RTT + L / R
=
.008
30.008
= 0.00027
microsec
onds
Transport Layer 3-38
파이프라인된 전송: 송신자 이용률의 증가
확인응답을 기다리기 전에 송신자가 3개의 패킷을 전송하도록 허용한다면:
송신자
수신자
송신되는 첫 번째 패킷의 첫 번째
비트,
t = t0=
송신되는 첫 번째 패킷의 마지막
비트,
L/R
전송 지연 시간
첫 번째 패킷의 첫 번째 비트
도착
첫 번째 패킷의 마지막 비트 도착,
ACK
전송
두
번째
패킷의 마지막 비트 도착,
ACK
전송
세 번째
패킷의 마지막 비트 도착,
ACK 전송
RTT
ACK 도착 후에 다음 패킷
전송,
t = RTT + L / R
U
sender
=
3*L/R
RTT + L / R
=
.024
= 0.0008
30.008[송신자의
microsecon
이용률이 3배 증가]
ds
Transport Layer 3-39
파이프라인된 프로토콜
파이프라이닝: 송신자는 확인 응답을 기다리지 않고 여러 패킷을
전송하도록 허용



순서번호의 범위가 증가되어야 한다. 각각의 전송 중인 패킷은 유일한
순서번호를 갖는다.
프로토콜의 송신 측과 수신 측은 한 패킷 이상을 버퍼링 해야 한다.
송신자는 전송되었으나 확인응답 되지 않은 패킷을, 수신자는 정확하게
수신 된 패킷들을 버퍼링해야 한다.
파이프라인된 프로토콜의 두 가지 접근방법: go-Back-N, selective repeat
Transport Layer 3-40