40
Transport Layer 3-1 Chapter 3: Transport Layer 22年 6年 21年.

Chapter 3: Transport Layer

  • Upload
    neka

  • View
    189

  • Download
    3

Embed Size (px)

DESCRIPTION

Chapter 3: Transport Layer. 2014-07-16 . 학습 목표 : 전송 계층 서비스의 원리 이해 : 다중화와 역다중화 신뢰적인 데이터 전송 흐름 제어 혼잡 제어. 인터넷에서 전송 계층 프로토콜에 대하여 배운다 . UDP: 비연결형 전송 TCP: 연결지향형 전송 TCP 혼잡 제어. Chapter 3: Transport Layer. 서로 다른 호스트에서 동작되는 app. 프로세스들 간의 논리적 통신 ( logical communication ) 을 제공한다 . - PowerPoint PPT Presentation

Citation preview

Page 1: Chapter 3: Transport Layer

Transport Layer 3-1

Chapter 3: Transport Layer

23 4 22年 月 日.

Page 2: Chapter 3: Transport Layer

Transport Layer 3-2

Chapter 3: Transport Layer학습 목표 : 전송 계층 서비스의

원리 이해 : 다중화와 역다중화 신뢰적인 데이터 전송 흐름 제어 혼잡 제어

인터넷에서 전송 계층 프로토콜에 대하여 배운다 . UDP: 비연결형 전송 TCP: 연결지향형 전송 TCP 혼잡 제어

Page 3: Chapter 3: Transport Layer

Transport Layer 3-3

전송 계층 서비스 개요 서로 다른 호스트에서 동작되는

app. 프로세스들 간의 논리적 통신 (logical communication) 을 제공한다 .

전송 계층 프로토콜은 종단 시스템에서 구현된다 . 송신 측 : 송신 app. 로 부터

수신한 메시지를 전송 계층 세그먼트인 패킷으로 변환하여 네트워크 계층으로 전달한다 .

수신 측 : 네트워크 계층의 데이터그램으로부터 세그먼트인 패킷을 추출하고 app. 계층으로 세그먼트를 보낸다 .

인터넷은 전송 계층 프로토콜로 TCP and UDP 를 가진다 .

application

transportnetworkdata linkphysical

application

transportnetworkdata linkphysical

networkdata linkphysical

networkdata linkphysical

networkdata linkphysical

networkdata linkphysicalnetwork

data linkphysical

logical end-end transport

Page 4: Chapter 3: Transport Layer

Transport Layer 3-4

전송계층과 네트워크 계층 사이의 관계 네트워크 계층 : 호스트 간의

논리적 통신 전송계층 : 서로 다른

호스트에서 동작하는 프로세스간의 논리적 통신 전송 계층 프로토콜은 종단

시스템에서 존재한다 . app. 프로세스에서

네트워크 경계 ( 네트워크 계층 ) 까지 메시지를 운반 (반대 방향으로도 )

하위 계층 프로토콜의 서비스 모델에 의해 제약을 받으며 , 또한 향상된 서비스를 app. 에게 제공한다 .

두 집안에 대한 비유 :동부와 서부 두 집안의 사촌간의

각 12 명의 아이들이 서로 간에 편지를 주고 받는다 .

processes = 사촌간인 두 집안의 24 명의 아이들

app 메시지 = 봉투 안의 편지

호스트 = 집 전송 계층 프로토콜 = 앤 과

빌 네트워크 계층 프로토콜 =

우편 서비스

Page 5: Chapter 3: Transport Layer

Transport Layer 3-5

인터넷에서의 전송 계층의 개요 인터넷 프로토콜 (IP): 최선형 전달

(best-effort delivery) 서비스 , 비신뢰적인 서비스 . 세그먼트의 전달을 보장하지 않고 세그먼트가 순서대로 전달되지 않는다 .

전송 계층 프로토콜 UDP, TCP 의 기본 기능 전송 계층 다중화와 역다중화 : “ 호스트

대 호스트” 전달을 “ 프로세스 대 프로세스” 전달로 확장

무결성 검사 : 헤더에 오류 검출 필드 포함

