เชจเซ‡เชŸ เชฎเชพเชŸเซ‡ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ Udp เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซเช‚ เช…เชฎเชฒเซ€เช•เชฐเชฃ

เช‡เชจเซเชŸเชฐเชจเซ‡เชŸ เชฒเชพเช‚เชฌเชพ เชธเชฎเชฏ เชชเชนเซ‡เชฒเชพ เชฌเชฆเชฒเชพเชˆ เช—เชฏเซเช‚ เช›เซ‡. เชˆเชจเซเชŸเชฐเชจเซ‡เชŸเชจเชพ เชฎเซเช–เซเชฏ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเซเชธเชฎเชพเช‚เชฅเซ€ เชเช• - UDP เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชเชชเซเชฒเซ€เช•เซ‡เชถเชจเซ‹ เชฆเซเชตเชพเชฐเชพ เชฎเชพเชคเซเชฐ เชกเซ‡เชŸเชพเช—เซเชฐเชพเชฎ เช…เชจเซ‡ เชฌเซเชฐเซ‹เชกเช•เชพเชธเซเชŸ เชชเชนเซ‹เช‚เชšเชพเชกเชตเชพ เชฎเชพเชŸเซ‡ เชœ เชจเชนเซ€เช‚, เชชเชฃ เชจเซ‡เชŸเชตเชฐเซเช• เชจเซ‹เชกเซเชธ เชตเชšเซเชšเซ‡ "เชชเซ€เช…เชฐ-เชŸเซ-เชชเซ€เช…เชฐ" เช•เชจเซ‡เช•เซเชถเชจเซเชธ เชชเซเชฐเชฆเชพเชจ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฃ เชฅเชพเชฏ เช›เซ‡. เชคเซ‡เชจเซ€ เชธเชฐเชณ เชกเชฟเชเชพเช‡เชจเชจเซ‡ เชฒเซ€เชงเซ‡, เช† เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเชพ เช…เช—เชพเช‰ เช˜เชฃเชพ เชฌเชฟเชจเช†เชฏเซ‹เชœเชฟเชค เช‰เชชเชฏเซ‹เช—เซ‹ เช›เซ‡, เชœเซ‹ เช•เซ‡, เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซ€ เช–เชพเชฎเซ€เช“, เชœเซ‡เชฎ เช•เซ‡ เช—เซ‡เชฐเช‚เชŸเซ€เชก เชกเชฟเชฒเชฟเชตเชฐเซ€เชจเซ€ เช…เช›เชค, เช•เซเชฏเชพเช‚เชฏ เช…เชฆเซƒเชถเซเชฏ เชฅเชˆ เชจเชฅเซ€. เช† เชฒเซ‡เช– UDP เชชเชฐ เชฌเชพเช‚เชฏเชงเชฐเซ€เช•เซƒเชค เชกเชฟเชฒเชฟเชตเชฐเซ€ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเซ‡ เช›เซ‡.
เช…เชจเซเช•เซเชฐเชฎเชฃเชฟเช•เชพ:เชชเชฐเชฟเชšเชฏ
เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชœเชฐเซ‚เชฐเซ€เชฏเชพเชคเซ‹
เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ UDP เชนเซ‡เชกเชฐ
เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเชพ เชธเชพเชฎเชพเชจเซเชฏ เชธเชฟเชฆเซเชงเชพเช‚เชคเซ‹
เชธเชฎเชฏเชธเชฎเชพเชชเซเชคเชฟ เช…เชจเซ‡ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชŸเชพเชˆเชฎเชฐ
เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ UDP เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เชธเซเชŸเซ‡เชŸ เชกเชพเชฏเชพเช—เซเชฐเชพเชฎ
เช•เซ‹เชกเชฎเชพเช‚ เชตเชงเซ เชŠเช‚เชกเซ‡. เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เช•เช‚เชŸเซเชฐเซ‹เชฒ เชฏเซเชจเชฟเชŸ
เช•เซ‹เชกเชฎเชพเช‚ เชตเชงเซ เชŠเช‚เชกเซ‡. เชฐเชพเชœเซเชฏเซ‹

เช•เซ‹เชกเชฎเชพเช‚ เชตเชงเซ เชŠเช‚เชกเซ‡. เชœเซ‹เชกเชพเชฃเซ‹ เชฌเชจเชพเชตเชตเชพ เช…เชจเซ‡ เชธเซเชฅเชพเชชเชฟเชค เช•เชฐเชตเชพ
เช•เซ‹เชกเชฎเชพเช‚ เชตเชงเซ เชŠเช‚เชกเซ‡. เชธเชฎเชฏเชธเชฎเชพเชชเซเชคเชฟ เชชเชฐ เช•เชจเซ‡เช•เซเชถเชจ เชฌเช‚เชง เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡
เช•เซ‹เชกเชฎเชพเช‚ เชตเชงเซ เชŠเช‚เชกเซ‡. เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เชชเซเชจเชƒเชธเซเชฅเชพเชชเชฟเชค เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡
เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ UDP API
เชจเชฟเชทเซเช•เชฐเซเชท
เช‰เชชเชฏเซ‹เช—เซ€ เชฒเชฟเช‚เช•เซเชธ เช…เชจเซ‡ เชฒเซ‡เช–เซ‹

เชชเชฐเชฟเชšเชฏ

เชˆเชจเซเชŸเชฐเชจเซ‡เชŸเชจเชพ เชฎเซ‚เชณ เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเซ‡ เชเช• เชธเชฎเชพเชจ เชธเชฐเชจเชพเชฎเซเช‚ เชธเซเชฅเชพเชจ เชงเชพเชฐเชฃ เช•เชฐเซเชฏเซเช‚ เชนเชคเซเช‚ เชœเซ‡เชฎเชพเช‚ เชฆเชฐเซ‡เช• เชจเซ‹เชกเชจเซเช‚ เชตเซˆเชถเซเชตเชฟเช• เช…เชจเซ‡ เช…เชจเชจเซเชฏ IP เชธเชฐเชจเชพเชฎเซเช‚ เชนเชคเซเช‚ เช…เชจเซ‡ เชคเซ‡ เช…เชจเซเชฏ เชจเซ‹เชกเซเชธ เชธเชพเชฅเซ‡ เชธเซ€เชงเซ‹ เชธเช‚เชšเชพเชฐ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡. เชนเชตเซ‡ เชˆเชจเซเชŸเชฐเชจเซ‡เชŸ, เชตเชพเชธเซเชคเชตเชฎเชพเช‚, เชเช• เช…เชฒเช— เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เชงเชฐเชพเชตเซ‡ เช›เซ‡ - เชตเซˆเชถเซเชตเชฟเช• IP เชธเชฐเชจเชพเชฎเชพเช“เชจเซ‹ เชเช• เชตเชฟเชธเซเชคเชพเชฐ เช…เชจเซ‡ NAT เช‰เชชเช•เชฐเชฃเซ‹เชจเซ€ เชชเชพเช›เชณ เช›เซเชชเชพเชฏเซ‡เชฒเชพ เช–เชพเชจเช—เซ€ เชธเชฐเชจเชพเชฎเชพเช‚เชตเชพเชณเชพ เช˜เชฃเชพ เชตเชฟเชธเซเชคเชพเชฐเซ‹.เช† เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐเชฎเชพเช‚, เชตเซˆเชถเซเชตเชฟเช• เชเชกเซเชฐเซ‡เชธ เชธเซเชชเซ‡เชธเชฎเชพเช‚เชจเชพ เช‰เชชเช•เชฐเชฃเซ‹ เชœ เชจเซ‡เชŸเชตเชฐเซเช• เชชเชฐเชจเซ€ เช•เซ‹เชˆเชชเชฃ เชตเซเชฏเช•เซเชคเชฟ เชธเชพเชฅเซ‡ เชธเชฐเชณเชคเชพเชฅเซ€ เชตเชพเชคเชšเซ€เชค เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡ เช•เชพเชฐเชฃ เช•เซ‡ เชคเซ‡เชฎเชจเซ€ เชชเชพเชธเซ‡ เช…เชจเชจเซเชฏ, เชตเซˆเชถเซเชตเชฟเช• เชฐเซ€เชคเซ‡ เชฐเซ‚เชŸเซ‡เชฌเชฒ IP เชธเชฐเชจเชพเชฎเซเช‚ เช›เซ‡. เช–เชพเชจเช—เซ€ เชจเซ‡เชŸเชตเชฐเซเช• เชชเชฐเชจเซ‹ เชจเซ‹เชก เช เชœ เชจเซ‡เชŸเชตเชฐเซเช• เชชเชฐเชจเชพ เช…เชจเซเชฏ เชจเซ‹เชกเซเชธ เชธเชพเชฅเซ‡ เช•เชจเซ‡เช•เซเชŸ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡, เช…เชจเซ‡ เชตเซˆเชถเซเชตเชฟเช• เชธเชฐเชจเชพเชฎเชพเช‚เชจเซ€ เชœเช—เซเชฏเชพเชฎเชพเช‚ เช…เชจเซเชฏ เชœเชพเชฃเซ€เชคเชพ เชจเซ‹เชกเซเชธ เชธเชพเชฅเซ‡ เชชเชฃ เช•เชจเซ‡เช•เซเชŸ เชฅเชˆ เชถเช•เซ‡ เช›เซ‡. เช† เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เชฎเซ‹เชŸเซ‡ เชญเชพเช—เซ‡ เชจเซ‡เชŸเชตเชฐเซเช• เชธเชฐเชจเชพเชฎเชพเช‚ เช…เชจเซเชตเชพเชฆ เชชเชฆเซเชงเชคเชฟเชจเซ‡ เช•เชพเชฐเชฃเซ‡ เชชเซเชฐเชพเชชเซเชค เชฅเชพเชฏ เช›เซ‡. NAT เช‰เชชเช•เชฐเชฃเซ‹, เชœเซ‡เชฎ เช•เซ‡ Wi-Fi เชฐเชพเช‰เชŸเชฐเซเชธ, เช†เช‰เชŸเช—เซ‹เช‡เช‚เช— เช•เชจเซ‡เช•เซเชถเชจเซเชธ เชฎเชพเชŸเซ‡ เชตเชฟเชถเชฟเชทเซเชŸ เช…เชจเซเชตเชพเชฆ เช•เซ‹เชทเซเชŸเช• เชเชจเซเชŸเซเชฐเซ€ เชฌเชจเชพเชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชชเซ‡เช•เซ‡เชŸเซ‹เชฎเชพเช‚ IP เชธเชฐเชจเชพเชฎเชพเช“ เช…เชจเซ‡ เชชเซ‹เชฐเซเชŸ เชจเช‚เชฌเชฐเซ‹เชจเซ‡ เชธเช‚เชถเซ‹เชงเชฟเชค เช•เชฐเซ‡ เช›เซ‡. เช† เช–เชพเชจเช—เซ€ เชจเซ‡เชŸเชตเชฐเซเช•เชฅเซ€ เช—เซเชฒเซ‹เชฌเชฒ เชเชกเซเชฐเซ‡เชธ เชธเซเชชเซ‡เชธเชฎเชพเช‚ เชนเซ‹เชธเซเชŸ เชฎเชพเชŸเซ‡ เช†เช‰เชŸเช—เซ‹เช‡เช‚เช— เช•เชจเซ‡เช•เซเชถเชจเซเชธเชจเซ‡ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡. เชชเชฐเช‚เชคเซ เชคเซ‡ เชœ เชธเชฎเชฏเซ‡, NAT เช‰เชชเช•เชฐเชฃเซ‹ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชคเชฎเชพเชฎ เช‡เชจเช•เชฎเชฟเช‚เช— เชŸเซเชฐเชพเชซเชฟเช•เชจเซ‡ เช…เชตเชฐเซ‹เชงเชฟเชค เช•เชฐเซ‡ เช›เซ‡ เชธเชฟเชตเชพเชฏ เช•เซ‡ เช‡เชจเช•เชฎเชฟเช‚เช— เช•เชจเซ‡เช•เซเชถเชจเซเชธ เชฎเชพเชŸเซ‡ เช…เชฒเช— เชจเชฟเชฏเชฎเซ‹ เชธเซ‡เชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡.

เช‡เชจเซเชŸเชฐเชจเซ‡เชŸเชจเซเช‚ เช† เช†เชฐเซเช•เชฟเชŸเซ‡เช•เซเชšเชฐ เช•เซเชฒเชพเชฏเช‚เชŸ-เชธเชฐเซเชตเชฐ เช•เชฎเซเชฏเซเชจเชฟเช•เซ‡เชถเชจ เชฎเชพเชŸเซ‡ เชชเซ‚เชฐเชคเซเช‚ เชฏเซ‹เช—เซเชฏ เช›เซ‡, เชœเซเชฏเชพเช‚ เช•เซเชฒเชพเชฏเชจเซเชŸ เช–เชพเชจเช—เซ€ เชจเซ‡เชŸเชตเชฐเซเช•เชฎเชพเช‚ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡, เช…เชจเซ‡ เชธเชฐเซเชตเชฐ เชชเชพเชธเซ‡ เชตเซˆเชถเซเชตเชฟเช• เชธเชฐเชจเชพเชฎเซเช‚ เช›เซ‡. เชชเชฐเช‚เชคเซ เชคเซ‡ เชตเชšเซเชšเซ‡ เชฌเซ‡ เช—เชพเช‚เช เซ‹เชจเชพ เชธเซ€เชงเชพ เชœเซ‹เชกเชพเชฃ เชฎเชพเชŸเซ‡ เชฎเซเชถเซเช•เซ‡เชฒเซ€เช“ เชŠเชญเซ€ เช•เชฐเซ‡ เช›เซ‡ เชตเชฟเชตเชฟเชง เช–เชพเชจเช—เซ€ เชจเซ‡เชŸเชตเชฐเซเช•เซเชธ. เชชเซ€เช…เชฐ-เชŸเซ-เชชเซ€เช…เชฐ เชเชชเซเชฒเซ€เช•เซ‡เชถเชจ เชœเซ‡เชฎ เช•เซ‡ เชตเซ‹เชˆเชธ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ (เชธเซเช•เชพเชฏเชชเซ‡), เช•เซ‹เชฎเซเชชเซเชฏเซเชŸเชฐ (เชŸเซ€เชฎเชตเซเชฏเซเช…เชฐ)เชฎเชพเช‚ เชฐเซ€เชฎเซ‹เชŸ เชเช•เซเชธเซ‡เชธ เชฎเซ‡เชณเชตเชตเซ€ เช…เชฅเชตเชพ เช“เชจเชฒเชพเชˆเชจ เช—เซ‡เชฎเชฟเช‚เช— เชฎเชพเชŸเซ‡ เชฌเซ‡ เชจเซ‹เชกเซเชธ เชตเชšเซเชšเซ‡ เชธเซ€เชงเซ‹ เชœเซ‹เชกเชพเชฃ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เช›เซ‡.

เชตเชฟเชตเชฟเชง เช–เชพเชจเช—เซ€ เชจเซ‡เชŸเชตเชฐเซเช•เซเชธ เชชเชฐเชจเชพ เช‰เชชเช•เชฐเชฃเซ‹ เชตเชšเซเชšเซ‡ เชชเซ€เช…เชฐ-เชŸเซ-เชชเซ€เช…เชฐ เช•เชจเซ‡เช•เซเชถเชจ เชธเซเชฅเชพเชชเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชธเซŒเชฅเซ€ เช…เชธเชฐเช•เชพเชฐเช• เชชเชฆเซเชงเชคเชฟเช“เชฎเชพเช‚เชจเซ€ เชเช•เชจเซ‡ เชนเซ‹เชฒ เชชเช‚เชšเชฟเช‚เช— เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช† เชคเช•เชจเซ€เช•เชจเซ‹ เช‰เชชเชฏเซ‹เช— UDP เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชชเชฐ เช†เชงเชพเชฐเชฟเชค เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเซ‹ เชธเชพเชฅเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เชฅเชพเชฏ เช›เซ‡.

เชชเชฐเช‚เชคเซ เชœเซ‹ เชคเชฎเชพเชฐเซ€ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เชกเซ‡เชŸเชพเชจเซ€ เชฌเชพเช‚เชฏเชงเชฐเซ€เช•เซƒเชค เชกเชฟเชฒเชฟเชตเชฐเซ€เชจเซ€ เชœเชฐเซ‚เชฐ เชนเซ‹เชฏ, เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชคเชฎเซ‡ เช•เชฎเซเชชเซเชฏเซเชŸเชฐเซเชธ เชตเชšเซเชšเซ‡ เชซเชพเช‡เชฒเซ‹ เชธเซเชฅเชพเชจเชพเช‚เชคเชฐเชฟเชค เช•เชฐเซ‹ เช›เซ‹, เชคเซ‹ UDP เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช˜เชฃเซ€ เชฎเซเชถเซเช•เซ‡เชฒเซ€เช“ เชนเชถเซ‡ เช•เชพเชฐเชฃ เช•เซ‡ UDP เช เช—เซ‡เชฐเช‚เชŸเซ€เช•เซƒเชค เชกเชฟเชฒเชฟเชตเชฐเซ€ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชจเชฅเซ€ เช…เชจเซ‡ TCPเชฅเซ€ เชตเชฟเชชเชฐเซ€เชค, เช•เซเชฐเชฎเชฎเชพเช‚ เชชเซ‡เช•เซ‡เชŸ เชกเชฟเชฒเชฟเชตเชฐเซ€ เชชเซเชฐเชฆเชพเชจ เช•เชฐเชคเซเช‚ เชจเชฅเซ€. เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ

เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชฌเชพเช‚เชฏเชงเชฐเซ€เช•เซƒเชค เชชเซ‡เช•เซ‡เชŸ เชกเชฟเชฒเชฟเชตเชฐเซ€เชจเซ€ เช–เชพเชคเชฐเซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชเชชเซเชฒเซ€เช•เซ‡เชถเชจ เชฒเซ‡เชฏเชฐ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซ‹ เช…เชฎเชฒ เช•เชฐเชตเซ‹ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡ เชœเซ‡ เชœเชฐเซ‚เชฐเซ€ เช•เชพเชฐเซเชฏเช•เซเชทเชฎเชคเชพ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ UDP เชชเชฐ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡.

เชนเซเช‚ เชนเชฎเชฃเชพเช‚ เชœ เชจเซ‹เช‚เชงเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚ เช•เซ‡ เชตเชฟเชตเชฟเชง เช–เชพเชจเช—เซ€ เชจเซ‡เชŸเชตเชฐเซเช•เซเชธเชฎเชพเช‚ เชจเซ‹เชกเซเชธ เชตเชšเซเชšเซ‡ TCP เช•เชจเซ‡เช•เซเชถเชจ เชธเซเชฅเชพเชชเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ TCP เชนเซ‹เชฒ เชชเช‚เชšเชฟเช‚เช— เชŸเซ‡เช•เชจเชฟเช• เช›เซ‡, เชชเชฐเช‚เชคเซ เช˜เชฃเชพ NAT เช‰เชชเช•เชฐเชฃเซ‹ เชฆเซเชตเชพเชฐเชพ เชคเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เชธเชฎเชฐเซเชฅเชจเชจเชพ เช…เชญเชพเชตเชจเซ‡ เช•เชพเชฐเชฃเซ‡, เชคเซ‡เชจเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชฐเซ€เชคเซ‡ เช•เชจเซ‡เช•เซเชŸ เช•เชฐเชตเชพเชจเซ€ เชฎเซเช–เซเชฏ เชฐเซ€เชค เชคเชฐเซ€เช•เซ‡ เช—เชฃเชตเชพเชฎเชพเช‚ เช†เชตเชคเซ€ เชจเชฅเซ€. เช†เชตเชพ เช—เชพเช‚เช เซ‹.

เช† เชฒเซ‡เช–เชจเชพ เชฌเชพเช•เซ€เชจเชพ เชญเชพเช—เชฎเชพเช‚, เชนเซเช‚ เชซเช•เซเชค เช—เซ‡เชฐเช‚เชŸเซ€เช•เซƒเชค เชกเชฟเชฒเชฟเชตเชฐเซ€ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชชเชฐ เชงเซเชฏเชพเชจ เช•เซ‡เชจเซเชฆเซเชฐเชฟเชค เช•เชฐเซ€เชถ. UDP เชนเซ‹เชฒ เชชเช‚เชšเชฟเช‚เช— เชŸเซ‡เช•เชจเชฟเช•เชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซเช‚ เชตเชฐเซเชฃเชจ เชจเซ€เชšเซ‡เชจเชพ เชฒเซ‡เช–เซ‹เชฎเชพเช‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.

เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชœเชฐเซ‚เชฐเซ€เชฏเชพเชคเซ‹

  1. เชธเช•เชพเชฐเชพเชคเซเชฎเช• เชชเซเชฐเชคเชฟเชธเชพเชฆ เชชเชฆเซเชงเชคเชฟ (เช•เชนเซ‡เชตเชพเชคเชพ เชนเช•เชพเชฐเชพเชคเซเชฎเช• เชธเซเชตเซ€เช•เซƒเชคเชฟ) เชฆเซเชตเชพเชฐเชพ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ เชชเซ‡เช•เซ‡เชŸ เชตเชฟเชคเชฐเชฃ
  2. เชฎเซ‹เชŸเชพ เชกเซ‡เชŸเชพเชจเชพ เช•เชพเชฐเซเชฏเช•เซเชทเชฎ เชŸเซเชฐเชพเชจเซเชธเชซเชฐเชจเซ€ เชœเชฐเซ‚เชฐเชฟเชฏเชพเชค, เชเชŸเชฒเซ‡ เช•เซ‡. เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเซ‡ เชฌเชฟเชจเชœเชฐเซ‚เชฐเซ€ เชชเซ‡เช•เซ‡เชŸ เชฐเชฟเชฒเซ‡ เช•เชฐเชตเชพเชจเซเช‚ เชŸเชพเชณเชตเซเช‚ เชœเซ‹เชˆเช
  3. เชกเชฟเชฒเชฟเชตเชฐเซ€ เช•เชจเซเชซเชฐเซเชฎเซ‡เชถเชจ เชฎเชฟเช•เซ‡เชจเชฟเชเชฎ ("เชถเซเชฆเซเชง" UDP เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชคเชฐเซ€เช•เซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ) เชฐเชฆ เช•เชฐเชตเชพเชจเซเช‚ เชถเช•เซเชฏ เชนเซ‹เชตเซเช‚ เชœเซ‹เชˆเช.
  4. เชฆเชฐเซ‡เช• เชธเช‚เชฆเซ‡เชถเชจเซ€ เชชเซเชทเซเชŸเชฟ เชธเชพเชฅเซ‡, เช†เชฆเซ‡เชถ เชฎเซ‹เชกเชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพเชจเซ€ เช•เซเชทเชฎเชคเชพ
  5. เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชชเชฐ เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชธเชซเชฐเชจเซเช‚ เชฎเซ‚เชณเชญเซ‚เชค เชเช•เชฎ เชธเช‚เชฆเซ‡เชถ เชนเซ‹เชตเซเช‚ เช†เชตเชถเซเชฏเช• เช›เซ‡

