سؤال

بيزور يستخدم UDP / IP كبروتوكول الاتصال. لقد تحولنا مؤخرا إلى الخادم العام إلى جهاز جديد، وبدأت في الحصول على تقارير عن العديد من المهلة. اكتشفت أنني أستطيع حل المشكلة إذا قمت بتغيير IP الذي تم الاستعلام عنه eth0:1 ل eth0.

يمكنني إعادة إنتاج هذه المشكلة بمثال بسيط:

هذا هو رمز الخادم:

#! /usr/bin/env python

import SocketServer

class RequestHandler(SocketServer.DatagramRequestHandler):
    def handle(self):
        print self.packet
        self.wfile.write("Pong")

s = SocketServer.UDPServer(("0.0.0.0", 24440), RequestHandler)
s.serve_forever()

هذا هو رمز العميل (188.40.77.206 هو eth0. 188.40.77.236 هو نفس الخادم، ولكن هو eth0:1):

>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>>> s.sendto('ping', 0, ("188.40.77.206", 24440))
4
>>> s.recvfrom(1024)
('Pong', ('188.40.77.206', 24440))
>>> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
>>> s.sendto('ping', 0, ("188.40.77.236", 24440))
4
>>> s.recvfrom(1024)
[never gets anything]

يحصل الخادم على حزمة "Ping" في كلتا الحالتين (وبالتالي يرسل حزمة "بونغ" في كلتا الحالتين).

الغريب، هذا يفعل العمل من بعض الأماكن (أي سأحصل على استجابة من كل من IPS). على سبيل المثال، يعمل من 188.40.37.137 (نفس الشبكة / Datacenter، خادم مختلف)، ولكن أيضا من 89.18.189.160 (datacenter مختلفة). في تلك الحالات، recvfrom الرد لديه eth0 IP، بدلا من تلك التي كانت مرتبطة بها.

هل هذه مجرد قاعدة من UDP؟ هل هذه مشكلة / قيود مع بيثون UDPServer صف دراسي؟ هل هو شيء أفعله بشكل غير صحيح؟ هل هناك أي طريقة يمكنني الحصول عليها عن هذا العمل بعيدا عن الاتصال ببساطة eth0 IP (أو الاستماع على IP المحددة وليس 0.0.0.0)?

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

المحلول

جئت عبر هذا مع خادم TFTP. كان الخادم الخاص بي عناوين IP تواجه نفس الشبكة. نظرا لأن UDP بدون اتصال، فقد تكون هناك مشكلات مع عناوين IP التي لا يتم تعيينها كما هو متوقع في هذا الموقف. التسلسل الذي كان لدي كان:

  1. يرسل العميل الحزمة الأولية إلى الخادم في عنوان IP معين
  2. يقرأ الخادم عنوان مصدر العميل من الحزمة الواردة، ويرسل استجابة.
    1. ومع ذلك، في الاستجابة، يتم تعيين "عنوان المصدر" الخاص بالخادم وفقا لجدول التوجيه، ويحصل على تعيين آخر عنوان IP.
    2. لم يكن من الممكن التحكم في عنوان IP "المصدر" الخاص بالملقم لأن نظام التشغيل لم يخبرنا عنوان IP الذي جاء الطلب عبره.
  3. يحصل العميل على استجابة من عنوان IP "الآخر"، ويرفضه.

كان الحل في حالتي هو ربط خادم TFTP خصيصا بعنوان IP الذي أردت الاستماع إليه، بدلا من الربط لجميع الواجهات.

لقد وجدت بعض النص الذي قد يكون ذا صلة Linux MAN صفحة ل tftpd (خادم TFTP). ها هو:

 Unfortunately, on multi-homed systems, it is impossible for tftpd to
 determine the address on which a packet was received. As a result, tftpd
 uses two different mechanisms to guess the best source address to use for
 replies. If the socket that inetd(8) passed to tftpd is bound to a par‐
 ticular address, tftpd uses that address for replies. Otherwise, tftpd
 uses ‘‘UDP connect’’ to let the kernel choose the reply address based on
 the destination of the replies and the routing tables. This means that
 most setups will work transparently, while in cases where the reply
 address must be fixed, the virtual hosting feature of inetd(8) can be
 used to ensure that replies go out from the correct address.  These con‐
 siderations are important, because most tftp clients will reject reply
 packets that appear to come from an unexpected address.

يرى هذه الإجابة التي تظهر أن على لينكس ذلك هو من الممكن قراءة العنوان المحلي لحزم UDP الواردة، وتعيينه للحزم الصادرة. من الممكن في ج؛ لست متأكدا من بيثون رغم ذلك.

نصائح أخرى

هل هذه مجرد قاعدة من UDP؟

لا.

هل هذه مشكلة / قيود مع فئة بيثون UDPServer؟

المشكوك فيه.

هل هو شيء أفعله بشكل غير صحيح؟

برنامجك يبدو صحيحا.

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

معرفة ما إذا كنت مسموحا بربط هذا العنوان. يوجد برنامج صغير رائع يسمى Netcat الذي يعمل بشكل رائع للوصول إلى شبكة منخفضة المستوى. ليس متاحا دائما على كل نظام ولكن من السهل تنزيله وتجميعه.

nc -l -s 188.40.77.236 -p 24440 -u

إذا قمت بتشغيل برنامج العميل الخاص بك تماما كما حدث، فيجب أن ترى "Ping" مطبوعة على المحطة الخاصة بك. (يمكنك كتابة بونغ وتعيينه مرة أخرى إلى عميلك. إنه متعة كيندا للعب معه.) إذا حصلت على Ping، فإن قضايا الشبكات ليست مشكلة وشيء خاطئ في برنامج Python Server أو المكتبات. إذا لم تحصل على Ping، فلن تتمكن من إجراء الاتصال. "اتصل بمسؤول الشبكة للحصول على المساعدة".

تشمل الأشياء التي يجب مراجعها ...

  1. مشاكل جدار الحماية؟
  2. مشكلات التكوين مع واجهات الشبكة المستعثية.
  3. مشاكل إذن المستخدم.
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top