λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
ComputerScience πŸ“š/μ»΄ν“¨ν„°λ„€νŠΈμ›Œν¬

[λ„€νŠΈμ›Œν¬] 트랜슀포트 계측(4) - RDT(신뒰적인 데이터 전달)

by dkswnkk 2022. 6. 30.

 

μ„œλ‘ 

 

[λ„€νŠΈμ›Œν¬] 트랜슀포트 계측(3) - UDP

μ„œλ‘  [λ„€νŠΈμ›Œν¬] 트랜슀포트 계측(2) - 닀쀑화와 역닀쀑화 μ„œλ‘  [λ„€νŠΈμ›Œν¬] 트랜슀포트 계측(1) - μ„œλΉ„μŠ€ 및 κ°œμš” μ„œλ‘  μ§€κΈˆκΉŒμ§€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 계측듀에 λŒ€ν•΄ λ‹€λ£¨μ—ˆμŠ΅λ‹ˆλ‹€. 이번 κ²Œμ‹œκΈ€λΆ€ν„°λŠ” 트

dkswnkk.tistory.com

이전 κ²Œμ‹œκΈ€μ—μ„œλŠ” UDP에 λŒ€ν•΄μ„œ 정리해 λ³΄μ•˜μŠ΅λ‹ˆλ‹€. UDPλŠ” λΉ„ μ—°κ²°ν˜•μœΌλ‘œ 신뒰성을 보μž₯ν•˜μ§€ μ•ŠλŠ” 반면 TCPλŠ” μ—°κ²° 지ν–₯ν˜•μœΌλ‘œ 신뒰성을 보μž₯ν•œλ‹€λŠ” νŠΉμ§•μ΄ μžˆμ—ˆμŠ΅λ‹ˆλ‹€. 

이번 κ²Œμ‹œκΈ€μ—μ„œλŠ” TCP에 λŒ€ν•΄ μ •λ¦¬ν•˜κΈ°μ— μ•žμ„œ μ–΄λ–»κ²Œ μ‹ λ’°μ„± μžˆλŠ” 데이터λ₯Ό 전솑할 수 μžˆμ„μ§€μ— λŒ€ν•΄μ„œ λ¨Όμ € μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

 

rdt1. 0 

rdt(reliable data transfer): 신뒰적인 데이터 전솑

rdt1.0은 μ™„λ²½ν•˜κ²Œ 신뒰적인 채널 μƒμ—μ„œμ˜ 신뒰적인 데이터 전솑을 ν‘œν˜„ν•©λ‹ˆλ‹€.

rdt 1.0 μ†‘μ‹ μžμ™€ μˆ˜μ‹ μžμ— λŒ€ν•œ μœ ν•œμƒνƒœ λ¨Έμ‹ (finite-state machine, FSM)의 μ΄λ―Έμ§€λŠ” μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

rdt1.0 - μ™„μ „ν•˜κ²Œ 신뒰적인 μ±„λ„μ—μ„œμ˜ ν”„λ‘œν† μ½œ

μœ„ μ΄λ―Έμ§€μ˜ (a)μ—μ„œ FSM은 μ†‘μ‹ μžμ˜ λ™μž‘μ„ μ •μ˜ν•˜κ³ , (b)의 FSM은 μˆ˜μ‹ μžμ˜ λ™μž‘μ„ μ •μ˜ν•©λ‹ˆλ‹€. 

