নেটওয়ার্ক ক্লায়েন্ট-সার্ভার বার্তা বিনিময় এবং ক্লক সিঙ্ক্রোনাইজেশন সহায়তা


10

আমি একটি দ্রুত গতিতে পদার্থবিজ্ঞানের খেলা করছি যা একটি টেবিল হকি। দুটি মাললেট এবং একটি পাক দিয়ে। গেমটি আইফোন / আইপ্যাডে চলে এবং আমি গেমসেন্টারটির মাধ্যমে মাল্টিপ্লেয়ার অংশটি করছি।

নেটওয়ার্ক সিস্টেমটি এভাবেই কাজ করে। ক্লায়েন্ট যা ম্যাচটি তারা করে, এটি সার্ভার হিসাবে নিষ্পত্তি হবে এবং ম্যাচের অনুরোধটি গ্রহণকারী হ'ল ক্লায়েন্ট।

'সার্ভারে' পদার্থবিজ্ঞান চলছে এবং প্রতিক্রিয়া তাত্ক্ষণিক এবং ক্লায়েন্টের সাথে তাদের পদার্থবিজ্ঞানও চলছে তাই বার্তা বিনিময়ের মধ্যে এটি মসৃণ দেখাচ্ছে সার্ভার হিসাবে আমি যা করি তা হ'ল আমি ক্লায়েন্টকে আমার হাঁসের বেগ এবং আমার অবস্থান প্রেরণ করি এবং ক্লায়েন্টটি তার সিঙ্গী ধরে রাখতে সার্ভারের সাথে সম্পর্কিত তার হাঁসের বেগ / অবস্থান সামঞ্জস্য করে। অন্যথায় পদার্থবিজ্ঞান বিভক্ত হয় এবং এটি এটিকে স্ক্রু করে দেয়।

নেটওয়ার্কের বিলম্বিতা যখন ভাল হয়, তখন 100 মিমি ফলাফল খুব ভাল হয়, আমি ক্লায়েন্টের পক্ষে একটি মসৃণ প্লেযোগ্য খেলাম এবং অদ্ভুত আচরণ সর্বনিম্ন। ল্যাগটি 150 থেকে 200 মিমি হয়ে গেলে সমস্যাটি ঘটে। সেক্ষেত্রে ঘটে যায় যে আমার ক্লায়েন্ট পাকটি ইতিমধ্যে একটি কিনারা এবং উল্টানো দিকটি আঘাত করেছে তবে এটি সার্ভার থেকে একটি বিলম্ব বার্তা পেয়েছে এবং এটি কিছুটা ব্যাক করে যাতে বল আচরণের জন্য একটি অদ্ভুত অনুভূতি হয়।

আমি এটি সম্পর্কে কয়েকটি জিনিস পড়েছি:

পং নেটওয়ার্ক উদাহরণ

সিঙ্ক্রোনাইজেশন উদাহরণ ক্লিক করুন

ক্লক সিঙ্কে উইকিপিডিয়া

সুতরাং, আমি কীভাবে এটি সমাধান করতে পারি? আমি যতক্ষণ না আমার কাছে সর্বোত্তম বিকল্পটি পড়েছি তা হ'ল একটি টাইমস্ট্যাম্প সহ সার্ভার / ক্লায়েন্টের সাথে একটি ক্লক সিঙ্ক্রোনাইজেশন করা যাতে আমি যখন আমার ঘড়ির সাথে সম্পর্কিত বিলম্ব বার্তাগুলি পাই তখন আমি কেবল তখনই উপেক্ষা করে ক্লায়েন্টদের সিমুলেশনটি করি কাজ। আপনি কি এর সাথে একমত? এবং যেহেতু আমি ডেটা অবিশ্বাস্য (ইউডিপি) প্রেরণ করছি আমি বিলম্বিত বার্তা বা বার্তাগুলিকে ক্রম ছাড়িয়ে যেতে পারি।