เช† เช†เชตเชถเซเชฏเช•เชคเชพเช“ เชฎเซ‹เชŸเชพเชญเชพเช—เซ‡ เช†เชฎเชพเช‚ เชตเชฐเซเชฃเชตเซ‡เชฒ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ เชกเซ‡เชŸเชพ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เช†เชตเชถเซเชฏเช•เชคเชพเช“ เชธเชพเชฅเซ‡ เชธเซเชธเช‚เช—เชค เช›เซ‡ เช†เชฐเชเชซเชธเซ€ 908 ะธ เช†เชฐเชเชซเชธเซ€ 1151, เช…เชจเซ‡ เช† เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชตเชฟเช•เชธเชพเชตเชคเซ€ เชตเช–เชคเซ‡ เชฎเซ‡เช‚ เชคเซ‡ เชงเซ‹เชฐเชฃเซ‹ เชชเชฐ เช†เชงเชพเชฐ เชฐเชพเช–เซเชฏเซ‹ เชนเชคเซ‹.

เช† เชœเชฐเซ‚เชฐเชฟเชฏเชพเชคเซ‹เชจเซ‡ เชธเชฎเชœเชตเชพ เชฎเชพเชŸเซ‡, เชšเชพเชฒเซ‹ TCP เช…เชจเซ‡ UDP เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฌเซ‡ เชจเซ‡เชŸเชตเชฐเซเช• เชจเซ‹เชกเซเชธ เชตเชšเซเชšเซ‡ เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชธเชซเชฐเชจเซ‹ เชธเชฎเชฏ เชœเซ‹เชˆเช. เชšเชพเชฒเซ‹ เชฌเช‚เชจเซ‡ เช•เชฟเชธเซเชธเชพเช“เชฎเชพเช‚ เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชเช• เชชเซ‡เช•เซ‡เชŸ เช–เซ‹เชตเชพเชˆ เชœเชถเซ‡.
TCP เชชเชฐ เชจเซ‹เชจ-เช‡เชจเซเชŸเชฐเซ‡เช•เซเชŸเชฟเชต เชกเซ‡เชŸเชพเชจเซเช‚ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ:เชจเซ‡เชŸ เชฎเชพเชŸเซ‡ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ Udp เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซเช‚ เช…เชฎเชฒเซ€เช•เชฐเชฃ

เชœเซ‡เชฎ เชคเชฎเซ‡ เชกเชพเชฏเชพเช—เซเชฐเชพเชฎเชฎเชพเช‚เชฅเซ€ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹, เชชเซ‡เช•เซ‡เชŸ เช–เซ‹เชตเชพเชˆ เชœเชตเชพเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, TCP เช–เซ‹เชตเชพเชˆ เช—เชฏเซ‡เชฒเชพ เชชเซ‡เช•เซ‡เชŸเชจเซ‡ เชถเซ‹เชงเซ€ เช•เชพเชขเชถเซ‡ เช…เชจเซ‡ เช–เซ‹เชตเชพเชฏเซ‡เชฒเชพ เชธเซ‡เช—เชฎเซ‡เชจเซเชŸเชจเซ‹ เชจเช‚เชฌเชฐ เชชเซ‚เช›เซ€เชจเซ‡ เชฎเซ‹เช•เชฒเชจเชพเชฐเชจเซ‡ เชคเซ‡เชจเซ€ เชœเชพเชฃ เช•เชฐเชถเซ‡.
UDP เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชฆเซเชตเชพเชฐเชพ เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ:เชจเซ‡เชŸ เชฎเชพเชŸเซ‡ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ Udp เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซเช‚ เช…เชฎเชฒเซ€เช•เชฐเชฃ

UDP เช–เซ‹เชŸ เชถเซ‹เชงเชตเชพเชจเชพ เช•เซ‹เชˆ เชชเช—เชฒเชพเช‚ เชฒเซ‡เชคเซเช‚ เชจเชฅเซ€. UDP เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชฎเชพเช‚ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เชญเซ‚เชฒเซ‹เชจเซเช‚ เชจเชฟเชฏเช‚เชคเซเชฐเชฃ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ€ เชœเชตเชพเชฌเชฆเชพเชฐเซ€ เช›เซ‡.

TCP เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชฎเชพเช‚ เชญเซ‚เชฒ เชถเซ‹เชง เช เชเชจเซเชก เชจเซ‹เชก เชธเชพเชฅเซ‡ เช•เชจเซ‡เช•เซเชถเชจ เชธเซเชฅเชพเชชเชฟเชค เช•เชฐเซ€เชจเซ‡, เชคเซ‡ เช•เชจเซ‡เช•เซเชถเชจเชจเซ€ เชธเซเชฅเชฟเชคเชฟเชจเซ‡ เชธเซเชŸเซ‹เชฐ เช•เชฐเซ€เชจเซ‡, เชฆเชฐเซ‡เช• เชชเซ‡เช•เซ‡เชŸ เชนเซ‡เชกเชฐเชฎเชพเช‚ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡เชฒเซ€ เชฌเชพเชˆเชŸเซเชธเชจเซ€ เชธเช‚เช–เซเชฏเชพ เชธเซ‚เชšเชตเซ€เชจเซ‡ เช…เชจเซ‡ เชธเซเชตเซ€เช•เซƒเชคเชฟ เชจเช‚เชฌเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชฐเชธเซ€เชฆเซ‹เชจเซ‡ เชธเซ‚เชšเชฟเชค เช•เชฐเซ€เชจเซ‡ เชชเซเชฐเชพเชชเซเชค เชฅเชพเชฏ เช›เซ‡.

เชตเชงเซเชฎเชพเช‚, เช•เชพเชฎเช—เซ€เชฐเซ€ เชฌเชนเซ‡เชคเชฐ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ (เชเชŸเชฒเซ‡ โ€‹โ€‹โ€‹โ€‹เช•เซ‡ เชธเซเชตเซ€เช•เซƒเชคเชฟ เชชเซเชฐเชพเชชเซเชค เช•เชฐเซเชฏเชพ เชตเชฟเชจเชพ เชเช• เช•เชฐเชคเชพ เชตเชงเซ เชธเซ‡เช—เชฎเซ‡เชจเซเชŸ เชฎเซ‹เช•เชฒเซ‹), TCP เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เช•เชนเซ‡เชตเชพเชคเซ€ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เชตเชฟเชจเซเชกเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡ - เชกเซ‡เชŸเชพเชจเชพ เชฌเชพเชˆเชŸเชจเซ€ เชธเช‚เช–เซเชฏเชพ เชœเซ‡ เชธเซ‡เช—เชฎเซ‡เชจเซเชŸเชจเชพ เชชเซเชฐเซ‡เชทเช•เชจเซ‡ เชชเซเชฐเชพเชชเซเชค เชฅเชตเชพเชจเซ€ เช…เชชเซ‡เช•เซเชทเชพ เช›เซ‡.

TCP เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชตเชฟเชถเซ‡ เชตเชงเซ เชฎเชพเชนเชฟเชคเซ€ เชฎเชพเชŸเซ‡, เชœเซเช“ เช†เชฐเชเชซเชธเซ€ 793, UDP เชฅเซ€ เช†เชฐเชเชซเชธเซ€ 768เชœเซเชฏเชพเช‚, เชนเช•เซ€เช•เชคเชฎเชพเช‚, เชคเซ‡เช“ เชตเซเชฏเชพเช–เซเชฏเชพเชฏเชฟเชค เชฅเชฏเซ‡เชฒ เช›เซ‡.

เช‰เชชเชฐเชฅเซ€, เชคเซ‡ เชธเซเชชเชทเซเชŸ เช›เซ‡ เช•เซ‡ UDP เชชเชฐ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ เชธเช‚เชฆเซ‡เชถ เชตเชฟเชคเชฐเชฃ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชฌเชจเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ (เชคเซเชฏเชพเชฐเชฌเชพเชฆ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ UDP), เชคเซ‡ TCP เชœเซ‡เชตเซ€ เชœ เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เชฎเชฟเช•เซ‡เชจเชฟเชเชฎเซเชธ เชฒเชพเช—เซ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡. เชœเซ‡เชฎ เช•เซ‡:

  • เช•เชจเซ‡เช•เซเชถเชจ เชธเซเชฅเชฟเชคเชฟ เชธเชพเชšเชตเซ‹
  • เชธเซ‡เช—เชฎเซ‡เชจเซเชŸ เชจเช‚เชฌเชฐเชฟเช‚เช—เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹
  • เช–เชพเชธ เชชเซเชทเซเชŸเชฟเช•เชฐเชฃ เชชเซ‡เช•เซ‡เชœเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹
  • เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชฅเซเชฐเซเชชเซเชŸ เชตเชงเชพเชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเชฐเชณ เชตเชฟเชจเซเชกเซ‹เช‡เช‚เช— เชฎเชฟเช•เซ‡เชจเชฟเชเชฎเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‹

เชตเชงเซเชฎเชพเช‚, เชคเชฎเชพเชฐเซ‡ เชœเชฐเซ‚เชฐ เช›เซ‡:

  • เช•เชจเซ‡เช•เซเชถเชจ เชฎเชพเชŸเซ‡ เชธเช‚เชธเชพเชงเชจเซ‹ เชซเชพเชณเชตเชตเชพ เชฎเชพเชŸเซ‡, เชธเช‚เชฆเซ‡เชถเชจเซ€ เชถเชฐเซ‚เช†เชคเชจเซ‹ เชธเช‚เช•เซ‡เชค เช†เชชเซ‹
  • เชชเซเชฐเชพเชชเซเชค เชธเช‚เชฆเซ‡เชถเชจเซ‡ เช…เชชเชธเซเชŸเซเชฐเซ€เชฎ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชฎเชพเช‚ เชชเชธเชพเชฐ เช•เชฐเชตเชพ เช…เชจเซ‡ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชธเช‚เชธเชพเชงเชจเซ‹ เช›เซ‹เชกเชตเชพ เชฎเชพเชŸเซ‡ เชธเช‚เชฆเซ‡เชถเชจเชพ เช…เช‚เชคเชจเซ‹ เชธเช‚เช•เซ‡เชค เช†เชชเซ‹
  • เช•เชจเซ‡เช•เซเชถเชจ-เชตเชฟเชถเชฟเชทเซเชŸ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซ‡ "เชถเซเชฆเซเชง" UDP เชคเชฐเซ€เช•เซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชกเชฟเชฒเชฟเชตเชฐเซ€ เชชเซเชทเซเชŸเชฟเช•เชฐเชฃ เชชเชฆเซเชงเชคเชฟเชจเซ‡ เช…เช•เซเชทเชฎ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‹

เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ UDP เชนเซ‡เชกเชฐ

เชฏเชพเชฆ เช•เชฐเซ‹ เช•เซ‡ UDP เชกเซ‡เชŸเชพเช—เซเชฐเชพเชฎ IP เชกเซ‡เชŸเชพเช—เซเชฐเชพเชฎเชฎเชพเช‚ เชธเชฎเชพเชตเชฟเชทเซเชŸ เช›เซ‡. เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ UDP เชชเซ‡เช•เซ‡เชŸ UDP เชกเซ‡เชŸเชพเช—เซเชฐเชพเชฎเชฎเชพเช‚ เชฏเซ‹เช—เซเชฏ เชฐเซ€เชคเซ‡ "เช†เชตเชฐเชฟเชค" เช›เซ‡.
เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ UDP เชนเซ‡เชกเชฐ เชเชจเซเช•เซ‡เชชเซเชธเซเชฏเซเชฒเซ‡เชถเชจ:เชจเซ‡เชŸ เชฎเชพเชŸเซ‡ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ Udp เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซเช‚ เช…เชฎเชฒเซ€เช•เชฐเชฃ

เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ UDP เชนเซ‡เชกเชฐเชจเซ€ เชฐเชšเชจเชพ เชเช•เชฆเชฎ เชธเชฐเชณ เช›เซ‡:

เชจเซ‡เชŸ เชฎเชพเชŸเซ‡ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ Udp เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซเช‚ เช…เชฎเชฒเซ€เช•เชฐเชฃ

  • เชซเซเชฒเซ‡เช—เซเชธ - เชชเซ‡เช•เซ‡เชœ เชจเชฟเชฏเช‚เชคเซเชฐเชฃ เชซเซเชฒเซ‡เช—เซเชธ
  • MessageType - เช…เชชเชธเซเชŸเซเชฐเซ€เชฎ เชเชชเซเชฒเซ€เช•เซ‡เชถเชจเซ‹ เชฆเซเชตเชพเชฐเชพ เชšเซ‹เช•เซเช•เชธ เชธเช‚เชฆเซ‡เชถเชพเช“ เชชเชฐ เชธเชฌเซเชธเซเช•เซเชฐเชพเช‡เชฌ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพเชคเซ‹ เชธเช‚เชฆเซ‡เชถ เชชเซเชฐเช•เชพเชฐ
  • เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เช†เชˆเชกเซ€ - เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจเชจเซ€ เชธเช‚เช–เซเชฏเชพ, เชชเซเชฐเชพเชชเซเชคเช•เชฐเซเชคเชพเชจเชพ เชธเชฐเชจเชพเชฎเชพ เช…เชจเซ‡ เชชเซ‹เชฐเซเชŸ เชธเชพเชฅเซ‡, เชœเซ‹เชกเชพเชฃเชจเซ‡ เช…เชจเชจเซเชฏ เชฐเซ€เชคเซ‡ เช“เชณเช–เซ‡ เช›เซ‡
  • PacketNumber - เชชเซ‡เช•เซ‡เชŸ เชจเช‚เชฌเชฐ
  • เชตเชฟเช•เชฒเซเชชเซ‹ - เชตเชงเชพเชฐเชพเชจเชพ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชตเชฟเช•เชฒเซเชชเซ‹. เชชเซเชฐเชฅเชฎ เชชเซ‡เช•เซ‡เชŸเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชธเช‚เชฆเซ‡เชถเชจเซเช‚ เช•เชฆ เชฆเชฐเซเชถเชพเชตเชตเชพ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡

เชงเซเชตเชœ เชจเซ€เชšเซ‡ เชฎเซเชœเชฌ เช›เซ‡:

  • เชซเชฐเซเชธเซเชŸเชชเซ‡เช•เซ‡เชŸ - เชธเช‚เชฆเซ‡เชถเชจเซเช‚ เชชเซเชฐเชฅเชฎ เชชเซ‡เช•เซ‡เชŸ
  • NoAsk - เชธเช‚เชฆเซ‡เชถเชจเซ‡ เชธเช•เซเชทเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเซเชตเซ€เช•เซƒเชคเชฟ เชชเชฆเซเชงเชคเชฟเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€
  • เชฒเชพเชธเซเชŸเชชเซ‡เช•เซ‡เชŸ - เชธเช‚เชฆเซ‡เชถเชจเซเช‚ เช›เซ‡เชฒเซเชฒเซเช‚ เชชเซ‡เช•เซ‡เชŸ
  • RequestForPacket - เชชเซเชทเซเชŸเชฟ เชชเซ‡เช•เซ‡เชŸ เช…เชฅเชตเชพ เช–เซ‹เชตเชพเชฏเซ‡เชฒเชพ เชชเซ‡เช•เซ‡เชŸ เชฎเชพเชŸเซ‡เชจเซ€ เชตเชฟเชจเช‚เชคเซ€

เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเชพ เชธเชพเชฎเชพเชจเซเชฏ เชธเชฟเชฆเซเชงเชพเช‚เชคเซ‹

เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ UDP เชฌเซ‡ เช—เชพเช‚เช เซ‹ เชตเชšเซเชšเซ‡ เชฌเชพเช‚เชฏเชงเชฐเซ€เช•เซƒเชค เชธเช‚เชฆเซ‡เชถเชพ เชชเซเชฐเชธเชพเชฐเชฃ เชชเชฐ เช•เซ‡เชจเซเชฆเซเชฐเชฟเชค เชนเซ‹เชตเชพเชฅเซ€, เชคเซ‡ เชฌเซ€เชœเซ€ เชฌเชพเชœเซ เชธเชพเชฅเซ‡ เชœเซ‹เชกเชพเชฃ เชธเซเชฅเชพเชชเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เชธเช•เซเชทเชฎ เชนเซ‹เชตเซเช‚ เชœเซ‹เชˆเช. เช•เชจเซ‡เช•เซเชถเชจ เชธเซเชฅเชพเชชเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชชเซเชฐเซ‡เชทเช• เชซเชฐเซเชธเซเชŸเชชเซ‡เช•เซ‡เชŸ เชซเซเชฒเซ‡เช— เชธเชพเชฅเซ‡ เชเช• เชชเซ‡เช•เซ‡เชŸ เชฎเซ‹เช•เชฒเซ‡ เช›เซ‡, เชœเซ‡เชจเซ‹ เชชเซเชฐเชคเชฟเชธเชพเชฆ เช…เชฐเซเชฅ เช เชฅเชถเซ‡ เช•เซ‡ เชœเซ‹เชกเชพเชฃ เชธเซเชฅเชพเชชเชฟเชค เชฅเชฏเซเช‚ เช›เซ‡. เชฌเชงเชพ เชชเซเชฐเชคเชฟเชญเชพเชต เชชเซ‡เช•เซ‡เชŸเซ‹, เช…เชฅเชตเชพ, เช…เชจเซเชฏ เชถเชฌเซเชฆเซ‹เชฎเชพเช‚, เชธเซเชตเซ€เช•เซƒเชคเชฟ เชชเซ‡เช•เซ‡เชŸเซ‹, เชนเช‚เชฎเซ‡เชถเชพ PacketNumber เชซเซ€เชฒเซเชกเชจเซเช‚ เชฎเซ‚เชฒเซเชฏ เชธเชซเชณเชคเชพเชชเซ‚เชฐเซเชตเช• เชชเซเชฐเชพเชชเซเชค เชฅเชฏเซ‡เชฒเชพ เชชเซ‡เช•เซ‡เชŸเซ‹เชจเชพ เชธเซŒเชฅเซ€ เชฎเซ‹เชŸเชพ PacketNumber เชฎเซ‚เชฒเซเชฏ เช•เชฐเชคเชพเช‚ เชตเชงเซ เชเช• เชชเชฐ เชธเซ‡เชŸ เช•เชฐเซ‡ เช›เซ‡. เชฎเซ‹เช•เชฒเซ‡เชฒ เชชเซเชฐเชฅเชฎ เชชเซ‡เช•เซ‡เชŸ เชฎเชพเชŸเซ‡ เชตเชฟเช•เชฒเซเชชเซ‹ เชซเซ€เชฒเซเชก เช เชธเช‚เชฆเซ‡เชถเชจเซเช‚ เช•เชฆ เช›เซ‡.

เช•เชจเซ‡เช•เซเชถเชจเชจเซ‡ เชธเชฎเชพเชชเซเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชธเชฎเชพเชจ เชชเชฆเซเชงเชคเชฟเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฅเชพเชฏ เช›เซ‡. LastPacket เชงเซเชตเชœ เชธเช‚เชฆเซ‡เชถเชจเชพ เช›เซ‡เชฒเซเชฒเชพ เชชเซ‡เช•เซ‡เชŸ เชชเชฐ เชธเซ‡เชŸ เช•เชฐเซ‡เชฒ เช›เซ‡. เชชเซเชฐเชคเชฟเชญเชพเชต เชชเซ‡เช•เซ‡เชŸเชฎเชพเช‚ เช›เซ‡เชฒเซเชฒเชพ เชชเซ‡เช•เซ‡เชŸเชจเซ€ เชธเช‚เช–เซเชฏเชพ + 1 เชนเซ‹เชฏ เช›เซ‡, เชœเซ‡เชจเซ‹ เช…เชฐเซเชฅ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชจเชพเชฐ เชฌเชพเชœเซ เชฎเชพเชŸเซ‡ เชธเช‚เชฆเซ‡เชถเชจเซ€ เชธเชซเชณ เชกเชฟเชฒเชฟเชตเชฐเซ€ เชฅเชพเชฏ เช›เซ‡.
เช•เชจเซ‡เช•เซเชถเชจ เชธเซเชฅเชพเชชเชจเชพ เช…เชจเซ‡ เชธเชฎเชพเชชเซเชคเชฟ เชฐเซ‡เช–เชพเช•เซƒเชคเชฟ:เชจเซ‡เชŸ เชฎเชพเชŸเซ‡ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ Udp เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซเช‚ เช…เชฎเชฒเซ€เช•เชฐเชฃ

