القائمة الرئيسية

الصفحات

دورة CCNA 200-301 - الدرس الرابع والثلاثون (تقنية الـ Etherchannel)

دورة CCNA 200-301 - الدرس الرابع والثلاثون (تقنية الـ Etherchannel)

دورة CCNA 200-301 - الدرس الرابع والثلاثون (تقنية الـ Etherchannel)

في هذا الدرس ، سنلقي نظرة على تقنية الـ EtherChannel المعروفة أيضًا باسم link aggregation او تجميع الروابط. EtherChannel هي تقنية تتيح لك تجميع روابط مادية متعددة في ارتباط وهمي واحد. سنلقي نظرة على كيفية عمله وما هي مزاياه . لنبدأ بمثال على شبكة صغيرة:

مثال طوبولوجيا Etherchannel


الق نظرة على الصورة بالاعلى. لدي سويشان وجهازي كمبيوتر متصلان بكل سويش. نحن نستخدم وصلات Gigabit Ethernet هنا.


تخيل الآن أن جهاز H1 سيرسل 800 ميجابت من حركة المرور موجهة إلى H3. و H2 سيرسل 600 ميجابت من حركة المرور موجهة إلى H4. سيصبح الرابط بين السويشين كعنق الزجاجة. نحن نطلب 800 + 600 = 1400 ميجابت ولكن لدينا فقط وصلة تتحمل 1000 ميجابت فقط.


هناك نوعان من الحلول لهذه المشكلة:

  • أن نستبدل الرابط الموجود بين السويشات برابط له باندوديث أعلى ، ربما 10 جيجابت .
  • اضافة روابط متعددة ثم نقم بتجميعها في EtherChannel واحدة.

نظرًا لأن هذا الدرس يتعلق بـ EtherChannel ، فسنلقي نظرة على إضافة روابط متعددة. هذا مثال:

مثال لطوبولوجيا Etherchannel رابطان



في الصورة أعلاه قمت بإضافة بعض الروابط الإضافية. تكمن مشكلة هذا الإعداد في أن لدينا لوب بين السويشات مما سيجعل بروتوكول STP يوقف عمل أحد الرابطين لمنع اللوب. يحل بروتوكول EtherChannel هذه المشكلة لأنه ينشئ رابطًا افتراضيًا واحدًا من هذه الروابط المادية:

مثال على قناة Etherchannel ارتباط منطقي طوبولوجيا


يرى بروتوكول STP هذا الرابط كرابط وهمي واحد لذلك لا توجد حلقات او لوب! ستقوم EtherChannel بموازنة الحمل بين الروابط المختلفة التي لدينا وستتولى موضوع الوفرة redundancy. بمجرد فشل أحد الروابط ، سيستمر في العمل ويستخدم الروابط التي بقيت.

ضع في اعتبارك أن الروابط المادية  هي عامل محدود. لن يكون تدفق حركة المرور الفردية قادرة على تجاوز أكثر من 1000 ميجابت (رابط جيجابت واحد). قناة Etherchannel تعادل إضافة المزيد من الافرع إلى طريق سريع. فالباندوديث يزيد، ولكن محدودية السرعة لا تتغير.

يمكنك تعيين ما يصل إلى 16 وصلة فعلية لقناة EtherChannel ولكن 8 وصلات فقط ستكون نشطة في المرة الواحدة.


إذا كنت ترغب في تهيئة اعدادات الـ EtherChannel ، فلدينا ثلاثة خيارات:

  • بروتوكول PAgP (مملوك لشركة Cisco)
  • بروتوكول LACP (معيار IEEE)
  • يدوياً

PAgP و LACP عبارة عن بروتوكولات تفاوض تقوم بتهيئة قناة Etherchannel ديناميكيًا. PAgP هو بروتوكول مملوك لشركة Cisco بحيث يمكنك استخدامه فقط بين أجهزة سيسكو. LACP هو معيار IEEE يدعمه العديد من البائعين.


من الممكن أيضًا تهيئة قناة EtherChannel ثابتة بدون أن تقوم هذه البروتوكولات بالتفاوض على الاختيار نيابةً عنك.


إذا كنت تنوي إنشاء EtherChannel ، فأنت بحاجة إلى التأكد من أن جميع الوصلات لها نفس الضبط:

  • الدوبلكس.
  • السرعة.
  • شبكات VLAN  الـ Native والمسموح بها.
  • وضع Switchport (اكسس أو ترنك).