যদি এটি সর্বোত্তম পন্থা হয় তবে আমি কীভাবে ক্লক সিঙ্ক্রোনাইজেশন প্রয়োগ করব। আমি কীভাবে করব সে সম্পর্কে পদক্ষেপগুলি পড়েছি কিন্তু আমি এটি বেশ বুঝতে পারি নি।

এটি বলে যে:

  1. ক্লায়েন্ট বর্তমান সময়ের স্থানীয় সময়কে "সময় অনুরোধ" প্যাকেটে স্ট্যাম্প দেয় এবং সার্ভারে প্রেরণ করে।
  2. সার্ভার দ্বারা প্রাপ্তি পরে, সার্ভার সার্ভার-সময় স্ট্যাম্প এবং রিটার্ন
  3. ক্লায়েন্ট দ্বারা প্রাপ্তির পরে, ক্লায়েন্ট প্রেরিত সময় থেকে বর্তমান সময়কে বিয়োগ করে এবং গণনা করতে বিলম্বের জন্য দুটি দ্বারা ভাগ করে। এটি ক্লায়েন্ট-সার্ভারের সময় ব-দ্বীপ নির্ধারণের জন্য সার্ভার সময় থেকে বর্তমান সময়কে বিয়োগ করে এবং সঠিক ঘড়ির ব-দ্বীপটি পেতে অর্ধ-বিলম্বিতভাবে যুক্ত করে। (এখনও পর্যন্ত এই অ্যালগোথিম এসএনটিপির সাথে খুব মিল)
  4. ক্লায়েন্ট প্রতিটি সময় কয়েক সেকেন্ড বিরতি দিয়ে 1 থেকে 3 পাঁচ বা তার বেশি বার পুনরাবৃত্তি করে। অন্তর্বর্তী সময়ে অন্যান্য ট্র্যাফিকের অনুমতি দেওয়া যেতে পারে তবে সেরা ফলাফলের জন্য এটি হ্রাস করা উচিত প্যাকেটের প্রাপ্তিগুলির ফলাফলগুলি সঞ্চিত হয় এবং সর্বাধিক-বিলম্বিত ক্রমে সর্বনিম্ন-বিন্যাসে বাছাই করা হয়। এই আদেশ তালিকা থেকে মিড পয়েন্ট নমুনা বাছাইয়ের মাধ্যমে মিডিয়েন ল্যাটেন্সি নির্ধারণ করা হয়।
  5. মিডিয়ান থেকে আনুমানিক 1 স্ট্যান্ডার্ড-বিচ্যুতির উপরের সমস্ত নমুনাগুলি বাতিল করা হয় এবং বাকী নমুনাগুলি একটি গাণিতিক গড় ব্যবহার করে গড়ে গড়ে নেওয়া হয়।

এই উদাহরণ অনুসরণ করে আমার এই হবে:

গেমটি লোড হয়ে গেছে এবং আমার ক্লায়েন্টের সময় এখন 0 হয়ে গেছে তা ভেবে দেখা যাক, তাই আমি সার্ভারে প্রেরণ করি যে আমার সময় 0।

এই বার্তাগুলি সার্ভারে পেতে 150 মিমি লাগে তবে সার্ভারের ঘড়িটি ইতিমধ্যে শুরু হয়ে গেছে এবং ক্লায়েন্টের থেকে 1 সেকেন্ড এগিয়ে। যখন সার্ভার বার্তাটি পাবে তখন সময়টি হবে: 1.15 এবং ক্লায়েন্টকে সেই সময়টি প্রেরণ করে, আমরা কি ভাল আছি? আমাদের ল্যাগটি 150 মিমি থেকে ধ্রুবক রয়েছে tend

এখন ক্লায়েন্টটি 1.15 সময় গ্রহণ করে এবং প্রেরিত সময় থেকে বর্তমান সময়কে বিয়োগ করে এবং দুটি দ্বারা বিভাজন গণনা করতে বিলম্ব করে। যা হ'ল: 0.3 - 0 = 0.3 / 2 -> 150 মিমি।

