যোগাযোগ, গেমিং বা ফাইল স্থানান্তরের জন্য দুটি ব্রাউজারের মধ্যে ডেটা পাঠানো একটি বরং জড়িত প্রক্রিয়া হতে পারে। এটি ডেটা রিলে করার জন্য একটি সার্ভারের জন্য সেট আপ এবং অর্থপ্রদান করতে হবে এবং সম্ভবত এটি একাধিক ডেটা সেন্টারে স্কেলিং করতে হবে। এই পরিস্থিতিতে, উচ্চ বিলম্বের সম্ভাবনা রয়েছে এবং ডেটা গোপন রাখা কঠিন।
WebRTC এর RTCDataChannel
API ব্যবহার করে সরাসরি এক পিয়ার থেকে অন্য পিয়ারে ডেটা স্থানান্তর করার মাধ্যমে এই সমস্যাগুলি দূর করা যেতে পারে। এই নিবন্ধটি কীভাবে ডেটা চ্যানেল সেট আপ এবং ব্যবহার করতে হয় তার মূল বিষয়গুলি কভার করে, সেইসাথে আজকের ওয়েবে সাধারণ ব্যবহারের ক্ষেত্রেও।
অন্য ডাটা চ্যানেল কেন?
আমাদের WebSocket , AJAX এবং সার্ভার সেন্ট ইভেন্ট আছে। কেন আমরা অন্য যোগাযোগ চ্যানেল প্রয়োজন? WebSocket দ্বিমুখী, কিন্তু এই সমস্ত প্রযুক্তি একটি সার্ভারে বা থেকে যোগাযোগের জন্য ডিজাইন করা হয়েছে।
RTCDataChannel
একটি ভিন্ন পদ্ধতি গ্রহণ করে:
- এটি
RTCPeerConnection
API এর সাথে কাজ করে, যা পিয়ার-টু-পিয়ার সংযোগ সক্ষম করে। এর ফলে কম বিলম্ব হতে পারে - কোন মধ্যস্থতাকারী সার্ভার নেই এবং কম 'হপস'। -
RTCDataChannel
স্ট্রীম কন্ট্রোল ট্রান্সমিশন প্রোটোকল (SCTP) ব্যবহার করে, যা কনফিগারযোগ্য ডেলিভারি শব্দার্থবিদ্যা-আউট-অফ-অর্ডার ডেলিভারি এবং রিট্রান্সমিট কনফিগারেশনের অনুমতি দেয়।
RTCDataChannel
এখন গুগল ক্রোম, অপেরা এবং ফায়ারফক্সে ডেস্কটপ এবং অ্যান্ড্রয়েডে SCTP সমর্থন সহ উপলব্ধ।
একটি সতর্কতা: সিগন্যালিং, STUN এবং টার্ন
WebRTC পিয়ার-টু-পিয়ার কমিউনিকেশন সক্ষম করে, কিন্তু পিয়ার কানেকশন বুটস্ট্র্যাপ করার জন্য মিডিয়া এবং নেটওয়ার্ক মেটাডেটা আদান-প্রদানের জন্য সিগন্যালিং এর জন্য সার্ভারের প্রয়োজন।
WebRTC NATs এবং ফায়ারওয়ালগুলির সাথে মোকাবিলা করে:
- আইসিই ফ্রেমওয়ার্ক সহকর্মীদের মধ্যে সর্বোত্তম সম্ভাব্য নেটওয়ার্ক পাথ স্থাপন করতে।
- প্রতিটি পিয়ারের জন্য একটি সর্বজনীনভাবে অ্যাক্সেসযোগ্য আইপি এবং পোর্ট নিশ্চিত করতে STUN সার্ভারগুলি ।
- সরাসরি সংযোগ ব্যর্থ হলে এবং ডেটা রিলেইংয়ের প্রয়োজন হলে সার্ভারগুলি চালু করুন ৷
WebRTC কীভাবে সিগন্যালিং এবং নেটওয়ার্কিংয়ের জন্য সার্ভারের সাথে কাজ করে সে সম্পর্কে আরও তথ্যের জন্য, বাস্তব জগতে WebRTC দেখুন: STUN, TURN, এবং সিগন্যালিং ।
ক্ষমতা
RTCDataChannel
API ডেটা প্রকারের একটি নমনীয় সেট সমর্থন করে। এপিআই ওয়েবসকেটকে হুবহু নকল করার জন্য ডিজাইন করা হয়েছে, এবং RTCDataChannel
জাভাস্ক্রিপ্টের কিছু বাইনারি ধরনের স্ট্রিংকে সমর্থন করে, যেমন Blob , ArrayBuffer , এবং ArrayBufferView । ফাইল স্থানান্তর এবং মাল্টিপ্লেয়ার গেমিংয়ের সাথে কাজ করার সময় এই ধরনের সহায়ক হতে পারে।
RTCDataChannel
অবিশ্বস্ত এবং ক্রমবিন্যস্ত মোডে কাজ করতে পারে (ব্যবহারকারী ডেটাগ্রাম প্রোটোকল বা UDP-এর অনুরূপ), নির্ভরযোগ্য এবং অর্ডারকৃত মোড (ট্রান্সমিশন কন্ট্রোল প্রোটোকল বা TCP-এর অনুরূপ), এবং আংশিক নির্ভরযোগ্য মোড:
- নির্ভরযোগ্য এবং অর্ডারকৃত মোড বার্তা প্রেরণের গ্যারান্টি দেয় এবং যে ক্রমানুসারে সেগুলি বিতরণ করা হয় । এটি অতিরিক্ত ওভারহেড নেয়, এইভাবে সম্ভাব্যভাবে এই মোডটিকে ধীর করে তোলে।
- অবিশ্বস্ত এবং অবিন্যস্ত মোড গ্যারান্টি দেয় না যে প্রতিটি বার্তা অন্য দিকে যাবে বা তারা সেখানে কী ক্রমে পাবে । এটি ওভারহেড সরিয়ে দেয়, এই মোডটিকে আরও দ্রুত কাজ করার অনুমতি দেয়।
- আংশিক নির্ভরযোগ্য মোড একটি নির্দিষ্ট অবস্থার অধীনে বার্তা প্রেরণের গ্যারান্টি দেয়, যেমন একটি পুনঃপ্রচারের সময়সীমা বা সর্বাধিক পরিমাণ পুনঃপ্রচার । বার্তাগুলির ক্রমও কনফিগারযোগ্য।
প্রথম দুটি মোডের কর্মক্ষমতা প্রায় একই রকম হয় যখন প্যাকেটের কোনো ক্ষতি না হয়। যাইহোক, নির্ভরযোগ্য এবং অর্ডারকৃত মোডে, একটি হারিয়ে যাওয়া প্যাকেট এর পিছনে অন্যান্য প্যাকেটগুলিকে ব্লক করে দেয় এবং হারানো প্যাকেটটি পুনঃপ্রেরিত এবং আসার সময় বাসি হতে পারে। অবশ্যই, একই অ্যাপের মধ্যে একাধিক ডেটা চ্যানেল ব্যবহার করা সম্ভব, প্রতিটি তাদের নিজস্ব নির্ভরযোগ্য বা অবিশ্বস্ত শব্দার্থবিদ্যা সহ।
এখানে ইলিয়া গ্রিগোরিকের হাই পারফরম্যান্স ব্রাউজার নেটওয়ার্কিং থেকে একটি সহায়ক টেবিল রয়েছে:
টিসিপি | ইউডিপি | SCTP | |
নির্ভরযোগ্যতা | নির্ভরযোগ্য | অবিশ্বস্ত | কনফিগারযোগ্য |
ডেলিভারি | আদেশ দিয়েছেন | ক্রমহীন | কনফিগারযোগ্য |
সংক্রমণ | বাইট-ভিত্তিক | বার্তা-ভিত্তিক | বার্তা-ভিত্তিক |
প্রবাহ নিয়ন্ত্রণ | হ্যাঁ | না | হ্যাঁ |
যানজট নিয়ন্ত্রণ | হ্যাঁ | না | হ্যাঁ |
এর পরে, আপনি শিখবেন কিভাবে RTCDataChannel
কনফিগার করতে হয় নির্ভরযোগ্য এবং অর্ডার করা বা অবিশ্বস্ত এবং অক্রমহীন মোড ব্যবহার করতে।
ডেটা চ্যানেল কনফিগার করা হচ্ছে
অনলাইনে RTCDataChannel
এর বেশ কয়েকটি সাধারণ ডেমো রয়েছে:
এই উদাহরণগুলিতে, ব্রাউজারটি নিজের সাথে একটি পিয়ার সংযোগ তৈরি করে, তারপরে একটি ডেটা চ্যানেল তৈরি করে এবং পিয়ার সংযোগের মাধ্যমে একটি বার্তা পাঠায়। এটি তখন একটি ডেটা চ্যানেল তৈরি করছে এবং পিয়ার সংযোগের সাথে বার্তা পাঠাচ্ছে। অবশেষে, আপনার বার্তা পৃষ্ঠার অন্য পাশে বক্সে প্রদর্শিত হবে!
এটি দিয়ে শুরু করার কোডটি সংক্ষিপ্ত:
const peerConnection = new RTCPeerConnection();
// Establish your peer connection using your signaling channel here
const dataChannel =
peerConnection.createDataChannel("myLabel", dataChannelOptions);
dataChannel.onerror = (error) => {
console.log("Data Channel Error:", error);
};
dataChannel.onmessage = (event) => {
console.log("Got Data Channel Message:", event.data);
};
dataChannel.onopen = () => {
dataChannel.send("Hello World!");
};
dataChannel.onclose = () => {
console.log("The Data Channel is Closed");
};
dataChannel
অবজেক্টটি ইতিমধ্যেই প্রতিষ্ঠিত পিয়ার সংযোগ থেকে তৈরি করা হয়েছে। এটি সংকেত হওয়ার আগে বা পরে তৈরি করা যেতে পারে। তারপরে আপনি এই চ্যানেলটিকে অন্যদের থেকে আলাদা করতে একটি লেবেল এবং ঐচ্ছিক কনফিগারেশন সেটিংসের একটি সেট পাস করুন:
const dataChannelOptions = {
ordered: false, // do not guarantee order
maxPacketLifeTime: 3000, // in milliseconds
};
একটি maxRetransmits
বিকল্প যোগ করাও সম্ভব (ব্যর্থ হওয়ার আগে কতবার চেষ্টা করতে হবে), কিন্তু আপনি শুধুমাত্র maxRetransmits বা maxPacketLifeTime নির্দিষ্ট করতে পারেন, উভয়ই নয়। UDP শব্দার্থবিদ্যার জন্য, maxRetransmits
0
এ সেট করুন এবং ordered
false
। আরও তথ্যের জন্য, এই IETF RFCগুলি দেখুন: স্ট্রিম কন্ট্রোল ট্রান্সমিশন প্রোটোকল এবং স্ট্রিম কন্ট্রোল ট্রান্সমিশন প্রোটোকল আংশিক নির্ভরযোগ্যতা এক্সটেনশন ।
-
ordered
: যদি ডাটা চ্যানেল অর্ডারের নিশ্চয়তা দেয় বা না দেয় -
maxPacketLifeTime
: একটি ব্যর্থ বার্তা পুনরায় প্রেরণ করার চেষ্টা করার সর্বোচ্চ সময় -
maxRetransmits
: একটি ব্যর্থ বার্তা পুনঃপ্রচার করার চেষ্টা করার জন্য সর্বাধিক সংখ্যক বার -
protocol
: একটি সাবপ্রোটোকল ব্যবহার করার অনুমতি দেয়, যা অ্যাপের দিকে মেটা তথ্য প্রদান করে -
negotiated
: যদি সত্য হিসাবে সেট করা হয়, অন্য পিয়ারে একটি ডেটা চ্যানেলের স্বয়ংক্রিয় সেট আপ সরিয়ে দেয়, অন্য দিকে একই আইডি দিয়ে একটি ডেটা চ্যানেল তৈরি করার জন্য আপনার নিজস্ব উপায় প্রদান করে -
id
: আপনাকে চ্যানেলের জন্য আপনার নিজস্ব আইডি প্রদান করতে দেয় যা শুধুমাত্রnegotiated
সাথেtrue
সেট করে ব্যবহার করা যেতে পারে)
শুধুমাত্র যে বিকল্পগুলি বেশিরভাগ লোককে ব্যবহার করতে হবে তা হল প্রথম তিনটি: ordered
, maxPacketLifeTime
, এবং maxRetransmits
৷ SCTP (এখন WebRTC সমর্থন করে এমন সমস্ত ব্রাউজার দ্বারা ব্যবহৃত) নির্ভরযোগ্য এবং অর্ডার ডিফল্টরূপে সত্য। আপনি যদি অ্যাপ স্তর থেকে সম্পূর্ণ নিয়ন্ত্রণ চান তবে অবিশ্বস্ত এবং অব্যবস্থাপিত ব্যবহার করা বোধগম্য, তবে বেশিরভাগ ক্ষেত্রেই আংশিক নির্ভরযোগ্যতা সহায়ক।
মনে রাখবেন, WebSocket-এর মতো, RTCDataChannel
ইভেন্টগুলি ফায়ার করে যখন একটি সংযোগ স্থাপন করা হয়, বন্ধ করা হয়, বা ত্রুটি হয় এবং যখন এটি অন্য পিয়ার থেকে একটি বার্তা পায়।
এটা নিরাপদ?
সমস্ত WebRTC উপাদানগুলির জন্য এনক্রিপশন বাধ্যতামূলক৷ RTCDataChannel
এর সাথে, সমস্ত ডেটা ডেটাগ্রাম ট্রান্সপোর্ট লেয়ার সিকিউরিটি (DTLS) দিয়ে সুরক্ষিত। DTLS হল SSL-এর একটি ডেরিভেটিভ, যার অর্থ আপনার ডেটা যেকোনো স্ট্যান্ডার্ড SSL-ভিত্তিক সংযোগ ব্যবহার করার মতোই সুরক্ষিত হবে। DTLS মানসম্মত এবং WebRTC সমর্থন করে এমন সমস্ত ব্রাউজারে তৈরি। আরও তথ্যের জন্য, Wireshark উইকি দেখুন।
আপনি ডেটা সম্পর্কে কীভাবে চিন্তা করেন তা পরিবর্তন করুন
জাভাস্ক্রিপ্টে প্রচুর পরিমাণে ডেটা পরিচালনা করা একটি ব্যথার বিষয় হতে পারে। Sharefest এর ডেভেলপাররা যেমন উল্লেখ করেছেন, এর জন্য ডেটা নিয়ে নতুন ভাবে চিন্তা করতে হবে। আপনি যদি একটি ফাইল স্থানান্তর করেন যা আপনার উপলব্ধ মেমরির পরিমাণের চেয়ে বড়, তাহলে আপনাকে এই তথ্য সংরক্ষণ করার নতুন উপায় সম্পর্কে চিন্তা করতে হবে। এখানেই প্রযুক্তি, যেমন FileSystem API , কার্যকর হয়, যেমন আপনি পরবর্তীতে দেখছেন।
একটি ফাইল শেয়ারিং অ্যাপ তৈরি করুন
ব্রাউজারে ফাইল শেয়ার করতে পারে এমন একটি ওয়েব অ্যাপ তৈরি করা এখন RTCDataChannel
এর মাধ্যমে সম্ভব। RTCDataChannel
এর উপরে বিল্ডিংয়ের অর্থ হস্তান্তরিত ফাইল ডেটা এনক্রিপ্ট করা হয়েছে এবং কোনও অ্যাপ প্রদানকারীর সার্ভারকে স্পর্শ করে না। এই কার্যকারিতা, দ্রুত শেয়ার করার জন্য একাধিক ক্লায়েন্টের সাথে সংযোগ করার সম্ভাবনার সাথে মিলিত, WebRTC ফাইল শেয়ারিংকে ওয়েবের জন্য একটি শক্তিশালী প্রার্থী করে তোলে।
একটি সফল স্থানান্তর করতে বেশ কয়েকটি পদক্ষেপ প্রয়োজন:
- File API ব্যবহার করে JavaScript এ একটি ফাইল পড়ুন।
-
RTCPeerConnection
এর মাধ্যমে ক্লায়েন্টদের মধ্যে একটি পিয়ার কানেকশন তৈরি করুন। -
RTCDataChannel
দিয়ে ক্লায়েন্টদের মধ্যে একটি ডেটা চ্যানেল তৈরি করুন।
RTCDataChannel
মাধ্যমে ফাইল পাঠানোর চেষ্টা করার সময় বেশ কয়েকটি বিষয় বিবেচনা করতে হবে:
- ফাইলের আকার: যদি ফাইলের আকার যুক্তিসঙ্গতভাবে ছোট হয় এবং একটি ব্লব হিসাবে সংরক্ষণ এবং লোড করা যায়, তাহলে আপনি ফাইল API ব্যবহার করে মেমরিতে লোড করতে পারেন এবং তারপরে ফাইলটিকে একটি নির্ভরযোগ্য চ্যানেলে পাঠাতে পারেন (যদিও মনে রাখবেন যে ব্রাউজারগুলি সর্বাধিক সীমাবদ্ধতা আরোপ করে স্থানান্তর আকার)। ফাইলের আকার বড় হওয়ার সাথে সাথে জিনিসগুলি আরও জটিল হয়। যখন একটি চঙ্কিং মেকানিজমের প্রয়োজন হয়, তখন ফাইলের খণ্ডগুলি লোড করা হয় এবং অন্য পিয়ারের কাছে পাঠানো হয়, যার সাথে
chunkID
মেটাডেটা থাকে যাতে পিয়ার তাদের চিনতে পারে। মনে রাখবেন, এই ক্ষেত্রে, আপনাকে প্রথমে অংশগুলিকে অফলাইন স্টোরেজে সংরক্ষণ করতে হবে (উদাহরণস্বরূপ, FileSystem API ব্যবহার করে) এবং আপনার কাছে ফাইলটি সম্পূর্ণ হলেই ব্যবহারকারীর ডিস্কে সংরক্ষণ করতে হবে। - খণ্ডের আকার: এগুলি হল আপনার অ্যাপের ডেটার ক্ষুদ্রতম "পরমাণু"৷ চাঙ্কিং প্রয়োজন কারণ বর্তমানে পাঠানোর আকারের সীমা রয়েছে (যদিও এটি ডেটা চ্যানেলের ভবিষ্যতের সংস্করণে ঠিক করা হবে)। সর্বাধিক খণ্ড আকারের জন্য বর্তমান সুপারিশ হল 64KiB।
একবার ফাইলটি সম্পূর্ণরূপে অন্য দিকে স্থানান্তরিত হলে, এটি একটি অ্যাঙ্কর ট্যাগ ব্যবহার করে ডাউনলোড করা যেতে পারে:
function saveFile(blob) {
const link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = 'File Name';
link.click();
};
PubShare এবং GitHub- এর এই ফাইল-শেয়ারিং অ্যাপগুলি এই কৌশলটি ব্যবহার করে। তারা উভয়ই ওপেন সোর্স এবং RTCDataChannel
উপর ভিত্তি করে ফাইল-শেয়ারিং অ্যাপের জন্য একটি ভাল ভিত্তি প্রদান করে।
তাই আপনি কি করতে পারেন?
RTCDataChannel
ফাইল শেয়ারিং, মাল্টিপ্লেয়ার গেমিং এবং কন্টেন্ট ডেলিভারির জন্য অ্যাপ তৈরি করার নতুন উপায়ের দরজা খুলে দেয়।
- পূর্বে বর্ণিত হিসাবে পিয়ার-টু-পিয়ার ফাইল শেয়ারিং
- মাল্টিপ্লেয়ার গেমিং, অন্যান্য প্রযুক্তির সাথে যুক্ত, যেমন WebGL, যেমনটি মোজিলার ব্যানানাব্রেডে দেখা যায়
- কন্টেন্ট ডেলিভারি পিয়ারসিডিএন দ্বারা নতুনভাবে উদ্ভাবিত হয়েছে, একটি কাঠামো যা পিয়ার-টু-পিয়ার ডেটা যোগাযোগের মাধ্যমে ওয়েব সম্পদ সরবরাহ করে
আপনি যেভাবে অ্যাপ তৈরি করেন তা পরিবর্তন করুন
আপনি এখন RTCDataChannel
মাধ্যমে উচ্চ-পারফরম্যান্স, কম লেটেন্সি সংযোগ ব্যবহার করে আরও আকর্ষক অ্যাপ প্রদান করতে পারেন। ফ্রেমওয়ার্ক, যেমন PeerJS এবং PubNub WebRTC SDK , RTCDataChannel
কার্যকর করা সহজ করে তোলে এবং API-এর এখন প্ল্যাটফর্ম জুড়ে ব্যাপক সমর্থন রয়েছে।
RTCDataChannel
এর আবির্ভাব ব্রাউজারে ডেটা স্থানান্তর সম্পর্কে আপনার চিন্তাভাবনা পরিবর্তন করতে পারে।