سيتحقق كل من PAgP و LACP مما إذا كان ضبط الوصلات التي تستخدمها هو نفسه.


الإعدادات

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


PAgP

إذا كنت ترغب في اعداد PAgP ، فهناك خياران يمكنك الاختيار من بينهما. يمكن اعداد الوصلة على النحو التالي:

  • Desirable مرغوب فيه: ستطلب الوصلة من الجانب الآخر أن يريد أن يصبح قناة EtherChannel.
  • Auto تلقائي: ستنتظر الوصلة بوضع الاستعداد حتى يطلب الجانب الآخر أن يصبح قناة EtherChannel.

فيما يلي نظرة عامة سريعة على خياري تكوين PAgP وما إذا كان EtherChannel سيتشكل أم لا:

DesirableAuto
DesirableYesYes
AutoYesNo

اسمحوا لي أن أريكم مثالاً على كيفية تكوين PAgP بين سويشين . سأستخدم SW1 و SW2 لهذا العرض التوضيحي:

واجهات Sw1 Sw2 اثنين جيجابت


يحتوي كل من SW1 و SW2 على وصلتين جيجابت والتي سنجمعها في رابط وهمي واحد.


فيما يلي الخيارات:

SW1(config)#interface GigabitEthernet 0/1
SW1(config-if)#channel-group 1 mode ?
  active     Enable LACP unconditionally
  auto       Enable PAgP only if a PAgP device is detected
  desirable  Enable PAgP unconditionally
  on         Enable EtherChannel only
  passive    Enable LACP only if a LACP device is detected

نستخدم الأمر channel-group على مستوى الوصلة. يمكنك اختيار أي رقم تريده ، سأختار 1. نحتاج إلى تحديد ما إذا كنا نستخدم الوضع التلقائي أو الوضع المرغوب فيه. سأقوم بتهيئة SW1 لاستخدام الوضع المرغوب فيه:

SW1(config)#interface range GigabitEthernet 0/1 - 2
SW1(config-if)#channel-group 1 mode desirable

قمت باعداد SW1 بوضع PAgP المرغوب به . سيطلب السويج بنشاط من SW2 ورغبته في أن يصبح قناة EtherChannel بهذه الطريقة. يمكننا اعداد SW2 إما في الوضع التلقائي أو المرغوب فيه. سأستخدم الوضع التلقائي:

SW2(config)#interface range GigabitEthernet 0/1 - 2
SW2(config-if)#channel-group 1 mode auto 

باستخدام الوضع التلقائي ، سيستجيب SW2 فقط لطلبات PAgP الواردة. بعد بضع ثوانٍ ، سترى الرسالة التالية على كلا السويشين:

SW1 %LINK-3-UPDOWN: Interface Port-channel1, changed state to up

يقوم السويش تلقائيًا بإنشاء وصلة قناة منفذ جديدة:

SW1#show interfaces port-channel 1
Port-channel1 is up, line protocol is up (connected)
  Hardware is EtherChannel, address is fa16.3e15.5fb2 (bia fa16.3e15.5fb2)
  MTU 1500 bytes, BW 2000000 Kbit/sec, DLY 10 usec, 
     reliability 255/255, txload 1/255, rxload 1/255
  Encapsulation ARPA, loopback not set
  Keepalive set (10 sec)
  ARP type: ARPA, ARP Timeout 04:00:00
  Last input 00:03:04, output never, output hang never
  Last clearing of "show interface" counters never
  Input queue: 0/2000/0/0 (size/max/drops/flushes); Total output drops: 0
  Queueing strategy: fifo
  Output queue: 0/40 (size/max)
  5 minute input rate 0 bits/sec, 0 packets/sec
  5 minute output rate 0 bits/sec, 0 packets/sec
     12 packets input, 973 bytes, 0 no buffer
     Received 0 broadcasts (0 multicasts)
     0 runts, 0 giants, 0 throttles 
     0 input errors, 0 CRC, 0 frame, 0 overrun, 0 ignored
     0 input packets with dribble condition detected
     240 packets output, 17496 bytes, 0 underruns
     0 output errors, 0 collisions, 0 interface resets
     0 unknown protocol drops
     0 babbles, 0 late collision, 0 deferred
     0 lost carrier, 0 no carrier
     0 output buffer failures, 0 output buffers swapped out