এটি ক্লায়েন্ট-সার্ভারের সময় ব-দ্বীপ নির্ধারণের জন্য সার্ভার সময় থেকে বর্তমান সময়কে বিয়োগ করে এবং সঠিক ঘড়ির ব-দ্বীপটি পেতে অর্ধ-বিলম্বিতভাবে যুক্ত করে:
ক্লায়েন্টের সময়: 0.3 সার্ভারের সময় 1.15
0.3 - 1.15 = .85 + ল্যাটেন্সি (.15) = 1

কীভাবে এটি সিঙ্ক্রোনাইজ করা হয়? আমি কী মিস করছি?

এটি মাল্টিপ্লেয়ার এবং নেটওয়ার্কের অভিজ্ঞতায় আমার প্রথমবার, তাই আমি কিছুটা বিভ্রান্ত।

ধন্যবাদ.


ভাল প্রশ্ন. আপনি কি সংশোধন করতে পারেন: 0.3 - 1.15 হতে 1.15 - 0.3?
Ciaran

উত্তর:


12

পোস্ট করা অ্যালগরিদমটি সঠিক ছিল, তবে উদাহরণস্বরূপ আপনি সার্ভার প্যাকেটের ক্লায়েন্টের কাছে যেতে সময়টি ভুলে যাচ্ছেন, তাই:

Server time: 1
Client time: 0
Client sends 0 to server

... 150ms to get to server  (ping is 300! not 150ms in this case. Ping is round-trip)

Server time: 1.15
Client time: 0.15
Server receives packet and sends client 1.15

... 150ms to get back to client

Server time: 1.30
Client time: 0.30
Client receives 1.15 from server

এখন আপনি দেখতে পাচ্ছেন, ক্লায়েন্টটি যদি তার ঘড়িটি 1.15 এ পরিবর্তন করে তবে এটি সার্ভারের পিছনে 0.15 হবে, এ কারণেই আপনাকে পিংয়ের জন্য সামঞ্জস্য করতে হবে (ওরফে রাউন্ড ট্রিপ সময় [আরটিটি])। এখানে বিভিন্ন পদক্ষেপের জন্য সম্পূর্ণ ব-দ্বীনের সময় গণনা করা হল:

Server Time - Current Time + Ping / 2
= Server Time - Current Time + (Current Time - First Packet Time) / 2
= 1.15 (Perceived, not actual!) - 0.30 + (0.30 - 0.00) / 2
= 1.00

এটি আমাদেরকে ১.০০ সেকেন্ডের সঠিক ব-দ্বীনের সময় দেয়


আমি পেয়ে যাচ্ছি, সুতরাং আমার ক্লায়েন্টের ঘড়িটি 1.00 এবং সার্ভারটি 1.30 হয় সার্ভার থেকে বার্তা পাওয়ার পরে আমাকে কী পিং যুক্ত করতে হবে তা পরীক্ষা করতে দেরী হওয়া বার্তা বা কিছু আছে কিনা? আরেকটি জিনিস, যদি বিলম্ব হয় তবে আমি কী সমস্ত সময় এই গণনাগুলি চালিয়ে যেতে পারি?
gmemaro

ক্লায়েন্টের সময়টিকে সার্ভারের সময়ের সমান করতে বর্তমান ঘড়িতে 1.00 সেকেন্ডের ব-দ্বীপের সময় যুক্ত করতে হবে। লেটেন্সি সবসময় পরিবর্তিত হয়, প্রতিটি প্যাকেটে কিছুটা আলাদা আরটিটি থাকবে। একটি গেমের মতো সংক্ষিপ্ত সময়সীমার মধ্যে আমি কেবল একবারে এই বার সিঙ্ক করব, ক্লায়েন্টটির সার্ভারের সময় কী হবে তা সম্পর্কে খুব ভাল ধারণা থাকবে এবং উভয় ঘড়ি প্রায় একই গতিতে এগিয়ে চলবে। কেবলমাত্র ব্যতিক্রম হবে যদি আপনি এমন প্যাকেট পান যা ভবিষ্যতে উপস্থিত হয়। সেক্ষেত্রে 2 টি সমাধান রয়েছে: 1) একটি নতুন সময় সিঙ্ক করুন। 2) ভবিষ্যতের ঘড়ির সাথে মেলে আপনার ঘড়ির অগ্রসর করুন
জন ম্যাকডোনাল্ড

