delta = measuredRTT - srtt
srtt β srtt + g Γ delta
rttvar β rttvar + h (|delta| - rttvar)
RTO = srtt + 4 Γ rttvar
delta β ΡΡΠΎ ΡΠ°Π·Π½ΠΎΡΡΡ ΠΌΠ΅ΠΆΠ΄Ρ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½Π½ΡΠΌ RTT ΠΈ ΡΠ΅ΠΊΡΡΠΈΠΌ ΡΠ³Π»Π°ΠΆΠ΅Π½Π½ΡΠΌ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»Π΅ΠΌ RTT (srtt). g β ΡΡΠΎ ΠΏΡΠΈΡΠ°ΡΠ΅Π½ΠΈΠ΅, ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΠ΅ ΠΊ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»Ρ RTT, ΡΠ°Π²Π½ΠΎΠ΅ 1/8. h β ΡΡΠΎ ΠΏΡΠΈΡΠ°ΡΠ΅Π½ΠΈΠ΅, ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΠΎΠ΅ ΠΊ ΡΠ³Π»Π°ΠΆΠ΅Π½Π½ΠΎΠΌΡ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»Ρ ΡΡΠ΅Π΄Π½Π΅Π³ΠΎ ΠΎΡΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΡ, ΡΠ°Π²Π½ΠΎΠ΅ ΒΌ.
ΠΠ ΠΠΠΠ§ΠΠΠΠΠΠ²Π° ΠΏΡΠΈΡΠ°ΡΠ΅Π½ΠΈΡ ΠΈ ΠΌΠ½ΠΎΠΆΠΈΡΠ΅Π»Ρ 4 Π² Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΈ RTO ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΠΎ Π²ΡΡΠ°ΠΆΠ΅Π½Ρ ΡΡΠ΅ΠΏΠ΅Π½ΡΠΌΠΈ ΡΠΈΡΠ»Π° 2 ΠΈ ΠΌΠΎΠ³ΡΡ Π±ΡΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½Ρ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΉ ΡΠ΄Π²ΠΈΠ³Π° Π²ΠΌΠ΅ΡΡΠΎ Π΄Π΅Π»Π΅Π½ΠΈΡ ΠΈ ΡΠΌΠ½ΠΎΠΆΠ΅Π½ΠΈΡ. ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ TCP Π² ΡΠ΄ΡΠ΅ (ΡΠΌ. ΡΠ°Π·Π΄Π΅Π» 25.7 [128]) Π΄Π»Ρ ΡΡΠΊΠΎΡΠ΅Π½ΠΈΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠΉ ΠΎΠ±ΡΡΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅Ρ Π°ΡΠΈΡΠΌΠ΅ΡΠΈΠΊΡ Ρ ΡΠΈΠΊΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠΉ ΡΠΎΡΠΊΠΎΠΉ, Π½ΠΎ ΠΌΡ Π΄Π»Ρ ΠΏΡΠΎΡΡΠΎΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌ Π² Π½Π°ΡΠ΅ΠΌ ΠΊΠΎΠ΄Π΅ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΡ Ρ ΠΏΠ»Π°Π²Π°ΡΡΠ΅ΠΉ ΡΠΎΡΠΊΠΎΠΉ.
ΠΡΡΠ³ΠΎΠΉ Π²Π°ΠΆΠ½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ, ΠΎΡΠΌΠ΅ΡΠ΅Π½Π½ΡΠΉ Π² [52], Π·Π°ΠΊΠ»ΡΡΠ°Π΅ΡΡΡ Π² ΡΠΎΠΌ, ΡΡΠΎ ΠΏΠΎ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠΌΠ΅ΡΠ° ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π΄Π»Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ RTO Π΄ΠΎΠ»ΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠΊΡΠΏΠΎΠ½Π΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΠ΅ ΡΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ (exponential backoff). ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π΅ΡΠ»ΠΈ Π½Π°ΡΠ΅ ΠΏΠ΅ΡΠ²ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ RTO ΡΠ°Π²Π½ΠΎ 2 Ρ ΠΈ Π·Π° ΡΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΎΡΠ²Π΅ΡΠ° Π½Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ, ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ RTO Π±ΡΠ΄Π΅Ρ ΡΠ°Π²Π½ΠΎ 4 Ρ. ΠΡΠ»ΠΈ ΠΎΡΠ²Π΅Ρ Π²ΡΠ΅ Π΅ΡΠ΅ Π½Π΅ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Π», ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ RTO Π±ΡΠ΄Π΅Ρ 8 Ρ, Π·Π°ΡΠ΅ΠΌ 16 ΠΈ Ρ.Π΄.
ΠΠ»Π³ΠΎΡΠΈΡΠΌΡ ΠΠΆΠ΅ΠΊΠΎΠ±ΡΠΎΠ½Π° (Jacobson) ΡΠ΅Π°Π»ΠΈΠ·ΡΡΡ Π²ΡΡΠΈΡΠ»Π΅Π½ΠΈΠ΅ RTO ΠΏΡΠΈ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΈΠΈ RTT ΠΈ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ RTO ΠΏΡΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ΅. ΠΠ΄Π½Π°ΠΊΠΎ, ΠΊΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΡΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡ ΠΈ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΎΡΠ²Π΅Ρ, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΡΡΠΈ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ (retransmission ambiguity problem). ΠΠ° ΡΠΈΡ. 22.2 ΠΏΠΎΠΊΠ°Π·Π°Π½Ρ ΡΡΠΈ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΡ ΡΡΠ΅Π½Π°ΡΠΈΡ, ΠΏΡΠΈ ΠΊΠΎΡΠΎΡΡΡ ΠΈΡΡΠ΅ΠΊΠ°Π΅Ρ Π²ΡΠ΅ΠΌΡ ΠΎΠΆΠΈΠ΄Π°Π½ΠΈΡ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ:
β Π·Π°ΠΏΡΠΎΡ ΠΏΠΎΡΠ΅ΡΡΠ½;
β ΠΎΡΠ²Π΅Ρ ΠΏΠΎΡΠ΅ΡΡΠ½;
β Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ RTO ΡΠ»ΠΈΡΠΊΠΎΠΌ ΠΌΠ°Π»ΠΎ.
Π ΠΈΡ. 22.2. Π’ΡΠΈ ΡΡΠ΅Π½Π°ΡΠΈΡ, Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΏΡΠΈ ΠΈΡΡΠ΅ΡΠ΅Π½ΠΈΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΡΠ°ΠΉΠΌΠ΅ΡΠ° ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ
ΠΠΎΠ³Π΄Π° ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ ΠΎΡΠ²Π΅Ρ Π½Π° Π·Π°ΠΏΡΠΎΡ, ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΠΉ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ, ΠΎΠ½ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ ΡΠΊΠ°Π·Π°ΡΡ, ΠΊΠ°ΠΊΠΎΠΌΡ ΠΈΠ· Π·Π°ΠΏΡΠΎΡΠΎΠ² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΠΎΡΠ²Π΅Ρ. ΠΠ° ΡΠΈΡΡΠ½ΠΊΠ΅, ΠΈΠ·ΠΎΠ±ΡΠ°ΠΆΠ΅Π½Π½ΠΎΠΌ ΡΠΏΡΠ°Π²Π°, ΠΎΡΠ²Π΅Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ Π½Π°ΡΠ°Π»ΡΠ½ΠΎΠΌΡ Π·Π°ΠΏΡΠΎΡΡ, Π² ΡΠΎ Π²ΡΠ΅ΠΌΡ ΠΊΠ°ΠΊ Π½Π° Π΄Π²ΡΡ Π΄ΡΡΠ³ΠΈΡ ΡΠΈΡΡΠ½ΠΊΠ°Ρ ΠΎΡΠ²Π΅Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡ Π²ΡΠΎΡΠΎΠΌΡ Π·Π°ΠΏΡΠΎΡΡ.
ΠΠ»Π³ΠΎΡΠΈΡΠΌ ΠΠ°ΡΠ½Π° (Karn) [58] ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΡΡΠΎΡ ΡΡΠ΅Π½Π°ΡΠΈΠΉ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ ΡΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°ΠΌΠΈ, ΠΏΡΠΈΠΌΠ΅Π½ΡΠ΅ΠΌΡΠΌΠΈ Π² Π»ΡΠ±ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅, ΠΊΠΎΠ³Π΄Π° ΠΎΡΠ²Π΅Ρ ΠΏΠΎΠ»ΡΡΠ΅Π½ Π½Π° Π·Π°ΠΏΡΠΎΡ, ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΠΉ Π±ΠΎΠ»Π΅Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΡΠ°Π·Π°:
β ΠΡΠ»ΠΈ Π΄Π»Ρ Π·Π°ΠΏΡΠΎΡΠ° ΠΈ ΠΎΡΠ²Π΅ΡΠ° Π±ΡΠ»ΠΎ ΠΈΠ·ΠΌΠ΅ΡΠ΅Π½ΠΎ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ RTT, Π½Π΅ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ Π΄Π»Ρ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΡ ΠΎΡΠ΅Π½ΠΎΡΠ½ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠΉ, ΡΠ°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ Π½Π΅ Π·Π½Π°Π΅ΠΌ, ΠΊΠ°ΠΊΠΎΠΌΡ Π·Π°ΠΏΡΠΎΡΡ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΠ΅Ρ ΠΎΡΠ²Π΅Ρ.
β ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΎΡΠ²Π΅Ρ ΠΏΡΠΈΡΠ΅Π» Π΄ΠΎ ΡΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΠΈΡΡΠ΅ΠΊΠ»ΠΎ Π²ΡΠ΅ΠΌΡ Π½Π°ΡΠ΅Π³ΠΎ ΡΠ°ΠΉΠΌΠ΅ΡΠ° ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ Π΄Π»Ρ ΡΠ»Π΅Π΄ΡΡΡΠ΅Π³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ° ΡΠ΅ΠΊΡΡΠ΅Π΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ RTO. Π’ΠΎΠ»ΡΠΊΠΎ ΠΊΠΎΠ³Π΄Π° ΠΌΡ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΠΎΡΠ²Π΅Ρ Π½Π° Π·Π°ΠΏΡΠΎΡ, ΠΊΠΎΡΠΎΡΡΠΉ Π½Π΅ Π±ΡΠ» ΠΏΠ΅ΡΠ΅Π΄Π°Π½ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ, ΠΌΡ ΠΈΠ·ΠΌΠ΅Π½ΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ RTT ΠΈ ΡΠ½ΠΎΠ²Π° Π²ΡΡΠΈΡΠ»ΡΠ΅ΠΌ RTO.
ΠΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ Π½Π°ΡΠΈΡ ΡΡΠ½ΠΊΡΠΈΠΉ RTT ΠΏΡΠΈΠΌΠ΅Π½ΠΈΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΠ°ΡΠ½Π° Π½Π΅ΡΠ»ΠΎΠΆΠ½ΠΎ, Π½ΠΎ ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ, ΡΡΠΎ ΡΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΈ Π±ΠΎΠ»Π΅Π΅ ΠΈΠ·ΡΡΠ½ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅. ΠΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ Π² ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΡΡ TCP Π΄Π»Ρ ΡΠ΅ΡΠ΅ΠΉ Ρ Π²ΡΡΠΎΠΊΠΎΠΉ ΠΏΡΠΎΠΏΡΡΠΊΠ½ΠΎΠΉ ΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡΡΡ, ΡΠΎ Π΅ΡΡΡ ΡΠ΅ΡΠ΅ΠΉ, ΠΎΠ±Π»Π°Π΄Π°ΡΡΠΈΡ Π»ΠΈΠ±ΠΎ ΡΠΈΡΠΎΠΊΠΎΠΉ ΠΏΠΎΠ»ΠΎΡΠΎΠΉ ΠΏΡΠΎΠΏΡΡΠΊΠ°Π½ΠΈΡ, Π»ΠΈΠ±ΠΎ Π±ΠΎΠ»ΡΡΠΈΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΠΌ RTT, Π»ΠΈΠ±ΠΎ ΠΎΠ±ΠΎΠΈΠΌΠΈ ΡΡΠΈΠΌΠΈ ΡΠ²ΠΎΠΉΡΡΠ²Π°ΠΌΠΈ (RFC 1323 [53]). ΠΡΠΎΠΌΠ΅ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΡ ΠΏΠΎΡΡΠ΄ΠΊΠΎΠ²ΠΎΠ³ΠΎ Π½ΠΎΠΌΠ΅ΡΠ° ΠΊ Π½Π°ΡΠ°Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ Π·Π°ΠΏΡΠΎΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅ΡΠ²Π΅Ρ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΡΠ°Π·ΠΈΡΡ, ΠΌΡ Π΄ΠΎΠ±Π°Π²Π»ΡΠ΅ΠΌ ΠΎΡΠΌΠ΅ΡΠΊΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΠΊΠΎΡΠΎΡΡΡ ΡΠ΅ΡΠ²Π΅Ρ ΡΠ°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΎΡΡΠ°Π·ΠΈΡΡ. ΠΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π·, ΠΎΡΠΏΡΠ°Π²Π»ΡΡ Π·Π°ΠΏΡΠΎΡ, ΠΌΡ ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ Π² ΡΡΠΎΠΉ ΠΎΡΠΌΠ΅ΡΠΊΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΠ΅ΠΊΡΡΠ΅Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ. ΠΠΎΠ³Π΄Π° ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡ ΠΎΡΠ²Π΅Ρ, ΠΌΡ Π²ΡΡΠΈΡΠ»ΡΠ΅ΠΌ Π²Π΅Π»ΠΈΡΠΈΠ½Ρ RTT Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ ΠΏΠ°ΠΊΠ΅ΡΠ° ΠΊΠ°ΠΊ ΡΠ΅ΠΊΡΡΠ΅Π΅ Π²ΡΠ΅ΠΌΡ ΠΌΠΈΠ½ΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΎΡΠΌΠ΅ΡΠΊΠΈ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΠΎΡΡΠ°ΠΆΠ΅Π½Π½ΠΎΠΉ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ Π² ΡΠ²ΠΎΠ΅ΠΌ ΠΎΡΠ²Π΅ΡΠ΅. ΠΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠ°ΠΆΠ΄ΡΠΉ Π·Π°ΠΏΡΠΎΡ Π½Π΅ΡΠ΅Ρ ΠΎΡΠΌΠ΅ΡΠΊΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, ΠΎΡΡΠ°ΠΆΠ°Π΅ΠΌΡΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ, ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ Π²ΡΡΠΈΡΠ»ΠΈΡΡ RTT Π΄Π»Ρ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΡΠ²Π΅ΡΠ°, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ. Π’Π΅ΠΏΠ΅ΡΡ Π½Π΅Ρ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Π½Π΅ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎΡΡΠΈ. ΠΠΎΠ»Π΅Π΅ ΡΠΎΠ³ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΠ΅ΡΠ²Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΎΡΡΠ°ΠΆΠ°Π΅Ρ ΠΎΡΠΌΠ΅ΡΠΊΡ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°, ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΌΠΎΠΆΠ΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΄Π»Ρ ΠΎΡΠΌΠ΅ΡΠΎΠΊ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ Π»ΡΠ±ΡΠ΅ ΡΠ΄ΠΎΠ±Π½ΡΠ΅ Π΅Π΄ΠΈΠ½ΠΈΡΡ, ΠΈ ΠΏΡΠΈ ΡΡΠΎΠΌ Π½Π΅ ΡΡΠ΅Π±ΡΠ΅ΡΡΡ, ΡΡΠΎΠ±Ρ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΈ ΡΠ΅ΡΠ²Π΅Ρ ΡΠΈΠ½Ρ ΡΠΎΠ½ΠΈΠ·ΠΈΡΠΎΠ²Π°Π»ΠΈ ΡΠ°ΡΡ.
ΠΡΠΈΠΌΠ΅Ρ
Π‘Π²ΡΠΆΠ΅ΠΌ ΡΠ΅ΠΏΠ΅ΡΡ Π²ΡΡ ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π²ΠΎΠ΅Π΄ΠΈΠ½ΠΎ Π² ΠΏΡΠΈΠΌΠ΅ΡΠ΅. ΠΡ Π½Π°ΡΠ½Π΅ΠΌ Ρ ΡΡΠ½ΠΊΡΠΈΠΈ main Π½Π°ΡΠ΅Π³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° UDP, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»Π΅Π½Π½ΠΎΠ³ΠΎ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 8.3, ΠΈ ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ Π² Π½Π΅ΠΉ ΡΠΎΠ»ΡΠΊΠΎ Π½ΠΎΠΌΠ΅Ρ ΠΏΠΎΡΡΠ° Ρ SERV_PORT Π½Π° 7 (ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΡΡ ΠΎ-ΡΠ΅ΡΠ²Π΅Ρ, ΡΠΌ. ΡΠ°Π±Π». 2.1).
Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 22.4 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΡΡΠ½ΠΊΡΠΈΡ dg_cli. ΠΠ΄ΠΈΠ½ΡΡΠ²Π΅Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΡΡΠ°Π²Π½Π΅Π½ΠΈΡ Ρ Π»ΠΈΡΡΠΈΠ½Π³ΠΎΠΌ 8.4 ΡΠΎΡΡΠΎΠΈΡ Π² Π·Π°ΠΌΠ΅Π½Π΅ Π²ΡΠ·ΠΎΠ²ΠΎΠ² ΡΡΠ½ΠΊΡΠΈΠΉ sendto ΠΈ recvfrom Π²ΡΠ·ΠΎΠ²ΠΎΠΌ Π½Π°ΡΠ΅ΠΉ Π½ΠΎΠ²ΠΎΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ dg_send_recv.
ΠΠ΅ΡΠ΅Π΄ ΡΠ΅ΠΌ ΠΊΠ°ΠΊ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΡ ΡΡΠ½ΠΊΡΠΈΡ dg_send_recv ΠΈ Π½Π°ΡΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ RTT, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΎΠ½Π° Π²ΡΠ·ΡΠ²Π°Π΅Ρ, ΠΌΡ ΠΏΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌ Π² Π»ΠΈΡΡΠΈΠ½Π³Π΅ 22.5 Π½Π°ΡΡ ΡΡ Π΅ΠΌΡ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΡΡΠ½ΠΊΡΠΈΠΎΠ½Π°Π»ΡΠ½ΡΡ ΡΠ²ΠΎΠΉΡΡΠ², ΠΏΠΎΠ²ΡΡΠ°ΡΡΠΈΡ Π½Π°Π΄Π΅ΠΆΠ½ΠΎΡΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° UDP. ΠΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΈΠΌΠ΅Π½Π° ΠΊΠΎΡΠΎΡΡΡ Π½Π°ΡΠΈΠ½Π°ΡΡΡΡ Ρ rtt_, ΠΎΠΏΠΈΡΠ°Π½Ρ Π΄Π°Π»Π΅Π΅.
ΠΠΈΡΡΠΈΠ½Π³ 22.4. Π€ΡΠ½ΠΊΡΠΈΡ dg_cli, Π²ΡΠ·ΡΠ²Π°ΡΡΠ°Ρ Π½Π°ΡΡ ΡΡΠ½ΠΊΡΠΈΡ dg_send_recv
//rtt/dg_cli.c
1 #include "unp.h"
2 ssize_t Dg_send_recv(int, const void*, size_t, void*, size_t,
3 const SA*, socklen_t);
4 void
5 dg_cli(FILE *fp, int sockfd, const SA *pservaddr, socklen_t servlen)
6 {
7 ssize_t n;
8 char sendline[MAXLINE], recvline[MAXLINE + 1];
9 while (Fgets(sendline, MAXLINE, fp) != NULL) {
10 n = Dg_send_recv(sockfd, sendline, strlen(sendline),
11 recvline, MAXLINE, pservaddr, servlen);
12 recvline[n] = 0; /* Π·Π°Π²Π΅ΡΡΠ°ΡΡΠΈΠΉ Π½ΡΠ»Ρ */
13 Fputs(recvline, stdout);
14 }
15 }
ΠΠΈΡΡΠΈΠ½Π³ 22.5. Π‘Ρ Π΅ΠΌΠ° ΡΡΠ½ΠΊΡΠΈΠΉ RTT ΠΈ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ ΠΈΡ Π²ΡΠ·ΠΎΠ²Π°
static sigjmp_buf jmpbuf;
{
ΡΠΎΡΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π·Π°ΠΏΡΠΎΡΠ°
signal(SIGALRM, sig_alrm); /* ΡΡΡΠ°Π½Π°Π²Π»ΠΈΠ²Π°Π΅ΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΡΠΈΠ³Π½Π°Π»Π° */
rtt_newpack(); /* ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΡΠ΅ΠΌ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΡΡΠ΅ΡΡΠΈΠΊΠ° rexmt Π½ΡΠ»Π΅ΠΌ */
sendagain:
sendto();
alarm(rtt_start()); /* Π·Π°Π΄Π°Π΅ΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈ alarm ΡΠ°Π²Π½ΡΠΌ RTO */
if (sigsetjmp(jmpbuf, 1) != 0) {
if (rtt_timeout()) /* ΡΠ΄Π²Π°ΠΈΠ²Π°Π΅ΠΌ RTO, ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ ΠΎΡΠ΅Π½ΠΎΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ */
ΠΎΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌΡΡ ΠΎΡ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠΈΡ ΠΏΠΎΠΏΡΡΠΎΠΊ
goto sendagain; /* ΠΏΠΎΠ²ΡΠΎΡΠ½Π°Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠ° */
}
do {
recvfrom();
} while (Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΡΠΉ ΠΏΠΎΡΡΠ΄ΠΊΠΎΠ²ΡΠΉ Π½ΠΎΠΌΠ΅Ρ);
alarm(0); /* ΠΎΡΠΊΠ»ΡΡΠ°Π΅ΠΌ ΡΠΈΠ³Π½Π°Π» alarm */
rtt_stop(); /* Π²ΡΡΠΈΡΠ»ΡΠ΅ΠΌ RTT ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΠ΅ΠΌ ΠΎΡΠ΅Π½ΠΎΡΠ½ΡΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΡ */
ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅ΠΌ ΠΎΡΠ²Π΅Ρ
}
void sig_alrm(int signo) {
siglongjmp(jmpbuf, 1);
}
ΠΡΠ»ΠΈ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡ ΠΎΡΠ²Π΅Ρ, Π½ΠΎ Π΅Π³ΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠΎΠ²ΡΠΉ Π½ΠΎΠΌΠ΅Ρ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΠΎΠ³ΠΎ, ΠΌΡ ΡΠ½ΠΎΠ²Π° Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΡ recvfrom, Π½ΠΎ Π½Π΅ ΠΎΡΠΏΡΠ°Π²Π»ΡΠ΅ΠΌ ΡΠ½ΠΎΠ²Π° ΡΠΎΡ ΠΆΠ΅ Π·Π°ΠΏΡΠΎΡ ΠΈ Π½Π΅ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΠΊΠ°Π΅ΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΡΠΈΠΉ ΡΠ°ΠΉΠΌΠ΅Ρ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎΠΉ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ. ΠΠ±ΡΠ°ΡΠΈΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π² ΠΊΡΠ°ΠΉΠ½Π΅ΠΌ ΠΏΡΠ°Π²ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π½Π° ΡΠΈΡ. 22.2 ΠΏΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΎΡΠ²Π΅Ρ, ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΠΉ Π½Π° ΠΎΡΠΏΡΠ°Π²Π»Π΅Π½Π½ΡΠΉ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π·Π°ΠΏΡΠΎΡ, Π±ΡΠ΄Π΅Ρ Π½Π°Ρ ΠΎΠ΄ΠΈΡΡΡΡ Π² ΠΏΡΠΈΠ΅ΠΌΠ½ΠΎΠΌ Π±ΡΡΠ΅ΡΠ΅ ΡΠΎΠΊΠ΅ΡΠ° Π΄ΠΎ ΡΠ΅Ρ ΠΏΠΎΡ, ΠΏΠΎΠΊΠ° ΠΊΠ»ΠΈΠ΅Π½Ρ Π½Π΅ ΡΠ΅ΡΠΈΡ ΠΎΡΠΏΡΠ°Π²ΠΈΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π·Π°ΠΏΡΠΎΡ (ΠΈ ΠΏΠΎΠ»ΡΡΠΈΡΡ Π½Π° Π½Π΅Π³ΠΎ ΠΎΡΠ²Π΅Ρ). ΠΡΠΎ Π½ΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΠΊΠ»ΠΈΠ΅Π½Ρ ΠΏΡΠΎΡΠΈΡΠ°Π΅Ρ ΡΡΠΎΡ ΠΎΡΠ²Π΅Ρ, ΠΎΡΠΌΠ΅ΡΠΈΡ, ΡΡΠΎ ΠΏΠΎΡΡΠ΄ΠΊΠΎΠ²ΡΠΉ Π½ΠΎΠΌΠ΅Ρ ΠΎΡΠ»ΠΈΡΠ°Π΅ΡΡΡ ΠΎΡ ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΠΌΠΎΠ³ΠΎ, ΠΏΡΠΎΠΈΠ³Π½ΠΎΡΠΈΡΡΠ΅Ρ ΠΎΡΠ²Π΅Ρ ΠΈ ΡΠ½ΠΎΠ²Π° Π²ΡΠ·ΠΎΠ²Π΅Ρ ΡΡΠ½ΠΊΡΠΈΡ recvfrom.
ΠΡ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌ ΡΡΠ½ΠΊΡΠΈΠΈ sigsetjmp ΠΈ siglongjmp, ΡΡΠΎΠ±Ρ ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΡΡ Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΈΠ΅ ΡΠΈΡΡΠ°ΡΠΈΠΈ Π³ΠΎΠ½ΠΎΠΊ Ρ ΡΠΈΠ³Π½Π°Π»ΠΎΠΌ SIGALRM, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΠΎΠΏΠΈΡΠ°Π»ΠΈ Π² ΡΠ°Π·Π΄Π΅Π»Π΅ 20.5. Π Π»ΠΈΡΡΠΈΠ½Π³Π΅ 22.6 ΠΏΠΎΠΊΠ°Π·Π°Π½Π° ΠΏΠ΅ΡΠ²Π°Ρ ΡΠ°ΡΡΡ Π½Π°ΡΠ΅ΠΉ ΡΡΠ½ΠΊΡΠΈΠΈ dg_send_recv.
ΠΠΈΡΡΠΈΠ½Π³ 22.6. Π€ΡΠ½ΠΊΡΠΈΡ dg_send_recv: ΠΏΠ΅ΡΠ²Π°Ρ ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π°
//rtt/dg_send_recv.c
1 #include "unprtt.h"
2 #include <setjmp.h>
3 #define RTT_DEBUG
4 static struct rtt_info rttinfo;
5 static int rttinit = 0;
6 static struct msghdr msgsend, msgrecv;
/* ΠΏΡΠ΅Π΄ΠΏΠΎΠ»Π°Π³Π°Π΅ΡΡΡ, ΡΡΠΎ ΠΎΠ±Π΅ ΡΡΡΡΠΊΡΡΡΡ ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠΎΠ²Π°Π½Ρ Π½ΡΠ»Π΅ΠΌ */
7 static struct hdr {
8 uint32_t seq; /* ΠΏΠΎΡΡΠ΄ΠΊΠΎΠ²ΡΠΉ Π½ΠΎΠΌΠ΅Ρ */
9 uint32_t ts; /* ΠΎΡΠΌΠ΅ΡΠΊΠ° Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ ΠΏΡΠΈ ΠΎΡΠΏΡΠ°Π²ΠΊΠ΅ */
10 } sendhdr, recvhdr;
11 static void signalrm(int signo);
12 static sigjmp_buf jmpbuf;
13 ssize_t
14 dg_send_recv(int fd, const void *outbuff, size_t outbytes,
15 void *inbuff, size_t inbytes,
16 const SA *destaddr, socklen_t destlen)
17 {
18 ssize_t n;
19 struct iovec iovsend[2], iovrecv[2];
20 if (rttinit == 0) {
21 rtt_init(&rttinfo); /* ΠΏΠ΅ΡΠ²ΡΠΉ Π²ΡΠ·ΠΎΠ² */
22 rttinit = 1;
23 rtt_d_flag = 1;
24 }
25 sendhdr.seq++;
26 msgsend.msg_name = destaddr;
27 msgsend.msg_namelen = destlen;
28 msgsend.msg_iov = iovsend;
29 msgsend.msg_iovlen = 2;
30 iovsend[0].iov_base = &sendhdr;
31 iovsend[0].iov_len = sizeof(struct hdr);
32 iovsend[1].iov_base = outbuff;
33 iovsend[1].iov_len = outbytes;
34 msgrecv.msg_name = NULL;
35 msgrecv.msg_namelen = 0;
36 msgrecv.msg_iov = iovrecv;
37 msgrecv.msg_iovlen = 2;
38 iovrecv[0].iov_base = &recvhdr;
39 iovrecv[0].iov_len = sizeof(struct hdr);
40 iovrecv[l].iov_base = inbuff;