เชœเซเชฏเชพเชฐเซ‡ เช•เชจเซ‡เช•เซเชถเชจ เชธเซเชฅเชพเชชเชฟเชค เชฅเชพเชฏ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เชถเชฐเซ‚ เชฅเชพเชฏ เช›เซ‡. เชกเซ‡เชŸเชพ เชชเซ‡เช•เซ‡เชŸเซ‹เชจเชพ เชฌเซเชฒเซ‹เช•เชฎเชพเช‚ เชชเซเชฐเชธเชพเชฐเชฟเชค เชฅเชพเชฏ เช›เซ‡. เชฆเชฐเซ‡เช• เชฌเซเชฒเซ‹เช•, เช›เซ‡เชฒเซเชฒเชพ เชเช• เชธเชฟเชตเชพเชฏ, เชชเซ‡เช•เซ‡เชŸเซ‹เชจเซ€ เชจเชฟเชถเซเชšเชฟเชค เชธเช‚เช–เซเชฏเชพ เชงเชฐเชพเชตเซ‡ เช›เซ‡. เชคเซ‡ เชชเซเชฐเชพเชชเซเชค/เชชเซเชฐเชธเชพเชฐเชฃ เชตเชฟเชจเซเชกเซ‹ เชฎเชพเชช เชธเชฎเชพเชจ เช›เซ‡. เชกเซ‡เชŸเชพเชจเชพ เช›เซ‡เชฒเซเชฒเชพ เชฌเซเชฒเซ‹เช•เชฎเชพเช‚ เช“เช›เชพ เชชเซ‡เช•เซ‡เชŸ เชนเซ‹เชˆ เชถเช•เซ‡ เช›เซ‡. เชฆเชฐเซ‡เช• เชฌเซเชฒเซ‹เช• เชฎเซ‹เช•เชฒเซเชฏเชพ เชชเช›เซ€, เชฎเซ‹เช•เชฒเชจเชพเชฐ เชฌเชพเชœเซ เชกเชฟเชฒเชฟเชตเชฐเซ€ เช•เชจเซเชซเชฐเซเชฎเซ‡เชถเชจเชจเซ€ เชฐเชพเชน เชœเซเช เช›เซ‡ เช…เชฅเชตเชพ เช–เซ‹เชตเชพเชฏเซ‡เชฒเชพ เชชเซ‡เช•เซ‡เชŸเชจเซ‡ เชซเชฐเซ€เชฅเซ€ เชกเชฟเชฒเชฟเชตเชฐ เช•เชฐเชตเชพเชจเซ€ เชตเชฟเชจเช‚เชคเซ€เชจเซ€ เชฐเชพเชน เชœเซเช เช›เซ‡, เชชเซเชฐเชคเชฟเชธเชพเชฆเซ‹ เชฎเซ‡เชณเชตเชตเชพ เชฎเชพเชŸเซ‡ เชฐเชฟเชธเชฟเชต/เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชŸ เชตเชฟเชจเซเชกเซ‹ เช–เซเชฒเซเชฒเซ€ เชฐเชพเช–เซ€เชจเซ‡. เชฌเซเชฒเซ‹เช• เชกเชฟเชฒเชฟเชตเชฐเซ€เชจเซ€ เชชเซเชทเซเชŸเชฟ เชชเซเชฐเชพเชชเซเชค เช•เชฐเซเชฏเชพ เชชเช›เซ€, เชชเซเชฐเชพเชชเซเชค/เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชŸ เชตเชฟเชจเซเชกเซ‹ เชถเชฟเชซเซเชŸ เชฅเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เชกเซ‡เชŸเชพเชจเซ‹ เช†เช—เชณเชจเซ‹ เชฌเซเชฒเซ‹เช• เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เชชเซเชฐเชพเชชเซเชค เช•เชฐเชจเชพเชฐ เชฌเชพเชœเซ เชชเซ‡เช•เซ‡เชŸเซ‹ เชฎเซ‡เชณเชตเซ‡ เช›เซ‡. เชฆเชฐเซ‡เช• เชชเซ‡เช•เซ‡เชŸ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เชตเชฟเชจเซเชกเซ‹เชจเซ€ เช…เช‚เชฆเชฐ เช†เชตเซ‡ เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ เชคเซ‡ เชœเซ‹เชตเชพ เชฎเชพเชŸเซ‡ เชคเชชเชพเชธเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชชเซ‡เช•เซ‡เชŸเซ‹ เช…เชจเซ‡ เชกเซเชชเซเชฒเชฟเช•เซ‡เชŸเซเชธ เชœเซ‡ เชตเชฟเชจเซเชกเซ‹เชฎเชพเช‚ เช†เชตเชคเชพ เชจเชฅเซ€ เชคเซ‡ เชซเชฟเชฒเซเชŸเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เช•เชพเชฐเชฃ เช•เซ‡ เชœเซ‹ เชตเชฟเชจเซเชกเซ‹เชจเซเช‚ เช•เชฆ เชจเชฟเชถเซเชšเชฟเชค เชนเซ‹เชฏ เช…เชจเซ‡ เชชเซเชฐเชพเชชเซเชคเช•เชฐเซเชคเชพ เช…เชจเซ‡ เชชเซเชฐเซ‡เชทเช• เชฎเชพเชŸเซ‡ เชธเชฎเชพเชจ เชนเซ‹เชฏ, เชคเซ‹ เชชเซ‡เช•เซ‡เชŸเชจเชพ เชฌเซเชฒเซ‹เช•เชจเซ‡ เชจเซเช•เชถเชพเชจ เชตเชฟเชจเชพ เชชเชนเซ‹เช‚เชšเชพเชกเชตเชพเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชตเชฟเชจเซเชกเซ‹เชจเซ‡ เชกเซ‡เชŸเชพเชจเชพ เช†เช—เชฒเชพ เชฌเซเชฒเซ‹เช•เชจเชพ เชชเซ‡เช•เซ‡เชŸเซ‹ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช–เชธเซ‡เชกเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชกเชฟเชฒเชฟเชตเชฐเซ€เชจเซ€ เชชเซเชทเซเชŸเชฟ เชฅเชพเชฏ เช›เซ‡. เชฎเซ‹เช•เชฒเซ‡เชฒ. เชœเซ‹ เชตเชฐเซเช• เชŸเชพเชˆเชฎเชฐ เชฆเซเชตเชพเชฐเชพ เชจเชฟเชฐเซเชงเชพเชฐเชฟเชค เชธเชฎเชฏเช—เชพเชณเชพเชจเซ€ เช…เช‚เชฆเชฐ เชตเชฟเชจเซเชกเซ‹ เชญเชฐเชพเชฏ เชจเชนเซ€เช‚, เชคเซ‹ เชšเซ‡เช• เชถเชฐเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡ เช•เซ‡ เชœเซ‡เชจเชพ เชชเชฐ เชชเซ‡เช•เซ‡เชŸเซ‹ เชตเชฟเชคเชฐเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เชจเชฅเซ€ เช…เชจเซ‡ เชชเซเชจเชƒเชกเชฟเชฒเชฟเชตเชฐเซ€ เชฎเชพเชŸเซ‡เชจเซ€ เชตเชฟเชจเช‚เชคเซ€เช“ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡.
เชฐเซ€เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เชกเชพเชฏเชพเช—เซเชฐเชพเชฎ:เชจเซ‡เชŸ เชฎเชพเชŸเซ‡ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ Udp เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซเช‚ เช…เชฎเชฒเซ€เช•เชฐเชฃ

เชธเชฎเชฏเชธเชฎเชพเชชเซเชคเชฟ เช…เชจเซ‡ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชŸเชพเชˆเชฎเชฐ

เช•เชจเซ‡เช•เซเชถเชจ เชธเซเชฅเชพเชชเชฟเชค เช•เชฐเซ€ เชถเช•เชพเชคเซเช‚ เชจเชฅเซ€ เชคเซ‡เชจเชพ เช˜เชฃเชพ เช•เชพเชฐเชฃเซ‹ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชœเซ‹ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชจเชพเชฐ เชชเช•เซเชท เช‘เชซเชฒเชพเช‡เชจ เชนเซ‹เชฏ. เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เช•เชจเซ‡เช•เซเชถเชจ เชธเซเชฅเชพเชชเชฟเชค เช•เชฐเชตเชพเชจเซ‹ เชชเซเชฐเชฏเชพเชธ เช•เชฐเชคเซ€ เชตเช–เชคเซ‡, เชธเชฎเชฏเชธเชฎเชพเชชเซเชคเชฟ เชฆเซเชตเชพเชฐเชพ เชœเซ‹เชกเชพเชฃ เชฌเช‚เชง เชฅเชˆ เชœเชถเซ‡. เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ UDP เช…เชฎเชฒเซ€เช•เชฐเชฃ เชธเชฎเชฏเชธเชฎเชพเชชเซเชคเชฟ เชธเซ‡เชŸ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฌเซ‡ เชŸเชพเชˆเชฎเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ‡ เช›เซ‡. เชชเซเชฐเชฅเชฎ, เช•เชพเชฐเซเชฏเช•เชพเชฐเซ€ เชŸเชพเชˆเชฎเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เชฐเชฟเชฎเซ‹เชŸ เชนเซ‹เชธเซเชŸ เชคเชฐเชซเชฅเซ€ เชชเซเชฐเชคเชฟเชธเชพเชฆเชจเซ€ เชฐเชพเชน เชœเซ‹เชตเชพ เชฎเชพเชŸเซ‡ เชฅเชพเชฏ เช›เซ‡. เชœเซ‹ เชคเซ‡ เชชเซเชฐเซ‡เชทเช• เชฌเชพเชœเซ เชชเชฐ เชซเชพเชฏเชฐ เชฅเชพเชฏ เช›เซ‡, เชคเซ‹ เช›เซ‡เชฒเซเชฒเซเช‚ เชฎเซ‹เช•เชฒเซ‡เชฒเซเช‚ เชชเซ‡เช•เซ‡เชŸ เชซเชฐเซ€เชฅเซ€ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชœเซ‹ เชŸเชพเชˆเชฎเชฐ เชชเซเชฐเชพเชชเซเชคเช•เชฐเซเชคเชพ เชชเชฐ เชธเชฎเชพเชชเซเชค เชฅเชพเชฏ เช›เซ‡, เชคเซ‹ เชชเช›เซ€ เช–เซ‹เชตเชพเชฏเซ‡เชฒเชพ เชชเซ‡เช•เซ‡เชŸเซ‹เชจเซ€ เชคเชชเชพเชธ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชซเชฐเซ€เชฅเซ€ เชตเชฟเชคเชฐเชฃ เชฎเชพเชŸเซ‡เชจเซ€ เชตเชฟเชจเช‚เชคเซ€เช“ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เชจเซ‹เชกเซเชธ เชตเชšเซเชšเซ‡เชจเชพ เชธเช‚เชšเชพเชฐเชจเชพ เช…เชญเชพเชตเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เช•เชจเซ‡เช•เซเชถเชจเชจเซ‡ เชฌเช‚เชง เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชฌเซ€เชœเชพ เชŸเชพเชˆเชฎเชฐเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡. เชชเซเชฐเซ‡เชทเช• เชฌเชพเชœเซ เชฎเชพเชŸเซ‡, เชคเซ‡ เช•เชพเชฐเซเชฏเช•เชพเชฐเซ€ เชŸเชพเชˆเชฎเชฐ เชธเชฎเชพเชชเซเชค เชฅเชฏเชพ เชชเช›เซ€ เชคเชฐเชค เชœ เชถเชฐเซ‚ เชฅเชพเชฏ เช›เซ‡, เช…เชจเซ‡ เชฐเชฟเชฎเซ‹เชŸ เชจเซ‹เชก เชคเชฐเชซเชฅเซ€ เชชเซเชฐเชคเชฟเชธเชพเชฆเชจเซ€ เชฐเชพเชน เชœเซเช เช›เซ‡. เชœเซ‹ เชจเชฟเชฐเซเชฆเชฟเชทเซเชŸ เชธเชฎเชฏเช—เชพเชณเชพเชฎเชพเช‚ เช•เซ‹เชˆ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชจ เชฎเชณเซ‡, เชคเซ‹ เช•เชจเซ‡เช•เซเชถเชจ เชธเชฎเชพเชชเซเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชธเช‚เชธเชพเชงเชจเซ‹ เชฌเชนเชพเชฐ เชชเชพเชกเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชฐเซ€เชธเซ€เชตเชฟเช‚เช— เชฌเชพเชœเซ เชฎเชพเชŸเซ‡, เช•เชจเซ‡เช•เซเชถเชจ เช•เซเชฒเซ‹เช เชŸเชพเชˆเชฎเชฐ เชตเชฐเซเช• เชŸเชพเชˆเชฎเชฐ เชฌเซ‡ เชตเชพเชฐ เชธเชฎเชพเชชเซเชค เชฅเชฏเชพ เชชเช›เซ€ เชถเชฐเซ‚ เชฅเชพเชฏ เช›เซ‡. เช•เชจเซเชซเชฐเซเชฎเซ‡เชถเชจ เชชเซ‡เช•เซ‡เชŸเชจเซ€ เช–เซ‹เชŸ เชธเชพเชฎเซ‡ เชตเซ€เชฎเซ‹ เชฒเซ‡เชตเชพ เชฎเชพเชŸเซ‡ เช† เชœเชฐเซ‚เชฐเซ€ เช›เซ‡. เชœเซเชฏเชพเชฐเซ‡ เชŸเชพเชˆเชฎเชฐ เชธเชฎเชพเชชเซเชค เชฅเชพเชฏ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เช•เชจเซ‡เช•เซเชถเชจ เชชเชฃ เชธเชฎเชพเชชเซเชค เชฅเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เชธเช‚เชธเชพเชงเชจเซ‹ เชชเซเชฐเช•เชพเชถเชฟเชค เชฅเชพเชฏ เช›เซ‡.

เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ UDP เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เชธเซเชŸเซ‡เชŸ เชกเชพเชฏเชพเช—เซเชฐเชพเชฎ

เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเชพ เชธเชฟเชฆเซเชงเชพเช‚เชคเซ‹ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เชฐเชพเชœเซเชฏ เชฎเชถเซ€เชจเชฎเชพเช‚ เชฒเชพเช—เซ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชœเซ‡เชฎเชพเช‚เชฅเซ€ เชฆเชฐเซ‡เช• เชฐเชพเชœเซเชฏ เชชเซ‡เช•เซ‡เชŸ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพเชจเชพ เชšเซ‹เช•เซเช•เชธ เชคเชฐเซเช• เชฎเชพเชŸเซ‡ เชœเชตเชพเชฌเชฆเชพเชฐ เช›เซ‡.
เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ UDP เชธเซเชŸเซ‡เชŸ เชกเชพเชฏเชพเช—เซเชฐเชพเชฎ:

เชจเซ‡เชŸ เชฎเชพเชŸเซ‡ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ Udp เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซเช‚ เช…เชฎเชฒเซ€เช•เชฐเชฃ

เชฌเช‚เชง - เช–เชฐเซ‡เช–เชฐ เชเช• เชฐเชพเชœเซเชฏ เชจเชฅเซ€, เชคเซ‡ เช“เชŸเซ‹เชฎเซ‡เชŸเชจ เชฎเชพเชŸเซ‡ เชถเชฐเซ‚เช†เชค เช…เชจเซ‡ เช…เช‚เชคเชฟเชฎ เชฌเชฟเช‚เชฆเซ เช›เซ‡. เชฐเชพเชœเซเชฏ เชฎเชพเชŸเซ‡ เชฌเช‚เชง เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เช•เช‚เชŸเซเชฐเซ‹เชฒ เชฌเซเชฒเซ‹เช• เชชเซเชฐเชพเชชเซเชค เชฅเชพเชฏ เช›เซ‡, เชœเซ‡, เช…เชธเซเชฎเซ‡เชณ UDP เชธเชฐเซเชตเชฐเชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เซ€เชจเซ‡, เชชเซ‡เช•เซ‡เชŸเซ‹เชจเซ‡ เชฏเซ‹เช—เซเชฏ เชœเซ‹เชกเชพเชฃเซ‹ เชชเชฐ เชซเซ‹เชฐเชตเชฐเซเชก เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชธเซเชŸเซ‡เชŸ เชชเซเชฐเซ‹เชธเซ‡เชธเชฟเช‚เช— เชถเชฐเซ‚ เช•เชฐเซ‡ เช›เซ‡.

FirstPacketSending - เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เชธเซเชฅเชฟเชคเชฟ เชœเซ‡เชฎเชพเช‚ เชธเช‚เชฆเซ‡เชถ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เชคเซเชฏเชพเชฐเซ‡ เช†เช‰เชŸเช—เซ‹เช‡เช‚เช— เช•เชจเซ‡เช•เซเชถเชจ เชนเซ‹เชฏ เช›เซ‡.

เช† เชธเซเชฅเชฟเชคเชฟเชฎเชพเช‚, เชธเชพเชฎเชพเชจเซเชฏ เชธเช‚เชฆเซ‡เชถเชพเช“ เชฎเชพเชŸเซ‡ เชชเซเชฐเชฅเชฎ เชชเซ‡เช•เซ‡เชŸ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชชเซเชทเซเชŸเชฟเช•เชฐเชฃ เชตเชฟเชจเชพเชจเชพ เชธเช‚เชฆเซ‡เชถเชพเช“ เชฎเชพเชŸเซ‡, เช† เชเช•เชฎเชพเชคเซเชฐ เชฐเชพเชœเซเชฏ เช›เซ‡ เชœเซเชฏเชพเช‚ เชธเชฎเช—เซเชฐ เชธเช‚เชฆเซ‡เชถ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เชธเชพเชฏเช•เชฒ เชฎเซ‹เช•เชฒเซ‹ - เชธเช‚เชฆเซ‡เชถ เชชเซ‡เช•เซ‡เชŸเชจเชพ เชชเซเชฐเชธเชพเชฐเชฃ เชฎเชพเชŸเซ‡ เช—เซเชฐเชพเช‰เชจเซเชก เชธเซเชŸเซ‡เชŸ.

เชฐเชพเชœเซเชฏเชฎเชพเช‚เชฅเซ€ เชคเซ‡เชฎเชพเช‚ เชธเช‚เช•เซเชฐเชฎเชฃ FirstPacketSending เชธเช‚เชฆเซ‡เชถเชจเซเช‚ เชชเซเชฐเชฅเชฎ เชชเซ‡เช•เซ‡เชŸ เชฎเซ‹เช•เชฒเซเชฏเชพ เชชเช›เซ€ เชนเชพเชฅ เชงเชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชคเซ‡ เช† เชธเซเชฅเชฟเชคเชฟเชฎเชพเช‚ เช›เซ‡ เช•เซ‡ เชคเชฎเชพเชฎ เชธเซเชตเซ€เช•เซƒเชคเชฟเช“ เช…เชจเซ‡ เชชเซเชจเชƒเชชเซเชฐเชธเชพเชฐเชฃ เชฎเชพเชŸเซ‡เชจเซ€ เชตเชฟเชจเช‚เชคเซ€เช“ เช†เชตเซ‡ เช›เซ‡. เชคเซ‡เชฎเชพเช‚เชฅเซ€ เชฌเชนเชพเชฐ เชจเซ€เช•เชณเชตเซเช‚ เชฌเซ‡ เช•เชฟเชธเซเชธเชพเช“เชฎเชพเช‚ เชถเช•เซเชฏ เช›เซ‡ - เชธเช‚เชฆเซ‡เชถเชจเชพ เชธเชซเชณ เชตเชฟเชคเชฐเชฃเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เช…เชฅเชตเชพ เชธเชฎเชฏ เชธเชฎเชพเชชเซเชค เชฅเชตเชพเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚.

เชซเชฐเซเชธเซเชŸเชชเซ‡เช•เซ‡เชŸ เชชเซเชฐเชพเชชเซเชค เชฅเชฏเซเช‚ - เชธเช‚เชฆเซ‡เชถ เชชเซเชฐเชพเชชเซเชคเช•เชฐเซเชคเชพ เชฎเชพเชŸเซ‡ เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เชธเซเชฅเชฟเชคเชฟ.

เชคเซ‡ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจเชจเซ€ เชถเชฐเซ‚เช†เชคเชจเซ€ เชถเซเชฆเซเชงเชคเชพ เชคเชชเชพเชธเซ‡ เช›เซ‡, เชœเชฐเซ‚เชฐเซ€ เชฌเช‚เชงเชพเชฐเชฃ เชฌเชจเชพเชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชชเซเชฐเชฅเชฎ เชชเซ‡เช•เซ‡เชŸเชจเซ€ เชฐเชธเซ€เชฆ เชฎเซ‹เช•เชฒเซ‡ เช›เซ‡.

เชเชตเชพ เชธเช‚เชฆเซ‡เชถ เชฎเชพเชŸเซ‡ เช•เซ‡ เชœเซ‡เชฎเชพเช‚ เชเช• เชœ เชชเซ‡เช•เซ‡เชŸ เชนเซ‹เชฏ เช…เชจเซ‡ เชกเชฟเชฒเชฟเชตเชฐเซ€เชจเชพ เชชเซเชฐเชพเชตเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซเชฏเชพ เชตเชฟเชจเชพ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซ‹ เชนเซ‹เชฏ, เช† เชเช•เชฎเชพเชคเซเชฐ เชฐเชพเชœเซเชฏ เช›เซ‡. เช†เชตเชพ เชธเช‚เชฆเซ‡เชถ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเซเชฏเชพ เชชเช›เซ€, เช•เชจเซ‡เช•เซเชถเชจ เชฌเช‚เชง เช›เซ‡.

เชเชธเซ‡เชฎเซเชฌเชฒเชฟเช‚เช— - เชธเช‚เชฆเซ‡เชถ เชชเซ‡เช•เซ‡เชŸเซ‹ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชฎเซ‚เชณเชญเซ‚เชค เชธเซเชฅเชฟเชคเชฟ.

เชคเซ‡ เช…เชธเซเชฅเชพเชฏเซ€ เชธเช‚เช—เซเชฐเชน เชฎเชพเชŸเซ‡ เชชเซ‡เช•เซ‡เชŸเซ‹ เชฒเช–เซ‡ เช›เซ‡, เชชเซ‡เช•เซ‡เชŸเชจเซ€ เช–เซ‹เชŸ เชคเชชเชพเชธเซ‡ เช›เซ‡, เชชเซ‡เช•เซ‡เชŸเซ‹เชจเชพ เชฌเซเชฒเซ‹เช• เช…เชจเซ‡ เชธเชฎเช—เซเชฐ เชธเช‚เชฆเซ‡เชถเชจเซ€ เชกเชฟเชฒเชฟเชตเชฐเซ€ เชฎเชพเชŸเซ‡ เชธเซเชตเซ€เช•เซƒเชคเชฟเช“ เชฎเซ‹เช•เชฒเซ‡ เช›เซ‡ เช…เชจเซ‡ เช–เซ‹เชตเชพเชฏเซ‡เชฒเชพ เชชเซ‡เช•เซ‡เชŸเซ‹เชจเซ€ เชชเซเชจเชƒ เชกเชฟเชฒเชฟเชตเชฐเซ€ เชฎเชพเชŸเซ‡ เชตเชฟเชจเช‚เชคเซ€เช“ เชฎเซ‹เช•เชฒเซ‡ เช›เซ‡. เชธเชฎเช—เซเชฐ เชธเช‚เชฆเซ‡เชถเชจเซ€ เชธเชซเชณ เชชเซเชฐเชพเชชเซเชคเชฟเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เช•เชจเซ‡เช•เซเชถเชจ เชฐเชพเชœเซเชฏเชฎเชพเช‚ เชœเชพเชฏ เช›เซ‡ เชชเซ‚เชฐเซเชฃ, เช…เชจเซเชฏเชฅเชพ, เชธเชฎเชฏเชธเชฎเชพเชชเซเชคเชฟ เชฌเชนเชพเชฐ เชจเซ€เช•เชณเซ€ เชœเชพเชฏ เช›เซ‡.

เชชเซ‚เชฐเซเชฃ - เชธเชฎเช—เซเชฐ เชธเช‚เชฆเซ‡เชถเชจเซ€ เชธเชซเชณเชคเชพเชชเซ‚เชฐเซเชตเช• เชชเซเชฐเชพเชชเซเชคเชฟเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เช•เชจเซ‡เช•เซเชถเชจ เชฌเช‚เชง เช•เชฐเชตเซเช‚.

เช† เชธเซเชฅเชฟเชคเชฟ เชธเช‚เชฆเซ‡เชถเชจเซ€ เชเชธเซ‡เชฎเซเชฌเชฒเซ€ เชฎเชพเชŸเซ‡ เช…เชจเซ‡ เชคเซ‡ เช•เซ‡เชธ เชฎเชพเชŸเซ‡ เชœเชฐเซ‚เชฐเซ€ เช›เซ‡ เชœเซเชฏเชพเชฐเซ‡ เชชเซเชฐเซ‡เชทเช•เชจเชพ เชฎเชพเชฐเซเช—เชฎเชพเช‚ เชธเช‚เชฆเซ‡เชถเชจเซ€ เชกเชฟเชฒเชฟเชตเชฐเซ€ เชชเซเชทเซเชŸเชฟ เช–เซ‹เชตเชพเชˆ เช—เชˆ เชนเชคเซ€. เช† เชธเซเชฅเชฟเชคเชฟ เชธเชฎเชฏเชธเชฎเชพเชชเซเชคเชฟ เชฆเซเชตเชพเชฐเชพ เชฌเชนเชพเชฐ เชจเซ€เช•เชณเซ€ เช›เซ‡, เชชเชฐเช‚เชคเซ เช•เชจเซ‡เช•เซเชถเชจ เชธเชซเชณเชคเชพเชชเซ‚เชฐเซเชตเช• เชฌเช‚เชง เชฎเชพเชจเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.

เช•เซ‹เชกเชฎเชพเช‚ เชตเชงเซ เชŠเช‚เชกเซ‡. เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เช•เช‚เชŸเซเชฐเซ‹เชฒ เชฏเซเชจเชฟเชŸ

เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ UDP เชจเชพ เชฎเซเช–เซเชฏ เช˜เชŸเช•เซ‹เชฎเชพเช‚เชจเซเช‚ เชเช• เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เช•เช‚เชŸเซเชฐเซ‹เชฒ เชฌเซเชฒเซ‹เช• เช›เซ‡. เช† เชฌเซเชฒเซ‹เช•เชจเซเช‚ เช•เชพเชฐเซเชฏ เชตเชฐเซเชคเชฎเชพเชจ เชœเซ‹เชกเชพเชฃเซ‹ เช…เชจเซ‡ เชธเชนเชพเชฏเช• เชคเชคเซเชตเซ‹เชจเซ‡ เชธเช‚เช—เซเชฐเชนเชฟเชค เช•เชฐเชตเชพเชจเซเช‚ เช›เซ‡, เช†เชตเชจเชพเชฐเชพ เชชเซ‡เช•เซ‡เชŸเซ‹เชจเซ‡ เชธเช‚เชฌเช‚เชงเชฟเชค เชœเซ‹เชกเชพเชฃเซ‹เชฎเชพเช‚ เชตเชฟเชคเชฐเชฟเชค เช•เชฐเชตเชพ, เช•เชจเซ‡เช•เซเชถเชจเชฎเชพเช‚ เชชเซ‡เช•เซ‡เชŸเซ‹ เชฎเซ‹เช•เชฒเชตเชพ เชฎเชพเชŸเซ‡ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชชเซเชฐเชฆเชพเชจ เช•เชฐเชตเชพ เช…เชจเซ‡ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ API เชจเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพเชจเซเช‚ เช›เซ‡. เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เช•เช‚เชŸเซเชฐเซ‹เชฒ เชฌเซเชฒเซ‹เช• UDP เชฒเซ‡เชฏเชฐเชฎเชพเช‚เชฅเซ€ เชชเซ‡เช•เซ‡เชŸเซ‹ เชฎเซ‡เชณเชตเซ‡ เช›เซ‡ เช…เชจเซ‡ เชคเซ‡เชจเซ‡ เชชเซเชฐเซ‹เชธเซ‡เชธเชฟเช‚เช— เชฎเชพเชŸเซ‡ เชธเซเชŸเซ‡เชŸ เชฎเชถเซ€เชจเชจเซ‡ เชซเซ‹เชฐเชตเชฐเซเชก เช•เชฐเซ‡ เช›เซ‡. เชชเซ‡เช•เซ‡เชŸเซ‹ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเซ‡ เช…เชธเซเชฎเซ‡เชณ UDP เชธเชฐเซเชตเชฐเชจเซ‡ เชฒเชพเช—เซ เช•เชฐเซ‡ เช›เซ‡.
ReliableUdpConnectionControlBlock เชตเชฐเซเช—เชจเชพ เช•เซ‡เชŸเชฒเชพเช• เชธเชญเซเชฏเซ‹:

internal class ReliableUdpConnectionControlBlock : IDisposable
{
  // ะผะฐััะธะฒ ะฑะฐะนั‚ ะดะปั ัƒะบะฐะทะฐะฝะฝะพะณะพ ะบะปัŽั‡ะฐ. ะ˜ัะฟะพะปัŒะทัƒะตั‚ัั ะดะปั ัะฑะพั€ะบะธ ะฒั…ะพะดัั‰ะธั… ัะพะพะฑั‰ะตะฝะธะน    
  public ConcurrentDictionary<Tuple<EndPoint, Int32>, byte[]> IncomingStreams { get; private set;}
  // ะผะฐััะธะฒ ะฑะฐะนั‚ ะดะปั ัƒะบะฐะทะฐะฝะฝะพะณะพ ะบะปัŽั‡ะฐ. ะ˜ัะฟะพะปัŒะทัƒะตั‚ัั ะดะปั ะพั‚ะฟั€ะฐะฒะบะธ ะธัั…ะพะดัั‰ะธั… ัะพะพะฑั‰ะตะฝะธะน.
  public ConcurrentDictionary<Tuple<EndPoint, Int32>, byte[]> OutcomingStreams { get; private set; }
  // connection record ะดะปั ัƒะบะฐะทะฐะฝะฝะพะณะพ ะบะปัŽั‡ะฐ.
  private readonly ConcurrentDictionary<Tuple<EndPoint, Int32>, ReliableUdpConnectionRecord> m_listOfHandlers;
  // ัะฟะธัะพะบ ะฟะพะดะฟะธัั‡ะธะบะพะฒ ะฝะฐ ัะพะพะฑั‰ะตะฝะธั.
  private readonly List<ReliableUdpSubscribeObject> m_subscribers;    
  // ะปะพะบะฐะปัŒะฝั‹ะน ัะพะบะตั‚    
  private Socket m_socketIn;
  // ะฟะพั€ั‚ ะดะปั ะฒั…ะพะดัั‰ะธั… ัะพะพะฑั‰ะตะฝะธะน
  private int m_port;
  // ะปะพะบะฐะปัŒะฝั‹ะน IP ะฐะดั€ะตั
  private IPAddress m_ipAddress;    
  // ะปะพะบะฐะปัŒะฝะฐั ะบะพะฝะตั‡ะฝะฐั ั‚ะพั‡ะบะฐ    
  public IPEndPoint LocalEndpoint { get; private set; }    
  // ะบะพะปะปะตะบั†ะธั ะฟั€ะตะดะฒะฐั€ะธั‚ะตะปัŒะฝะพ ะธะฝะธั†ะธะฐะปะธะทะธั€ะพะฒะฐะฝะฝั‹ั…
  // ัะพัั‚ะพัะฝะธะน ะบะพะฝะตั‡ะฝะพะณะพ ะฐะฒั‚ะพะผะฐั‚ะฐ
  public StatesCollection States { get; private set; }
  // ะณะตะฝะตั€ะฐั‚ะพั€ ัะปัƒั‡ะฐะนะฝั‹ั… ั‡ะธัะตะป. ะ˜ัะฟะพะปัŒะทัƒะตั‚ัั ะดะปั ัะพะทะดะฐะฝะธั TransmissionId
  private readonly RNGCryptoServiceProvider m_randomCrypto;    	
  //...
}

เช…เชธเซเชฎเซ‡เชณ UDP เชธเชฐเซเชตเชฐเชจเซเช‚ เช…เชฎเชฒเซ€เช•เชฐเชฃ:

private void Receive()
{
  EndPoint connectedClient = new IPEndPoint(IPAddress.Any, 0);
  // ัะพะทะดะฐะตะผ ะฝะพะฒั‹ะน ะฑัƒั„ะตั€, ะดะปั ะบะฐะถะดะพะณะพ socket.BeginReceiveFrom 
  byte[] buffer = new byte[DefaultMaxPacketSize + ReliableUdpHeader.Length];
  // ะฟะตั€ะตะดะฐะตะผ ะฑัƒั„ะตั€ ะฒ ะบะฐั‡ะตัั‚ะฒะต ะฟะฐั€ะฐะผะตั‚ั€ะฐ ะดะปั ะฐัะธะฝั…ั€ะพะฝะฝะพะณะพ ะผะตั‚ะพะดะฐ
  this.m_socketIn.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref connectedClient, EndReceive, buffer);
}   

private void EndReceive(IAsyncResult ar)
{
  EndPoint connectedClient = new IPEndPoint(IPAddress.Any, 0);
  int bytesRead = this.m_socketIn.EndReceiveFrom(ar, ref connectedClient);
  //ะฟะฐะบะตั‚ ะฟะพะปัƒั‡ะตะฝ, ะณะพั‚ะพะฒั‹ ะฟั€ะธะฝะธะผะฐั‚ัŒ ัะปะตะดัƒัŽั‰ะธะน        
  Receive();
  // ั‚.ะบ. ะฟั€ะพัั‚ะตะนัˆะธะน ัะฟะพัะพะฑ ั€ะตัˆะธั‚ัŒ ะฒะพะฟั€ะพั ั ะฑัƒั„ะตั€ะพะผ - ะฟะพะปัƒั‡ะธั‚ัŒ ััั‹ะปะบัƒ ะฝะฐ ะฝะตะณะพ 
  // ะธะท IAsyncResult.AsyncState        
  byte[] bytes = ((byte[]) ar.AsyncState).Slice(0, bytesRead);
  // ะฟะพะปัƒั‡ะฐะตะผ ะทะฐะณะพะปะพะฒะพะบ ะฟะฐะบะตั‚ะฐ        
  ReliableUdpHeader header;
  if (!ReliableUdpStateTools.ReadReliableUdpHeader(bytes, out header))
  {          
    // ะฟั€ะธัˆะตะป ะฝะตะบะพั€ั€ะตะบั‚ะฝั‹ะน ะฟะฐะบะตั‚ - ะพั‚ะฑั€ะฐัั‹ะฒะฐะตะผ ะตะณะพ
    return;
  }
  // ะบะพะฝัั‚ั€ัƒะธั€ัƒะตะผ ะบะปัŽั‡ ะดะปั ะพะฟั€ะตะดะตะปะตะฝะธั connection recordโ€™ะฐ ะดะปั ะฟะฐะบะตั‚ะฐ
  Tuple<EndPoint, Int32> key = new Tuple<EndPoint, Int32>(connectedClient, header.TransmissionId);
  // ะฟะพะปัƒั‡ะฐะตะผ ััƒั‰ะตัั‚ะฒัƒัŽั‰ัƒัŽ connection record ะธะปะธ ัะพะทะดะฐะตะผ ะฝะพะฒัƒัŽ
  ReliableUdpConnectionRecord record = m_listOfHandlers.GetOrAdd(key, new ReliableUdpConnectionRecord(key, this, header.ReliableUdpMessageType));
  // ะทะฐะฟัƒัะบะฐะตะผ ะฟะฐะบะตั‚ ะฒ ะพะฑั€ะฐะฑะพั‚ะบัƒ ะฒ ะบะพะฝะตั‡ะฝั‹ะน ะฐะฒั‚ะพะผะฐั‚
  record.State.ReceivePacket(record, header, bytes);
}

เชฆเชฐเซ‡เช• เชธเช‚เชฆเซ‡เชถ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เชฎเชพเชŸเซ‡, เชเช• เชฎเชพเชณเช–เซเช‚ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เชœเซ‡เชฎเชพเช‚ เช•เชจเซ‡เช•เซเชถเชจ เชตเชฟเชถเซ‡เชจเซ€ เชฎเชพเชนเชฟเชคเซ€ เชนเซ‹เชฏ เช›เซ‡. เช†เชตเซ€ เชฐเชšเชจเชพ เช•เชนเซ‡เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เช•เชจเซ‡เช•เซเชถเชจ เชฐเซ‡เช•เซ‹เชฐเซเชก.
ReliableUdpConnectionRecord เชตเชฐเซเช—เชจเชพ เช•เซ‡เชŸเชฒเชพเช• เชธเชญเซเชฏเซ‹:

internal class ReliableUdpConnectionRecord : IDisposable
{    
  // ะผะฐััะธะฒ ะฑะฐะนั‚ ั ัะพะพะฑั‰ะตะฝะธะตะผ    
  public byte[] IncomingStream { get; set; }
  // ััั‹ะปะบะฐ ะฝะฐ ัะพัั‚ะพัะฝะธะต ะบะพะฝะตั‡ะฝะพะณะพ ะฐะฒั‚ะพะผะฐั‚ะฐ    
  public ReliableUdpState State { get; set; }    
  // ะฟะฐั€ะฐ, ะพะดะฝะพะทะฝะฐั‡ะฝะพ ะพะฟั€ะตะดะตะปััŽั‰ะฐั connection record
  // ะฒ ะฑะปะพะบะต ัƒะฟั€ะฐะฒะปะตะฝะธั ะฟะตั€ะตะดะฐั‡ะตะน     
  public Tuple<EndPoint, Int32> Key { get; private set;}
  // ะฝะธะถะฝัั ะณั€ะฐะฝะธั†ะฐ ะฟั€ะธะตะผะฝะพะณะพ ะพะบะฝะฐ    
  public int WindowLowerBound;
  // ั€ะฐะทะผะตั€ ะพะบะฝะฐ ะฟะตั€ะตะดะฐั‡ะธ
  public readonly int WindowSize;     
  // ะฝะพะผะตั€ ะฟะฐะบะตั‚ะฐ ะดะปั ะพั‚ะฟั€ะฐะฒะบะธ
  public int SndNext;
  // ะบะพะปะธั‡ะตัั‚ะฒะพ ะฟะฐะบะตั‚ะพะฒ ะดะปั ะพั‚ะฟั€ะฐะฒะบะธ
  public int NumberOfPackets;
  // ะฝะพะผะตั€ ะฟะตั€ะตะดะฐั‡ะธ (ะธะผะตะฝะฝะพ ะพะฝ ะธ ะตัั‚ัŒ ะฒั‚ะพั€ะฐั ั‡ะฐัั‚ัŒ Tuple)
  // ะดะปั ะบะฐะถะดะพะณะพ ัะพะพะฑั‰ะตะฝะธั ัะฒะพะน	
  public readonly Int32 TransmissionId;
  // ัƒะดะฐะปะตะฝะฝั‹ะน IP endpoint โ€“ ัะพะฑัั‚ะฒะตะฝะฝะพ ะฟะพะปัƒั‡ะฐั‚ะตะปัŒ ัะพะพะฑั‰ะตะฝะธั
  public readonly IPEndPoint RemoteClient;
  // ั€ะฐะทะผะตั€ ะฟะฐะบะตั‚ะฐ, ะฒะพ ะธะทะฑะตะถะฐะฝะธะต ั„ั€ะฐะณะผะตะฝั‚ะฐั†ะธะธ ะฝะฐ IP ัƒั€ะพะฒะฝะต
  // ะฝะต ะดะพะปะถะตะฝ ะฟั€ะตะฒั‹ัˆะฐั‚ัŒ MTU โ€“ (IP.Header + UDP.Header + RelaibleUDP.Header)
  public readonly int BufferSize;
  // ะฑะปะพะบ ัƒะฟั€ะฐะฒะปะตะฝะธั ะฟะตั€ะตะดะฐั‡ะตะน
  public readonly ReliableUdpConnectionControlBlock Tcb;
  // ะธะฝะบะฐะฟััƒะปะธั€ัƒะตั‚ ั€ะตะทัƒะปัŒั‚ะฐั‚ั‹ ะฐัะธะฝั…ั€ะพะฝะฝะพะน ะพะฟะตั€ะฐั†ะธะธ ะดะปั BeginSendMessage/EndSendMessage
  public readonly AsyncResultSendMessage AsyncResult;
  // ะฝะต ะพั‚ะฟั€ะฐะฒะปัั‚ัŒ ะฟะฐะบะตั‚ั‹ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธั
  public bool IsNoAnswerNeeded;
  // ะฟะพัะปะตะดะฝะธะน ะบะพั€ั€ะตะบั‚ะฝะพ ะฟะพะปัƒั‡ะตะฝะฝั‹ะน ะฟะฐะบะตั‚ (ะฒัะตะณะดะฐ ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐะตั‚ัั ะฒ ะฝะฐะธะฑะพะปัŒัˆะธะน ะฝะพะผะตั€)
  public int RcvCurrent;
  // ะผะฐััะธะฒ ั ะฝะพะผะตั€ะฐะผะธ ะฟะพั‚ะตั€ัะฝะฝั‹ั… ะฟะฐะบะตั‚ะพะฒ
  public int[] LostPackets { get; private set; }
  // ะฟั€ะธัˆะตะป ะปะธ ะฟะพัะปะตะดะฝะธะน ะฟะฐะบะตั‚. ะ˜ัะฟะพะปัŒะทัƒะตั‚ัั ะบะฐะบ bool.
  public int IsLastPacketReceived = 0;
  //...
}

เช•เซ‹เชกเชฎเชพเช‚ เชตเชงเซ เชŠเช‚เชกเซ‡. เชฐเชพเชœเซเชฏเซ‹

เชฐเชพเชœเซเชฏเซ‹ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ UDP เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเชพ เชฐเชพเชœเซเชฏ เชฎเชถเซ€เชจเชจเซ‹ เช…เชฎเชฒ เช•เชฐเซ‡ เช›เซ‡, เชœเซเชฏเชพเช‚ เชชเซ‡เช•เซ‡เชŸเซ‹เชจเซ€ เชฎเซเช–เซเชฏ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชฅเชพเชฏ เช›เซ‡. เช…เชฎเซ‚เชฐเซเชค เชตเชฐเซเช— ReliableUdpState เชฐเชพเชœเซเชฏ เชฎเชพเชŸเซ‡ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡:

เชจเซ‡เชŸ เชฎเชพเชŸเซ‡ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ Udp เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซเช‚ เช…เชฎเชฒเซ€เช•เชฐเชฃ

เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซ‹ เชธเชฎเช—เซเชฐ เชคเชฐเซเช• เช‰เชชเชฐ เชชเซเชฐเชธเซเชคเซเชค เชตเชฐเซเช—เซ‹ เชฆเซเชตเชพเชฐเชพ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชเช• เชธเชนเชพเชฏเช• เชตเชฐเซเช— เชธเชพเชฅเซ‡ เชœเซ‡ เชธเซเชฅเชฟเชฐ เชชเชฆเซเชงเชคเชฟเช“ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ‡ เช›เซ‡, เชœเซ‡เชฎ เช•เซ‡, เช•เชจเซ‡เช•เซเชถเชจ เชฐเซ‡เช•เซ‹เชฐเซเชกเชฎเชพเช‚เชฅเซ€ ReliableUdp เชนเซ‡เชกเชฐเชจเซเช‚ เชจเชฟเชฐเซเชฎเชพเชฃ.

เช†เช—เชณ, เช…เชฎเซ‡ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชชเชฆเซเชงเชคเชฟเช“เชจเชพ เช…เชฎเชฒเซ€เช•เชฐเชฃ เชตเชฟเชถเซ‡ เชตเชฟเช—เชคเชตเชพเชฐ เชตเชฟเชšเชพเชฐเชฃเชพ เช•เชฐเซ€เชถเซเช‚ เชœเซ‡ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเชพ เชฎเซ‚เชณเชญเซ‚เชค เช…เชฒเซเช—เซ‹เชฐเชฟเชงเชฎเซเชธเชจเซ‡ เชจเชฟเชฐเซเชงเชพเชฐเชฟเชค เช•เชฐเซ‡ เช›เซ‡.

DisposeByTimeout เชชเชฆเซเชงเชคเชฟ

DisposeByTimeout เชชเชฆเซเชงเชคเชฟ เชธเชฎเชฏเชธเชฎเชพเชชเซเชคเชฟ เชชเช›เซ€ เช•เชจเซ‡เช•เซเชถเชจ เชธเช‚เชธเชพเชงเชจเซ‹ เช›เซ‹เชกเชตเชพ เชฎเชพเชŸเซ‡ เช…เชจเซ‡ เชธเชซเชณ/เช…เชธเชซเชณ เชธเช‚เชฆเซ‡เชถ เชกเชฟเชฒเชฟเชตเชฐเซ€เชจเซ‹ เชธเช‚เช•เซ‡เชค เช†เชชเชตเชพ เชฎเชพเชŸเซ‡ เชœเชตเชพเชฌเชฆเชพเชฐ เช›เซ‡.
ReliableUdpState.DisposeByTimeout:

protected virtual void DisposeByTimeout(object record)
{
  ReliableUdpConnectionRecord connectionRecord = (ReliableUdpConnectionRecord) record;      
  if (record.AsyncResult != null)
  {
    connectionRecord.AsyncResult.SetAsCompleted(false);
  }
  connectionRecord.Dispose();
}

เชคเซ‡ เชฎเชพเชคเซเชฐ เชฐเชพเชœเซเชฏเชฎเชพเช‚ เช“เชตเชฐเชฐเชพเช‡เชก เช›เซ‡ เชชเซ‚เชฐเซเชฃ.
เชชเซ‚เชฐเซเชฃ เชฅเชฏเซเช‚.DisposeByTimeout:

protected override void DisposeByTimeout(object record)
{
  ReliableUdpConnectionRecord connectionRecord = (ReliableUdpConnectionRecord) record;
  // ัะพะพะฑั‰ะฐะตะผ ะพะฑ ัƒัะฟะตัˆะฝะพะผ ะฟะพะปัƒั‡ะตะฝะธะธ ัะพะพะฑั‰ะตะฝะธั
  SetAsCompleted(connectionRecord);        
}

เชชเซเชฐเซ‹เชธเซ‡เชธเชชเซ‡เช•เซ‡เชŸเซเชธ เชชเชฆเซเชงเชคเชฟ

ProcessPackets เชชเชฆเซเชงเชคเชฟ เชชเซ‡เช•เซ‡เชœ เช…เชฅเชตเชพ เชชเซ‡เช•เซ‡เชœเซ‹เชจเซ€ เชตเชงเชพเชฐเชพเชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชฎเชพเชŸเซ‡ เชœเชตเชพเชฌเชฆเชพเชฐ เช›เซ‡. เชธเซ€เชงเชพ เช…เชฅเชตเชพ เชชเซ‡เช•เซ‡เชŸ เชฐเชพเชน เชŸเชพเชˆเชฎเชฐ เชฆเซเชตเชพเชฐเชพ เช•เซ‰เชฒ เช•เชฐเซ‹.