في الوقت الحالي ، لم يتم اعداد أي شيء ضمن وصلة port-channel:

SW1#show run interface Port-channel 1

interface Port-channel1
end
تحتوي وصلتنا المادية التي تنتمي إلى قناة EtherChannel هذه على أمر channel-group فقط:

SW1#show run interface GigabitEthernet 0/1

interface GigabitEthernet0/1
 channel-group 1 mode desirable
end
SW1#show run interface GigabitEthernet 0/2

interface GigabitEthernet0/2
 channel-group 1 mode desirable
end
إذا كنت ترغب في إجراء أي تغييرات مثل اعداد EtherChannel كترنك ، فأنت بحاجة إلى القيام بذلك ضمن وصلة port-channel. على سبيل المثال:
SW1(config)#interface Port-channel 1
SW1(config-if)#switchport trunk encapsulation dot1q 
SW1(config-if)#switchport mode trunk
عند القيام بذلك ، يقوم السويش تلقائيًا بإضافة الأوامر إلى الوصلات المادية أيضًا:
SW1#show run interface GigabitEthernet 0/1

interface GigabitEthernet0/1
 switchport trunk encapsulation dot1q
 switchport mode trunk
 channel-group 1 mode desirable
end
SW1#show run interface GigabitEthernet 0/2

interface GigabitEthernet0/2
 switchport trunk encapsulation dot1q
 switchport mode trunk
 channel-group 1 mode desirable
end
يجب عدم إجراء أي تغييرات على الوصلات المادية التي تنتمي إلى EtherChannel. استخدم دائمًا وصلة port-channel .

دعنا نواصل ونلقي نظرة فاحصة على حالة EtherChannel وبعض أوامر show:

SW1#show etherchannel summary 
Flags:  D - down        P - bundled in port-channel
        I - stand-alone s - suspended
        H - Hot-standby (LACP only)
        R - Layer3      S - Layer2
        U - in use      f - failed to allocate aggregator

        M - not in use, minimum links not met
        u - unsuitable for bundling
        w - waiting to be aggregated
        d - default port

Number of channel-groups in use: 1
Number of aggregators:           1

Group  Port-channel  Protocol    Ports
------+-------------+-----------+-----------------------------------------------
1      Po1(SU)         PAgP      Gi0/1(P)   Gi0/2(P)
يعطي الأمر show etherchannel Summary نظرة عامة نظيفة لطيفة على جميع قنوات EtherChannels الخاصة بك. يخبرنا ما إذا كان EtherChannel يعمل وما هو البروتوكول الذي نستخدمه. إليك أمر show آخر:
SW1#show etherchannel 1 port-channel 
		Port-channels in the group: 
		---------------------------

Port-channel: Po1
------------

Age of the Port-channel   = 0d:00h:10m:16s
Logical slot/port   = 2/1          Number of ports = 2
GC                  = 0x00010001      HotStandBy port = null
Port state          = Port-channel Ag-Inuse 
Protocol            =   PAgP
Port security       = Disabled

Ports in the Port-channel: 

Index   Load   Port     EC state        No of bits
------+------+------+------------------+-----------
  0     00     gi0/1   Desirable-Sl       0
  0     00     gi0/2   Desirable-Sl       0

Time since last port bundled:    0d:00h:00m:07s    Gi0/1
Time since last port Un-bundled: 0d:00h:04m:08s    Gi0/2
يمنحك الأمر show etherchannel نظرة عامة على EtherChannel. يمكنك رؤية البروتوكول والوصلات التي نستخدمها ، ويخبرنا ما إذا كانت الوصلة الوهمية تعمل أم لا.

إليك آخر أمر show يمكنك استخدامه:
SW1#show interfaces GigabitEthernet 0/1 etherchannel 
Port state    = Up Mstr In-Bndl 
Channel group = 1           Mode = Desirable-Sl    Gcchange = 0
Port-channel  = Po1         GC   = 0x00010001      Pseudo port-channel = Po1
Port index    = 0           Load = 0x00            Protocol =   PAgP

Flags:  S - Device is sending Slow hello.  C - Device is in Consistent state.
        A - Device is in Auto mode.        P - Device learns on physical port.
        d - PAgP is down.