이 두 가지가 UDP 가 제공하는 서비스 신뢰적이고 연결지향적인 TCP:

기본기능에 다음과 같은 추가기능 제공 신뢰적인 데이터 전달의 위한 흐름제어 ,

순서번호 , 확인응답 , 타이머를 사용 혼잡 제어

application

transportnetworkdata linkphysical

application

transportnetworkdata linkphysical

networkdata linkphysical

networkdata linkphysical

networkdata linkphysical

networkdata linkphysicalnetwork

data linkphysical

logical end-end transport

Page 6: Chapter 3: Transport Layer

Transport Layer 3-6

다중화와 역다중화

application

transport

network

link

physical

P1 application

transport

network

link

physical

application

transport

network

link

physical

P2P3 P4P1

host 1 host 2 host 3

= 프로세스= 소켓

수신 받은 세그먼트 데이터를 올바른 소켓에게 전달하는 작업

수신 측 호스트에서의 역다중화 :호스트에서 소켓들로부터 데이터를 모으고 , 헤더 정보로 캡슐화하고 , 네트워크 계층으로 전달하는 작업

송신 측 호스트에서의 다중화 :

Page 7: Chapter 3: Transport Layer

Transport Layer 3-7

역다중화 작업 소켓은 유일한 식별자 ( 포트번호 ) 를 갖는

다 . 각 세그먼트는 적절한 소켓을 가리키는

특별한 필드를 가진다 . 근원지 포트번호 필드 , 목적지 포트번호 필드

포트번호 : 16 비트 정수 0-1023: 잘 알려진 (well-known)

포트번호로 잘 알려진 app. 프로토콜로 예약되어 있다 .

새 app. 개발 시 포트번호 할당

역다중화 작업 과정 각 소켓은 포트번호 할당 전송 계층은 세그먼트 안의 목적지

포트번호를 검사하고 상응하는 소켓으로 세그먼트를 전달

세그먼트 데이터는 소켓을 통해 해당 프로세스로 전달

근원지 포트번호목적지 포트번호

32 bits

app. 데이터(message)

기타 헤더 필드

TCP/UDP segment format

Page 8: Chapter 3: Transport Layer

Transport Layer 3-8

비연결형 다중화와 역다중화 포트번호를 갖는 소켓을 생성DatagramSocket mySocket1 = new

DatagramSocket(99111);DatagramSocket mySocket2 = new

DatagramSocket(99222);

UDP 소켓 생성 후 호스트가 데이터 전송을 원하면 : ( 다중화 과정 )

1. UDP 전송계층은 근원지 , 목적지 포트번호를 포함한 전송계층 세그먼트를 생성하고 ,

2. 만들어진 세그먼트를 네트워크 계층에 전달

UDP 소켓은 목적지 IP address 와 목적지 포트번호로 구성된 요소의 집합에 의해서 식별된다 .

호스트가 UDP 세그먼트를 수신하면 (역다중화 과정 ):1. UDP 전송계층은 세그먼트에서 목적지

포트번호를 확인한다 .2. 포트번호를 갖는 소켓에게 UDP

세그먼트를 전달한다 . 근원지 IP address 나 근원지

포트번호가 다르더라도 목적지 IP address 와 목적지 포트번호가 같으면 UDP 세그먼트는 동일한 프로세스로 향한다 .

근원지 IP 주소 및 포트번호의 용도 : 질의에 대한 응답 시 “ 복귀주소” 로 사용 .

Page 9: Chapter 3: Transport Layer

Transport Layer 3-9

비연결형 다중화와 역다중화

ClientIP:C

P2

client IP: A

P1P1P3

serverIP: B

SP: 6428DP: 9157

SP: 9157DP: 6428

SP: 6428DP: 5775

SP: 5775DP: 6428

•클라이언트 A 가 서버 B 로 하나의 HTTP 세션을 초기화•클라이언트 C 가 서버 B 로 하나의 HTTP 세션을 초기화•역다중화 시 두개의 요소 ( 목적지 IP address 와 목적지 포트번호 ) 를 사용하여 소켓식별•두 요소가 같기 때문에 세그먼트가 같은 소켓으로 전달 .