rdt의 솑신 츑은 rdt_send(data) μ΄λ²€νŠΈμ— μ˜ν•΄ μƒμœ„ κ³„μΈ΅μœΌλ‘œλΆ€ν„° 데이터λ₯Ό 받아듀이고 데이터λ₯Ό ν¬ν•¨ν•œ νŒ¨ν‚·μ„ μƒμ„±ν•©λ‹ˆλ‹€(make_pkt(data)). 그리고 λ‚œ ν›„ νŒ¨ν‚·μ„ μ±„λ„λ‘œ μ†‘μ‹ ν•©λ‹ˆλ‹€. μ‹€μ œλ‘œ rdt_send(data) μ΄λ²€νŠΈλŠ” μƒμœ„ 계측 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ ν”„λ‘œμ‹œμ € 호좜(예:rdt_send(data))에 μ˜ν•΄μ„œ λ°œμƒν•©λ‹ˆλ‹€.

 μˆ˜μ‹  μΈ‘μ—μ„œ, rdtλŠ” rdt_rcv(packet) μ΄λ²€νŠΈμ— μ˜ν•΄ ν•˜μœ„μ˜ μ±„λ„λ‘œλΆ€ν„° νŒ¨ν‚·μ„ μˆ˜μ‹ ν•˜κ³ , νŒ¨ν‚·μœΌλ‘œλΆ€ν„°(extract(packet, data)에 μ˜ν•΄μ„œ) 데이터λ₯Ό μΆ”μΆœν•œ ν›„ 데이터λ₯Ό μƒμœ„ κ³„μΈ΅μœΌλ‘œ μ „λ‹¬ν•©λ‹ˆλ‹€(deliver_data(data)). rdt_rcv(packet) μ΄λ²€νŠΈλŠ” ν•˜μœ„ 계측 ν”„λ‘œν† μ½œλ‘œλΆ€ν„°μ˜ ν”„λ‘œμ‹œμ € 호좜(예: rdt_rcv())에 μ˜ν•΄μ„œ λ°œμƒν•©λ‹ˆλ‹€.

 μ΄λŸ¬ν•œ κ°„λ‹¨ν•œ ν”„λ‘œν† μ½œμ—μ„œλŠ” 데이터 λ‹¨μœ„μ™€ νŒ¨ν‚· λ‹¨μœ„μ˜ 차이점이 μ—†μœΌλ©°, λͺ¨λ“  νŒ¨ν‚· 흐름은 μ†‘μ‹ μžλ‘œλΆ€ν„° μˆ˜μ‹ μžκΉŒμ§€ μž…λ‹ˆλ‹€. 즉, μ™„μ „νžˆ 신뒰적인 μ±„λ„μ—μ„œλŠ” 였λ₯˜κ°€ 생길 수 μ—†μœΌλ―€λ‘œ μˆ˜μ‹  츑이 솑신 μΈ‘μ—κ²Œ μ–΄λ– ν•œ ν”Όλ“œλ°±(feedback)도 μ œκ³΅ν•  ν•„μš”κ°€ μ—†μŠ΅λ‹ˆλ‹€.

 

rdt2.0 

rdt(reliable data transfer): 신뒰적인 데이터 전솑

rdt2.0은 λΉ„νŠΈ 였λ₯˜κ°€ μžˆλŠ” 채널 μƒμ—μ„œμ˜ 신뒰적 데이터 전솑을 ν‘œν˜„ν•©λ‹ˆλ‹€.

ν•˜μœ„ μ±„λ„μ˜ 더 μ‹€μ§ˆ λͺ¨λΈμ€ νŒ¨ν‚· μ•ˆμ˜ λΉ„νŠΈλ“€μ΄ ν•˜μœ„ μ±„λ„μ—μ„œ μ†μƒλ˜λŠ” λͺ¨λΈμž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ μ±„λ„μ—μ„œ 신뒰적인 톡신을 μœ„ν•œ ν”„λ‘œν† μ½œμ€ 긍정 확인 응닡(positive acknowledgment)와 λΆ€μ • 확인 응닡(negative acknowledgment)을 μ‚¬μš©ν•©λ‹ˆλ‹€.

μ΄λŸ¬ν•œ 두 응닡은 데이터가 μ •ν™•ν•˜κ²Œ μˆ˜μ‹ λ˜μ—ˆλŠ”μ§€ λ˜λŠ” 잘λͺ» μˆ˜μ‹ λ˜μ–΄ 반볡이 ν•„μš”ν•œμ§€λ₯Ό μˆ˜μ‹ μžκ°€ μ†‘μ‹ μžμ—κ²Œ μ•Œλ € 쀄 수 있게 ν•©λ‹ˆλ‹€.

rdt2.0 - λΉ„νŠΈ 였λ₯˜κ°€ μžˆλŠ” μ±„λ„μ—μ„œμ˜ ν”„λ‘œν† μ½œ