Timers: H - Hello timer is running.        Q - Quit timer is running.
        S - Switching timer is running.    I - Interface timer is running.

Local information:
                                Hello    Partner  PAgP     Learning  Group
Port      Flags State   Timers  Interval Count   Priority   Method  Ifindex
Gi0/1     SC	U6/S7   H	30s	 1        128        Any      5001

Partner's information:

          Partner              Partner          Partner         Partner Group
Port      Name                 Device ID        Port       Age  Flags   Cap.
Gi0/1     SW2              0019.569d.5700	Gi0/1      19s SAC	10001 

Age of the port in the current state: 0d:00h:02m:37s
الطريقة الثالثة للتحقق من EtherChannel هي استخدام الأمر show interfaces. في المثال الخاص بي ، أبحث في معلومات الوصلة GigabitEthernet 0/1. إلى جانب المعلومات الموجودة على السويش المحلي الخاص بنا ، يمكنك أيضًا رؤية الوصلة من جهة السويش المجاور لنا.

هل تريد أن تلقي نظرة بنفسك؟ ستجد هنا اعداد PAgP النهائي لكل جهاز.

بروتوكول LACP
LACP مشابه لـ PAgP ولكنه يستخدم مصطلحات مختلفة:

نشط Active: ستطلب الوصلة من الجانب الآخر أن يصبح EtherChannel.
خامل Passive: تنتظر الوصلة بشكل سلبي أن يطلب الجانب الآخر أن يصبح EtherChannel.
يجب أن يستخدم سويش واحد على الأقل الوضع النشط. عندما يستخدم كلا السويشين الوضع الخامل ، فلن يحدث أي شيء.


ActivePassive
ActiveYesYes
PassiveYesNo

سأستخدم نفس الشكل الذي استخدمناه لـ PAgP:

واجهات Sw1 Sw2 اثنين جيجابت


سنقوم باعداد SW1 لاستخدام الوضع النشط:
SW1(config-if)#interface range GigabitEthernet 0/1 - 2
SW1(config-if)#channel-group 1 mode active 
وسيستخدم SW2 الوضع الخامل:

SW2(config)#interface range GigabitEthernet 0/1 - 2
SW2(config-if)#channel-group 1 mode passive

دعونا نتحقق من عملنا. يمكننا استخدام نفس أوامر show التي نستخدمها لـ PAgP:
SW1#show etherchannel summary 
Flags:  D - down        P - bundled in port-channel
        I - stand-alone s - suspended
        H - Hot-standby (LACP only)
        R - Layer3      S - Layer2
        U - in use      N - not in use, no aggregation
        f - failed to allocate aggregator

        M - not in use, minimum links not met
        m - not in use, port not aggregated due to minimum links not met
        u - unsuitable for bundling
        w - waiting to be aggregated
        d - default port

        A - formed by Auto LAG


Number of channel-groups in use: 1
Number of aggregators:           1

Group  Port-channel  Protocol    Ports
------+-------------+-----------+-----------------------------------------------
1      Po1(SU)         LACP      Gi0/1(P)    Gi0/2(P)
لنجرب الأمر show etherchannel:

SW1#show etherchannel 1 port-channel
                Port-channels in the group: 
                ---------------------------

Port-channel: Po1    (Primary Aggregator)

------------

Age of the Port-channel   = 0d:00h:01m:43s
Logical slot/port   = 16/0          Number of ports = 2
HotStandBy port = null 
Port state          = Port-channel Ag-Inuse 
Protocol            =   LACP
Port security       = Disabled
Load share deferral = Disabled   

Ports in the Port-channel: 

Index   Load   Port     EC state        No of bits
------+------+------+------------------+-----------
  0     00     Gi0/1    Active             0
  0     00     Gi0/2    Active             0

Time since last port bundled:    0d:00h:01m:04s    Gi0/2
وأخيرًا وليس آخرًا ، لنجرب إظهار الوصلات:
SW1#show interfaces GigabitEthernet 0/1 etherchannel
Port state    = Up Mstr Assoc In-Bndl 
Channel group = 1           Mode = Active          Gcchange = -
Port-channel  = Po1         GC   =   -             Pseudo port-channel = Po1
Port index    = 0           Load = 0x00            Protocol =   LACP