Page 10: Chapter 3: Transport Layer

Transport Layer 3-10

연결지향형 다중화와 역다중화

TCP 소켓은 4 개의 요소로 된 집합으로 식별된다 .: 근원지 IP address 근원지 port number 목적지 IP address 목적지 port number

수신 호스트는 적당한 소켓으로 세그먼트를 전달하기 위해 ( 역다중화 과정에서 ) 4 개 값을 모두 사용한다 .

서버 호스트는 동시에 많은 TCP 소켓을 지원한다 . 각 소켓은 자신의 4 요소에

의해서 식별된다 . 웹 서버는 각각의 연결된

클라이언트마다 서로 다른 소켓을 생성한다 . 비지속 HTTP 는 각 응답마다

서로 다른 소켓을 갖는다 . UDP 와는 다르게 같은 목적지

IP address 와 목적지 포트번호를 갖더라도 서로 다른 소켓으로 TCP 세그먼트가 전달된다 .

Page 11: Chapter 3: Transport Layer

Transport Layer 3-11

연결지향형 다중화와 역다중화

ClientIP:C

P1

client IP: A

P1P2P4

serverIP: B

SP: 9157DP: 80

SP: 9157DP: 80

P5 P6 P3

D-IP:CS-IP: AD-IP:C

S-IP: B

SP: 5775DP: 80

D-IP:CS-IP: B

•클라이언트 C 가 서버 B 로 두 개의 HTTP 세션을 초기화•클라이언트 A 가 서버 B 로 하나의 HTTP 세션을 초기화•역다중화 시 4 개의 요소를 모두 사용하여 소켓식별•서버는 각각의 연결에 따라 새로운 프로세스를 생성•프로세스 마다 각자 서로 다른 연결 소켓을 갖는다 .

Page 12: Chapter 3: Transport Layer

Transport Layer 3-12

연결지향형 다중화와 역다중화 : Threaded Web Server

ClientIP:C

P1

client IP: A

P1P2

serverIP: B

SP: 9157DP: 80

SP: 9157DP: 80

P4 P3

D-IP:CS-IP: AD-IP:C

S-IP: B

SP: 5775DP: 80

D-IP:CS-IP: B

•Threaded 웹 서버는 하나의 프로세스에 첨부된 많은 연결 소켓이 동시에 존재•새로운 클라이언트 연결을 위해 새로운 소켓과 스레드 ( 서브프로세서 ) 들 생성

Page 13: Chapter 3: Transport Layer

Transport Layer 3-13

비연결형 트랜스포트 : UDP[RFC 768] 전송계층 프로토콜이 할 수 있는 최소

기능으로 동작 다중화와 역다중화 간단한 오류 검사 기능

비연결형 : UDP 송신자와 수신자 사이에

핸드세이크를 사용하지 않는다 . DNS 의 UDP

1. DNS 클라이언트가 질의 메시지를 작성 UDP 에게 메시지를 넘겨준다 .

2. 핸드세이킹 없이 메시지에 헤더필드 추가 후 네트워크 계층으로 넘겨준다 .( 다중화 )

3. 네트워크 계층은 데이터그램으로 캡슐화하여 네임서버에 송신

4. 질의에 대한 응답을 기다린다 .5. 응답이 없으면 다른 네임 서버에

송신하거나 , 응답수신불능을 통보 .

왜 UDP 인가 ? 연결설정이 없다 . (which

can add delay) 연결상태가 없다 . 작은 패킷 헤더 오버헤드 혼잡제어가 없다 .: 실기간

app. 에 적당한 프로토콜이다 . 신뢰성을 app. 자체에서

제공하고 UDP 는 혼잡제어에 의한 전송률 억제를 강요당하지 않는다 .

Page 14: Chapter 3: Transport Layer

Transport Layer 3-14

UDP streaming multimedia

apps 에 자주 사용 손실 허용 최소 전송율 요구 세그먼트의 전송지연이

없어야 한다 . 다른 UDP 사용 app.

DNS SNMP