μœ„ μ΄λ―Έμ§€λŠ” 였λ₯˜ κ²€μΆœ, 긍정 확인 응닡 그리고 λΆ€μ • 확인 응닡듀을 κ³ λ €ν•œ rdt2.0의 FSM을 보이고 μžˆμŠ΅λ‹ˆλ‹€.

rdt2.0의 솑신 츑은 2개의 μƒνƒœλ₯Ό κ°€μ§‘λ‹ˆλ‹€. (a)의 μ™Όμͺ½μ˜ μƒνƒœμ—μ„œ, 솑신 μΈ‘ ν”„λ‘œν† μ½œμ€ μƒμœ„ κ³„μΈ΅μœΌλ‘œλΆ€ν„° 데이터가 μ „λ‹¬λ˜κΈ°λ₯Ό κΈ°λ‹€λ¦½λ‹ˆλ‹€. rdt_send(data) μ΄λ²€νŠΈκ°€ λ°œμƒν•˜λ©΄, μ†‘μ‹ μžλŠ” νŒ¨ν‚· 체크섬과 ν•¨κ»˜ 전솑될 데이터λ₯Ό ν¬ν•¨ν•˜λŠ” νŒ¨ν‚·(sndpkt)을 μƒμ„±ν•˜κ³ , κ·Έ νŒ¨ν‚·μ„ udt_send(sndpkt) λ™μž‘μ„ 톡해 μ „μ†‘ν•©λ‹ˆλ‹€.

체크섬에 λŒ€ν•œ λ‚΄μš©: https://dkswnkk.tistory.com/570

(a)의 였λ₯Έμͺ½μ˜ μƒνƒœμ—μ„œλŠ” μ†‘μ‹ μž ν”„λ‘œν† μ½œμ€ μˆ˜μ‹ μžλ‘œλΆ€ν„° ACK λ˜λŠ” NAK νŒ¨ν‚·μ„ κΈ°λ‹€λ¦½λ‹ˆλ‹€. λ§Œμ•½ ACK νŒ¨ν‚·μ΄ μˆ˜μ‹ λœλ‹€λ©΄(rdt_rcv(rcvpkt) && isACK(rcvpkt)) μ†‘μ‹ μžλŠ” κ°€μž₯ μ΅œκ·Όμ— μ „μ†‘λœ νŒ¨ν‚·μ΄ μ •ν™•ν•˜κ²Œ μˆ˜μ‹ λ˜μ—ˆλ‹€λŠ” 것을 μ•Œκ²Œ λ©λ‹ˆλ‹€. κ·Έλž˜μ„œ ν”„λ‘œν† μ½œμ€ μƒμœ„ κ³„μΈ΅μœΌλ‘œλΆ€ν„° 데이터λ₯Ό κΈ°λ‹€λ¦¬λŠ” μƒνƒœλ‘œ λŒμ•„κ°‘λ‹ˆλ‹€. λ§Œμ•½ NAKκ°€ μˆ˜μ‹ λ˜λ©΄ ν”„λ‘œν† μ½œμ€ λ§ˆμ§€λ§‰ νŒ¨ν‚·μ„ μž¬μ „μ†‘ν•˜κ³  μž¬μ „μ†‘λœ 데이터 νŒ¨ν‚·μ— λŒ€ν•œ μ‘λ‹΅μœΌλ‘œ μˆ˜μ‹ μžμ— μ˜ν•΄ μ‘λ‹΅λ˜λŠ” ACK λ˜λŠ” NAKλ₯Ό κΈ°λ‹€λ¦½λ‹ˆλ‹€. 

μ†‘μ‹ μžκ°€ ACK λ˜λŠ” NAKλ₯Ό κΈ°λ‹€λ¦¬λŠ” μƒνƒœμ— μžˆμ„ λ•ŒλŠ” μƒμœ„ κ³„μΈ΅μœΌλ‘œλΆ€ν„° 더 μ΄μƒμ˜ 데이터λ₯Ό 전달 받을 수 μ—†μŠ΅λ‹ˆλ‹€. 즉, rdt_send() μ΄λ²€νŠΈκ°€ λ°œμƒν•  수 μ—†μœΌλ©° κ·ΈλŸ¬λ―€λ‘œ μ†‘μ‹ μžλŠ” μˆ˜μ‹ μžκ°€ ν˜„μž¬μ˜ νŒ¨ν‚·μ„ μ •ν™•ν•˜κ²Œ μˆ˜μ‹ ν–ˆλ‹€λŠ” 것을 ν™•μ‹ ν•˜κΈ° μ „κΉŒμ§€ μƒˆλ‘œμš΄ 데이터λ₯Ό μ „λ‹¬ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ νŠΉμ§• λ•Œλ¬Έμ— rdt2.0κ³Ό 같은 ν”„λ‘œν† μ½œμ€ 전솑 - ν›„ - λŒ€κΈ°(stop-and-wait) ν”„λ‘œν† μ½œμ΄λΌκ³ λ„ λΆ€λ¦…λ‹ˆλ‹€.

