ما الفرق بين اغتيال الانتظار الزمني و SO_REESEADDR

StackOverflow https://stackoverflow.com/questions/587961

  •  06-09-2019
  •  | 
  •  

سؤال

كنت أقرأ عن استخدام خيار مأخذ المقبس SO_LLINGER لتعمد "اغتيال" حالة الانتظار الزمنية من خلال تحديد الوقت البارزين إلى الصفر. إن مؤلف الكتاب ثم يذهب إلى القول أننا يجب ألا نفعل ذلك بشكل عام ولا ينبغي لنا أن نتدخل أبدا مع حالة الانتظار الزمني. ثم توصي على الفور باستخدام خيار so_reuseaddr لتجاوز حالة انتظار الوقت.

سؤالي هو، ما هو الفرق؟ في كلتا الحالتين، فإنك تقوم بإنهاء الدولة الانتظار التي تنتظرها قبل الأوان وأخذ خطر تلقي شرائح مكررة. لماذا هو واحد جيد والآخر سيء؟

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

المحلول 2

فعلت بعض القراءة والمزيد من فهمي لما يحدث (نأمل صحيح):

عند الاتصال بالقرب من المقبس الذي يحتوي على So_Reuseaddr (أو تعطل تطبيقك) يحدث التسلسل التالي:

  1. يرسل TCP أي بيانات متبقية في المخزن المؤقت Send وزعزح
  2. إذا كان الإغلاق يسمى أنه يعود على الفور دون الإشارة إلى ما إذا تم تسليم أي بيانات متبقية بنجاح.
  3. إذا تم إرسال البيانات، يرسل الأقران بيانات ACK
  4. يرسل النظير ACK من الزعنفة ويرسل حزم الزعنفة الخاصة به
  5. زعنفة الأقران acked ويتم إلغاء تخصيص موارد المقبس.
  6. المقبس لا يدخل الوقت الانتظار.

عند إغلاق المقبس مع تعيين وقت so_linger إلى الصفر:

  1. يتجاهل TCP أي بيانات في المخزن المؤقت إرسال
  2. TCP يرسل حزمة RST إلى النظير
  3. يتم إلغاء تخصيص موارد المقبس.
  4. المقبس لا يدخل الوقت - الانتظار

إلى جانب حقيقة أن إعداد Linger to Zero هو الاختراق والأسلوب السيء، فإنه أيضا أخلاق سيء لأنه لا يمر عبر إغلاق نظيف للاتصال.

نصائح أخرى

Time_wait طبيعي تماما. يحدث بعد زعنفة TCP على الجانب المحلي متبوعا بقلم زعنفة TCP ACK من الموقع البعيد. في time_wait، أنت فقط تنتظر أي حزم طائشة تصل إلى العنوان المحلي. ومع ذلك، إذا كانت هناك حزمة ضائعة أو عصرية، فعندما تضمن TIME_WATE أن تنتهي صلاحية TTL أو "الوقت للعيش" قبل استخدام العنوان مرة أخرى.

إذا كنت تستخدم so_reuseaddr، فأنت تقول أساسا، فسوف أفترض أنه لا توجد حزم طائشة. والتي من المحتمل بشكل متزايد مع شبكات TCP الحديثة والموثوقة. على الرغم من أنه لا يزال من الممكن، فمن غير المرجح.

يؤدي إعداد So_linger إلى الصفر إلى بدء إغلاق غير طبيعي، يسمى أيضا "إغلاق الاتصال". هنا أنت لا تحترم time_wait وتجاهل إمكانية حزمة طائشة.

إذا رأيت fin_wait_1، فقد يتسبب ذلك في حدوث مشكلات، حيث لم يتم إرسال الموقع البعيد زعانف TCP ACK استجابة لزعزاعك. لذلك تم قتل العملية أو فقدت ACK زعانف TCP بسبب قسم شبكة أو طريق سيء.

عندما ترى Close_wait لديك مشكلة، يمكنك هنا تسريب الاتصالات لأنك لا ترسل ACK TCP ACK عند إعطاء زعنفة TCP.

لقد استخدمت SO_REESEADDR إلى BILDCARD BIND () إلى منفذ محلي يحتوي بالفعل على بعض البرامج الأخرى بالفعل اتصال. اتضح أن هذا الاستخدام بالذات لن يسبب عدم وجود مشكلة طالما لم يحاول أي مآخذ أن يستمع () إلى نفس التحرير والسرد Addr / Port في نفس الوقت.

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