UDP 사용 시 신뢰적인 데이터 전송 : 신뢰성에 대한 기능을 app. 자체에서 제공

근원지 포트번호목적지 포트번호

32 bits

Applicationdata

(message)

UDP segment format

길이 검사합

헤더를 포함하는 UDP 세그먼트의

길이 ( 바이트 단위 )

Page 15: Chapter 3: Transport Layer

Transport Layer 3-15

UDP 검사합 (Checksum)

송신측 : 검사합 : 세그먼트 안의 모든 16

비트 워드합을 1 의 보수를 수행 , 덧셈과정에서 발생하는 오버플로우는 결과값에 합산된다 .

송신자는 겁사합 연산 결과를 UDP 세그먼트의 검사합 필드에 삽입하여 전송한다 .

수신측 : 수신 받은 세그먼트에서 겁사합을

포함한 모든 16 비트 워드를 합산한다 .

합산한 결과에서 0이 있으면 오류가 있는 걸로 검출된다 .

목적 : 전송된 세그먼트의 비트변경에 의한 오류를 검출

Page 16: Chapter 3: Transport Layer

Transport Layer 3-16

검사합 예 Note

덧셈과정에서 발생하는 오버플로우는 결과값에 합산된다

Example: add two 16-bit integers

1 1 1 1 0 0 1 1 0 0 1 1 0 0 1 1 01 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1

1 1 0 1 1 1 0 1 1 1 0 1 1 1 0 1 1

1 1 0 1 1 1 0 1 1 1 0 1 1 1 1 0 01 0 1 0 0 0 1 0 0 0 1 0 0 0 0 1 1

wraparound

sumchecksum

Page 17: Chapter 3: Transport Layer

Transport Layer 3-17

신뢰성 있는 데이터 전송의 원리

신뢰적인 데이터 전송 프로토콜 (reliable data transfer(rdt) protocol) 데이터가 변형되거나 손실되지 않고 , 전송순서대로 전달된다 .

하위 계층의 비신뢰적인 채널의 특성이 신뢰적인 데이터 전송 프로토콜의 복잡도를 결정한다 .

Page 18: Chapter 3: Transport Layer

Transport Layer 3-18

신뢰성 있는 데이터 전송 프로토콜:reliable data transfer(rdt) protocol

sendside

receiveside

rdt_send(): 위 계층 (app. 계층 ) 에 의해서 호출

udt_send(): 비 신뢰적인 채널을 통해 수신자에게 패킷을 전송할 때 호출

rdt_rcv(): 패킷이 채널의 수신 측으로부터 도착했을 때 호출

deliver_data(): 상위 계층에 데이터를 전달하려고 할 때 호출

Page 19: Chapter 3: Transport Layer

Transport Layer 3-19

신뢰적인 데이터 전송 프로토콜의 구축신뢰적인 데이터 전송 (rdt) 프로토콜의 구축방법을 위한 가정 송신 측으로부터 수신 측까지의 데이터 전송인 단방향

데이터 전송의 경우만을 고려한다 . ( 단 .제어 패킷은 양방향으로 전송된다 .)

송신자와 수신자를 정의하기 위해 유한 상태 머신 (finite state machines: FSM) 을 사용한다 .

상태 1 상태 2

상태변화를 일으키는 이벤트이벤트가 발생했을 때 취해지는 행동

eventactions

Page 20: Chapter 3: Transport Layer

Transport Layer 3-20

Rdt1.0: 오류없는 채널에서의 신뢰적인 데이터 전송

하위 채널이 완전히 신뢰적인 가장 간단한 경우 데이터 변형이 없다 .( 비트 에러가 없다 .) 패킷의 손실이 없다 .

송신자와 수신자가 분리된 FSM: 송신 측

• rdt_send(data) 이벤트 : 상위계층으로부터 데이터를 받아들인다 . 상위 계층에서 프로시저 호출

• packet=make_pkt(data): 데이터를 포함한 패킷을 생성• udt_send(packet): 패킷을 채널로 송신

수신 측• rdt_rcv(packet) 이벤트 : 하위계층 채널로부터 패킷을 수신 , 하위