사싀 rdt2.0 ν”„λ‘œν† μ½œμ€ 잘 λ™μž‘ν•˜λŠ” 것 κ°™μ§€λ§Œ ACK λ˜λŠ” NAK νŒ¨ν‚·μ΄ 손상될 수 μžˆλ‹€λŠ” κ°€λŠ₯성을 κ³ λ €ν•˜μ§€ μ•Šμ•˜λ‹€λŠ” 치λͺ…적인 결함이 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ κ°„λ‹¨ν•œ ν•΄κ²°μ±…μœΌλ‘œ 데이터 νŒ¨ν‚·μ— μƒˆλ‘œμš΄ ν•„λ“œλ₯Ό μΆ”κ°€ν•˜κ³  이 ν•„λ“œ μ•ˆμ— μˆœμ„œ 번호(sequence number)λ₯Ό μ‚½μž…ν•˜λŠ” λ°©μ‹μœΌλ‘œ 데이터 νŒ¨ν‚·μ— μ†‘μ‹ μžκ°€ 번호λ₯Ό λΆ™μ΄λŠ” 방법이 μžˆμŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œ TCPμ—μ„œλ„ μ΄λŸ¬ν•œ 방식을 μ‚¬μš©ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.

μˆ˜μ‹ μžλŠ” μˆ˜μ‹ λœ νŒ¨ν‚·μ΄ μž¬μ „μ†‘ 인지λ₯Ό κ²°μ •ν•  λ•ŒλŠ” 이 μˆœμ„œλ²ˆν˜Έλ§Œ ν™•μΈν•˜λ©΄ λ©λ‹ˆλ‹€. μ΄λŸ¬ν•œ κ°„λ‹¨ν•œ stop-and-wait ν”„λ‘œν† μ½œμ˜ 경우, ν•œ λΉ„νŠΈ μˆœμ„œ 번호면 μ†‘μ‹ μžκ°€ 이전에 μ „μ†‘λœ νŒ¨ν‚·μ„ λ‹€μ‹œ 전솑할 것인지, μ•„λ‹ˆλ©΄ μƒˆλ‘œμš΄ νŒ¨ν‚·μ„ 전솑할 것인지λ₯Ό μΆ©λΆ„νžˆ μ•Œ 수 μžˆμŠ΅λ‹ˆλ‹€. 

일반적으둜 rdt2.0의 채널은 λΉ„νŠΈ 였λ₯˜λ§Œ μžˆλŠ” 채널이고, νŒ¨ν‚·μ„ μ†μ‹€ν•˜μ§€ μ•ŠλŠ” 채널이라고 κ°€μ •ν•˜κ³  μžˆμœΌλ―€λ‘œ, ACK와 NAK νŒ¨ν‚·λ“€μ€ 이듀 νŒ¨ν‚· μ•ˆμ— 확인응닡을 ν•˜λŠ” νŒ¨ν‚·μ˜ μˆœμ„œ 번호λ₯Ό ν‘œμ‹œν•  ν•„μš”λŠ” μ—†μŠ΅λ‹ˆλ‹€.

rdt2.1 μ†‘μ‹ μž
rdt2.1 μˆ˜μ‹ μž