เชธเช•เซเชทเชฎ เชเชธเซ‡เชฎเซเชฌเชฒเชฟเช‚เช— เชชเชฆเซเชงเชคเชฟ เช“เชตเชฐเชฐเชพเช‡เชก เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡ เช…เชจเซ‡ เช–เซ‹เชตเชพเชฏเซ‡เชฒเชพ เชชเซ‡เช•เซ‡เชŸเซ‹ เชฎเชพเชŸเซ‡ เชคเชชเชพเชธ เช•เชฐเชตเชพ เช…เชจเซ‡ เชฐเชพเชœเซเชฏเชฎเชพเช‚ เชธเช‚เช•เซเชฐเชฎเชฃ เชฎเชพเชŸเซ‡ เชœเชตเชพเชฌเชฆเชพเชฐ เช›เซ‡ เชชเซ‚เชฐเซเชฃ, เช›เซ‡เชฒเซเชฒเซเช‚ เชชเซ‡เช•เซ‡เชŸ เชฎเซ‡เชณเชตเชตเชพ เช…เชจเซ‡ เชธเชซเชณ เชšเซ‡เช• เชชเชพเชธ เช•เชฐเชตเชพเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚
เชเชธเซ‡เชฎเซเชฌเชฒเชฟเช‚เช—.เชชเซเชฐเซ‹เชธเซ‡เชธ เชชเซ‡เช•เซ‡เชŸเซเชธ:

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  if (connectionRecord.IsDone != 0)
    return;
  if (!ReliableUdpStateTools.CheckForNoPacketLoss(connectionRecord, connectionRecord.IsLastPacketReceived != 0))
  {
    // ะตัั‚ัŒ ะฟะพั‚ะตั€ัะฝะฝั‹ะต ะฟะฐะบะตั‚ั‹, ะพั‚ัั‹ะปะฐะตะผ ะทะฐะฟั€ะพัั‹ ะฝะฐ ะฝะธั…
    foreach (int seqNum in connectionRecord.LostPackets)
    {
      if (seqNum != 0)
      {
        ReliableUdpStateTools.SendAskForLostPacket(connectionRecord, seqNum);
      }
    }
    // ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐะตะผ ั‚ะฐะนะผะตั€ ะฒะพ ะฒั‚ะพั€ะพะน ั€ะฐะท, ะดะปั ะฟะพะฒั‚ะพั€ะฝะพะน ะฟะพะฟั‹ั‚ะบะธ ะฟะตั€ะตะดะฐั‡ะธ
    if (!connectionRecord.TimerSecondTry)
    {
      connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
      connectionRecord.TimerSecondTry = true;
      return;
    }
    // ะตัะปะธ ะฟะพัะปะต ะดะฒัƒั… ะฟะพะฟั‹ั‚ะพะบ ัั€ะฐะฑะฐั‚ั‹ะฒะฐะฝะธะน WaitForPacketTimer 
    // ะฝะต ัƒะดะฐะปะพััŒ ะฟะพะปัƒั‡ะธั‚ัŒ ะฟะฐะบะตั‚ั‹ - ะทะฐะฟัƒัะบะฐะตะผ ั‚ะฐะนะผะตั€ ะทะฐะฒะตั€ัˆะตะฝะธั ัะพะตะดะธะฝะตะฝะธั
    StartCloseWaitTimer(connectionRecord);
  }
  else if (connectionRecord.IsLastPacketReceived != 0)
  // ัƒัะฟะตัˆะฝะฐั ะฟั€ะพะฒะตั€ะบะฐ 
  {
    // ะฒั‹ัั‹ะปะฐะตะผ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธะต ะพ ะฟะพะปัƒั‡ะตะฝะธะธ ะฑะปะพะบะฐ ะดะฐะฝะฝั‹ั…
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
    connectionRecord.State = connectionRecord.Tcb.States.Completed;
    connectionRecord.State.ProcessPackets(connectionRecord);
    // ะฒะผะตัั‚ะพ ะผะพะผะตะฝั‚ะฐะปัŒะฝะพะน ั€ะตะฐะปะธะทะฐั†ะธะธ ั€ะตััƒั€ัะพะฒ
    // ะทะฐะฟัƒัะบะฐะตะผ ั‚ะฐะนะผะตั€, ะฝะฐ ัะปัƒั‡ะฐะน, ะตัะปะธ
    // ะตัะปะธ ะฟะพัะปะตะดะฝะธะน ack ะฝะต ะดะพะนะดะตั‚ ะดะพ ะพั‚ะฟั€ะฐะฒะธั‚ะตะปั ะธ ะพะฝ ะทะฐะฟั€ะพัะธั‚ ะตะณะพ ัะฝะพะฒะฐ.
    // ะฟะพ ัั€ะฐะฑะฐั‚ั‹ะฒะฐะฝะธัŽ ั‚ะฐะนะผะตั€ะฐ - ั€ะตะฐะปะธะทัƒะตะผ ั€ะตััƒั€ัั‹
    // ะฒ ัะพัั‚ะพัะฝะธะธ Completed ะผะตั‚ะพะด ั‚ะฐะนะผะตั€ะฐ ะฟะตั€ะตะพะฟั€ะตะดะตะปะตะฝ
    StartCloseWaitTimer(connectionRecord);
  }
  // ัั‚ะพ ัะปัƒั‡ะฐะน, ะบะพะณะดะฐ ack ะฝะฐ ะฑะปะพะบ ะฟะฐะบะตั‚ะพะฒ ะฑั‹ะป ะฟะพั‚ะตั€ัะฝ
  else
  {
    if (!connectionRecord.TimerSecondTry)
    {
      ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
      connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
      connectionRecord.TimerSecondTry = true;
      return;
    }
    // ะทะฐะฟัƒัะบะฐะตะผ ั‚ะฐะนะผะตั€ ะทะฐะฒะตั€ัˆะตะฝะธั ัะพะตะดะธะฝะตะฝะธั
    StartCloseWaitTimer(connectionRecord);
  }
}

เชธเช•เซเชทเชฎ เชธเชพเชฏเช•เชฒ เชฎเซ‹เช•เชฒเซ‹ เช† เชชเชฆเซเชงเชคเชฟ เชซเช•เซเชค เชŸเชพเชˆเชฎเชฐ เชชเชฐ เชœ เชฌเซ‹เชฒเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เชคเซ‡ เช›เซ‡เชฒเซเชฒเซ‹ เชธเช‚เชฆเซ‡เชถ เชซเชฐเซ€เชฅเซ€ เชฎเซ‹เช•เชฒเชตเชพ เชคเซ‡เชฎเชœ เช•เชจเซ‡เช•เซเชถเชจ เช•เซเชฒเซ‹เช เชŸเชพเชˆเชฎเชฐเชจเซ‡ เชธเช•เซเชทเชฎ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชœเชตเชพเชฌเชฆเชพเชฐ เช›เซ‡.
SendingCycle.ProcessPackets:

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  if (connectionRecord.IsDone != 0)
    return;        
  // ะพั‚ะฟั€ะฐะฒะปัะตะผ ะฟะพะฒั‚ะพั€ะฝะพ ะฟะพัะปะตะดะฝะธะน ะฟะฐะบะตั‚ 
  // ( ะฒ ัะปัƒั‡ะฐะต ะฒะพััั‚ะฐะฝะพะฒะปะตะฝะธั ัะพะตะดะธะฝะตะฝะธั ัƒะทะตะป-ะฟั€ะธะตะผะฝะธะบ ะทะฐะฝะพะฒะพ ะพั‚ะฟั€ะฐะฒะธั‚ ะทะฐะฟั€ะพัั‹, ะบะพั‚ะพั€ั‹ะต ะดะพ ะฝะตะณะพ ะฝะต ะดะพัˆะปะธ)        
  ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.RetransmissionCreateUdpPayload(connectionRecord, connectionRecord.SndNext - 1));
  // ะฒะบะปัŽั‡ะฐะตะผ ั‚ะฐะนะผะตั€ CloseWait โ€“ ะดะปั ะพะถะธะดะฐะฝะธั ะฒะพััั‚ะฐะฝะพะฒะปะตะฝะธั ัะพะตะดะธะฝะตะฝะธั ะธะปะธ ะตะณะพ ะทะฐะฒะตั€ัˆะตะฝะธั
  StartCloseWaitTimer(connectionRecord);
}

เชธเช•เซเชทเชฎ เชชเซ‚เชฐเซเชฃ เชชเชฆเซเชงเชคเชฟ เชšเชพเชฒเซ€ เชฐเชนเซ‡เชฒ เชŸเชพเชˆเชฎเชฐเชจเซ‡ เชฌเช‚เชง เช•เชฐเซ‡ เช›เซ‡ เช…เชจเซ‡ เชธเชฌเซเชธเซเช•เซเชฐเชพเช‡เชฌเชฐเซเชธเชจเซ‡ เชธเช‚เชฆเซ‡เชถ เชฎเซ‹เช•เชฒเซ‡ เช›เซ‡.
เชชเซ‚เชฐเซเชฃ.เชชเซเชฐเซ‹เชธเซ‡เชธ เชชเซ‡เช•เซ‡เชŸเซเชธ:

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  if (connectionRecord.WaitForPacketsTimer != null)
    connectionRecord.WaitForPacketsTimer.Dispose();
  // ัะพะฑะธั€ะฐะตะผ ัะพะพะฑั‰ะตะฝะธะต ะธ ะฟะตั€ะตะดะฐะตะผ ะตะณะพ ะฟะพะดะฟะธัั‡ะธะบะฐะผ
  ReliableUdpStateTools.CreateMessageFromMemoryStream(connectionRecord);
}

เชฐเซ€เชธเซ€เชตเชชเซ‡เช•เซ‡เชŸ เชชเชฆเซเชงเชคเชฟ

เชธเช•เซเชทเชฎ เชซเชฐเซเชธเซเชŸเชชเซ‡เช•เซ‡เชŸ เชชเซเชฐเชพเชชเซเชค เชฅเชฏเซเช‚ เชชเชฆเซเชงเชคเชฟเชจเซเช‚ เชฎเซเช–เซเชฏ เช•เชพเชฐเซเชฏ เช เชจเชฟเชฐเซเชงเชพเชฐเชฟเชค เช•เชฐเชตเชพเชจเซเช‚ เช›เซ‡ เช•เซ‡ เชชเซเชฐเชฅเชฎ เชธเช‚เชฆเซ‡เชถ เชชเซ‡เช•เซ‡เชŸ เช–เชฐเซ‡เช–เชฐ เช‡เชจเซเชŸเชฐเชซเซ‡เชธ เชชเชฐ เช†เชตเซเชฏเซเช‚ เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ, เช…เชจเซ‡ เชเช• เชœ เชชเซ‡เช•เซ‡เชŸเชจเซ‹ เชธเชฎเชพเชตเซ‡เชถ เช•เชฐเชคเซ‹ เชธเช‚เชฆเซ‡เชถ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเชตเชพเชจเซ‹ เช›เซ‡.
FirstPacketReceived.ReceivePacket:

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  if (!header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket))
    // ะพั‚ะฑั€ะฐัั‹ะฒะฐะตะผ ะฟะฐะบะตั‚
    return;
  // ะบะพะผะฑะธะฝะฐั†ะธั ะดะฒัƒั… ั„ะปะฐะณะพะฒ - FirstPacket ะธ LastPacket - ะณะพะฒะพั€ะธั‚ ั‡ั‚ะพ ัƒ ะฝะฐั ะตะดะธะฝัั‚ะฒะตะฝะฝะพะต ัะพะพะฑั‰ะตะฝะธะต
  if (header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket) &
      header.Flags.HasFlag(ReliableUdpHeaderFlags.LastPacket))
  {
    ReliableUdpStateTools.CreateMessageFromSinglePacket(connectionRecord, header, payload.Slice(ReliableUdpHeader.Length, payload.Length));
    if (!header.Flags.HasFlag(ReliableUdpHeaderFlags.NoAsk))
    {
      // ะพั‚ะฟั€ะฐะฒะปัะตะผ ะฟะฐะบะตั‚ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธะต          
      ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
    }
    SetAsCompleted(connectionRecord);
    return;
  }
  // by design ะฒัะต packet numbers ะฝะฐั‡ะธะฝะฐัŽั‚ัั ั 0;
  if (header.PacketNumber != 0)          
    return;
  ReliableUdpStateTools.InitIncomingBytesStorage(connectionRecord, header);
  ReliableUdpStateTools.WritePacketData(connectionRecord, header, payload);
  // ัั‡ะธั‚ะฐะตะผ ะบะพะป-ะฒะพ ะฟะฐะบะตั‚ะพะฒ, ะบะพั‚ะพั€ั‹ะต ะดะพะปะถะฝั‹ ะฟั€ะธะนั‚ะธ
  connectionRecord.NumberOfPackets = (int)Math.Ceiling((double) ((double) connectionRecord.IncomingStream.Length/(double) connectionRecord.BufferSize));
  // ะทะฐะฟะธัั‹ะฒะฐะตะผ ะฝะพะผะตั€ ะฟะพัะปะตะดะฝะตะณะพ ะฟะพะปัƒั‡ะตะฝะฝะพะณะพ ะฟะฐะบะตั‚ะฐ (0)
  connectionRecord.RcvCurrent = header.PacketNumber;
  // ะฟะพัะปะต ัะดะฒะธะฝัƒะปะธ ะพะบะฝะพ ะฟั€ะธะตะผะฐ ะฝะฐ 1
  connectionRecord.WindowLowerBound++;
  // ะฟะตั€ะตะบะปัŽั‡ะฐะตะผ ัะพัั‚ะพัะฝะธะต
  connectionRecord.State = connectionRecord.Tcb.States.Assembling;
  // ะตัะปะธ ะฝะต ั‚ั€ะตะฑัƒะตั‚ัั ะผะตั…ะฐะฝะธะทะผ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธะต
  // ะทะฐะฟัƒัะบะฐะตะผ ั‚ะฐะนะผะตั€ ะบะพั‚ะพั€ั‹ะน ะฒั‹ัะฒะพะฑะพะดะธั‚ ะฒัะต ัั‚ั€ัƒะบั‚ัƒั€ั‹         
  if (header.Flags.HasFlag(ReliableUdpHeaderFlags.NoAsk))
  {
    connectionRecord.CloseWaitTimer = new Timer(DisposeByTimeout, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
  }
  else
  {
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
    connectionRecord.WaitForPacketsTimer = new Timer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
  }
}

เชธเช•เซเชทเชฎ เชธเชพเชฏเช•เชฒ เชฎเซ‹เช•เชฒเซ‹ เชกเชฟเชฒเชฟเชตเชฐเซ€ เชธเซเชตเซ€เช•เซƒเชคเชฟเช“ เช…เชจเซ‡ เชชเซเชจเชƒเชชเซเชฐเชธเชพเชฐเชฃ เชตเชฟเชจเช‚เชคเซ€เช“ เชธเซเชตเซ€เช•เชพเชฐเชตเชพ เชฎเชพเชŸเซ‡ เช† เชชเชฆเซเชงเชคเชฟเชจเซ‡ เช“เชตเชฐเชฐเชพเช‡เชก เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡.
SendingCycle.ReceivePacket:

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  if (connectionRecord.IsDone != 0)
    return;
  if (!header.Flags.HasFlag(ReliableUdpHeaderFlags.RequestForPacket))
    return;
  // ั€ะฐัั‡ะตั‚ ะบะพะฝะตั‡ะฝะพะน ะณั€ะฐะฝะธั†ั‹ ะพะบะฝะฐ
  // ะฑะตั€ะตั‚ัั ะณั€ะฐะฝะธั†ะฐ ะพะบะฝะฐ + 1, ะดะปั ะฟะพะปัƒั‡ะตะฝะธั ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธะน ะดะพัั‚ะฐะฒะบะธ
  int windowHighestBound = Math.Min((connectionRecord.WindowLowerBound + connectionRecord.WindowSize), (connectionRecord.NumberOfPackets));
  // ะฟั€ะพะฒะตั€ะบะฐ ะฝะฐ ะฟะพะฟะฐะดะฐะฝะธะต ะฒ ะพะบะฝะพ        
  if (header.PacketNumber < connectionRecord.WindowLowerBound || header.PacketNumber > windowHighestBound)
    return;
  connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(-1, -1);
  // ะฟั€ะพะฒะตั€ะธั‚ัŒ ะฝะฐ ะฟะพัะปะตะดะฝะธะน ะฟะฐะบะตั‚:
  if (header.PacketNumber == connectionRecord.NumberOfPackets)
  {
    // ะฟะตั€ะตะดะฐั‡ะฐ ะทะฐะฒะตั€ัˆะตะฝะฐ
    Interlocked.Increment(ref connectionRecord.IsDone);
    SetAsCompleted(connectionRecord);
    return;
  }
  // ัั‚ะพ ะพั‚ะฒะตั‚ ะฝะฐ ะฟะตั€ะฒั‹ะน ะฟะฐะบะตั‚ c ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธะตะผ         
  if ((header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket) && header.PacketNumber == 1))
  {
    // ะฑะตะท ัะดะฒะธะณะฐ ะพะบะฝะฐ
    SendPacket(connectionRecord);
  }
  // ะฟั€ะธัˆะปะพ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธะต ะพ ะฟะพะปัƒั‡ะตะฝะธะธ ะฑะปะพะบะฐ ะดะฐะฝะฝั‹ั…
  else if (header.PacketNumber == windowHighestBound)
  {
    // ัะดะฒะธะณะฐะตะผ ะพะบะฝะพ ะฟั€ะธะตะผ/ะฟะตั€ะตะดะฐั‡ะธ
    connectionRecord.WindowLowerBound += connectionRecord.WindowSize;
    // ะพะฑะฝัƒะปัะตะผ ะผะฐััะธะฒ ะบะพะฝั‚ั€ะพะปั ะฟะตั€ะตะดะฐั‡ะธ
    connectionRecord.WindowControlArray.Nullify();
    // ะพั‚ะฟั€ะฐะฒะปัะตะผ ะฑะปะพะบ ะฟะฐะบะตั‚ะพะฒ
    SendPacket(connectionRecord);
  }
  // ัั‚ะพ ะทะฐะฟั€ะพั ะฝะฐ ะฟะพะฒั‚ะพั€ะฝัƒัŽ ะฟะตั€ะตะดะฐั‡ัƒ โ€“ ะพั‚ะฟั€ะฐะฒะปัะตะผ ั‚ั€ะตะฑัƒะตะผั‹ะน ะฟะฐะบะตั‚          
  else
    ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.RetransmissionCreateUdpPayload(connectionRecord, header.PacketNumber));
}

เชธเช•เซเชทเชฎ เชเชธเซ‡เชฎเซเชฌเชฒเชฟเช‚เช— ReceivePacket เชชเชฆเซเชงเชคเชฟเชฎเชพเช‚, เช†เชตเชจเชพเชฐเชพ เชชเซ‡เช•เซ‡เชŸเซ‹เชฎเชพเช‚เชฅเซ€ เชธเช‚เชฆเซ‡เชถเชจเซ‡ เชเชธเซ‡เชฎเซเชฌเชฒ เช•เชฐเชตเชพเชจเซเช‚ เชฎเซเช–เซเชฏ เช•เชพเชฐเซเชฏ เชฅเชพเชฏ เช›เซ‡.
เชเชธเซ‡เชฎเซเชฌเชฒเซ€เช‚เช—.เชฐเชฟเชธเซ€เชตเชชเซ‡เช•เซ‡เชŸ:

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  if (connectionRecord.IsDone != 0)
    return;
  // ะพะฑั€ะฐะฑะพั‚ะบะฐ ะฟะฐะบะตั‚ะพะฒ ั ะพั‚ะบะปัŽั‡ะตะฝะฝั‹ะผ ะผะตั…ะฐะฝะธะทะผะพะผ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธั ะดะพัั‚ะฐะฒะบะธ
  if (header.Flags.HasFlag(ReliableUdpHeaderFlags.NoAsk))
  {
    // ัะฑั€ะฐัั‹ะฒะฐะตะผ ั‚ะฐะนะผะตั€
    connectionRecord.CloseWaitTimer.Change(connectionRecord.LongTimerPeriod, -1);
    // ะทะฐะฟะธัั‹ะฒะฐะตะผ ะดะฐะฝะฝั‹ะต
    ReliableUdpStateTools.WritePacketData(connectionRecord, header, payload);
    // ะตัะปะธ ะฟะพะปัƒั‡ะธะปะธ ะฟะฐะบะตั‚ ั ะฟะพัะปะตะดะฝะธะผ ั„ะปะฐะณะพะผ - ะดะตะปะฐะตะผ ะทะฐะฒะตั€ัˆะฐะตะผ          
    if (header.Flags.HasFlag(ReliableUdpHeaderFlags.LastPacket))
    {
      connectionRecord.State = connectionRecord.Tcb.States.Completed;
      connectionRecord.State.ProcessPackets(connectionRecord);
    }
    return;
  }        
  // ั€ะฐัั‡ะตั‚ ะบะพะฝะตั‡ะฝะพะน ะณั€ะฐะฝะธั†ั‹ ะพะบะฝะฐ
  int windowHighestBound = Math.Min((connectionRecord.WindowLowerBound + connectionRecord.WindowSize - 1), (connectionRecord.NumberOfPackets - 1));
  // ะพั‚ะฑั€ะฐัั‹ะฒะฐะตะผ ะฝะต ะฟะพะฟะฐะดะฐัŽั‰ะธะต ะฒ ะพะบะฝะพ ะฟะฐะบะตั‚ั‹
  if (header.PacketNumber < connectionRecord.WindowLowerBound || header.PacketNumber > (windowHighestBound))
    return;
  // ะพั‚ะฑั€ะฐัั‹ะฒะฐะตะผ ะดัƒะฑะปะธะบะฐั‚ั‹
  if (connectionRecord.WindowControlArray.Contains(header.PacketNumber))
    return;
  // ะทะฐะฟะธัั‹ะฒะฐะตะผ ะดะฐะฝะฝั‹ะต 
  ReliableUdpStateTools.WritePacketData(connectionRecord, header, payload);
  // ัƒะฒะตะปะธั‡ะธะฒะฐะตะผ ัั‡ะตั‚ั‡ะธะบ ะฟะฐะบะตั‚ะพะฒ        
  connectionRecord.PacketCounter++;
  // ะทะฐะฟะธัั‹ะฒะฐะตะผ ะฒ ะผะฐััะธะฒ ัƒะฟั€ะฐะฒะปะตะฝะธั ะพะบะฝะพะผ ั‚ะตะบัƒั‰ะธะน ะฝะพะผะตั€ ะฟะฐะบะตั‚ะฐ        
  connectionRecord.WindowControlArray[header.PacketNumber - connectionRecord.WindowLowerBound] = header.PacketNumber;
  // ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐะตะผ ะฝะฐะธะฑะพะปัŒัˆะธะน ะฟั€ะธัˆะตะดัˆะธะน ะฟะฐะบะตั‚        
  if (header.PacketNumber > connectionRecord.RcvCurrent)
    connectionRecord.RcvCurrent = header.PacketNumber;
  // ะฟะตั€ะตะทะฐะฟัƒัะบะฐะผ ั‚ะฐะนะผะตั€ั‹        
  connectionRecord.TimerSecondTry = false;
  connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(-1, -1);
  // ะตัะปะธ ะฟั€ะธัˆะตะป ะฟะพัะปะตะดะฝะธะน ะฟะฐะบะตั‚
  if (header.Flags.HasFlag(ReliableUdpHeaderFlags.LastPacket))
  {
    Interlocked.Increment(ref connectionRecord.IsLastPacketReceived);
  }
  // ะตัะปะธ ะฝะฐะผ ะฟั€ะธัˆะปะธ ะฒัะต ะฟะฐะบะตั‚ั‹ ะพะบะฝะฐ, ั‚ะพ ัะฑั€ะฐัั‹ะฒะฐะตะผ ัั‡ะตั‚ั‡ะธะบ
  // ะธ ะฒั‹ัั‹ะปะฐะตะผ ะฟะฐะบะตั‚ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธะต
  else if (connectionRecord.PacketCounter == connectionRecord.WindowSize)
  {
    // ัะฑั€ะฐัั‹ะฒะฐะตะผ ัั‡ะตั‚ั‡ะธะบ.      
    connectionRecord.PacketCounter = 0;
    // ัะดะฒะธะฝัƒะปะธ ะพะบะฝะพ ะฟะตั€ะตะดะฐั‡ะธ
    connectionRecord.WindowLowerBound += connectionRecord.WindowSize;
    // ะพะฑะฝัƒะปะตะฝะธะต ะผะฐััะธะฒะฐ ัƒะฟั€ะฐะฒะปะตะฝะธั ะฟะตั€ะตะดะฐั‡ะตะน
    connectionRecord.WindowControlArray.Nullify();
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
  }
  // ะตัะปะธ ะฟะพัะปะตะดะฝะธะน ะฟะฐะบะตั‚ ัƒะถะต ะธะผะตะตั‚ัั        
  if (Thread.VolatileRead(ref connectionRecord.IsLastPacketReceived) != 0)
  {
    // ะฟั€ะพะฒะตั€ัะตะผ ะฟะฐะบะตั‚ั‹          
    ProcessPackets(connectionRecord);
  }
}

