1. คำอธิบายสถาปัตยกรรม โปรโตคอลปัจจุบันมีลักษณะดังต่อไปนี้:
1) ไคลเอนต์ส่งคำขอไปยังเซิร์ฟเวอร์ และความยาวของคำขอแต่ละรายการจะแปรผัน ความยาวของคำขอจะถูกระบุใน INT แรก
2) แต่ละเซิร์ฟเวอร์มักจะให้บริการแก่ลูกค้าหลายราย ตัวอย่างเช่น TS จำเป็นต้องให้บริการแก่ CP และ NP ในเวลาเดียวกัน
CP ให้บริการแก่ NP และ CP อื่นๆ และยังเป็นลูกค้าของ CP, TS และ SP อื่นๆ อีกด้วย
3) เมื่อเซิร์ฟเวอร์แต่ละเครื่องให้บริการลูกค้า โดยปกติแล้วจะใช้เวลานานและเกี่ยวข้องกับการตอบกลับและตอบกลับหลายครั้ง
โครงสร้างดังกล่าวได้รับการออกแบบมาเพื่อรองรับการเชื่อมต่อไคลเอนต์พร้อมกันจำนวนมาก เมื่อมีการเชื่อมต่อไคลเอนต์พร้อมกันจำนวนมาก ไม่ว่าจะใช้เธรดหรือกระบวนการก็ตาม จะไม่สามารถให้บริการที่มีประสิทธิภาพได้ ดังนั้น การเลือกจึงต้องใช้
โหมดการเลือกตั้ง
2. คำอธิบายโครงสร้างข้อมูลพื้นฐาน: สำหรับไคลเอนต์แต่ละราย ข้อมูลบางอย่างที่เกี่ยวข้องกับไคลเอนต์จำเป็นต้องได้รับการบันทึก CPnew.c ปัจจุบัน, SPnew.c
โดยพื้นฐานแล้วจะเหมือนกับโครงสร้างข้อมูลหลักของ TSnew.c ซึ่งประกอบด้วย Session
ประกอบด้วย SessionCluster (ใน TSnew.c) หรือ ServerDesc (CPnew.c และ SPnew.c)
หนึ่งในนั้นคือ Session คือข้อมูลที่เกี่ยวข้องกับแต่ละไคลเอ็นต์ และ SessionCluster (หรือ ServerDesc) คือข้อมูลเกี่ยวกับแต่ละบริการ ซึ่งมีตัวชี้ไปยังแต่ละเซสชันที่เกี่ยวข้องกับบริการ
โครงสร้างข้อมูลนี้ไม่ได้รับการจัดสรรแบบไดนามิกเมื่อมีการร้องขอของลูกค้า แต่ได้รับการจัดสรรในการเริ่มต้นครั้งแรก เมื่อมีคำขอไคลเอนต์ใหม่มาถึง เซิร์ฟเวอร์จะค้นหาเซสชันที่จัดสรรไว้ล่วงหน้าเหล่านี้และพบว่ามีบางเซสชันที่ไม่ได้ใช้งาน และรายงานข้อผิดพลาดหากไม่มีเวลาว่าง
สำหรับ TS และ CP(SP) ความแตกต่างที่ใหญ่ที่สุดคือ TS ใช้โปรโตคอล UDP ในขณะที่ CP และ SP ใช้โปรโตคอล TCP
1) สำหรับไคลเอนต์โปรโตคอล TCP เนื่องจากไคลเอนต์แต่ละรายใช้ซ็อกเก็ตที่แตกต่างกัน หลังจากเลือกแล้ว คุณเพียงแค่ต้องตรวจสอบว่า fd_set ของไคลเอนต์แต่ละตัวได้รับการตั้งค่าไว้หรือไม่ สำหรับไคลเอนต์ UDP คุณจะต้องค้นหากระบวนการค้นหาที่ใช้ มาตรการบางประการเพื่อลดค่าใช้จ่ายที่เกิดจากการค้นหา
2) ในโปรโตคอล TCP ข้อมูลที่ส่งจะอยู่ในรูปแบบของสตรีม ดังนั้นข้อความจึงต้องถูกแบ่งออกเป็นบล็อก อาจเป็นไปได้ว่าอ่านสองข้อความในการอ่านครั้งเดียว หรืออาจต้องอ่านข้อความหลายครั้ง จำเป็นต้องพิจารณาทั้งสองสถานการณ์ ดังนั้น แต่ละเซสชันจึงมี buf, rstart และ rlen ซึ่งใช้เพื่อจัดเก็บข้อความที่อ่านแล้วแต่ยังไม่ได้ประมวลผล
ในทำนองเดียวกัน ในระหว่างกระบวนการเขียน จำเป็นต้องพิจารณาว่าการเขียนอาจไม่เสร็จสิ้นในคราวเดียว ดังนั้นจึงจำเป็นต้องเก็บ wbuf, wstart และ wlen ไว้ในแต่ละเซสชัน ซึ่งจะแตกต่างกันใน UDP การใช้งานจะถือว่าแต่ละแพ็กเก็ต UDP ข้อความที่อยู่ในนั้นสมบูรณ์ทั้งหมดดังนั้นจึงไม่รวมรายการเหล่านี้
SessionCluster (หรือ ServerDesc) อธิบายบริการ ซึ่งประกอบด้วยส่วนหลักหลายส่วน:
1) ถุงเท้า: อธิบายซ็อกเก็ตที่ใช้
2) cur: จำนวนลูกค้าปัจจุบัน
3) สูงสุด: จำนวนลูกค้าสูงสุดที่สามารถรองรับได้
4) head: Head of Session, head[0] เป็นเซสชันแรก, head[max-1] เป็นเซสชันสุดท้าย
5) init: การดำเนินการเริ่มต้นที่ต้องดำเนินการโดยแต่ละเซสชันในบริการนี้ (ตัวชี้ฟังก์ชัน)
6) กระบวนการ: ฟังก์ชั่นการประมวลผลข้อความในบริการนี้
7) การปิด: ตัวทำลายล้างที่จำเป็นในบริการนี้
3. คำอธิบายโครงสร้างหลัก
process_child: ฟังก์ชั่นหลัก ฟังก์ชั่นนี้ส่วนใหญ่จะใช้เพื่อตั้งค่าถุงเท้าและ wsocks สำหรับ SP และ CP นั้น wsocks จะถูกตั้งค่าเฉพาะเมื่อ wlen ของเซสชัน> 0;
เลือก;
สำหรับแต่ละ ServerDesc (หรือ SessionCluster) process_type
ใน SP และ CP เพื่อสนับสนุนการดำเนินการ PUSHLIST จะต้องดำเนินการ processJob ก่อนแต่ละรอบ
ใน CP นั้น periodCheck จะดำเนินการเป็นระยะเพื่อล้างการเชื่อมต่อที่หมดอายุใน TS และ periodLog จะดำเนินการเป็นระยะเพื่อล้างการเชื่อมต่อของลูกค้าที่หมดอายุ
กระบวนการ_ประเภท:
ในแต่ละ Session ให้ตรวจสอบว่าสามารถอ่านได้หรือไม่ หากสามารถอ่านได้ ให้ตรวจสอบว่ามีข้อความครบถ้วนหรือไม่
*(int ที่ไม่ได้ลงนาม *)(rbuf+rstart) <= rlen
เรียกกระบวนการที่เกี่ยวข้องจนกว่าจะไม่มีข้อความที่สมบูรณ์เพื่อตรวจสอบว่าสามารถเขียนได้หรือไม่ หากสามารถเขียนได้และ wlen>0 ให้เขียน
4. โมดูลที่สำคัญอื่น ๆ
1) โมดูลการกำหนดค่า โมดูลการกำหนดค่าส่วนใหญ่ประกอบด้วย struct NamVal, read_config, free_config
Name คือชื่อในไฟล์ cfg, ptr เป็นตัวชี้ไปยังที่เก็บข้อมูล และ type คือประเภทของข้อมูล ปัจจุบันรองรับประเภทต่อไปนี้
d: ประเภทจำนวนเต็ม ptr เป็นตัวชี้จำนวนเต็ม
s: ประเภทสตริง ptr เป็นตัวชี้ไปยังตัวชี้ (ถ่าน **)
b: ประเภทบัฟเฟอร์สตริง ptr คือถ่าน * คุณควรให้ความสนใจเมื่อใช้ประเภทนี้ สำหรับประเภท s
read_config จะจัดสรรหน่วยความจำ (malloc) สำหรับ val แต่สำหรับประเภท b นั้น ptr ต้องชี้ไปที่หน่วยความจำที่จัดสรร
หน้าที่ที่สำคัญสองประการคือ:
read_config พารามิเตอร์คือชื่อไฟล์ โครงสร้าง NamVal * และจำนวนรายการของโครงสร้าง NamVal
free_config พารามิเตอร์เป็นโครงสร้างเดียวกันกับ NamVal * และจำนวนรายการเป็น read_config
2) โมดูล mysql
โมดูล mysql ส่วนใหญ่ประกอบด้วย MYSQL *local_mysql และฟังก์ชันทั้งสามนี้ได้แก่
init_mysql, เริ่มต้น mysql, ส่งคืน MYSQL * โดยทั่วไปจะใช้เพื่อเริ่มต้น local_mysql
query_mysql, รันคำสั่ง mysql, รูปแบบคือ query_mysql (local_mysql, "คำสั่ง mysql,
รูปแบบจะเหมือนกับของ printf เช่น ลบออกจาก %s ฯลฯ" ซึ่งเป็นค่าที่ต้องการ)
query_mysql_select รันคำสั่ง mysql select แตกต่างจากที่กล่าวมาข้างต้น โดยจะส่งกลับค่า a
MYSQL_RES *.
3) โมดูลการเรียงลำดับเครือข่ายส่วนใหญ่ประกอบด้วยโครงสร้างเครือข่าย ฟังก์ชัน readNETBLOCK ฟังก์ชัน getnetwork ฟังก์ชัน comparisonNet ซึ่งในนั้น
readNETBLOCK ใช้ในการอ่านไฟล์การกำหนดค่าเครือข่ายและเริ่มต้นตัวแปรทั่วโลก NETBLOCKS คือ
อาร์เรย์ของโครงสร้างเครือข่าย พร้อมด้วยรายการ MAX_NET
getnetowrk ใช้เพื่อค้นหา netblock ที่ใกล้กับที่อยู่ IP มากที่สุด
CompareNet เป็นฟังก์ชันที่ใช้ใน qsort เพื่อเรียงลำดับ NPPeers ที่พบ เพื่อให้ NPPeers ในเครือข่ายเดียวกันได้รับการจัดอันดับเป็นอันดับแรก
4) การจัดการกราฟ ใน CP, SP และ NP ปัจจุบัน CP สามารถเข้าร่วมได้หลายช่องทางพร้อมกัน และ NP ยังสามารถมีทรัพยากรได้หลายรายการ เพื่ออธิบายโครงสร้างนี้ แนวคิดของกราฟจะถูกนำเสนอ (Edge ) ถูกจัดเก็บไว้ ตัวชี้ไปที่ NP, ตัวชี้ไปยังช่องสัญญาณ,
ใน TS จำเป็นต้องจัดเก็บแต่ละช่วงเวลาของเซสชันนี้ไว้ในแชนเนลนี้ แต่ละแชนเนลจะผ่าน Edge
ส่วนหัวของรายการที่เชื่อมโยงนี้คือ PeerHead ในโครงสร้าง Channel และแต่ละเซสชัน
ต่อไปใน Edge จะรวมอยู่ในรายการที่เชื่อมโยงด้วย และส่วนหัวของรายการที่เชื่อมโยงนี้คือส่วนหัวในโครงสร้างเซสชัน
ฟังก์ชั่นที่เกี่ยวข้องได้แก่:
newEdge: เพิ่ม Edge ใหม่ พารามิเตอร์คือ Channel *, Session * สำหรับ TS จำเป็นต้องใช้ ChannelInfo เพื่อเริ่มต้นข้อมูลใน Edge
delEdge: ลบขอบ พารามิเตอร์คือ Edge *
5) โมดูลช่องสัญญาณ
หน้าที่หลักของโมดูล Channel คือ:
TS ใช้ในการประมวลผล NEED_PEERS SP ยังต้องบันทึกและค้นหาข้อมูลช่องสัญญาณ และช่องได้รับการจัดการโดยใช้โครงสร้างกราฟ
การค้นหาช่องใช้แฮชเพื่อเหตุผลด้านประสิทธิภาพ
แฮช ดังแสดงใน hash_str
แชนเนลใน TS นั้นค่อนข้างง่าย แชนเนลใน SP และ CP จำเป็นต้องจัดการข้อมูลที่เกี่ยวข้องกับแชนเนลด้วย ข้อมูลเหล่านี้จะถูกจัดเก็บไว้ในไดเร็กทอรี /var/tmp/ บนฮาร์ดดิสก์ในรูปแบบของไฟล์ สำหรับข้อมูลที่เกี่ยวข้องแต่ละส่วน
บันทึกโดย BlockData, firstsampl, message_size, message_id และ offset ใน BlockData เก็บข้อมูลตัวอย่างแรก ความยาวบล็อก รหัสบล็อก และออฟเซ็ตในไฟล์ตามลำดับ
การประมวลผลของ SP และ CP นั้นแตกต่างกัน สำหรับ CP บล็อกจะถูกจัดเก็บไว้ในโหมดแฮช ตัวอย่างเช่น ID ของบล็อกคือ 1,000 ในขณะที่
max_queue คือ 100 ดังนั้นตำแหน่งที่เก็บข้อมูลคือ 1000%100=0 สำหรับ SP หากทรัพยากรเป็นช่องทางที่ส่งโดย CS
เป็นคิวแบบวงกลม และแต่ละบล็อกจะถูกจัดเก็บไว้ในตำแหน่งที่สอดคล้องกันตามลำดับ หากถึงจุดสิ้นสุดของคิว ก็จะเริ่มต้นจากส่วนหัวของคิว หากทรัพยากรเป็นไฟล์ ข้อมูล BlockData จะไม่ถูกบันทึก และไฟล์ต้นฉบับนั้นตั้งอยู่โดยตรงตาม blockID
มีฟังก์ชันมากมายที่เกี่ยวข้องกับ Channel เช่น ค้นหา_by_id, ค้นหาตำแหน่ง_order_by_id, newChannel,
freeChannel, saveBlock ฯลฯ
6) โมดูล Berkeley DB เกี่ยวข้องกับ SP เท่านั้น โดยส่วนใหญ่จะเปิดไฟล์ DB และสอบถามตำแหน่งของ md5 บางตัว โดยส่วนใหญ่จะเกี่ยวข้องกับ DB* MediaDB
ทั้งสองฟังก์ชั่น openDB และ openMedia
openDB: พารามิเตอร์คือชื่อของไฟล์ DB
openMedia: พารามิเตอร์คือ md5 และตัวชี้จำนวนเต็ม ส่งคืน FILE * และความยาวของไฟล์ ในตัวชี้จำนวนเต็ม
7) โมดูลงาน
โมดูลงานใช้ใน CP และ SP เพื่อประมวลผล PUSHLIST ข้อความ PUSHLIST สามารถรีเซ็ตรายการงานได้
คุณสามารถเพิ่มหรือลบงานได้ ซึ่งเกี่ยวข้องกับฟังก์ชันใน job.c และโครงสร้าง JobDes A Session * และ Channel * ในโครงสร้าง JobDes ใช้เพื่อระบุ Session และ Channel ที่เป็นของงาน และ num แสดงถึงจำนวน BlockID ที่ต้องดาวน์โหลด , job เป็นตัวชี้ไปยังจำนวนเต็ม, mask เป็นตัวชี้ไปยังจำนวนเต็มด้วย
job[i] คือ BlockID ที่ต้องดาวน์โหลด ถ้า mask[i] เป็น 0 แสดงว่าไม่จำเป็นต้องดาวน์โหลด
addJob: เมื่อเพิ่มงาน จะไม่ตรวจสอบว่างานอยู่ในรายการแล้วหรือไม่ แต่จะสร้างงานโดยตรงและเพิ่มลงในรายการที่เชื่อมโยง
DeleteJob: เมื่อลบงาน ให้ตรวจสอบงานทั้งหมดในรายการงานสำหรับงานที่มีเซสชันและช่องทางเดียวกัน
จากนั้นตั้งค่ามาสก์ที่เกี่ยวข้องของ blockID ที่ต้องการลบเป็น 1
processJob: สำหรับแต่ละงาน เริ่มต้นจาก cur ให้ใช้ process_P2P_REQUEST_real เพื่อส่งบล็อกแรกที่มีมาสก์ 0 หากเป็น 1 ทั้งหมด ให้ลบงาน
freeJob: ลบ JobDes
freeJobList: ลบ JobDes ทั้งหมดของเซสชัน ซึ่งมักใช้เมื่อออกจากเซสชัน
8) โมดูลช่วงเวลา
โมดูล Interval ใช้ใน TS เพื่อแสดงช่วงเวลาที่รวดเร็วทั้งหมดบน NP ในปัจจุบัน ช่วงเวลาบล็อกจะถูกระบุโดยฟิลด์เริ่มต้นและฟิลด์ความยาว การดำเนินการหลักสำหรับ Interval คือการผสานและการลบ
โดยจะรวมรายการ Interval ดั้งเดิมและรายการ Interval ใหม่ ในขณะที่การลบจะลบรายการใหม่ออกจากรายการดั้งเดิม
ผสาน: อัลกอริทึมจะเป็นดังนี้ โดยใช้รายการบัฟเฟอร์ tmp
ถ้า (เก่า[i] <ใหม่[j]) tmp[k] = เก่า[i];
อย่างอื่น tmp[k] = ใหม่[j];
จากนั้นดูว่าเก่าและใหม่ใดบ้างที่สามารถรวมเข้ากับ tmp[k]
ลบ: ซับซ้อนกว่า ให้พิจารณาสถานการณ์ต่อไปนี้
จุดเริ่มต้นของเก่า[i]ยิ่งใหญ่กว่าจุดสิ้นสุดของใหม่[j]
จุดสิ้นสุดของเก่า[i]คือก่อนการเริ่มต้นของใหม่[j]
old[i] และ new[j] มีส่วนเหมือนกัน และ
old[i] มีอยู่ใน new[j]
new[j] จะรวมอยู่ใน old[i] และไม่รวมกัน new[j] จะรวมอยู่ในอันก่อนหน้าและไม่รวมซึ่งกันและกัน และ old[i] จะรวมอยู่ในอันก่อนหน้า
5. อัลกอริธึมที่รวดเร็ว
1) ใน TS ที่ใช้ UDP เมื่อไคลเอนต์เข้าสู่ระบบเป็นครั้งแรก จำเป็นต้องค้นหาเซสชันที่ไม่ได้ใช้งาน นอกจากนี้ ไคลเอนต์อาจส่งข้อความเข้าสู่ระบบซ้ำ ๆ ในกรณีนี้ จำเป็นต้องตรวจสอบว่าไคลเอนต์นั้นอยู่หรือไม่ อยู่ในรายการเซสชันแล้ว ประการที่สาม เมื่อไคลเอ็นต์ส่งข้อความ จะต้องค้นหาเซสชันที่เกี่ยวข้อง
เพื่อหลีกเลี่ยงคำถามเหล่านี้ จึงมีการใช้วิธีการต่อไปนี้ตามลำดับ
ขั้นแรก สร้างตารางแฮช ในตอนเริ่มต้น เซสชันฟรีทั้งหมดจะเชื่อมโยงกับแฮช[0] เมื่อใดก็ตามที่มีไคลเอ็นต์ใหม่เข้ามา เซสชันจะถูกนำออกจากแฮช[0] และเชื่อมโยงกับแฮชที่เกี่ยวข้อง ค่าที่ได้รับจากแฮชต้องไม่เป็น 0 หากเป็น 0 ระบบจะส่งคืนแฮชที่ใหญ่ที่สุดที่เป็นไปได้
การสืบค้นเซสชันตามพอร์ตต้นทางและที่อยู่ IP ยังใช้ตารางแฮชนี้
เมื่อไคลเอ็นต์ส่งข้อความ ไคลเอ็นต์จะใช้ 3 ไบต์แรกจาก 7 ไบต์ที่ใช้สำหรับการตรวจสอบ และใช้ 3 ไบต์เหล่านี้เพื่อระบุเซสชัน
ตัวห้อย จึงหลีกเลี่ยงค่าใช้จ่ายในการสืบค้น
2) ใช้ maxid เพื่อลดจำนวนการค้นหา
แฮชไม่ได้ใช้ใน TCP รายการ maxid ใช้เพื่อบันทึกรหัสที่ใหญ่ที่สุดในเซสชัน
ในระหว่างการเริ่มต้น เซสชันที่ไม่ได้ใช้งานที่มี ID น้อยที่สุดจะถูกค้นหา ดังนั้นเซสชันจึงถือว่าค่อนข้างกะทัดรัด
เนื่องจาก SP และ CP รองรับลูกค้าน้อยกว่า TS มาก การรักษานี้จึงเป็นที่ยอมรับได้
เมื่อลูกค้าออก อาจจำเป็นต้องอัปเดต maxid การอัปเดตนี้เสร็จสมบูรณ์โดย Clientclosure
Clientclosure อัปเดต maxid แล้วเรียก destructor ที่เกี่ยวข้อง
3) การประมวลผลการหมดเวลาของการเชื่อมต่อที่ไม่ได้ใช้งานในระยะยาว เนื่องจากการประมวลผลการหมดเวลาจำเป็นต้องข้ามผ่านรายการทั้งหมด เพื่อประหยัดทรัพยากรระบบ
IDLE ใช้เวลานาน นอกจากนี้ จำเป็นต้องมีการรายงานสถิติของระบบเป็นประจำ ดังนั้นจึงจำเป็นต้องมีความทันเวลา
โดยทั่วไป periodLog หรือ periodCheck จะกำหนดว่าจะดำเนินการใดในสองขั้นตอนนี้
4) เมื่อค้นหา CPPeer เมื่อพิจารณาว่าปัจจุบันรองรับเฉพาะ GCP เท่านั้น ระบบจะใช้ GCPCHOICE โดยตรง ตั้งค่าเป็น GCP ที่มีโหลดปัจจุบันน้อยที่สุด และอัปเดตเมื่อรายงาน GCP หรือ GCP เข้าสู่ระบบและออก
6. การประมวลผลข้อความ
1) การประมวลผลข้อความ TS
NP2TS_LOGIN: NP เข้าสู่ระบบ TS และแฮชตามที่อยู่ IP ต้นทางและ npport ที่รายงาน หากเวลานับตั้งแต่ครั้งสุดท้ายที่ส่งข้อความ NP2TS_LOGIN น้อยกว่า SILENCE_TIME เวลาดังกล่าวจะส่งกลับโดยตรง ไม่เช่นนั้นจะมีการส่งข้อความ WELCOME
NP2TS_REPORT: รายงานข้อมูลช่วงเวลา หากการรีเฟรชเป็นจริง จะถูกรีเซ็ต มิฉะนั้นจะถูกเพิ่มก่อนแล้วจึงลบออก
NP2TS_NEED_PEERS: ค้นหาข้อมูล Peer ใช้ findCPPeer เพื่อค้นหา CP ที่เหมาะสม ใช้ findNPPeers
ค้นหา NP ที่เหมาะสม เมื่อค้นหา NP หลังจากค้นหาผลลัพธ์แล้ว จะถูกจัดเรียงตามเครือข่ายเพื่อให้แน่ใจว่าเครือข่ายที่อยู่ในเครือข่ายเดียวกันได้รับการจัดอันดับเป็นอันดับแรก
NP2TS_LOGOUT: ออก
NP2TS_RES_LIST: ส่งทรัพยากรทั้งหมดของ NP ปัจจุบัน ใช้ addSession สำหรับการประมวลผล หากยังไม่มี Edge นี้ ให้เพิ่มเข้าไป
NP2TS_REQ_RES: เพิ่ม RES และส่งคืนเพียร์
NP2TS_DEL_RES: ลบ RES
CP2TS_REGISTER: เข้าสู่ระบบ, CP เข้าสู่ระบบ TS, แฮชตามที่อยู่ IP ต้นทางและ npport ที่รายงาน
หากเป็นเวลา ILENCE_TIME นับตั้งแต่ครั้งสุดท้ายที่ CP2TS_REGISTER ถูกส่ง ให้ส่งคืนโดยตรง หรือส่ง
ข้อความต้อนรับ.
CP2TS_UPDATE: รายงานโหลด CP
CP2TS_NEED_PEERS: ใช้สำหรับการสืบค้น ECP ยังไม่ได้ใช้
2) การประมวลผลข้อความ SP
P2P_HELLO: เข้าร่วมช่อง
หากมีช่องสัญญาณอยู่ หากเป็นไฟล์มีเดีย ให้ส่งคืน SPUPDATE โดยระบุ blockID ขั้นต่ำและสูงสุดของช่องสัญญาณนี้
มิฉะนั้น: หากช่องนี้สิ้นสุดแล้ว ให้ส่งคืนข้อมูลสิ้นสุด หากไม่มีช่องดังกล่าว หากเป็นไฟล์สื่อ: ส่งคืน SPUPDATE โดยระบุ blockID ขั้นต่ำและสูงสุดของช่องนี้ ให้สร้างช่องสัญญาณนั้นอีกครั้ง: ส่งคืน SPUPDATE ไปที่ ระบุข้อผิดพลาด
P2P_PUSHLIST: รีเซ็ตหรือเพิ่มหรือลบรายการงาน เมื่อรีเซ็ต ให้ลบงานที่เกี่ยวข้องทั้งหมดก่อน จากนั้นจึงเพิ่มหรือลบ
CS2SP_REGISTER: สร้างช่อง
CS2SP_UPDATE: อัปเดตข้อมูลช่อง
CS2SP_BLOCK: ส่งบล็อกข้อมูล
3) การประมวลผลข้อความ CP
P2P_HELLO: เข้าร่วมช่องและสร้างการเชื่อมต่อที่เกี่ยวข้องตามที่อยู่ SP ที่ให้ไว้
P2P_PUSHLIST: รีเซ็ตหรือเพิ่มและลบรายการงาน
P2P_SPUPDATE: SPUPDATE ที่ส่งโดย SP หากเป็นไฟล์ Media จะไม่ถูกส่งต่อไปยัง NP
P2P_RESPONSE: บล็อกข้อมูลที่ส่งโดย SP
นอกจากนี้ ซีพียังต้องลงทะเบียนกับ TS ด้วย
ขณะนี้มีการใช้ GCP เพียงประเภทเดียวเท่านั้น
ขยาย