계층에서 프로시저 호출 .• extract(packet, data): 패킷으로 부터 데이터를 추출 .• deliver_data(data): 데이터를 상위계층으로 전달 .

상위로부터 호출을

기다림packet = make_pkt(data)udt_send(packet)

rdt_send(data)extract (packet,data)deliver_data(data)

하위로부터 호출을

기다림

rdt_rcv(packet)

sender receiver

Page 21: Chapter 3: Transport Layer

Transport Layer 3-21

Rdt 2.0: 비트 오류가 있는 채널에서의 신뢰적인 데이터 전송

패킷 안의 비트들이 하위 채널에서 변형되는 모델 검사 합으로 비트 오류를 검출 패킷은 모두 순서대로 수신된다고 가정 .

오류 정정 방법 : 자동재전송요구 (Automatic Repeat reQuest: ARQ) acknowledgements (ACKs): 송신자가 수신자에게 패킷이 정확하게

수신됐다는 것을 알린다 . negative acknowledgements (NAKs): 송신자가 수신자에게 패킷에

비트오류가 발생했음을 알린다 . 송신자는 NAK 를 수신하면 패킷을 재전송한다 .

rdt1.0 과 비교한 rdt2.0 의 새로운 기능 : 오류 검출 : 검사합 필드 사용 수신자 피드백 : 수신자로부터 송신자로 ACK 와 NAK 패킷을 전송 재전송 : NAK 를 수신하면 송신자가 해당 패킷을 재전송

Page 22: Chapter 3: Transport Layer

Transport Layer 3-22

Rdt 2.0 : FSM 의 정의

상위로부터 호출을기다림

snkpkt = make_pkt(data, checksum)udt_send(sndpkt)

extract(rcvpkt,data)deliver_data(data)udt_send(ACK)

rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)

rdt_rcv(rcvpkt) && isACK(rcvpkt)

udt_send(sndpkt)

rdt_rcv(rcvpkt) && isNAK(rcvpkt)

udt_send(NAK)

rdt_rcv(rcvpkt) && corrupt(rcvpkt)

ACK 또는 NAK

응답을 기다림

하위로부터 호출을기다림sender

receiverrdt_send(data)

Page 23: Chapter 3: Transport Layer

Transport Layer 3-23

snkpkt = make_pkt(data, checksum)udt_send(sndpkt)

extract(rcvpkt,data)deliver_data(data)udt_send(ACK)

rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)

rdt_rcv(rcvpkt) && isACK(rcvpkt)

udt_send(sndpkt)

rdt_rcv(rcvpkt) && isNAK(rcvpkt)

udt_send(NAK)

rdt_rcv(rcvpkt) && corrupt(rcvpkt)

ACK 또는 NAK

응답을 기다림

sender

receiverrdt_send(data)

Rdt 2.0 : 오류 없을 때 동작

상위로부터 호출을기다림

하위로부터 호출을기다림

Page 24: Chapter 3: Transport Layer

Transport Layer 3-24

상위로부터 호출을기다림

snkpkt = make_pkt(data, checksum)udt_send(sndpkt)

extract(rcvpkt,data)deliver_data(data)udt_send(ACK)

rdt_rcv(rcvpkt) && notcorrupt(rcvpkt)

rdt_rcv(rcvpkt) && isACK(rcvpkt)

udt_send(sndpkt)

rdt_rcv(rcvpkt) && isNAK(rcvpkt)

udt_send(NAK)

rdt_rcv(rcvpkt) && corrupt(rcvpkt)

하위로부터 호출을기다림sender

receiverrdt_send(data)

Rdt 2.0 : 오류 있을 때 동작

ACK 또는 NAK

응답을 기다림

Page 25: Chapter 3: Transport Layer

Transport Layer 3-25

rdt2.0: transition rdt_send(data)

udt_send(data) rdt_rcv(data)deliver_data(data)

udt_send(ACK)rdt_send(data)

deliver_data(data)

패킷을 만들고

오류검사하고

없으면

오류검사하고있으면

재전송

오류검사하고없으면