เชธเช•เซเชทเชฎ เชชเซ‚เชฐเซเชฃ เชชเชฆเซเชงเชคเชฟเชจเซเช‚ เชเช•เชฎเชพเชคเซเชฐ เช•เชพเชฐเซเชฏ เชธเช‚เชฆเซ‡เชถเชจเชพ เชธเชซเชณ เชตเชฟเชคเชฐเชฃเชจเซ€ เชชเซเชจเชƒ เชธเซเชตเซ€เช•เซƒเชคเชฟ เชฎเซ‹เช•เชฒเชตเชพเชจเซเช‚ เช›เซ‡.
เชชเซ‚เชฐเซเชฃ เชฅเชฏเซเช‚.เชชเซ‡เช•เซ‡เชŸ เชชเซเชฐเชพเชชเซเชค เช•เชฐเซ‹:

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  // ะฟะพะฒั‚ะพั€ะฝะฐั ะพั‚ะฟั€ะฐะฒะบะฐ ะฟะพัะปะตะดะฝะตะณะพ ะฟะฐะบะตั‚ะฐ ะฒ ัะฒัะทะธ ั ั‚ะตะผ,
  // ั‡ั‚ะพ ะฟะพัะปะตะดะฝะธะน ack ะฝะต ะดะพัˆะตะป ะดะพ ะพั‚ะฟั€ะฐะฒะธั‚ะตะปั
  if (header.Flags.HasFlag(ReliableUdpHeaderFlags.LastPacket))
  {
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
  }
}

เชชเซ‡เช•เซ‡เชŸ เชชเชฆเซเชงเชคเชฟ เชฎเซ‹เช•เชฒเซ‹

เชธเช•เซเชทเชฎ FirstPacketSending เช† เชชเชฆเซเชงเชคเชฟ เชกเซ‡เชŸเชพเชจเซเช‚ เชชเซเชฐเชฅเชฎ เชชเซ‡เช•เซ‡เชŸ เชฎเซ‹เช•เชฒเซ‡ เช›เซ‡, เช…เชฅเชตเชพ เชœเซ‹ เชธเช‚เชฆเซ‡เชถเชจเซ‡ เชกเชฟเชฒเชฟเชตเชฐเซ€ เชชเซเชทเซเชŸเชฟเชจเซ€ เชœเชฐเซ‚เชฐ เชจเชฅเซ€, เชคเซ‹ เชธเชฎเช—เซเชฐ เชธเช‚เชฆเซ‡เชถ.
FirstPacketSending.SendPacket:

public override void SendPacket(ReliableUdpConnectionRecord connectionRecord)
{
  connectionRecord.PacketCounter = 0;
  connectionRecord.SndNext = 0;
  connectionRecord.WindowLowerBound = 0;       
  // ะตัะปะธ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธั ะฝะต ั‚ั€ะตะฑัƒะตั‚ัั - ะพั‚ะฟั€ะฐะฒะปัะตะผ ะฒัะต ะฟะฐะบะตั‚ั‹
  // ะธ ะฒั‹ัะฒะพะฑะพะถะดะฐะตะผ ั€ะตััƒั€ัั‹
  if (connectionRecord.IsNoAnswerNeeded)
  {
    // ะ—ะดะตััŒ ะฟั€ะพะธัั…ะพะดะธั‚ ะพั‚ะฟั€ะฐะฒะบะฐ As Is
    do
    {
      ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.CreateUdpPayload(connectionRecord, ReliableUdpStateTools. CreateReliableUdpHeader(connectionRecord)));
      connectionRecord.SndNext++;
    } while (connectionRecord.SndNext < connectionRecord.NumberOfPackets);
    SetAsCompleted(connectionRecord);
    return;
  }
  // ัะพะทะดะฐะตะผ ะทะฐะณะพะปะพะฒะพะบ ะฟะฐะบะตั‚ะฐ ะธ ะพั‚ะฟั€ะฐะฒะปัะตะผ ะตะณะพ 
  ReliableUdpHeader header = ReliableUdpStateTools.CreateReliableUdpHeader(connectionRecord);
  ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.CreateUdpPayload(connectionRecord, header));
  // ัƒะฒะตะปะธั‡ะธะฒะฐะตะผ ัั‡ะตั‚ั‡ะธะบ
  connectionRecord.SndNext++;
  // ัะดะฒะธะณะฐะตะผ ะพะบะฝะพ
  connectionRecord.WindowLowerBound++;
  connectionRecord.State = connectionRecord.Tcb.States.SendingCycle;
  // ะ—ะฐะฟัƒัะบะฐะตะผ ั‚ะฐะนะผะตั€
  connectionRecord.WaitForPacketsTimer = new Timer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
}

เชธเช•เซเชทเชฎ เชธเชพเชฏเช•เชฒ เชฎเซ‹เช•เชฒเซ‹ เช† เชชเชฆเซเชงเชคเชฟเชฎเชพเช‚, เชชเซ‡เช•เซ‡เชŸเซ‹เชจเซ‹ เชฌเซเชฒเซ‹เช• เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.
SendingCycle.SendPacket:

public override void SendPacket(ReliableUdpConnectionRecord connectionRecord)
{      
  // ะพั‚ะฟั€ะฐะฒะปัะตะผ ะฑะปะพะบ ะฟะฐะบะตั‚ะพะฒ      
  for (connectionRecord.PacketCounter = 0;
        connectionRecord.PacketCounter < connectionRecord.WindowSize &&
        connectionRecord.SndNext < connectionRecord.NumberOfPackets;
        connectionRecord.PacketCounter++)
  {
    ReliableUdpHeader header = ReliableUdpStateTools.CreateReliableUdpHeader(connectionRecord);
    ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.CreateUdpPayload(connectionRecord, header));
    connectionRecord.SndNext++;
  }
  // ะฝะฐ ัะปัƒั‡ะฐะน ะฑะพะปัŒัˆะพะณะพ ะพะบะฝะฐ ะฟะตั€ะตะดะฐั‡ะธ, ะฟะตั€ะตะทะฐะฟัƒัะบะฐะตะผ ั‚ะฐะนะผะตั€ ะฟะพัะปะต ะพั‚ะฟั€ะฐะฒะบะธ
  connectionRecord.WaitForPacketsTimer.Change( connectionRecord.ShortTimerPeriod, -1 );
  if ( connectionRecord.CloseWaitTimer != null )
  {
    connectionRecord.CloseWaitTimer.Change( -1, -1 );
  }
}

เช•เซ‹เชกเชฎเชพเช‚ เชตเชงเซ เชŠเช‚เชกเซ‡. เชœเซ‹เชกเชพเชฃเซ‹ เชฌเชจเชพเชตเชตเชพ เช…เชจเซ‡ เชธเซเชฅเชพเชชเชฟเชค เช•เชฐเชตเชพ

เชนเชตเซ‡ เชœเซเชฏเชพเชฐเซ‡ เช†เชชเชฃเซ‡ เชฎเซ‚เชณเชญเซ‚เชค เชธเซเชฅเชฟเชคเชฟเช“ เช…เชจเซ‡ เชฐเชพเชœเซเชฏเซ‹เชจเซ‡ เชนเซ‡เชจเซเชกเชฒ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เช‰เชชเชฏเซ‹เช—เชฎเชพเช‚ เชฒเซ‡เชตเชพเชคเซ€ เชชเชฆเซเชงเชคเชฟเช“ เชœเซ‹เชˆ เช›เซ‡, เชšเชพเชฒเซ‹ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชพเชฐเซเชฏ เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡เชจเชพ เชฅเซ‹เชกเชพ เช‰เชฆเชพเชนเชฐเชฃเซ‹เชจเซ‡ เชฅเซ‹เชกเซ€ เชตเชงเซ เชตเชฟเช—เชคเชฎเชพเช‚ เชคเซ‹เชกเซ€เช.
เชธเชพเชฎเชพเชจเซเชฏ เชธเซเชฅเชฟเชคเชฟเชฎเชพเช‚ เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เชกเชพเชฏเชพเช—เซเชฐเชพเชฎ:เชจเซ‡เชŸ เชฎเชพเชŸเซ‡ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ Udp เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซเช‚ เช…เชฎเชฒเซ€เช•เชฐเชฃ

เชฐเชšเชจเชพเชจเซ‡ เชตเชฟเช—เชคเชตเชพเชฐ เชงเซเชฏเชพเชจเชฎเชพเช‚ เชฒเซ‹ เช•เชจเซ‡เช•เซเชถเชจ เชฐเซ‡เช•เซ‹เชฐเซเชก เช•เชจเซ‡เช•เซเชŸ เช•เชฐเชตเชพ เช…เชจเซ‡ เชชเซเชฐเชฅเชฎ เชชเซ‡เช•เซ‡เชŸ เชฎเซ‹เช•เชฒเชตเชพ เชฎเชพเชŸเซ‡. เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เชนเช‚เชฎเซ‡เชถเชพ เชเชชเซเชฒเซ€เช•เซ‡เชถเชจ เชฆเซเชตเชพเชฐเชพ เชถเชฐเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เชœเซ‡ เชธเซ‡เชจเซเชก เชฎเซ‡เชธเซ‡เชœ API เชจเซ‡ เช•เซ‰เชฒ เช•เชฐเซ‡ เช›เซ‡. เช†เช—เชณ, เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เช•เช‚เชŸเซเชฐเซ‹เชฒ เชฌเซเชฒเซ‹เช•เชจเซ€ เชธเซเชŸเชพเชฐเซเชŸ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เชชเชฆเซเชงเชคเชฟเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชœเซ‡ เชจเชตเชพ เชธเช‚เชฆเซ‡เชถ เชฎเชพเชŸเซ‡ เชกเซ‡เชŸเชพเชจเซเช‚ เชชเซเชฐเชธเชพเชฐเชฃ เชถเชฐเซ‚ เช•เชฐเซ‡ เช›เซ‡.
เช†เช‰เชŸเช—เซ‹เช‡เช‚เช— เช•เชจเซ‡เช•เซเชถเชจ เชฌเชจเชพเชตเชตเซเช‚:

private void StartTransmission(ReliableUdpMessage reliableUdpMessage, EndPoint endPoint, AsyncResultSendMessage asyncResult)
{
  if (m_isListenerStarted == 0)
  {
    if (this.LocalEndpoint == null)
    {
      throw new ArgumentNullException( "", "You must use constructor with parameters or start listener before sending message" );
    }
    // ะทะฐะฟัƒัะบะฐะตะผ ะพะฑั€ะฐะฑะพั‚ะบัƒ ะฒั…ะพะดัั‰ะธั… ะฟะฐะบะตั‚ะพะฒ
    StartListener(LocalEndpoint);
  }
  // ัะพะทะดะฐะตะผ ะบะปัŽั‡ ะดะปั ัะปะพะฒะฐั€ั, ะฝะฐ ะพัะฝะพะฒะต EndPoint ะธ ReliableUdpHeader.TransmissionId        
  byte[] transmissionId = new byte[4];
  // ัะพะทะดะฐะตะผ ัะปัƒั‡ะฐะนะฝั‹ะน ะฝะพะผะตั€ transmissionId        
  m_randomCrypto.GetBytes(transmissionId);
  Tuple<EndPoint, Int32> key = new Tuple<EndPoint, Int32>(endPoint, BitConverter.ToInt32(transmissionId, 0));
  // ัะพะทะดะฐะตะผ ะฝะพะฒัƒัŽ ะทะฐะฟะธััŒ ะดะปั ัะพะตะดะธะฝะตะฝะธั ะธ ะฟั€ะพะฒะตั€ัะตะผ, 
  // ััƒั‰ะตัั‚ะฒัƒะตั‚ ะปะธ ัƒะถะต ั‚ะฐะบะพะน ะฝะพะผะตั€ ะฒ ะฝะฐัˆะธั… ัะปะพะฒะฐั€ัั…
  if (!m_listOfHandlers.TryAdd(key, new ReliableUdpConnectionRecord(key, this, reliableUdpMessage, asyncResult)))
  {
    // ะตัะปะธ ััƒั‰ะตัั‚ะฒัƒะตั‚ โ€“ ั‚ะพ ะฟะพะฒั‚ะพั€ะฝะพ ะณะตะฝะตั€ะธั€ัƒะตะผ ัะปัƒั‡ะฐะนะฝั‹ะน ะฝะพะผะตั€ 
    m_randomCrypto.GetBytes(transmissionId);
    key = new Tuple<EndPoint, Int32>(endPoint, BitConverter.ToInt32(transmissionId, 0));
    if (!m_listOfHandlers.TryAdd(key, new ReliableUdpConnectionRecord(key, this, reliableUdpMessage, asyncResult)))
      // ะตัะปะธ ัะฝะพะฒะฐ ะฝะต ัƒะดะฐะปะพััŒ โ€“ ะณะตะฝะตั€ะธั€ัƒะตะผ ะธัะบะปัŽั‡ะตะฝะธะต
      throw new ArgumentException("Pair TransmissionId & EndPoint is already exists in the dictionary");
  }
  // ะทะฐะฟัƒัั‚ะธะปะธ ัะพัั‚ะพัะฝะธะต ะฒ ะพะฑั€ะฐะฑะพั‚ะบัƒ         
  m_listOfHandlers[key].State.SendPacket(m_listOfHandlers[key]);
}

เชชเชนเซ‡เชฒเซเช‚ เชชเซ‡เช•เซ‡เชŸ เชฎเซ‹เช•เชฒเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡ (FirstPacketSending State):

public override void SendPacket(ReliableUdpConnectionRecord connectionRecord)
{
  connectionRecord.PacketCounter = 0;
  connectionRecord.SndNext = 0;
  connectionRecord.WindowLowerBound = 0;       
  // ... 
  // ัะพะทะดะฐะตะผ ะทะฐะณะพะปะพะฒะพะบ ะฟะฐะบะตั‚ะฐ ะธ ะพั‚ะฟั€ะฐะฒะปัะตะผ ะตะณะพ 
  ReliableUdpHeader header = ReliableUdpStateTools.CreateReliableUdpHeader(connectionRecord);
  ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.CreateUdpPayload(connectionRecord, header));
  // ัƒะฒะตะปะธั‡ะธะฒะฐะตะผ ัั‡ะตั‚ั‡ะธะบ
  connectionRecord.SndNext++;
  // ัะดะฒะธะณะฐะตะผ ะพะบะฝะพ
  connectionRecord.WindowLowerBound++;
  // ะฟะตั€ะตั…ะพะดะธะผ ะฒ ัะพัั‚ะพัะฝะธะต SendingCycle
  connectionRecord.State = connectionRecord.Tcb.States.SendingCycle;
  // ะ—ะฐะฟัƒัะบะฐะตะผ ั‚ะฐะนะผะตั€
  connectionRecord.WaitForPacketsTimer = new Timer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
}

เชชเซเชฐเชฅเชฎ เชชเซ‡เช•เซ‡เชŸ เชฎเซ‹เช•เชฒเซเชฏเชพ เชชเช›เซ€, เชฎเซ‹เช•เชฒเชจเชพเชฐ เชฐเชพเชœเซเชฏเชฎเชพเช‚ เชชเซเชฐเชตเซ‡เชถ เช•เชฐเซ‡ เช›เซ‡ เชธเชพเชฏเช•เชฒ เชฎเซ‹เช•เชฒเซ‹ - เชชเซ‡เช•เซ‡เชœ เชตเชฟเชคเชฐเชฃเชจเซ€ เชชเซเชทเซเชŸเชฟ เชฎเชพเชŸเซ‡ เชฐเชพเชน เชœเซเช“.
เชชเซเชฐเชพเชชเซเชค เช•เชฐเชจเชพเชฐ เชฌเชพเชœเซ, EndReceive เชชเชฆเซเชงเชคเชฟเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡, เชฎเซ‹เช•เชฒเซ‡เชฒ เชชเซ‡เช•เซ‡เชŸ เชฎเซ‡เชณเชตเซ‡ เช›เซ‡, เชเช• เชจเชตเซเช‚ เชฌเชจเชพเชตเซ‡ เช›เซ‡ เช•เชจเซ‡เช•เซเชถเชจ เชฐเซ‡เช•เซ‹เชฐเซเชก เช…เชจเซ‡ เช† เชชเซ‡เช•เซ‡เชŸเชจเซ‡, เชชเซเชฐเซ€-เชชเชพเชฐเซเชธ เชนเซ‡เชกเชฐ เชธเชพเชฅเซ‡, เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชฎเชพเชŸเซ‡ เชฐเชพเชœเซเชฏเชจเซ€ เชฐเซ€เชธเซ€เชตเชชเซ‡เช•เซ‡เชŸ เชชเชฆเซเชงเชคเชฟเชฎเชพเช‚ เชชเชธเชพเชฐ เช•เชฐเซ‡ เช›เซ‡. เชซเชฐเซเชธเซเชŸเชชเซ‡เช•เซ‡เชŸ เชชเซเชฐเชพเชชเซเชค เชฅเชฏเซเช‚
เชชเซเชฐเชพเชชเซเชคเชฟ เชฌเชพเชœเซ เชชเชฐ เช•เชจเซ‡เช•เซเชถเชจ เชฌเชจเชพเชตเชตเซเช‚:

private void EndReceive(IAsyncResult ar)
{
  // ...
  // ะฟะฐะบะตั‚ ะฟะพะปัƒั‡ะตะฝ
  // ะฟะฐั€ัะธะผ ะทะฐะณะพะปะพะฒะพะบ ะฟะฐะบะตั‚ะฐ        
  ReliableUdpHeader header;
  if (!ReliableUdpStateTools.ReadReliableUdpHeader(bytes, out header))
  {          
    // ะฟั€ะธัˆะตะป ะฝะตะบะพั€ั€ะตะบั‚ะฝั‹ะน ะฟะฐะบะตั‚ - ะพั‚ะฑั€ะฐัั‹ะฒะฐะตะผ ะตะณะพ
    return;
  }
  // ะบะพะฝัั‚ั€ัƒะธั€ัƒะตะผ ะบะปัŽั‡ ะดะปั ะพะฟั€ะตะดะตะปะตะฝะธั connection recordโ€™ะฐ ะดะปั ะฟะฐะบะตั‚ะฐ
  Tuple<EndPoint, Int32> key = new Tuple<EndPoint, Int32>(connectedClient, header.TransmissionId);
  // ะฟะพะปัƒั‡ะฐะตะผ ััƒั‰ะตัั‚ะฒัƒัŽั‰ัƒัŽ connection record ะธะปะธ ัะพะทะดะฐะตะผ ะฝะพะฒัƒัŽ
  ReliableUdpConnectionRecord record = m_listOfHandlers.GetOrAdd(key, new ReliableUdpConnectionRecord(key, this, header. ReliableUdpMessageType));
  // ะทะฐะฟัƒัะบะฐะตะผ ะฟะฐะบะตั‚ ะฒ ะพะฑั€ะฐะฑะพั‚ะบัƒ ะฒ ะบะพะฝะตั‡ะฝั‹ะน ะฐะฒั‚ะพะผะฐั‚
  record.State.ReceivePacket(record, header, bytes);
}

เชชเซเชฐเชฅเชฎ เชชเซ‡เช•เซ‡เชŸ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเซเช‚ เช…เชจเซ‡ เชธเซเชตเซ€เช•เซƒเชคเชฟ เชฎเซ‹เช•เชฒเชตเซ€ (เชซเชฐเซเชธเซเชŸเชชเซ‡เช•เซ‡เชŸ เชชเซเชฐเชพเชชเซเชค เชฐเชพเชœเซเชฏ):

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  if (!header.Flags.HasFlag(ReliableUdpHeaderFlags.FirstPacket))
    // ะพั‚ะฑั€ะฐัั‹ะฒะฐะตะผ ะฟะฐะบะตั‚
    return;
  // ...
  // by design ะฒัะต packet numbers ะฝะฐั‡ะธะฝะฐัŽั‚ัั ั 0;
  if (header.PacketNumber != 0)          
    return;
  // ะธะฝะธั†ะธะฐะปะธะทะธั€ัƒะตะผ ะผะฐััะธะฒ ะดะปั ั…ั€ะฐะฝะตะฝะธั ั‡ะฐัั‚ะตะน ัะพะพะฑั‰ะตะฝะธั
  ReliableUdpStateTools.InitIncomingBytesStorage(connectionRecord, header);
  // ะทะฐะฟะธัั‹ะฒะฐะตะผ ะดะฐะฝะฝั‹ะต ะฟะฐะบะตั‚ ะฒ ะผะฐััะธะฒ
  ReliableUdpStateTools.WritePacketData(connectionRecord, header, payload);
  // ัั‡ะธั‚ะฐะตะผ ะบะพะป-ะฒะพ ะฟะฐะบะตั‚ะพะฒ, ะบะพั‚ะพั€ั‹ะต ะดะพะปะถะฝั‹ ะฟั€ะธะนั‚ะธ
  connectionRecord.NumberOfPackets = (int)Math.Ceiling((double) ((double) connectionRecord.IncomingStream.Length/(double) connectionRecord.BufferSize));
  // ะทะฐะฟะธัั‹ะฒะฐะตะผ ะฝะพะผะตั€ ะฟะพัะปะตะดะฝะตะณะพ ะฟะพะปัƒั‡ะตะฝะฝะพะณะพ ะฟะฐะบะตั‚ะฐ (0)
  connectionRecord.RcvCurrent = header.PacketNumber;
  // ะฟะพัะปะต ัะดะฒะธะฝัƒะปะธ ะพะบะฝะพ ะฟั€ะธะตะผะฐ ะฝะฐ 1
  connectionRecord.WindowLowerBound++;
  // ะฟะตั€ะตะบะปัŽั‡ะฐะตะผ ัะพัั‚ะพัะฝะธะต
  connectionRecord.State = connectionRecord.Tcb.States.Assembling;  
  if (/*ะตัะปะธ ะฝะต ั‚ั€ะตะฑัƒะตั‚ัั ะผะตั…ะฐะฝะธะทะผ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธะต*/)
  // ...
  else
  {
    // ะพั‚ะฟั€ะฐะฒะปัะตะผ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธะต
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
    connectionRecord.WaitForPacketsTimer = new Timer(CheckByTimer, connectionRecord, connectionRecord.ShortTimerPeriod, -1);
  }
}

เช•เซ‹เชกเชฎเชพเช‚ เชตเชงเซ เชŠเช‚เชกเซ‡. เชธเชฎเชฏเชธเชฎเชพเชชเซเชคเชฟ เชชเชฐ เช•เชจเซ‡เช•เซเชถเชจ เชฌเช‚เชง เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชŸเชพเชˆเชฎเช†เช‰เชŸ เชนเซ‡เชจเซเชกเชฒเชฟเช‚เช— เช เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ UDP เชจเซ‹ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชญเชพเช— เช›เซ‡. เชเช• เช‰เชฆเชพเชนเชฐเชฃเชจเซ‹ เชตเชฟเชšเชพเชฐ เช•เชฐเซ‹ เชœเซ‡เชฎเชพเช‚ เชฎเชงเซเชฏเชตเชฐเซเชคเซ€ เชจเซ‹เชก เชจเชฟเชทเซเชซเชณ เช—เชฏเซ‹ เช…เชจเซ‡ เชฌเช‚เชจเซ‡ เชฆเชฟเชถเชพเชฎเชพเช‚ เชกเซ‡เชŸเชพ เชกเชฟเชฒเชฟเชตเชฐเซ€ เช…เชถเช•เซเชฏ เชฌเชจเซ€ เช—เชˆ.
เชธเชฎเชฏเชธเชฎเชพเชชเซเชคเชฟ เชฆเซเชตเชพเชฐเชพ เช•เชจเซ‡เช•เซเชถเชจ เชฌเช‚เชง เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เช†เช•เซƒเชคเชฟ:เชจเซ‡เชŸ เชฎเชพเชŸเซ‡ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ Udp เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซเช‚ เช…เชฎเชฒเซ€เช•เชฐเชฃ