ঠিক আছে, এই পরিস্থিতিটি কেবলমাত্র আমি পেয়েছি তা নিশ্চিত করার জন্য এটি দেখতে দিন: সার্ভারের সময়: 1 এস ক্লায়েন্টের সময়: 0 এস 150 মিমি সার্ভারে পেতে সার্ভারের সময়: 1.15s ক্লায়েন্টের সময়: 0.15s সার্ভার ক্লায়েন্টের কাছে ক্লায়েন্টকে 1.15s 200ms প্রেরণ করে? সুতরাং, আমার পিং এখন 350 মিমি। এটা কি ঠিক? সার্ভারের সময়: 1.35 ক্লায়েন্টের সময়: 0.35 গণনা করা: 1.15 - .35 + (0.35 - 0.00) / 2 এখন আমার ডেল্টটাইম = 0,975 যদি আমি ডেল্টার সময়টি আমার .35 তে 0,975 যোগ করি তবে আমি পেয়েছি: 1,325 যা ডাইসাইঙ্কের ধরণ। এটা কি ঠিক আছে?
gmemaro

@ গিলসন, এটি সঠিক। দুটি প্যাকেটের জন্য বিলম্ব যদি পৃথক হয় (প্রায় গ্যারান্টিযুক্ত), ক্লায়েন্টের ব-দ্বীপের সময় গণনা নির্ভুল হবে না। ক্লায়েন্টের পক্ষে নিখুঁত হওয়ার কোনও উপায় নেই। প্রশ্নে আপনি বর্ণিত অ্যালগরিদমে, ব-দ্বীপের সময়টি বেশ কয়েকবার গণনা করা হয়েছিল এবং এই ফলাফলগুলি বাছাই এবং গড় করার জন্য একটি পদ্ধতি ছিল। অনেক সময় সিঙ্ক পদ্ধতিগুলি এর মতো কিছু করবে তবে এগুলি সাধারণত ব্যবসায়ের সমালোচনামূলক এবং দীর্ঘমেয়াদী সার্ভারগুলির জন্য যেমন স্টক এক্সচেঞ্জগুলির জন্য হয়। একটি সংক্ষিপ্ত গেমের জন্য আপনার যে সময়ের যথাযথতা প্রয়োজন, আমি মনে করি এটি ওভারকিল হবে।
জন ম্যাকডোনাল্ড

@ গিলসন, যতক্ষণ না ক্লায়েন্টটির সার্ভারের সময়ের একটি যুক্তিসঙ্গত অনুমান থাকে এবং উভয় ঘড়ি মোটামুটি একই হারে এগিয়ে যায়, আপনার কোনও সমস্যা লক্ষ্য করা উচিত নয়। যখন ক্লায়েন্ট বা সার্ভার অন্যদিকে কোনও ক্রিয়াকলাপ প্রেরণ করবে তখন তারা তাদের স্থানীয় সময় প্রেরণ করবে। গ্রহণের দিক থেকে, বার্তাটি সর্বদা অতীতের হওয়া উচিত এবং অতীত ঘটনা হিসাবে ব্যাখ্যা করা দরকার। এর অর্থ প্যাকেটের সমস্ত তথ্য যেমন আপনার অবস্থান, বেগ (দৈর্ঘ্য + দিক) এবং সময় প্রয়োজন। তারপরে আপনি সেখানে ছিনতাকে এবং তারপরে রাখতে পারেন এবং সেই ছানাটিকে অতীত থেকে বর্তমানের দিকে নিয়ে যেতে পারেন। আমি চ্যাট বিটিডব্লুতে আছি
জন ম্যাকডোনাল্ড
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.