udt_send(data) rdt_rcv(data)rdt_rcv(ACK)

udt_send(NAK)rdt_rcv(NAK)

udt_send(data) rdt_rcv(data)

udt_send(ACK)rdt_rcv(ACK)

송신측 수신측

Page 26: Chapter 3: Transport Layer

Transport Layer 3-26

Rdt 2.0 의 결함ACK/NAK 패킷이 전송 시 비트

오류 발생하면 , 송신 측은 수신 측의 패킷 전송

오류 여부를 알 수 없다 . 단순한 재전송은 중복 전송을

야기시킨다 .

해결책 송신자가 ACK/NAK 의 오류 검출

및 정정이 가능한 검사 합비트를 추가 .

-> 패킷 손실인 경우 문제 . 송신자가 ACK/NAK 의 오류 검출

후 재전송한다 . -> 중복 패킷을 전송할 수 있다 .( 송신 측에 ACK가 오류로 인하여 NAK 로 수신되면 ) 따라서 수신 측은 전송된 패킷이 새로운 데이터의 패킷인지 재전송 패킷인지 식별할 수 없다 .

중복 전송의 해결책 : 송신자는 순서번호필드를 패킷에

추가 . 만약 ACK/NAK 에 오류가 검출 되면

송신자는 현재 패킷을 재전송한다 . 수신자는 순서번호필드를 확인하여

최근에 수신한 패킷의 순서번호와 동일하면 재전송 , 그렇지 않으면 새로운 패킷으로 간주하여 중복패킷을 상위 계층으로 전달하지 않는다 .

송신자는 패킷을 보내고 나서수신자의 응답을 기다린다 .

stop and wait

Page 27: Chapter 3: Transport Layer

Transport Layer 3-27

Rdt 2.1 : 송신자

Wait for call 0 from

above

sndpkt = make_pkt(0, data, checksum)udt_send(sndpkt)

rdt_send(data)

Wait for ACK or NAK

0udt_send(sndpkt)

rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || isNAK(rcvpkt) )

sndpkt = make_pkt(1, data, checksum)udt_send(sndpkt)

rdt_send(data)

rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && isACK(rcvpkt)

udt_send(sndpkt)

rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) ||isNAK(rcvpkt) )

rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && isACK(rcvpkt)

Wait for call 1 from

above

Wait for ACK or NAK 1

1

1-1

2

34

2-1

2-2

3-14-1

4-2

Page 28: Chapter 3: Transport Layer

Transport Layer 3-28

Rdt 2.1: 수신자

Wait for 0 from below

sndpkt = make_pkt(NAK, chksum)udt_send(sndpkt)rdt_rcv(rcvpkt) && not corrupt(rcvpkt) && has_seq0(rcvpkt)

rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq1(rcvpkt) extract(rcvpkt,data)deliver_data(data)sndpkt = make_pkt(ACK, chksum)udt_send(sndpkt)

Wait for 1 from below

rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq0(rcvpkt) extract(rcvpkt,data)deliver_data(data)sndpkt = make_pkt(ACK, chksum)udt_send(sndpkt) rdt_rcv(rcvpkt) &&

