سؤال

لماذا هو أن اتصالات TCP إلى واجهة الاسترجاع في نهاية المطاف في TIME_WAIT (مأخذ مغلق مع مجموعة SO_DONTLINGER)، ولكن اتصالات متطابقة إلى مضيف آخر لا ينتهي في TIME_WAIT (هم إعادة تعيين / دمرت على الفور)؟

وفيما يلي سيناريوهات لتوضيح:

و(A) اثنين من التطبيقات، عميل وخادم، وكلاهما يعمل على نفس الجهاز ويندوز. يتصل العميل إلى الخادم عن طريق واجهة الاسترجاع للملقم (127.0.0.1، ميناء XXXX)، يرسل البيانات، يتلقى البيانات، ويتم إغلاق مأخذ (يتم تعيين SO_DONTLINGER).

ودعونا نقول ان الاتصالات هي <م> جدا لم يدم طويلا، وبالتالي فإن التطبيق العميل تأسيس وتدمير عدد كبير من الاتصالات كل ثانية. والنتيجة النهائية هي أن مآخذ في نهاية المطاف في TIME_WAIT، والعميل يستنفد في نهاية المطاف عدد الحد الأقصى لها من مآخذ (في ويندوز، وهذا هو ~ 3900 افتراضيا، ونحن على افتراض أنه لن يتم تغيير هذه القيمة في التسجيل).

و(B) نفس اثنين من التطبيقات السيناريو (A)، ولكن الملقم على مجموعة مختلفة (العميل لا يزال قيد التشغيل في ويندوز). اتصالات متطابقة في كل شيء، إلا أنها لا توجه لل127.0.0.1، ولكن بعض الآخر IP بدلا من ذلك. هنا وصلات على جهاز العميل لا ندخل TIME_WAIT، والتطبيق العميل يمكن أن تستمر في إجراء اتصالات إلى أجل غير مسمى.

لماذا هذا التناقض؟

هل كانت مفيدة؟

المحلول

والدولة TIME_WAIT يحدث فقط في واحدة من نهاية اتصال - النهاية أن يغلق أولا. للواجهة الاسترجاع طرفي هي على نفس الجهاز لذلك سوف نرى دائما TIME_WAIT.

في حالة أخرى، حاول النظر إلى آلة أخرى. أعتقد أنك سترى مآخذ TIME_WAIT هناك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top