API soket adalah standar de-facto untuk komunikasi TCP / IP dan UDP / IP (yaitu, kode jaringan seperti yang kita kenal). Namun, salah satu fungsi intinya, accept()
agak ajaib.
Meminjam definisi semi formal:
accept () digunakan di sisi server. Ia menerima upaya masuk yang diterima untuk membuat sambungan TCP baru dari klien jarak jauh, dan membuat soket baru yang terkait dengan pasangan alamat soket sambungan ini.
Dengan kata lain, accept
mengembalikan soket baru di mana server dapat berkomunikasi dengan klien yang baru terhubung. Soket lama (yang accept
disebut) tetap terbuka, di port yang sama, mendengarkan koneksi baru.
Bagaimana accept
kerjanya? Bagaimana penerapannya? Ada banyak kebingungan tentang topik ini. Banyak orang mengklaim menerima membuka port baru dan Anda berkomunikasi dengan klien melalui itu. Tetapi ini jelas tidak benar, karena tidak ada port baru yang dibuka. Anda sebenarnya dapat berkomunikasi melalui port yang sama dengan klien yang berbeda, tetapi bagaimana caranya? Ketika beberapa utas memanggil recv
pada port yang sama, bagaimana data tahu ke mana harus pergi?
Saya kira itu adalah sesuatu di sepanjang baris alamat klien yang dikaitkan dengan deskriptor soket, dan setiap kali data masuk, recv
itu dialihkan ke soket yang benar, tetapi saya tidak yakin.
Akan sangat bagus untuk mendapatkan penjelasan menyeluruh tentang cara kerja mekanisme ini.
sumber
Jawaban:
Kebingungan Anda terletak pada pemikiran bahwa soket diidentifikasi oleh Server IP: Server Port. Pada kenyataannya, soket secara unik diidentifikasi oleh kuartet informasi:
Client IP : Client Port
danServer IP : Server Port
Jadi, sementara IP Server dan Port Server konstan di semua koneksi yang diterima, informasi sisi klienlah yang memungkinkannya melacak ke mana arah semuanya.
Contoh untuk memperjelas hal:
Katakanlah kita memiliki server di
192.168.1.1:80
dan dua klien,10.0.0.1
dan10.0.0.2
.10.0.0.1
membuka koneksi di port lokal1234
dan terhubung ke server. Sekarang server memiliki satu soket yang diidentifikasi sebagai berikut:Sekarang
10.0.0.2
membuka koneksi di port lokal5678
dan terhubung ke server. Sekarang server memiliki dua soket yang diidentifikasi sebagai berikut:sumber
Hanya untuk menambah jawaban yang diberikan oleh pengguna "17 dari 26"
Soket sebenarnya terdiri dari 5 tuple - (ip sumber, port sumber, ip tujuan, port tujuan, protokol). Di sini protokol bisa TCP atau UDP atau protokol lapisan transport. Protokol ini diidentifikasi dalam paket dari bidang 'protokol' di datagram IP.
Dengan demikian dimungkinkan untuk memiliki aplikasi yang berbeda di server yang berkomunikasi ke klien yang sama pada 4-tupel yang persis sama tetapi berbeda dalam bidang protokol. Sebagai contoh
Apache di sisi server berbicara di (server1.com:880-client1:1234 di TCP) dan World of Warcraft berbicara di (server1.com:880-client1:1234 di UDP)
Baik klien dan server akan menangani ini karena bidang protokol dalam paket IP dalam kedua kasus berbeda meskipun keempat bidang lainnya sama.
sumber
Yang membuat saya bingung ketika saya mempelajari ini, adalah istilah
socket
danport
menyarankan bahwa mereka adalah sesuatu yang fisik, padahal sebenarnya itu hanya struktur data yang digunakan kernel untuk mengabstraksi detail jaringan.Dengan demikian, struktur data diimplementasikan untuk dapat memisahkan koneksi dari klien yang berbeda. Mengenai bagaimana mereka diimplementasikan, jawabannya adalah a.) Tidak masalah, tujuan dari sockets API adalah agar penerapannya tidak penting atau b.) Hanya untuk melihat-lihat. Terlepas dari buku Stevens yang sangat direkomendasikan yang memberikan penjelasan rinci tentang satu implementasi, lihat sumbernya di Linux atau Solaris atau di salah satu BSD.
sumber
Seperti yang dikatakan orang lain, soket secara unik diidentifikasi oleh 4-tuple (IP Klien, Port Klien, IP Server, Port Server).
Proses server yang berjalan pada IP Server memelihara database (artinya saya tidak peduli jenis tabel / daftar / pohon / larik / struktur data ajaib yang digunakannya) dari soket aktif dan mendengarkan di Port Server. Ketika menerima pesan (melalui tumpukan TCP / IP server), ia memeriksa IP dan Port Klien terhadap database. Jika IP Klien dan Port Klien ditemukan dalam entri database, pesan akan diteruskan ke penangan yang ada, jika tidak entri database baru dibuat dan penangan baru muncul untuk menangani soket itu.
Pada hari-hari awal ARPAnet, protokol tertentu (FTP untuk satu) akan mendengarkan port tertentu untuk permintaan koneksi, dan membalas dengan port handoff. Komunikasi lebih lanjut untuk koneksi itu akan melewati port handoff. Ini dilakukan untuk meningkatkan kinerja per paket: komputer beberapa kali lipat lebih lambat pada masa itu.
sumber