(corrupt(rcvpkt)

sndpkt = make_pkt(ACK, chksum)udt_send(sndpkt)

rdt_rcv(rcvpkt) && not corrupt(rcvpkt) && has_seq1(rcvpkt)

rdt_rcv(rcvpkt) && (corrupt(rcvpkt)

sndpkt = make_pkt(ACK, chksum)udt_send(sndpkt)

sndpkt = make_pkt(NAK, chksum)udt_send(sndpkt)

1

1-1

1-1

1-2

2

2-1

2-1

2-2

Page 29: Chapter 3: Transport Layer

Transport Layer 3-29

Rdt2.1: 검토송신자 : 순서번호를 패킷에 추가 0,1 두 개의 순서번호로

문제 해결이 가능하다 . ACK/NAK 응답이

비트오류가 있는지를 확인

Rdt 2.0 보다 두 배 많은 상태를 갖는다 .

수신자 : 수신된 패킷이

중복패킷인지 확인 최근에 수신한 패킷의

순서번호와 동일하면 재전송 , 그렇지 않으면 새로운 패킷으로 간주

Page 30: Chapter 3: Transport Layer

Transport Layer 3-30

Rdt2.2: a NAK-free protocol

NAK 를 사용하지 않고 ACK 만 사용 , 그 외는 Rdt2.1 과 같은 기능

NAK 대신에 , 수신자는 최근에 정확하게 수신된 패킷의 ACK 를 송신 . 수신자는 이전에 정확하게 수신된 패킷의 순서번호를 포함시켜 ACK 를

보내야 한다 .-> Rdt2.1 과 차이점

송신자는 두 번 ACK 되고 있는 패킷의 다음 패킷을 정확하게 수신하지 못했다는 것을 알고 재전송한다 .

Page 31: Chapter 3: Transport Layer

Transport Layer 3-31

Rdt2.2 : 송신자

Wait for call 0 from

above

sndpkt = make_pkt(0, data, checksum)udt_send(sndpkt)

rdt_send(data)

udt_send(sndpkt)

rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || isACK(rcvpkt,1) )

rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && isACK(rcvpkt,0)

Wait for ACK

0

Wait for ACK

1

Wait for call 1 from

above

udt_send(sndpkt)

rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) || isACK(rcvpkt,0) )

rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && isACK(rcvpkt,1)

sndpkt = make_pkt(1, data, checksum)udt_send(sndpkt)

rdt_send(data)

Page 32: Chapter 3: Transport Layer

Transport Layer 3-32

Rdt2.2 : 수신자

Wait for 0 from below

rdt_rcv(rcvpkt) && corrupt(rcvpkt) &&has_seq0(rcvpkt)

rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq1(rcvpkt) extract(rcvpkt,data)deliver_data(data)sndpkt = make_pkt(ACK, 1, chksum)udt_send(sndpkt)

Wait for 1 from below

rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && has_seq0(rcvpkt) extract(rcvpkt,data)deliver_data(data)sndpkt = make_pkt(ACK, 0, chksum)udt_send(sndpkt)oncethru=0

udt_send(sndpkt)

oncethru=1

rdt_rcv(rcvpkt) && corrupt(rcvpkt) && has_seq1(rcvpkt)if(oncethru==1)udt_send(sndpkt)

Page 33: Chapter 3: Transport Layer

Transport Layer 3-33

Rdt3.0: 비트오류가 있는 손실 채널에서의 데이터 전송

새로운 가정 : 하위 채널이 패킷 (data or ACKs) 을 손실하는 경우 검사합 , 순서번호 , ACK

패킷 , 재전송의 사용(Rdt2.2) 은 패킷 손실이 발생했을 때 대안은 되나 , 패킷 손실 검출이 불가능 하다 .

접근 방법 : 송신자는 ACK 응답을 받기 위한 충분한 시간을 기다린다 .

설정된 시간 안에 ACK 응답이 수신되지 않으면 패킷을 재전송 한다 .

만일 데이터나 ACK 패킷이 손실된 게 아닌 큰 지연이 발생한 것이라면 i: 중복 데이터 패킷이 재전송에

의해서 발생할 수 있으나 , 순서 번호로써 중복 패킷의 문제점을 해결할 수 있다 .

수신자는 Ack 패킷에 순서번호를 포함시켜 보낸다 .

주어진 시간 경과 후 기다리는 송신자를 인터럽트 할 수 있는 카운트다운 타이머가 필요하다 .

Page 34: Chapter 3: Transport Layer

Transport Layer 3-34

Rdt3.0 : 송신자

sndpkt = make_pkt(0, data, checksum)udt_send(sndpkt)start_timer

rdt_send(data)

Wait for

ACK0

rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) ||isACK(rcvpkt,1) )

Wait for call 1 from

above

sndpkt = make_pkt(1, data, checksum)udt_send(sndpkt)start_timer

rdt_send(data)

rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && isACK(rcvpkt,0)

rdt_rcv(rcvpkt) && ( corrupt(rcvpkt) ||isACK(rcvpkt,0) )

