سؤال

لقد قرأت العديد من المواقع والبرامج التعليمية عبر الإنترنت ولكني ما زلت مرتبكا. إذا كانت الرسالة أكبر من IP MTU، ثم send() إرجاع البايت المرسلة. ماذا يحدث لبقية الرسالة؟ هل أنا أسمي send() مرة أخرى ومحاولة إرسال بقية الرسالة؟ أو هل يجب أن تهتم طبقة IP شيء تلقائيا؟

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

المحلول

إذا كنت تستخدم TCP، فستكون الواجهة المقدمة إليك هي مجرى بايت. لا داعي للقلق بشأن كيفية حصول دفق البايت من طرف واحد من الاتصال بالآخر. يمكنك تجاهل MTU طبقة IP. في الواقع، يمكنك تجاهل طبقة IP بالكامل.

عندما تتصل send() ستعامل مكدس TCP على جهازك مع جميع التفاصيل الضرورية لدفق البايتات التي تدفعها إلى مكالمات الإرسال الخاصة بك لتظهر من recv() يدعو في الطرف الآخر من الاتصال.

الشيء الوحيد الذي يجب تذكره هو أنه مع TCP الذي تتعامل مع دفق وهذا يعني ذلك send() قد يؤدي إلى الوصول إلى البيانات المتعددة recv() المكالمات والعديد send() قد تؤدي المكالمات إلى الوصول إلى البيانات recv() يتصل. ليس لديك سيطرة على هذا. أنت تتعامل مع دفق بايت ولكل مكالمة recv() يمكن إرجاع أي عدد من البايتات من 1 إلى الرقم المعلقة حاليا (السماح بمرحلة المخازن المؤقتة الكافية recv() يتصل).

منذ أن طلب المعلقين؛)

على معظم مداخن TCP send() من المرجح أن تفشل في إرسال كل شيء لأن المخازن المؤقتة لكدس TCP ممتلئة و (ربما) نافذة TCP هي أيضا وكاملة التحكم في التدفق قيد التشغيل مما يعني أن المكدس لا يمكن أن ترسل أي بيانات أخرى حتى النهاية البعيدة ACKS بعض البيانات وليس على استعداد للمخزن المؤقت أكثر نيابة عنك. أنا لا آتي عبر كومة TCP التي سوف ترفض send() بسبب اعتبارات MTU وحدها ولكني أعتقد أن بعض الأنظمة المنفذة أسفل المنفذة قد تتصرف بهذه الطريقة ...

على أي حال، إذا send() إرجاع أقل من عدد البايتات التي قمت بتزويدها بعد ذلك، يجب عليك إعادة إرسال البيانات المتبقية في مرحلة ما. غالبا send() سيتم حظر وانتظر حتى تتمكن من إرسال جميع البيانات، وإذا قمت بتعيين المقبس في وضع غير حظر، فربما لا ترغب في إعادة محاولة الإرسال على الفور إذا فشلت في إرسال كل شيء كما سينتهي بك الأمر حلقة ضيقة ...

من المحتمل أن تكون مفيدة لك لتكون أكثر تحديدا حول نظام التشغيل الذي تستخدمه.

نصائح أخرى

إذا كانت الحزمة كبيرة جدا بحيث لا يتم إرسال تلميح التشريح بتشريعات ICMP إشارة المرسل لتقليل حجم الحزمة وحاول مرة أخرى.

إذا كنت تستخدم TCP، فكل التفاصيل، يجب أن تتوقع أن تعتني طبقة الشبكة لك. ما يفعله مكدسات IP الحديثة التي تقوم بها بالفعل الكواليس لمعرفة أدنى MTU على طول المسار أصبح قد أصبح إلى حد ما من الفن الأسود.

WRT UDP لا يزال بإمكانك أن تتوقع المكدس إلى جزء من أجلك ولكن نظرا عمليا استخدام حالة UDP ليس مثاليا .. اعتمادا على طلبك من المحتمل أن ترى أداء أفضل من خلال فهم المسار الخاص بك بشكل صريح.

... على السؤال () سؤال، يتصرف بعض المداخن بشكل مختلف ولكن يجب أن يكون العلاج هو نفسه. دعنا نقول أن لديك 100 بايت لإرسال ... إرسال () إرجاع 10 بايت المرسلة. تحتاج إلى الاستمرار في الاتصال بالإرسال باستخدام 90 بايت الباق حتى يتم دفع جميع الأسلاك لإرسال الرسالة بأكملها.

يؤدي استخدام مآخذ الحظر على نظام Windows Platform () إرجاع () بسهولة بعد إرسال كل شيء .. على منصات أخرى .. Linux et al ستحتاج إلى الحفاظ على إرسال أكثر في كثير من الأحيان لدفع البيانات.

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