Flags:  S - Device is sending Slow LACPDUs   F - Device is sending fast LACPDUs.
        A - Device is in active mode.        P - Device is in passive mode.

Local information:
                            LACP port     Admin     Oper    Port        Port
Port      Flags   State     Priority      Key       Key     Number      State
Gi0/1     SA      bndl      32768         0x1       0x1     0x2         0x3D  

Partner's information:

                  LACP port                        Admin  Oper   Port    Port
Port      Flags   Priority  Dev ID          Age    key    Key    Number  State
Gi0/1     SP      32768     5e00.0001.8000  18s    0x0    0x1    0x2     0x3C  

Age of the port in the current state: 0d:00h:01m:37s
كما ترى ، أصبح البروتوكول الآن LACP ، لدينا وصلة Port-channel 1 تتكون من وصلتين ماديتين.

هل تريد أن تلقي نظرة بنفسك؟ ستجد هنا اعداد LACP النهائي لكل جهاز.

الطريقة اليدوية
بدلاً من PAgP أو LACP ، يمكننا أيضًا تمكين Etherchannel يدويًا. سأستخدم نفس الشكل لإثبات هذا:
واجهات Sw1 Sw2 اثنين جيجابت


هنا الاعدادات:

SW1(config)#interface range GigabitEthernet 0/1 - 2
SW1(config-if-range)#channel-group 1 mode on
SW2(config)#interface range GigabitEthernet 0/1 - 2
SW2(config-if-range)#channel-group 1 mode on
هذا كل ما في الامر. دعونا نجرب أوامر العرض لدينا. سنبدأ بنظرة عامة:
SW1#show etherchannel summary 
Flags:  D - down        P - bundled in port-channel
        I - stand-alone s - suspended
        H - Hot-standby (LACP only)
        R - Layer3      S - Layer2
        U - in use      N - not in use, no aggregation
        f - failed to allocate aggregator

        M - not in use, minimum links not met
        m - not in use, port not aggregated due to minimum links not met
        u - unsuitable for bundling
        w - waiting to be aggregated
        d - default port

        A - formed by Auto LAG


Number of channel-groups in use: 1
Number of aggregators:           1

Group  Port-channel  Protocol    Ports
------+-------------+-----------+-----------------------------------------------
1      Po1(SU)          -        Gi0/1(P)    Gi0/2(P)
في الإخراج أعلاه ، يمكنك أن ترى أننا لا نستخدم أي بروتوكول. دعونا نلقي نظرة فاحصة على وصلة Port-channel:
SW1#show etherchannel 1 port-channel
                Port-channels in the group: 
                ---------------------------

Port-channel: Po1
------------

Age of the Port-channel   = 0d:00h:06m:54s
Logical slot/port   = 16/0          Number of ports = 2
GC                  = 0x00000000      HotStandBy port = null
Port state          = Port-channel Ag-Inuse 
Protocol            =    -
Port security       = Disabled
Load share deferral = Disabled   

Ports in the Port-channel: 

Index   Load   Port     EC state        No of bits
------+------+------+------------------+-----------
  0     00     Gi0/1    On                 0
  0     00     Gi0/2    On                 0

Time since last port bundled:    0d:00h:01m:21s    Gi0/2
Time since last port Un-bundled: 0d:00h:04m:05s    Gi0/2
ويمكننا التحقق من إحدى الوصلتين الفعليتين والاطلاع على معلومات قناة Etherchannel:
SW1#show interfaces GigabitEthernet 0/1 etherchannel
Port state    = Up Mstr In-Bndl 
Channel group = 1           Mode = On              Gcchange = -
Port-channel  = Po1         GC   =   -             Pseudo port-channel = Po1
Port index    = 0           Load = 0x00            Protocol =    -

Age of the port in the current state: 0d:00h:01m:41s

هذا كل ما لدينا.


توزيع الحمل
آخر شيء أريد أن أعرضه لكم عن EtherChannel هو موازنة التحميل. ألق نظرة على الاخراج التالي:

SW1#show EtherChannel load-balance 
EtherChannel Load-Balancing Configuration:
        src-mac

EtherChannel Load-Balancing Addresses Used Per-Protocol:
Non-IP: Source MAC address
  IPv4: Source MAC address
  IPv6: Source MAC address