เชกเชพเชฏเชพเช—เซเชฐเชพเชฎเชฎเชพเช‚เชฅเซ€ เชœเซ‹เชˆ เชถเช•เชพเชฏ เช›เซ‡ เชคเซ‡เชฎ, เชชเซ‡เช•เซ‡เชŸเชจเชพ เชฌเซเชฒเซ‹เช• เชฎเซ‹เช•เชฒเซเชฏเชพ เชชเช›เซ€ เชคเชฐเชค เชœ เชฎเซ‹เช•เชฒเชจเชพเชฐเชจเซเช‚ เช•เชพเชฐเซเชฏ เชŸเชพเชˆเชฎเชฐ เชถเชฐเซ‚ เชฅเชพเชฏ เช›เซ‡. เช† เชฐเชพเชœเซเชฏเชจเซ€ SendPacket เชชเชฆเซเชงเชคเชฟเชฎเชพเช‚ เชฅเชพเชฏ เช›เซ‡ เชธเชพเชฏเช•เชฒ เชฎเซ‹เช•เชฒเซ‹.
เชตเชฐเซเช• เชŸเชพเชˆเชฎเชฐเชจเซ‡ เชธเช•เซเชทเชฎ เช•เชฐเชตเซเช‚ (เชธเซ‡เชจเซเชกเชฟเช‚เช—เชธเชพเชฏเช•เชฒ เชธเซเชŸเซ‡เชŸ):

public override void SendPacket(ReliableUdpConnectionRecord connectionRecord)
{      
  // ะพั‚ะฟั€ะฐะฒะปัะตะผ ะฑะปะพะบ ะฟะฐะบะตั‚ะพะฒ   
  // ...   
  // ะฟะตั€ะตะทะฐะฟัƒัะบะฐะตะผ ั‚ะฐะนะผะตั€ ะฟะพัะปะต ะพั‚ะฟั€ะฐะฒะบะธ
  connectionRecord.WaitForPacketsTimer.Change( connectionRecord.ShortTimerPeriod, -1 );
  if ( connectionRecord.CloseWaitTimer != null )
    connectionRecord.CloseWaitTimer.Change( -1, -1 );
}

เชœเซเชฏเชพเชฐเซ‡ เช•เชจเซ‡เช•เซเชถเชจ เชฌเชจเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เชคเซเชฏเชพเชฐเซ‡ เชŸเชพเชˆเชฎเชฐ เชชเซ€เชฐเชฟเชฏเชกเซเชธ เชธเซ‡เชŸ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. เชกเชฟเชซเซ‰เชฒเซเชŸ ShortTimerPeriod 5 เชธเซ‡เช•เชจเซเชก เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃเชฎเชพเช‚, เชคเซ‡ 1,5 เชธเซ‡เช•เชจเซเชก เชชเชฐ เชธเซ‡เชŸ เช›เซ‡.

เช‡เชจเช•เชฎเชฟเช‚เช— เช•เชจเซ‡เช•เซเชถเชจ เชฎเชพเชŸเซ‡, เชŸเชพเช‡เชฎเชฐ เช›เซ‡เชฒเซเชฒเซเช‚ เช‡เชจเช•เชฎเชฟเช‚เช— เชกเซ‡เชŸเชพ เชชเซ‡เช•เซ‡เชŸ เชชเซเชฐเชพเชชเซเชค เช•เชฐเซเชฏเชพ เชชเช›เซ€ เชถเชฐเซ‚ เชฅเชพเชฏ เช›เซ‡, เช† เชฐเชพเชœเซเชฏเชจเซ€ เชฐเซ€เชธเซ€เชตเชชเซ‡เช•เซ‡เชŸ เชชเชฆเซเชงเชคเชฟเชฎเชพเช‚ เชฅเชพเชฏ เช›เซ‡ เชเชธเซ‡เชฎเซเชฌเชฒเชฟเช‚เช—
เชตเชฐเซเช• เชŸเชพเชˆเชฎเชฐเชจเซ‡ เชธเช•เซเชทเชฎ เช•เชฐเชตเซเช‚ (เชเชธเซ‡เชฎเซเชฌเชฒเชฟเช‚เช— เชธเซเชŸเซ‡เชŸ):

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  // ... 
  // ะฟะตั€ะตะทะฐะฟัƒัะบะฐะตะผ ั‚ะฐะนะผะตั€ั‹        
  connectionRecord.TimerSecondTry = false;
  connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(-1, -1);
  // ...
}

เช•เชพเชฐเซเชฏเช•เชพเชฐเซ€ เชŸเชพเชˆเชฎเชฐเชจเซ€ เชฐเชพเชน เชœเซ‹เชคเซ€ เชตเช–เชคเซ‡ เช‡เชจเช•เชฎเชฟเช‚เช— เช•เชจเซ‡เช•เซเชถเชจ เชชเชฐ เช•เซ‹เชˆ เชตเชงเซ เชชเซ‡เช•เซ‡เชŸ เช†เชตเซเชฏเชพ เชจเชฅเซ€. เชŸเชพเชˆเชฎเชฐ เชฌเช‚เชง เชฅเชˆ เช—เชฏเซเช‚ เช…เชจเซ‡ เชชเซเชฐเซ‹เชธเซ‡เชธเชชเซ‡เช•เซ‡เชŸเซเชธ เชชเชฆเซเชงเชคเชฟเชจเซ‡ เชฌเซ‹เชฒเชพเชตเชตเชพเชฎเชพเช‚ เช†เชตเซ€, เชœเซเชฏเชพเช‚ เช–เซ‹เชตเชพเชฏเซ‡เชฒเชพ เชชเซ‡เช•เซ‡เชŸเซ‹ เชฎเชณเซเชฏเชพ เช…เชจเซ‡ เชซเชฐเซ€เชฅเซ€ เชกเชฟเชฒเชฟเชตเชฐเซ€ เชตเชฟเชจเช‚เชคเซ€เช“ เชชเซเชฐเชฅเชฎ เชตเช–เชค เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ€.
เชชเซเชจเชƒ เชตเชฟเชคเชฐเชฃ เชตเชฟเชจเช‚เชคเซ€เช“ เชฎเซ‹เช•เชฒเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡ (เชเชธเซ‡เชฎเซเชฌเชฒเชฟเช‚เช— เชธเซเชŸเซ‡เชŸ):

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  // ...        
  if (/*ะฟั€ะพะฒะตั€ะบะฐ ะฝะฐ ะฟะพั‚ะตั€ัะฝะฝั‹ะต ะฟะฐะบะตั‚ั‹ */)
  {
    // ะพั‚ะฟั€ะฐะฒะปัะตะผ ะทะฐะฟั€ะพัั‹ ะฝะฐ ะฟะพะฒั‚ะพั€ะฝัƒัŽ ะดะพัั‚ะฐะฒะบัƒ
    // ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐะตะผ ั‚ะฐะนะผะตั€ ะฒะพ ะฒั‚ะพั€ะพะน ั€ะฐะท, ะดะปั ะฟะพะฒั‚ะพั€ะฝะพะน ะฟะพะฟั‹ั‚ะบะธ ะฟะตั€ะตะดะฐั‡ะธ
    if (!connectionRecord.TimerSecondTry)
    {
      connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
    connectionRecord.TimerSecondTry = true;
    return;
    }
  // ะตัะปะธ ะฟะพัะปะต ะดะฒัƒั… ะฟะพะฟั‹ั‚ะพะบ ัั€ะฐะฑะฐั‚ั‹ะฒะฐะฝะธะน WaitForPacketTimer 
  // ะฝะต ัƒะดะฐะปะพััŒ ะฟะพะปัƒั‡ะธั‚ัŒ ะฟะฐะบะตั‚ั‹ - ะทะฐะฟัƒัะบะฐะตะผ ั‚ะฐะนะผะตั€ ะทะฐะฒะตั€ัˆะตะฝะธั ัะพะตะดะธะฝะตะฝะธั
  StartCloseWaitTimer(connectionRecord);
  }
  else if (/*ะฟั€ะธัˆะตะป ะฟะพัะปะตะดะฝะธะน ะฟะฐะบะตั‚ ะธ ัƒัะฟะตัˆะฝะฐั ะฟั€ะพะฒะตั€ะบะฐ */)
  {
    // ...
    StartCloseWaitTimer(connectionRecord);
  }
  // ะตัะปะธ ack ะฝะฐ ะฑะปะพะบ ะฟะฐะบะตั‚ะพะฒ ะฑั‹ะป ะฟะพั‚ะตั€ัะฝ
  else
  { 
    if (!connectionRecord.TimerSecondTry)
    {
      // ะฟะพะฒั‚ะพั€ะฝะพ ะพั‚ัั‹ะปะฐะตะผ ack
      connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
      connectionRecord.TimerSecondTry = true;
      return;
    }
    // ะทะฐะฟัƒัะบะฐะตะผ ั‚ะฐะนะผะตั€ ะทะฐะฒะตั€ัˆะตะฝะธั ัะพะตะดะธะฝะตะฝะธั
    StartCloseWaitTimer(connectionRecord);
  }
}

TimerSecondTry เชšเชฒ เชชเชฐ เชธเซ‡เชŸ เช•เชฐเซ‡เชฒ เช›เซ‡ เชธเชพเชšเซเช‚. เช† เชšเชฒ เช•เชพเชฐเซเชฏเช•เชพเชฐเซ€ เชŸเชพเชˆเชฎเชฐเชจเซ‡ เชชเซเชจเชƒเชชเซเชฐเชพเชฐเช‚เชญ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชœเชตเชพเชฌเชฆเชพเชฐ เช›เซ‡.

เชฎเซ‹เช•เชฒเชจเชพเชฐเชจเซ€ เชฌเชพเชœเซเช, เช•เชพเชฐเซเชฏเช•เชพเชฐเซ€ เชŸเชพเชˆเชฎเชฐ เชชเชฃ เชŸเซเชฐเชฟเช—เชฐ เชฅเชพเชฏ เช›เซ‡ เช…เชจเซ‡ เช›เซ‡เชฒเซเชฒเซเช‚ เชฎเซ‹เช•เชฒเซ‡เชฒเซเช‚ เชชเซ‡เช•เซ‡เชŸ เชซเชฐเซ€เชฅเซ€ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.
เช•เชจเซ‡เช•เซเชถเชจ เช•เซเชฒเซ‹เช เชŸเชพเชˆเชฎเชฐ เชธเช•เซเชทเชฎ เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡ (เชธเซ‡เชจเซเชกเชฟเช‚เช—เชธเชพเชฏเช•เชฒ เชธเซเชŸเซ‡เชŸ):

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  // ...        
  // ะพั‚ะฟั€ะฐะฒะปัะตะผ ะฟะพะฒั‚ะพั€ะฝะพ ะฟะพัะปะตะดะฝะธะน ะฟะฐะบะตั‚ 
  // ...        
  // ะฒะบะปัŽั‡ะฐะตะผ ั‚ะฐะนะผะตั€ CloseWait โ€“ ะดะปั ะพะถะธะดะฐะฝะธั ะฒะพััั‚ะฐะฝะพะฒะปะตะฝะธั ัะพะตะดะธะฝะตะฝะธั ะธะปะธ ะตะณะพ ะทะฐะฒะตั€ัˆะตะฝะธั
  StartCloseWaitTimer(connectionRecord);
}

เชคเซ‡ เชชเช›เซ€, เช†เช‰เชŸเช—เซ‹เช‡เช‚เช— เช•เชจเซ‡เช•เซเชถเชจเชฎเชพเช‚ เช•เชจเซ‡เช•เซเชถเชจ เช•เซเชฒเซ‹เช เชŸเชพเชˆเชฎเชฐ เชถเชฐเซ‚ เชฅเชพเชฏ เช›เซ‡.
ReliableUdpState.StartCloseWaitTimer:

protected void StartCloseWaitTimer(ReliableUdpConnectionRecord connectionRecord)
{
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(connectionRecord.LongTimerPeriod, -1);
  else
    connectionRecord.CloseWaitTimer = new Timer(DisposeByTimeout, connectionRecord, connectionRecord.LongTimerPeriod, -1);
}

เช•เชจเซ‡เช•เซเชถเชจ เชฌเช‚เชง เชŸเชพเชˆเชฎเชฐ เชธเชฎเชฏเชธเชฎเชพเชชเซเชคเชฟ เช…เชตเชงเชฟ เชฎเซ‚เชณเชญเซ‚เชค เชฐเซ€เชคเซ‡ 30 เชธเซ‡เช•เชจเซเชก เช›เซ‡.

เชฅเซ‹เชกเชพ เชธเชฎเชฏ เชชเช›เซ€, เชชเซเชฐเชพเชชเซเชคเช•เชฐเซเชคเชพเชจเซ€ เชฌเชพเชœเซ เชชเชฐเชจเซเช‚ เช•เชพเชฐเซเชฏเช•เชพเชฐเซ€ เชŸเชพเชˆเชฎเชฐ เชซเชฐเซ€เชฅเซ€ เชซเชพเชฏเชฐ เชฅเชพเชฏ เช›เซ‡, เชตเชฟเชจเช‚เชคเซ€เช“ เชซเชฐเซ€เชฅเซ€ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชคเซเชฏเชพเชฐเชฌเชพเชฆ เช†เชตเชคเชพ เช•เชจเซ‡เช•เซเชถเชจ เชฎเชพเชŸเซ‡ เช•เชจเซ‡เช•เซเชถเชจ เช•เซเชฒเซ‹เช เชŸเชพเชˆเชฎเชฐ เชถเชฐเซ‚ เชฅเชพเชฏ เช›เซ‡.

เชœเซเชฏเชพเชฐเซ‡ เชฌเช‚เชง เชŸเชพเชˆเชฎเชฐ เชซเชพเชฏเชฐ เชฅเชพเชฏ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชฌเช‚เชจเซ‡ เช•เชจเซ‡เช•เซเชถเชจ เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธเชจเชพ เชคเชฎเชพเชฎ เชธเช‚เชธเชพเชงเชจเซ‹ เชชเซเชฐเช•เชพเชถเชฟเชค เชฅเชพเชฏ เช›เซ‡. เชชเซเชฐเซ‡เชทเช• เช…เชชเชธเซเชŸเซเชฐเซ€เชฎ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจเชจเซ‡ เชกเชฟเชฒเชฟเชตเชฐเซ€ เชจเชฟเชทเซเชซเชณเชคเชพเชจเซ€ เชœเชพเชฃ เช•เชฐเซ‡ เช›เซ‡ (เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ UDP API เชœเซเช“).
เช•เชจเซ‡เช•เซเชถเชจ เชฐเซ‡เช•เซ‹เชฐเซเชก เชธเช‚เชธเชพเชงเชจเซ‹ เชฐเชฟเชฒเซ€เช เช•เชฐเซ€ เชฐเชนเซเชฏเชพเช‚ เช›เซ‡:

public void Dispose()
{
  try
  {
    System.Threading.Monitor.Enter(this.LockerReceive);
  }
  finally
  {
    Interlocked.Increment(ref this.IsDone);
    if (WaitForPacketsTimer != null)
    {
      WaitForPacketsTimer.Dispose();
    }
    if (CloseWaitTimer != null)
    {
      CloseWaitTimer.Dispose();
    }
    byte[] stream;
    Tcb.IncomingStreams.TryRemove(Key, out stream);
    stream = null;
    Tcb.OutcomingStreams.TryRemove(Key, out stream);
    stream = null;
    System.Threading.Monitor.Exit(this.LockerReceive);
  }
}

เช•เซ‹เชกเชฎเชพเช‚ เชตเชงเซ เชŠเช‚เชกเซ‡. เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เชชเซเชจเชƒเชธเซเชฅเชพเชชเชฟเชค เช•เชฐเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡

เชชเซ‡เช•เซ‡เชŸ เช–เซ‹เชตเชพเชˆ เชœเชตเชพเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚ เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เชฐเชฟเช•เชตเชฐเซ€ เชกเชพเชฏเชพเช—เซเชฐเชพเชฎ:เชจเซ‡เชŸ เชฎเชพเชŸเซ‡ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ Udp เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซเช‚ เช…เชฎเชฒเซ€เช•เชฐเชฃ

เชธเชฎเชฏเชธเชฎเชพเชชเซเชคเชฟ เชชเชฐ เช•เชจเซ‡เช•เซเชถเชจ เชฌเช‚เชง เช•เชฐเชตเชพ เชตเชฟเชถเซ‡ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชšเชฐเซเชšเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เช›เซ‡, เชœเซเชฏเชพเชฐเซ‡ เช•เชพเชฐเซเชฏเช•เชพเชฐเซ€ เชŸเชพเชˆเชฎเชฐ เชธเชฎเชพเชชเซเชค เชฅเชพเชฏ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชฐเซ€เชธเซ€เชตเชฐ เช–เซ‹เชตเชพเชฏเซ‡เชฒเชพ เชชเซ‡เช•เซ‡เชŸเซ‹ เชฎเชพเชŸเซ‡ เชคเชชเชพเชธ เช•เชฐเชถเซ‡. เชชเซ‡เช•เซ‡เชŸ เช–เซ‹เชตเชพเชˆ เชœเชตเชพเชจเชพ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชชเซเชฐเชพเชชเซเชคเช•เชฐเซเชคเชพ เชธเซเชงเซ€ เชจ เชชเชนเซ‹เช‚เชšเซ‡เชฒเชพ เชชเซ‡เช•เซ‡เชŸเซ‹เชจเซ€ เชธเช‚เช–เซเชฏเชพเชจเซ€ เชฏเชพเชฆเซ€ เชคเซˆเชฏเชพเชฐ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชถเซ‡. เช† เชจเช‚เชฌเชฐเซ‹ เชšเซ‹เช•เซเช•เชธ เช•เชจเซ‡เช•เซเชถเชจเชจเชพ LostPackets เชเชฐเซ‡เชฎเชพเช‚ เชฆเชพเช–เชฒ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เช…เชจเซ‡ เชซเชฐเซ€เชฅเซ€ เชตเชฟเชคเชฐเชฃ เชฎเชพเชŸเซ‡เชจเซ€ เชตเชฟเชจเช‚เชคเซ€เช“ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.
เชชเซ‡เช•เซ‡เชœเซ‹ เชชเซเชจเชƒเชตเชฟเชคเชฐเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชตเชฟเชจเช‚เชคเซ€เช“ เชฎเซ‹เช•เชฒเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡ (เชเชธเซ‡เชฎเซเชฌเชฒเชฟเช‚เช— เชธเซเชŸเซ‡เชŸ):

public override void ProcessPackets(ReliableUdpConnectionRecord connectionRecord)
{
  //...
  if (!ReliableUdpStateTools.CheckForNoPacketLoss(connectionRecord, connectionRecord.IsLastPacketReceived != 0))
  {
    // ะตัั‚ัŒ ะฟะพั‚ะตั€ัะฝะฝั‹ะต ะฟะฐะบะตั‚ั‹, ะพั‚ัั‹ะปะฐะตะผ ะทะฐะฟั€ะพัั‹ ะฝะฐ ะฝะธั…
    foreach (int seqNum in connectionRecord.LostPackets)
    {
      if (seqNum != 0)
      {
        ReliableUdpStateTools.SendAskForLostPacket(connectionRecord, seqNum);
      }
    }
    // ...
  }
}

เชชเซเชฐเซ‡เชทเช• เชซเชฐเซ€เชฅเซ€ เชกเชฟเชฒเชฟเชตเชฐเซ€ เชตเชฟเชจเช‚เชคเซ€ เชธเซเชตเซ€เช•เชพเชฐเชถเซ‡ เช…เชจเซ‡ เช—เซเชฎ เชฅเชฏเซ‡เชฒ เชชเซ‡เช•เซ‡เชŸเซ‹ เชฎเซ‹เช•เชฒเชถเซ‡. เชคเซ‡ เชจเซ‹เช‚เชงเชตเซเช‚ เชฏเซ‹เช—เซเชฏ เช›เซ‡ เช•เซ‡ เช† เช•เซเชทเชฃเซ‡ เชชเซเชฐเซ‡เชทเช• เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เช•เชจเซ‡เช•เซเชถเชจ เช•เซเชฒเซ‹เช เชŸเชพเชˆเชฎเชฐ เชถเชฐเซ‚ เช•เชฐเซ€ เชšเซ‚เช•เซเชฏเซเช‚ เช›เซ‡ เช…เชจเซ‡, เชœเซเชฏเชพเชฐเซ‡ เชตเชฟเชจเช‚เชคเซ€ เชชเซเชฐเชพเชชเซเชค เชฅเชพเชฏ เช›เซ‡, เชคเซเชฏเชพเชฐเซ‡ เชคเซ‡ เชฐเซ€เชธเซ‡เชŸ เชฅเชพเชฏ เช›เซ‡.
เช–เซ‹เชตเชพเชฏเซ‡เชฒเชพ เชชเซ‡เช•เซ‡เชŸเซ‹ เชซเชฐเซ€เชฅเซ€ เชฎเซ‹เช•เชฒเซ€ เชฐเชนเซเชฏเชพ เช›เซ€เช (เชธเซ‡เชจเซเชกเชฟเช‚เช—เชธเชพเชฏเช•เชฒ เชธเซเชŸเซ‡เชŸ):

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  // ...
  connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
  // ัะฑั€ะพั ั‚ะฐะนะผะตั€ะฐ ะทะฐะบั€ั‹ั‚ะธั ัะพะตะดะธะฝะตะฝะธั 
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(-1, -1);
  // ...
  // ัั‚ะพ ะทะฐะฟั€ะพั ะฝะฐ ะฟะพะฒั‚ะพั€ะฝัƒัŽ ะฟะตั€ะตะดะฐั‡ัƒ โ€“ ะพั‚ะฟั€ะฐะฒะปัะตะผ ั‚ั€ะตะฑัƒะตะผั‹ะน ะฟะฐะบะตั‚          
  else
    ReliableUdpStateTools.SendPacket(connectionRecord, ReliableUdpStateTools.RetransmissionCreateUdpPayload(connectionRecord, header.PacketNumber));
}