rdt_rcv(rcvpkt) && notcorrupt(rcvpkt) && isACK(rcvpkt,1)

stop_timerstop_timer

udt_send(sndpkt)start_timer

timeout

udt_send(sndpkt)start_timer

timeout

rdt_rcv(rcvpkt)Wait for

call 0from above

Wait for

ACK1 rdt_rcv(rcvpkt)

1

1-1

2

2-1

4

3-1

3

2-24-2

4-1

Page 35: Chapter 3: Transport Layer

Transport Layer 3-35

Rdt3.0 : 무손실 동작과 패킷 손실동작

Page 36: Chapter 3: Transport Layer

Transport Layer 3-36

Rdt3.0 : ACK 손실과 조급한 타임아웃

Page 37: Chapter 3: Transport Layer

Transport Layer 3-37

Rdt3.0 의 성능 rdt3.0 은 기능적으로는 우수하나 , 오늘날 고속네트워크환경에서는 적당하지 않다 . 1 Gbps 전송률 (R) 을 가진 채널 , 15 ms 의 종단간 전파지연 , 1KB 패킷을

전송한다면 :

Ttransmit

= 8kb/pkt109 b/sec = 8 us

U sender: 송신자 이용률 – 송신자는 전체 전송소요시간의 0.00027동안만 채널이용 .

대략 30 ms 마다 1KB 패킷이 전송 -> 1 Gbps link 에서 267kbps 유효 처리량을 갖는다 .

네트워크 프로토콜들이 하위 네트워크 하드웨어가 제공하는 용량을 제한하게 된다 .

U sender = .008

30.008 = 0.00027

microseconds

L / R RTT + L / R

=

L ( 패킷 크기 , bit)R ( 전송율 , bps) =

RTT(왕복전파지연 ) = 30ms

Page 38: Chapter 3: Transport Layer

Transport Layer 3-38

Rdt3.0: 전송 후 대기 프로토콜

송신되는 첫 번째 패킷의 첫 번째 비트 , t = 0

송신자 수신자

RTT

송신되는 첫 번째 패킷의 마지막 비트 , t = L / R

전송 지연 시간첫 번째 패킷의 첫 번째 비트 도착첫 번째 패킷의 마지막 비트 도착 , ACK 전송

ACK 도착 후에 다음 패킷 전송 ,

t = RTT + L / R

U sender = .008

30.008 = 0.00027

microseconds

L / R RTT + L / R

=

Page 39: Chapter 3: Transport Layer

Transport Layer 3-39

파이프라인된 전송 : 송신자 이용률의 증가

RTT

U sender = .024

30.008 = 0.0008

microseconds

3 * L / R RTT + L / R

=

확인응답을 기다리기 전에 송신자가 3개의 패킷을 전송하도록 허용한다면 :

송신되는 첫 번째 패킷의 첫 번째 비트 , t = 0송신되는 첫 번째 패킷의 마지막 비트 , t

= L / R전송 지연 시간

송신자 수신자

첫 번째 패킷의 첫 번째 비트 도착첫 번째 패킷의 마지막 비트 도착 , ACK 전송두 번째 패킷의 마지막 비트 도착 , ACK 전송세 번째 패킷의 마지막 비트 도착 , ACK 전송ACK 도착 후에 다음 패킷 전

송 , t = RTT + L / R

[ 송신자의 이용률이 3배 증가 ]

Page 40: Chapter 3: Transport Layer

Transport Layer 3-40

파이프라인된 프로토콜파이프라이닝 : 송신자는 확인 응답을 기다리지 않고 여러 패킷을

전송하도록 허용 순서번호의 범위가 증가되어야 한다 . 각각의 전송 중인 패킷은 유일한

순서번호를 갖는다 . 프로토콜의 송신 측과 수신 측은 한 패킷 이상을 버퍼링 해야 한다 . 송신자는

전송되었으나 확인응답 되지 않은 패킷을 , 수신자는 정확하게 수신 된 패킷들을 버퍼링해야 한다 .

파이프라인된 프로토콜의 두 가지 접근방법 : go-Back-N, selective repeat