1. Deskripsi Arsitektur Protokol saat ini memiliki karakteristik sebagai berikut:
1) Klien mengirimkan permintaan ke server, dan panjang setiap permintaan bervariasi. Panjang permintaan ditentukan dalam INT pertama.
2) Setiap server biasanya menyediakan layanan ke banyak klien. Misalnya, TS perlu memberikan layanan ke CP dan NP secara bersamaan.
CP memberikan layanan kepada NP dan CP lainnya, dan juga merupakan klien dari CP, TS, dan SP lainnya.
3) Ketika setiap server melayani klien, biasanya bersifat jangka panjang dan melibatkan banyak permintaan-balasan bolak-balik.
Struktur seperti ini terutama dirancang untuk mendukung sejumlah besar koneksi klien secara bersamaan. Ketika ada sejumlah besar koneksi klien secara bersamaan, tidak peduli apakah thread atau proses digunakan, layanan yang efektif tidak dapat disediakan, jadi pilih harus digunakan.
Modus pemungutan suara.
2. Deskripsi struktur data dasar: Untuk setiap klien, beberapa informasi yang terkait dengan klien perlu disimpan
Pada dasarnya sama dengan struktur data inti TSnew.c, yang terdiri dari Sesi,
Terdiri dari SessionCluster (dalam TSnew.c) atau ServerDesc (CPnew.c dan SPnew.c).
Diantaranya, Session adalah data yang terkait dengan setiap klien, dan SessionCluster (atau ServerDesc) adalah informasi tentang setiap layanan, yang memiliki penunjuk ke setiap Sesi yang terkait dengan layanan tersebut
Struktur data ini tidak dialokasikan secara dinamis ketika ada permintaan klien, tetapi telah dialokasikan pada inisialisasi awal. Ketika permintaan klien baru datang, server mencari Sesi yang telah dialokasikan sebelumnya dan menemukan bahwa ada beberapa sesi yang menganggur itu, dan laporkan kesalahan jika tidak ada waktu menganggur.
Untuk TS dan CP(SP), perbedaan terbesarnya adalah TS menggunakan protokol UDP, sedangkan CP dan SP menggunakan protokol TCP.
1) Untuk klien protokol TCP, karena setiap klien menggunakan soket yang berbeda, setelah memilih, Anda hanya perlu memeriksa apakah fd_set setiap klien disetel. Untuk klien UDP, Anda perlu menemukan klien yang sesuai beberapa tindakan untuk mengurangi overhead yang disebabkan oleh pencarian.
2) Pada protokol TCP, data yang dikirim berbentuk stream, sehingga pesan perlu dibagi menjadi beberapa blok. Bisa saja dua pesan dibaca sekaligus, atau ada pesan yang perlu dibaca berkali-kali . Kedua situasi tersebut perlu dipertimbangkan. Oleh karena itu, setiap Sesi memiliki buf, rstart, dan rlen, yang digunakan untuk menyimpan pesan yang telah dibaca tetapi belum diproses.
Demikian pula dalam proses penulisan, perlu juga diperhatikan bahwa penulisan mungkin tidak selesai dalam satu waktu, sehingga perlu juga mempertahankan wbuf, wstart, dan wlen di setiap Sesi. Hal ini berbeda dalam UDP dalam protokol implementasinya, diasumsikan bahwa setiap paket UDP Pesan-pesan yang terkandung di dalamnya semuanya lengkap, sehingga item-item tersebut tidak disertakan.
SessionCluster (atau ServerDesc) menjelaskan layanan, yang terdiri dari beberapa bagian utama:
1) kaus kaki: menjelaskan soket yang digunakan
2) skr: jumlah klien saat ini
3) max : jumlah maksimal klien yang dapat ditampung
4) head: Ketua Sesi, head[0] adalah Sesi pertama, head[max-1] adalah sesi terakhir
5) init: Operasi inisialisasi yang perlu dilakukan oleh setiap Sesi dalam layanan ini (Fungsi pointer)
6) proses: fungsi pemrosesan pesan dalam layanan ini
7) penutupan: destruktor diperlukan dalam layanan ini
3. Deskripsi struktur utama
process_child: fungsi utama, fungsi ini terutama digunakan untuk mengatur kaus kaki dan wsocks. Untuk SP dan CP, wsocks hanya disetel ketika wlen dari Session>0;
memilih;
Untuk setiap ServerDesc (atau SessionCluster), process_type
Di SP dan CP, untuk mendukung operasi PUSHLIST, processJob harus dilakukan sebelum setiap siklus.
Di CP, periodCheck juga dilakukan secara berkala untuk menghapus koneksi yang kedaluwarsa di TS, dan periodLog dilakukan secara berkala untuk menghapus koneksi pelanggan yang kedaluwarsa.
tipe_proses:
Untuk setiap Sesi, periksa apakah dapat dibaca. Jika dapat dibaca, periksa apakah ada pesan yang lengkap,
*(unsigned int *)(rbuf+rstart) <= rlen
Panggil proses terkait hingga tidak ada pesan lengkap untuk memeriksa apakah dapat ditulis. Jika dapat ditulis dan wlen>0, tulis
4. Modul penting lainnya
1) Modul konfigurasi Modul konfigurasi terutama terdiri dari struct NamVal, read_config, free_config.
Nama adalah nama dalam file cfg, ptr adalah penunjuk ke penyimpanan, dan tipe adalah tipe data Saat ini, tipe berikut didukung
d: Tipe bilangan bulat, ptr adalah penunjuk bilangan bulat
s: tipe string, ptr adalah penunjuk ke penunjuk, (char **)
b: Tipe buffer string, ptr adalah char *, harus diperhatikan saat menggunakan tipe ini, untuk tipe s,
read_config akan mengalokasikan memori (malloc) untuk val, tetapi untuk tipe b, ptr harus menunjuk ke memori yang dialokasikan.
Dua fungsi penting tersebut adalah:
read_config, parameternya adalah nama file, struct NamVal *, dan jumlah item dari struct NamVal
free_config, parameternya adalah struct NamVal * yang sama dan jumlah item seperti read_config
2) modul mysql
Modul mysql terutama terdiri dari MYSQL *local_mysql dan tiga fungsi tersebut
init_mysql, menginisialisasi mysql, mengembalikan MYSQL *, umumnya digunakan untuk menginisialisasi local_mysql
query_mysql, jalankan pernyataan mysql, formatnya adalah query_mysql (local_mysql, "pernyataan mysql,
Formatnya sama dengan printf, seperti hapus dari %s, dll.", nilai yang diperlukan)
query_mysql_select, mengeksekusi pernyataan pilih mysql Berbeda dari di atas, ia mengembalikan a
MYSQL_RES*.
3) Modul penyortiran jaringan terutama terdiri dari struktur jaringan, fungsi readNETBLOCK, fungsi getnetwork, fungsi bandingkanNet, di antaranya,
readNETBLOCK digunakan untuk membaca file konfigurasi jaringan dan menginisialisasi variabel global NETBLOCKS
Array struktur jaringan, dengan item MAX_NET.
getnetowrk digunakan untuk menemukan netblock yang paling dekat dengan alamat IP
bandingkanNet adalah fungsi yang digunakan di qsort untuk mengurutkan NPPeers yang ditemukan sehingga NPPeers di jaringan yang sama mendapat peringkat pertama.
4) Manajemen grafik Dalam CP, SP, dan NP saat ini, CP dapat menggabungkan beberapa saluran secara bersamaan, dan NP juga dapat memiliki banyak sumber daya. Untuk menggambarkan struktur ini, konsep grafik diperkenalkan ) disimpan Penunjuk ke NP, penunjuk ke Saluran,
Di TS, setiap Interval Sesi ini juga perlu disimpan di Saluran ini. Setiap Saluran melewati Edge
Bagian berikutnya dirangkai menjadi daftar tertaut. Kepala dari daftar tertaut ini adalah PeerHead dalam struktur Saluran, dan setiap Sesi
Berikutnya di Edge juga dirangkai ke dalam daftar tertaut, dan kepala dari daftar tertaut ini adalah header dalam struktur Sesi.
Fungsi terkait adalah:
newEdge: Tambahkan edge baru, parameternya adalah Channel *, Session *. Untuk TS, ChannelInfo diperlukan untuk menginisialisasi informasi di Edge.
delEdge: Hapus tepi, parameternya adalah Tepi *
5) Modul saluran
Fungsi utama modul Saluran adalah:
TS digunakan untuk memproses NEED_PEERS, SP juga perlu menyimpan dan mencari data saluran, dan saluran dikelola menggunakan struktur grafik.
Pencarian saluran menggunakan Hash untuk alasan efisiensi. ChannelHash menggunakan string.
hash, seperti yang ditunjukkan pada hash_str.
Saluran di TS relatif sederhana. Saluran di SP dan CP juga perlu mengelola data terkait Saluran. Data ini disimpan di direktori /var/tmp/ pada hard disk dalam bentuk file. Untuk setiap informasi yang relevan,
Disimpan oleh BlockData, firstsampl, message_size, message_id, dan offset di BlockData menyimpan informasi sampel pertama, panjang blok, id blok, dan offset dalam file masing-masing.
Pemrosesan SP dan CP berbeda. Untuk CP, blok disimpan dalam mode hash
max_queue adalah 100, maka lokasi penyimpanannya 1000%100=0. Untuk SP, jika resourcenya adalah channel yang dikirim oleh CS,
Ini adalah antrian melingkar, dan setiap blok disimpan pada posisi yang sesuai secara berurutan. Jika mencapai akhir antrian, itu dimulai dari kepala antrian. Jika sumber daya berupa file, informasi BlockData tidak disimpan. dan file aslinya terletak langsung sesuai dengan blockID.
Ada banyak fungsi yang melibatkan Saluran, seperti loc_by_id, loc_order_by_id, newChannel,
freeChannel, saveBlock, dll.
6) Modul Berkeley DB hanya terlibat dalam SP. Ini terutama membuka file DB dan menanyakan lokasi md5 tertentu. Ini terutama melibatkan DB* MediaDB,
Kedua fungsi openDB dan openMedia
openDB: Parameternya adalah nama file DB
openMedia: Parameternya adalah md5 dan penunjuk bilangan bulat, kembalikan FILE * dan panjang file, dalam penunjuk bilangan bulat
7) Modul pekerjaan
Modul Pekerjaan digunakan di CP dan SP untuk memproses PUSHLIST. Pesan PUSHLIST dapat mengatur ulang daftar Pekerjaan.
Anda juga dapat menambahkan pekerjaan atau menghapus pekerjaan. Ini melibatkan fungsi dalam job.c dan struktur JobDes. Sesi * dan Saluran * dalam struktur JobDes digunakan untuk mengidentifikasi Sesi dan Saluran tempat pekerjaan tersebut berada num mewakili jumlah BlockID yang perlu diunduh, pekerjaan adalah penunjuk ke bilangan bulat, topeng juga merupakan penunjuk ke bilangan bulat,
job[i] adalah BlockID yang perlu diunduh. Jika mask[i] adalah 0, maka perlu diunduh.
addJob: Saat menambahkan pekerjaan, ia tidak memeriksa apakah pekerjaan tersebut sudah ada dalam daftar, tetapi langsung menghasilkan pekerjaan dan menambahkannya ke daftar tertaut.
deleteJob: Saat menghapus pekerjaan, periksa semua pekerjaan dalam daftar pekerjaan untuk pekerjaan dengan Sesi dan Saluran yang sama.
Kemudian atur mask yang sesuai dari blockID yang perlu dihapus menjadi 1.
processJob: Untuk setiap pekerjaan, mulai dari saat ini, gunakan process_P2P_REQUEST_real untuk mengirimkan blok pertama dengan mask 0. Jika semuanya 1, hapus pekerjaan tersebut.
freeJob: Hapus JobDes.
freeJobList: Hapus semua JobDes dari suatu Sesi, biasanya digunakan ketika Sesi keluar.
8) Modul interval
Modul Interval digunakan di TS untuk mewakili semua interval cepat di NP. Saat ini, interval blok diidentifikasi oleh bidang awal dan bidang panjang. Operasi utama untuk Interval adalah menggabungkan dan menghapus, menggabungkan
Ini menggabungkan Interval asli dan daftar Interval baru, sementara delete menghapus yang baru dari yang asli.
merge: Algoritmanya adalah sebagai berikut, menggunakan buffer Interval list tmp.
jika (lama[i] < baru[j]) tmp[k] = lama[i];
lain tmp[k] = baru[j];
Kemudian lihat mana yang lama dan baru yang bisa digabungkan dengan tmp[k]
delete: lebih rumit, pertimbangkan situasi berikut
Awal dari [i] lama lebih besar dari akhir [j] baru
Akhir dari [i] lama adalah sebelum dimulainya [j] baru
lama[i] dan baru[j] memiliki bagian yang sama, dan
lama[i] terkandung dalam baru[j]
new[j] disertakan dalam old[i] dan tidak menyertakan satu sama lain, new[j] disertakan dalam yang sebelumnya dan tidak menyertakan satu sama lain, dan old[i] disertakan dalam yang sebelumnya.
5. Beberapa algoritma cepat
1) Dalam TS yang menggunakan UDP, ketika klien login untuk pertama kalinya, perlu untuk menemukan Sesi yang menganggur. Selain itu, klien dapat mengirim pesan LOGIN berulang kali sudah ada dalam daftar Sesi. Ketiga, Ketika klien mengirim pesan, ia perlu menemukan Sesi yang sesuai.
Untuk menghindari pertanyaan ini, metode berikut digunakan masing-masing.
Pertama, buat tabel Hash. Pada awalnya, semua Sesi gratis ditautkan ke Hash[0]. Setiap kali klien baru datang, Sesi tersebut dikeluarkan dari Hash[0] dan ditautkan ke hashid yang sesuai nilai yang diperoleh hash tidak boleh 0. Jika 0, hashid terbesar yang mungkin dikembalikan.
Mengkueri Sesi berdasarkan port sumber dan alamat IP juga menggunakan tabel Hash ini.
Ketika klien mengirim pesan, ia menggunakan 3 byte pertama dari 7 byte yang digunakan untuk verifikasi, dan menggunakan 3 byte ini untuk mengidentifikasi Sesi.
subskrip, sehingga menghindari overhead kueri.
2) Gunakan maxid untuk mengurangi jumlah pencarian.
Hash tidak digunakan dalam TCP. Item maxid digunakan untuk mencatat id terbesar di Sesi
Selama inisialisasi, Sesi idle dengan ID terkecil dicari, sehingga Sesi dapat dianggap relatif kompak.
Karena SP dan CP mendukung klien jauh lebih sedikit dibandingkan TS, perlakuan ini dapat diterima.
Ketika pelanggan keluar, mungkin perlu memperbarui maxid. Pembaruan ini diselesaikan oleh Clientclosure.
Clientclosure memperbarui maxid dan kemudian memanggil destruktor yang sesuai.
3) Pemrosesan batas waktu koneksi menganggur jangka panjang. Karena pemrosesan batas waktu memerlukan penelusuran seluruh daftar, untuk menghemat sumber daya sistem,
IDLE membutuhkan waktu yang lama. Selain itu, statistik sistem umumnya perlu dilaporkan secara berkala, sehingga diperlukan ketepatan waktu.
Umumnya, periodLog atau periodCheck menentukan operasi mana yang akan dilakukan.
4) Saat menanyakan CPPeer, mengingat saat ini hanya GCP yang didukung, GCPCHOICE langsung digunakan, disetel ke GCP dengan beban arus terkecil, dan diperbarui saat laporan GCP atau GCP masuk dan keluar.
6. Pemrosesan pesan
1) Pemrosesan pesan TS
NP2TS_LOGIN: NP masuk ke TS dan melakukan hash sesuai dengan alamat IP sumber dan npport yang dilaporkan. Jika waktu sejak terakhir kali pesan NP2TS_LOGIN dikirim kurang dari SILENCE_TIME, pesan tersebut akan langsung dikembalikan, jika tidak, pesan SELAMAT DATANG akan dikirim.
NP2TS_REPORT: Informasi Interval Laporan. Jika penyegaran benar, maka akan direset.
NP2TS_NEED_PEERS: Kueri informasi Rekan, gunakan findCPPeer untuk menemukan CP yang sesuai, gunakan findNPPeers
Mencari NP yang cocok. Saat mencari NP, setelah menemukan hasilnya, mereka diurutkan berdasarkan jaringan untuk memastikan bahwa mereka yang berada di jaringan yang sama menempati peringkat pertama.
NP2TS_LOGOUT: Keluar
NP2TS_RES_LIST: Kirim semua RESOURCE dari NP saat ini, gunakan addSession untuk pemrosesan, jika tepi ini belum ada, tambahkan
NP2TS_REQ_RES: Tambahkan RES, dan kembalikan Rekan
NP2TS_DEL_RES: Hapus RES
CP2TS_REGISTER: Masuk, CP masuk ke TS, hash sesuai dengan alamat IP sumber dan npport yang dilaporkan,
Jika ILENCE_TIME sejak terakhir kali CP2TS_REGISTER dikirim, langsung kembalikan, jika tidak, kirim
pesan SELAMAT DATANG.
CP2TS_UPDATE: Laporkan beban CP
CP2TS_NEED_PEERS: digunakan untuk query ECP, belum digunakan
2) Pemrosesan pesan SP
P2P_HELLO: Bergabunglah dengan saluran,
Jika saluran ada, jika itu adalah file Media: Kembalikan SPUPDATE, yang menunjukkan blockID minimum dan maksimum saluran ini
Jika tidak: Jika saluran ini telah berakhir, kembalikan informasi akhir. Jika saluran tidak ada, jika itu adalah file Media: Kembalikan SPUPDATE, yang menunjukkan blockID minimum dan maksimum saluran ini, buat saluran tersebut menunjukkan kesalahan.
P2P_PUSHLIST: Reset atau tambah atau hapus daftar tugas. Saat menyetel ulang, hapus semua tugas terkait terlebih dahulu, lalu tambah atau hapus.
CS2SP_REGISTER: Buat saluran
CS2SP_UPDATE: Perbarui informasi saluran
CS2SP_BLOCK: Kirim blok data
3) Pemrosesan pesan CP
P2P_HELLO: Bergabunglah dengan saluran dan buat koneksi yang sesuai berdasarkan alamat SP yang diberikan
P2P_PUSHLIST: Mengatur ulang atau menambah dan menghapus daftar tugas
P2P_SPUPDATE: SPUPDATE yang dikirim oleh SP, jika berupa file Media, tidak akan diteruskan ke NP
P2P_RESPONSE: Blok data yang dikirim oleh SP.
Selain itu, CP juga perlu mendaftar ke TS.
Saat ini hanya satu jenis GCP yang digunakan.
Memperluas