เชฐเซ€เชธเซ‡เช‚เชŸ เชชเซ‡เช•เซ‡เชŸ (เชกเชพเชฏเชพเช—เซเชฐเชพเชฎเชฎเชพเช‚ เชชเซ‡เช•เซ‡เชŸ #3) เช‡เชจเช•เชฎเชฟเช‚เช— เช•เชจเซ‡เช•เซเชถเชจ เชฆเซเชตเชพเชฐเชพ เชชเซเชฐเชพเชชเซเชค เชฅเชพเชฏ เช›เซ‡. เชฐเซ€เชธเซ€เชต เชตเชฟเชจเซเชกเซ‹ เชญเชฐเชพเชˆ เช—เชˆ เช›เซ‡ เช…เชจเซ‡ เชธเชพเชฎเชพเชจเซเชฏ เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชถเชจ เชชเซเชจเชƒเชธเซเชฅเชพเชชเชฟเชค เช›เซ‡ เช•เซ‡ เช•เซ‡เชฎ เชคเซ‡ เชœเซ‹เชตเชพ เชฎเชพเชŸเซ‡ เชคเชชเชพเชธ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡.
เชชเซเชฐเชพเชชเซเชค เชตเชฟเช‚เชกเซ‹เชฎเชพเช‚ เชนเชฟเชŸ เชฎเชพเชŸเซ‡ เชคเชชเชพเชธเซ€ เชฐเชนเซเชฏเซเช‚ เช›เซ‡ (เชเชธเซ‡เชฎเซเชฌเชฒเชฟเช‚เช— เชธเซเชŸเซ‡เชŸ):

public override void ReceivePacket(ReliableUdpConnectionRecord connectionRecord, ReliableUdpHeader header, byte[] payload)
{
  // ...
  // ัƒะฒะตะปะธั‡ะธะฒะฐะตะผ ัั‡ะตั‚ั‡ะธะบ ะฟะฐะบะตั‚ะพะฒ        
  connectionRecord.PacketCounter++;
  // ะทะฐะฟะธัั‹ะฒะฐะตะผ ะฒ ะผะฐััะธะฒ ัƒะฟั€ะฐะฒะปะตะฝะธั ะพะบะฝะพะผ ั‚ะตะบัƒั‰ะธะน ะฝะพะผะตั€ ะฟะฐะบะตั‚ะฐ        
  connectionRecord.WindowControlArray[header.PacketNumber - connectionRecord.WindowLowerBound] = header.PacketNumber;
  // ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐะตะผ ะฝะฐะธะฑะพะปัŒัˆะธะน ะฟั€ะธัˆะตะดัˆะธะน ะฟะฐะบะตั‚        
  if (header.PacketNumber > connectionRecord.RcvCurrent)
    connectionRecord.RcvCurrent = header.PacketNumber;
  // ะฟะตั€ะตะทะฐะฟัƒัะบะฐะผ ั‚ะฐะนะผะตั€ั‹        
  connectionRecord.TimerSecondTry = false;
  connectionRecord.WaitForPacketsTimer.Change(connectionRecord.ShortTimerPeriod, -1);
  if (connectionRecord.CloseWaitTimer != null)
    connectionRecord.CloseWaitTimer.Change(-1, -1);
  // ...
  // ะตัะปะธ ะฝะฐะผ ะฟั€ะธัˆะปะธ ะฒัะต ะฟะฐะบะตั‚ั‹ ะพะบะฝะฐ, ั‚ะพ ัะฑั€ะฐัั‹ะฒะฐะตะผ ัั‡ะตั‚ั‡ะธะบ
  // ะธ ะฒั‹ัั‹ะปะฐะตะผ ะฟะฐะบะตั‚ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธะต
  else if (connectionRecord.PacketCounter == connectionRecord.WindowSize)
  {
    // ัะฑั€ะฐัั‹ะฒะฐะตะผ ัั‡ะตั‚ั‡ะธะบ.      
    connectionRecord.PacketCounter = 0;
    // ัะดะฒะธะฝัƒะปะธ ะพะบะฝะพ ะฟะตั€ะตะดะฐั‡ะธ
    connectionRecord.WindowLowerBound += connectionRecord.WindowSize;
    // ะพะฑะฝัƒะปะตะฝะธะต ะผะฐััะธะฒะฐ ัƒะฟั€ะฐะฒะปะตะฝะธั ะฟะตั€ะตะดะฐั‡ะตะน
    connectionRecord.WindowControlArray.Nullify();
    ReliableUdpStateTools.SendAcknowledgePacket(connectionRecord);
  }
  // ...
}

เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ UDP API

เชกเซ‡เชŸเชพ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชธเชพเชฅเซ‡ เช•เซเชฐเชฟเชฏเชพเชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชเช• เช–เซเชฒเซเชฒเซ‹ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ Udp เชตเชฐเซเช— เช›เซ‡, เชœเซ‡ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เช•เช‚เชŸเซเชฐเซ‹เชฒ เชฌเซเชฒเซ‹เช• เชชเชฐ เชฐเซ‡เชชเชฐ เช›เซ‡. เช…เชนเซ€เช‚ เชตเชฐเซเช—เชจเชพ เชธเซŒเชฅเซ€ เชฎเชนเชคเซเชตเชชเซ‚เชฐเซเชฃ เชธเชญเซเชฏเซ‹ เช›เซ‡:

public sealed class ReliableUdp : IDisposable
{
  // ะฟะพะปัƒั‡ะฐะตั‚ ะปะพะบะฐะปัŒะฝัƒัŽ ะบะพะฝะตั‡ะฝัƒัŽ ั‚ะพั‡ะบัƒ
  public IPEndPoint LocalEndpoint    
  // ัะพะทะดะฐะตั‚ ัะบะทะตะผะฟะปัั€ ReliableUdp ะธ ะทะฐะฟัƒัะบะฐะตั‚
  // ะฟั€ะพัะปัƒัˆะธะฒะฐะฝะธะต ะฒั…ะพะดัั‰ะธั… ะฟะฐะบะตั‚ะพะฒ ะฝะฐ ัƒะบะฐะทะฐะฝะฝะพะผ IP ะฐะดั€ะตัะต
  // ะธ ะฟะพั€ั‚ัƒ. ะ—ะฝะฐั‡ะตะฝะธะต 0 ะดะปั ะฟะพั€ั‚ะฐ ะพะทะฝะฐั‡ะฐะตั‚ ะธัะฟะพะปัŒะทะพะฒะฐะฝะธะต
  // ะดะธะฝะฐะผะธั‡ะตัะบะธ ะฒั‹ะดะตะปะตะฝะฝะพะณะพ ะฟะพั€ั‚ะฐ
  public ReliableUdp(IPAddress localAddress, int port = 0) 
  // ะฟะพะดะฟะธัะบะฐ ะฝะฐ ะฟะพะปัƒั‡ะตะฝะธะต ะฒั…ะพะดัั‰ะธั… ัะพะพะฑั‰ะตะฝะธะน
  public ReliableUdpSubscribeObject SubscribeOnMessages(ReliableUdpMessageCallback callback, ReliableUdpMessageTypes messageType = ReliableUdpMessageTypes.Any, IPEndPoint ipEndPoint = null)    
  // ะพั‚ะฟะธัะบะฐ ะพั‚ ะฟะพะปัƒั‡ะตะฝะธั ัะพะพะฑั‰ะตะฝะธะน
  public void Unsubscribe(ReliableUdpSubscribeObject subscribeObject)
  // ะฐัะธะฝั…ั€ะพะฝะฝะพ ะพั‚ะฟั€ะฐะฒะธั‚ัŒ ัะพะพะฑั‰ะตะฝะธะต 
  // ะŸั€ะธะผะตั‡ะฐะฝะธะต: ัะพะฒะผะตัั‚ะธะผะพัั‚ัŒ ั XP ะธ Server 2003 ะฝะต ั‚ะตั€ัะตั‚ัั, ั‚.ะบ. ะธัะฟะพะปัŒะทัƒะตั‚ัั .NET Framework 4.0
  public Task<bool> SendMessageAsync(ReliableUdpMessage reliableUdpMessage, IPEndPoint remoteEndPoint, CancellationToken cToken)
  // ะฝะฐั‡ะฐั‚ัŒ ะฐัะธะฝั…ั€ะพะฝะฝัƒัŽ ะพั‚ะฟั€ะฐะฒะบัƒ ัะพะพะฑั‰ะตะฝะธั
  public IAsyncResult BeginSendMessage(ReliableUdpMessage reliableUdpMessage, IPEndPoint remoteEndPoint, AsyncCallback asyncCallback, Object state)
  // ะฟะพะปัƒั‡ะธั‚ัŒ ั€ะตะทัƒะปัŒั‚ะฐั‚ ะฐัะธะฝั…ั€ะพะฝะฝะพะน ะพั‚ะฟั€ะฐะฒะบะธ
  public bool EndSendMessage(IAsyncResult asyncResult)  
  // ะพั‡ะธัั‚ะธั‚ัŒ ั€ะตััƒั€ัั‹
  public void Dispose()    
}

เชธเชฌเซเชธเซเช•เซเชฐเชฟเชชเซเชถเชจ เชฆเซเชตเชพเชฐเชพ เชธเช‚เชฆเซ‡เชถเชพเช“ เชชเซเชฐเชพเชชเซเชค เชฅเชพเชฏ เช›เซ‡. เช•เซ‰เชฒเชฌเซ‡เช• เชชเชฆเซเชงเชคเชฟ เชฎเชพเชŸเซ‡ เชชเซเชฐเชคเชฟเชจเชฟเชงเชฟ เชนเชธเซเชคเชพเช•เซเชทเชฐ:

public delegate void ReliableUdpMessageCallback( ReliableUdpMessage reliableUdpMessage, IPEndPoint remoteClient );

เชธเช‚เชฆเซ‡เชถ

public class ReliableUdpMessage
{
  // ั‚ะธะฟ ัะพะพะฑั‰ะตะฝะธั, ะฟั€ะพัั‚ะพะต ะฟะตั€ะตั‡ะธัะปะตะฝะธะต
  public ReliableUdpMessageTypes Type { get; private set; }
  // ะดะฐะฝะฝั‹ะต ัะพะพะฑั‰ะตะฝะธั
  public byte[] Body { get; private set; }
  // ะตัะปะธ ัƒัั‚ะฐะฝะพะฒะปะตะฝะพ ะฒ true โ€“ ะผะตั…ะฐะฝะธะทะผ ะฟะพะดั‚ะฒะตั€ะถะดะตะฝะธั ะดะพัั‚ะฐะฒะบะธ ะฑัƒะดะตั‚ ะพั‚ะบะปัŽั‡ะตะฝ
  // ะดะปั ะฟะตั€ะตะดะฐั‡ะธ ะบะพะฝะบั€ะตั‚ะฝะพะณะพ ัะพะพะฑั‰ะตะฝะธั
  public bool NoAsk { get; private set; }
}

เชšเซ‹เช•เซเช•เชธ เชธเช‚เชฆเซ‡เชถ เชชเซเชฐเช•เชพเชฐ เช…เชจเซ‡/เช…เชฅเชตเชพ เชšเซ‹เช•เซเช•เชธ เชชเซเชฐเซ‡เชทเช•เชจเซ‡ เชธเชฌเซเชธเซเช•เซเชฐเชพเช‡เชฌ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชฌเซ‡ เชตเซˆเช•เชฒเซเชชเชฟเช• เชชเชฐเชฟเชฎเชพเชฃเซ‹เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡: ReliableUdpMessageTypes messageType เช…เชจเซ‡ IPEndPoint ipEndPoint.

เชธเช‚เชฆเซ‡เชถเชจเชพ เชชเซเชฐเช•เชพเชฐเซ‹:

public enum ReliableUdpMessageTypes : short
{ 
  // ะ›ัŽะฑะพะต
  Any = 0,
  // ะ—ะฐะฟั€ะพั ะบ STUN server 
  StunRequest = 1,
  // ะžั‚ะฒะตั‚ ะพั‚ STUN server
  StunResponse = 2,
  // ะŸะตั€ะตะดะฐั‡ะฐ ั„ะฐะนะปะฐ
  FileTransfer =3,
  // ...
}

เชธเช‚เชฆเซ‡เชถ เช…เชธเซเชฎเซ‡เชณ เชฐเซ€เชคเซ‡ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡; เช† เชฎเชพเชŸเซ‡, เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชเช• เช…เชธเซเชฎเซ‡เชณ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชฎเซ‹เชกเซ‡เชฒ เชฒเชพเช—เซ เช•เชฐเซ‡ เช›เซ‡:

public IAsyncResult BeginSendMessage(ReliableUdpMessage reliableUdpMessage, IPEndPoint remoteEndPoint, AsyncCallback asyncCallback, Object state)

เชธเช‚เชฆเซ‡เชถ เชฎเซ‹เช•เชฒเชตเชพเชจเซเช‚ เชชเชฐเชฟเชฃเชพเชฎ เชธเชพเชšเซเช‚ เชนเชถเซ‡ - เชœเซ‹ เชธเช‚เชฆเซ‡เชถ เชธเชซเชณเชคเชพเชชเซ‚เชฐเซเชตเช• เชชเซเชฐเชพเชชเซเชคเช•เชฐเซเชคเชพ เชธเซเชงเซ€ เชชเชนเซ‹เช‚เชšเซเชฏเซ‹ เช…เชจเซ‡ เช–เซ‹เชŸเซ‹ - เชœเซ‹ เชธเชฎเชฏเชธเชฎเชพเชชเซเชคเชฟ เชฆเซเชตเชพเชฐเชพ เช•เชจเซ‡เช•เซเชถเชจ เชฌเช‚เชง เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชนเซ‹เชฏ เชคเซ‹:

public bool EndSendMessage(IAsyncResult asyncResult)

เชจเชฟเชทเซเช•เชฐเซเชท

เช† เชฒเซ‡เช–เชฎเชพเช‚ เช˜เชฃเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเซเช‚ เชจเชฅเซ€. เชฅเซเชฐเซ‡เชก เชฎเซ‡เชšเชฟเช‚เช— เชฎเชฟเช•เซ‡เชจเชฟเชเชฎเซเชธ, เช…เชชเชตเชพเชฆ เช…เชจเซ‡ เชญเซ‚เชฒ เชนเซ‡เชจเซเชกเชฒเชฟเช‚เช—, เช…เชธเซเชฎเซ‡เชณ เชธเช‚เชฆเซ‡เชถ เชฎเซ‹เช•เชฒเชตเชพเชจเซ€ เชชเชฆเซเชงเชคเชฟเช“เชจเซ‹ เช…เชฎเชฒ. เชชเชฐเช‚เชคเซ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซ‹ เชฎเซเช–เซเชฏ เชญเชพเช—, เชชเซ‡เช•เซ‡เชŸเซ‹ เชชเชฐ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเชพ เชคเชฐเซเช•เชจเซเช‚ เชตเชฐเซเชฃเชจ, เช•เชจเซ‡เช•เซเชถเชจ เชธเซเชฅเชพเชชเชฟเชค เช•เชฐเชตเซเช‚ เช…เชจเซ‡ เชธเชฎเชฏเชธเชฎเชพเชชเซเชคเชฟเชจเซเช‚ เชธเช‚เชšเชพเชฒเชจ เช•เชฐเชตเซเช‚, เชคเชฎเชพเชฐเชพ เชฎเชพเชŸเซ‡ เชธเซเชชเชทเซเชŸ เชนเซ‹เชตเซเช‚ เชœเซ‹เชˆเช.

เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ เชกเชฟเชฒเชฟเชตเชฐเซ€ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซเช‚ เชชเซเชฐเชฆเชฐเซเชถเชฟเชค เชธเช‚เชธเซเช•เชฐเชฃ เช…เช—เชพเช‰ เชจเชฟเชฐเซเชงเชพเชฐเชฟเชค เชœเชฐเซ‚เชฐเชฟเชฏเชพเชคเซ‹เชจเซ‡ เชชเชนเซ‹เช‚เชšเซ€ เชตเชณเชตเชพ เชฎเชพเชŸเซ‡ เชชเซ‚เชฐเชคเซเช‚ เชฎเชœเชฌเซ‚เชค เช…เชจเซ‡ เชฒเชตเชšเซ€เช• เช›เซ‡. เชชเชฐเช‚เชคเซ เชนเซเช‚ เช‰เชฎเซ‡เชฐเชตเชพ เชฎเชพเช‚เช—เซ เช›เซเช‚ เช•เซ‡ เชตเชฐเซเชฃเชตเซ‡เชฒ เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเซ‡ เชธเซเชงเชพเชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡. เช‰เชฆเชพเชนเชฐเชฃ เชคเชฐเซ€เช•เซ‡, เชฅเซเชฐเซเชชเซเชŸ เชตเชงเชพเชฐเชตเชพ เช…เชจเซ‡ เช—เชคเชฟเชถเซ€เชฒ เชฐเซ€เชคเซ‡ เชŸเชพเชˆเชฎเชฐ เชชเซ€เชฐเชฟเชฏเชกเซเชธ เชฌเชฆเชฒเชตเชพ เชฎเชพเชŸเซ‡, เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชฎเชพเช‚ เชธเซเชฒเชพเชˆเชกเชฟเช‚เช— เชตเชฟเชจเซเชกเซ‹ เช…เชจเซ‡ RTT เชœเซ‡เชตเซ€ เชฎเชฟเช•เซ‡เชจเชฟเชเชฎเซเชธ เช‰เชฎเซ‡เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡, เชคเซ‡ เช•เชจเซ‡เช•เซเชถเชจ เชจเซ‹เชกเซเชธ เชตเชšเซเชšเซ‡ MTU เชจเช•เซเช•เซ€ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡เชจเซ€ เชฎเชฟเช•เซ‡เชจเชฟเชเชฎ เชฒเชพเช—เซ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡ เชชเชฃ เช‰เชชเชฏเซ‹เช—เซ€ เชฅเชถเซ‡ (เชชเชฐเช‚เชคเซ เชœเซ‹ เชฎเซ‹เชŸเชพ เชธเช‚เชฆเซ‡เชถเชพ เชฎเซ‹เช•เชฒเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เชคเซ‹ เชœ) .

เชคเชฎเชพเชฐเชพ เชงเซเชฏเชพเชจ เชฌเชฆเชฒ เช†เชญเชพเชฐ, เชนเซเช‚ เชคเชฎเชพเชฐเซ€ เชŸเชฟเชชเซเชชเชฃเซ€เช“ เช…เชจเซ‡ เชŸเชฟเชชเซเชชเชฃเซ€เช“เชจเซ€ เชฐเชพเชน เชœเซ‹เช‰เช‚ เช›เซเช‚.

PS เชœเซ‡เช“ เชตเชฟเช—เชคเซ‹เชฎเชพเช‚ เชฐเชธ เชงเชฐเชพเชตเซ‡ เช›เซ‡ เช…เชฅเชตเชพ เชซเช•เซเชค เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซเช‚ เชชเชฐเซ€เช•เซเชทเชฃ เช•เชฐเชตเชพ เชฎเชพเช—เซ‡ เช›เซ‡ เชคเซ‡เชฎเชจเชพ เชฎเชพเชŸเซ‡, GitHube เชชเชฐเชจเชพ เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸเชจเซ€ เชฒเชฟเช‚เช•:
เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ UDP เชชเซเชฐเซ‹เชœเซ‡เช•เซเชŸ

เช‰เชชเชฏเซ‹เช—เซ€ เชฒเชฟเช‚เช•เซเชธ เช…เชจเซ‡ เชฒเซ‡เช–เซ‹

  1. TCP เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชธเซเชชเชทเซเชŸเซ€เช•เชฐเชฃ: เช…เช‚เช—เซเชฐเซ‡เชœเซ€เชฎเชพเช‚ ะธ เชฐเชถเชฟเชฏเชจ
  2. UDP เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เชธเซเชชเชทเซเชŸเซ€เช•เชฐเชฃ: เช…เช‚เช—เซเชฐเซ‡เชœเซ€เชฎเชพเช‚ ะธ เชฐเชถเชฟเชฏเชจ
  3. RUDP เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซ€ เชšเชฐเซเชšเชพ: เชกเซเชฐเชพเชซเซเชŸ-ietf-sigtran-reliable-udp-00
  4. เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ เชกเซ‡เชŸเชพ เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ: เช†เชฐเชเชซเชธเซ€ 908 ะธ เช†เชฐเชเชซเชธเซ€ 1151
  5. UDP เชชเชฐ เชกเชฟเชฒเชฟเชตเชฐเซ€ เช•เชจเซเชซเชฐเซเชฎเซ‡เชถเชจเชจเซเช‚ เชธเชฐเชณ เช…เชฎเชฒเซ€เช•เชฐเชฃ: .NET เช…เชจเซ‡ UDP เชธเชพเชฅเซ‡ เชคเชฎเชพเชฐเชพ เชจเซ‡เชŸเชตเชฐเซเช•เชฟเช‚เช— เชชเชฐ เชธเช‚เชชเซ‚เชฐเซเชฃ เชจเชฟเชฏเช‚เชคเซเชฐเชฃ เชฒเซ‹
  6. NAT เชŸเซเชฐเชพเชตเชฐเซเชธเชฒ เชฎเชฟเช•เซ‡เชจเชฟเชเชฎเซเชธเชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเชคเซ‹ เชฒเซ‡เช–: เชชเซ€เช…เชฐ-เชŸเซ-เชชเซ€เช…เชฐ เช•เซ‹เชฎเซเชฏเซเชจเชฟเช•เซ‡เชถเชจ เชธเชฎเช—เซเชฐ เชจเซ‡เชŸเชตเชฐเซเช• เชเชกเซเชฐเซ‡เชธ เชŸเซเชฐเชพเชจเซเชธเชฒเซ‡เชŸเชฐ
  7. เช…เชธเซเชฎเซ‡เชณ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชฎเซ‹เชกเซ‡เชฒเชจเซเช‚ เช…เชฎเชฒเซ€เช•เชฐเชฃ: CLR เช…เชธเชฟเช‚เช•เซเชฐเซ‹เชจเชธ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชฎเซ‹เชกเชฒเชจเซ‹ เช…เชฎเชฒ ะธ IAsyncResult เชกเชฟเชเชพเช‡เชจ เชชเซ‡เชŸเชฐเซเชจเชจเซ‹ เช…เชฎเชฒ เช•เซ‡เชตเซ€ เชฐเซ€เชคเซ‡ เช•เชฐเชตเซ‹
  8. เช…เชธเซเชฎเซ‡เชณ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช— เชฎเซ‹เชกเชฒเชจเซ‡ เช•เชพเชฐเซเชฏ-เช†เชงเชพเชฐเชฟเชค เช…เชธเซเชฎเซ‡เชณ เชชเซ‡เชŸเชฐเซเชจ (TAP เชฎเชพเช‚ APM):
    TPL เช…เชจเซ‡ เชชเชฐเช‚เชชเชฐเชพเช—เชค .NET เช…เชธเชฟเช‚เช•เซเชฐเซ‹เชจเชธ เชชเซเชฐเซ‹เช—เซเชฐเชพเชฎเชฟเช‚เช—
    เช…เชจเซเชฏ เช…เชธเชฟเช‚เช•เซเชฐเซ‹เชจเชธ เชชเซ‡เชŸเชฐเซเชจ เช…เชจเซ‡ เชชเซเชฐเช•เชพเชฐเซ‹ เชธเชพเชฅเซ‡ เช‡เชจเซเชŸเชฐเช“เชช เช•เชฐเซ‹

เช…เชชเชกเซ‡เชŸ: เช†เชญเชพเชฐ mayorovp ะธ sidristij เช‡เชจเซเชŸเชฐเชซเซ‡เชธเชฎเชพเช‚ เช•เชพเชฐเซเชฏ เช‰เชฎเซ‡เชฐเชตเชพเชจเชพ เชตเชฟเชšเชพเชฐ เชฎเชพเชŸเซ‡. เชœเซ‚เชจเซ€ เช“เชชเชฐเซ‡เชŸเชฟเช‚เช— เชธเชฟเชธเซเชŸเชฎเซ‹ เชธเชพเชฅเซ‡ เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€เชจเซ€ เชธเซเชธเช‚เช—เชคเชคเชพเชจเซเช‚ เช‰เชฒเซเชฒเช‚เช˜เชจ เชฅเชคเซเช‚ เชจเชฅเซ€, เช•เชพเชฐเชฃ เช•เซ‡ 4เชฅเซเช‚ เชซเซเชฐเซ‡เชฎเชตเชฐเซเช• XP เช…เชจเซ‡ 2003 เชธเชฐเซเชตเชฐเชจเซ‡ เชธเชชเซ‹เชฐเซเชŸ เช•เชฐเซ‡ เช›เซ‡.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