استخدم الأمر show etherchannel load-Balance لمعرفة الاعداد الافتراضي. كما ترى ، يتم توزيع الحمل في هذا السويش بناءً على عنوان MAC المصدر. إذا أردت ، يمكنك تغيير هذا السلوك باستخدام الأمر port-channel load-Balance:
SW1(config)#port-channel load-balance ?
  dst-ip       Dst IP Addr
  dst-mac      Dst Mac Addr
  src-dst-ip   Src XOR Dst IP Addr
  src-dst-mac  Src XOR Dst Mac Addr
  src-ip       Src IP Addr
  src-mac      Src Mac Addr
هناك الكثير من الخيارات للاختيار من بينها ، بما في ذلك مجموعات من المصدر و الوجهة أو عناوين IP.

لماذا يجب أن نهتم بموازنة الحمل؟ دعونا نلقي نظرة على الصورة أدناه:
سيناريو موازنة الحمل Etherchannel


لدينا SW1 وأربعة أجهزة كمبيوتر. على الجانب الأيمن ، لدينا SW2 وجهاز توجيه. آلية موازنة التحميل الافتراضية هي عنوان MAC المصدر. هذا يعني أنه سيتم إرسال كل حركة المرور من عنوان MAC واحد إلى نفس الوصلة المادية، على سبيل المثال:
  • سيتم إرسال عنوان الماك AAA باستخدام الوصلة gi0/1 .
  • سيتم إرسال عنوان BBB باستخدام الوصلة gi0/2.
  • سيتم إرسال عنوان CCC باستخدام الوصلة  gi0/1.
  • سيتم إرسال عنوان DDD باستخدام الوصلة gi0/2.
نظرًا لأن لدينا أجهزة كمبيوتر متعددة ، فهذا أمر جيد ، فسيتم استخدام كلا الرابطين الماديين على SW1 لقناة EtherChannel الخاصة بنا ، لذلك اعتمادًا على مقدار حركة المرور التي ترسلها أجهزة الكمبيوتر ، ستكون قريبة من نسبة 1:1.

إنها قصة مختلفة بالنسبة لـ SW2 نظرًا لأن لدينا جهاز توجيه واحد فقط بعنوان MAC EEE. سيختار إحدى الوصلات المادية بحيث يتم إرسال كل حركة المرور من جهاز التوجيه إلى وصلة GigabitEthernet 0/1 أو 0/2. لن يتم استخدام أحد الروابط المادية على الإطلاق.

إذا كانت هذه هي الحالة ، فقد يكون من الأفضل تغيير خوارزمية موازنة التحميل. على سبيل المثال ، في SW2 يمكننا القيام بذلك:
SW2(config)#port-channel load-balance dst-mac
إذا قمنا بتبديل موازنة الحمل إلى عنوان MAC الوجهة على SW2 ، فستكون حركة المرور من جهاز التوجيه الخاص بنا إلى أجهزة الكمبيوتر متوازنة الحمل بين الوصلات المادية المختلفة لأن لدينا أجهزة كمبيوتر متعددة بعناوين MAC وجهة مختلفة.

هذا كل ما لدي على EtherChannels في الوقت الحالي ، آمل أن يكون هذا مفيدًا لك! إذا كان لديك أي أسئلة فلا تتردد في ترك تعليق.

استنتاج
لقد تعلمت الآن ما هي قنوات EtherChannels وكيفية اعدادها:
  • قناة EtherChannel هي وصلة وهمية تجمع عدة وصلات مادية.
  • ترى Spanning-Tree قناة Etherchannel كوصلة واحدة ، لذا لن تمنع الروابط المادية الزائدة عن الحاجة.
  • هناك ثلاثة خيارات لاعداد EtherChannel:
    • PAgP: بروتوكول مملوك لشركة Cisco.
    • LACP: معيار IEEE.
    • يدوي: تجميع وصلات فعلية متعددة دون أي بروتوكول.
  • تدعم قنوات EtherChannels العديد من خيارات موازنة الحمل . تأكد من تحديد خوارزمية موازنة الحمل التي تطابق أنماط حركة المرور الخاصة بك.
أتمنى أن تكون قد استمتعت بهذا الدرس. إذا كان لديك أي أسئله، رجاء أترك تعليقا.
reaction:

تعليقات