μœ„ 그림듀은 rdt2.0의 μˆ˜μ • 버전인 rdt2.1에 λŒ€ν•œ FSM을 λ‚˜νƒ€λ‚΄κ³  μžˆμŠ΅λ‹ˆλ‹€. rdt2.1 μ†‘μ‹ μžμ™€ μˆ˜μ‹ μž FSM 각각은 이전보닀 두 λ°° λ§Žμ€ μƒνƒœλ₯Ό 가지고 μžˆλŠ”λ°, μ΄λŠ” ν”„λ‘œν† μ½œ μƒνƒœκ°€ ν˜„μž¬(μ†‘μ‹ μžμ— μ˜ν•΄μ„œ) μ „μ†‘λ˜κ³  μžˆκ±°λ‚˜, μ•„λ‹ˆλ©΄(μˆ˜μ‹ μžκ°€) 기닀리고 μžˆλŠ” νŒ¨ν‚·μ΄ μˆœμ„œ 번호 0 λ˜λŠ” 1을 κ°€μ Έμ•Ό ν•˜λŠ”μ§€λ₯Ό λ°˜μ˜ν•΄μ•Ό ν•˜κΈ° λ•Œλ¬Έμž…λ‹ˆλ‹€.  

ν”„λ‘œν† μ½œ rdt2.1은 μˆ˜μ‹ μžλ‘œλΆ€ν„° μ†‘μ‹ μžκΉŒμ§€μ˜ 긍정 확인응닡과 λΆ€μ • 확인응닡을 λͺ¨λ‘ ν¬ν•¨ν•©λ‹ˆλ‹€. μˆœμ„œκ°€ 바뀐 νŒ¨ν‚·μ΄ μˆ˜μ‹ λ˜λ©΄, μˆ˜μ‹ μžλŠ” 이미 전에 μˆ˜μ‹ ν•œ νŒ¨ν‚·μ— λŒ€ν•œ 긍정 확인 응닡을 μ „μ†‘ν•©λ‹ˆλ‹€. μ†μƒλœ νŒ¨ν‚·μ΄ μˆ˜μ‹ λ˜λ©΄, μˆ˜μ‹ μžλŠ” λΆ€μ • 확인 응닡을 μ „μ†‘ν•©λ‹ˆλ‹€. 

 

rdt3.0 

rdt(reliable data transfer): 신뒰적인 데이터 전솑

rdt3.0은 λΉ„νŠΈ 였λ₯˜μ™€ 손싀 μžˆλŠ” 채널 μƒμ—μ„œμ˜ 신뒰적 데이터 전솑을 ν‘œν˜„ν•©λ‹ˆλ‹€.

λΉ„νŠΈκ°€ μ†μƒλ˜λŠ” 것 외에도 인터넷을 ν¬ν•¨ν•˜λŠ” μ˜€λŠ˜λ‚  컴퓨터 ν™˜κ²½μ²˜λŸΌ ν•˜μœ„ 채널이 νŒ¨ν‚·μ„ μ†μ‹€ν•˜λŠ” κ²½μš°κ°€ λ°œμƒ ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 이럴 λ•ŒλŠ” μ–΄λ– ν•œ λ°©μ‹μœΌλ‘œ ν•΄κ²°ν•  수 μžˆμ„κΉŒμš”? 

rdt3.0 μ†‘μ‹ μž

μœ„ μ΄λ―Έμ§€λŠ” νŒ¨ν‚·μ΄ μ†μƒλ˜κ±°λ‚˜ 손싀될 수 μžˆλŠ” μ±„λ„μ—μ„œ 데이터λ₯Ό μ‹ λ’°μ μœΌλ‘œ μ „μ†‘ν•˜λŠ” ν”„λ‘œν† μ½œμΈ rdt3.0에 λŒ€ν•œ μ†‘μ‹ μž FSM을 λ³΄μ—¬μ€λ‹ˆλ‹€.

무손싀 λ™μž‘

μœ„ μ΄λ―Έμ§€λŠ” ν”„λ‘œν† μ½œμ΄ νŒ¨ν‚· 손싀 λ˜λŠ” 지연 없이 μ–΄λ–»κ²Œ λ™μž‘ν•˜λŠ”μ§€μ™€ μ†μ‹€λœ 데이터 νŒ¨ν‚·μ„ μ–΄λ–»κ²Œ μ²˜λ¦¬ν•˜λŠ”μ§€λ₯Ό λ³΄μ—¬μ€λ‹ˆλ‹€.

λŒ“κΈ€