S adalah program server: katakanlah ini adalah server HTTP, jadi ia akan menggunakan nomor port terkenal untuk HTTP , yaitu 80. Saya menjalankannya pada host dengan alamat IP 10.0.0.4, jadi ia akan mendengarkan koneksi pada 10.0.0.4:80(karena di situlah semua orang berharap menemukannya).
Di dalam S , saya akan membuat soket dan mengikatnya ke alamat itu: sekarang, OS tahu bahwa koneksi yang masuk 10.0.0.4:80harus dialihkan ke proses S saya melalui soket tertentu.
output netstat setelah soket terikat:
$ netstat --tcp -lan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
NB. alamat lokal semuanya nol karena S tidak peduli bagaimana kliennya mencapainya
Setelah S memiliki ikatan soket ini, ia akan menerima koneksi - setiap kali klien baru terhubung, acceptmengembalikan soket baru , yang khusus untuk klien itu
output netstat setelah koneksi diterima:
$ netstat --tcp -lan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 10.0.0.4:80 10.0.0.5:55715 ESTABLISHED
10.0.0.4:80mewakili S end 's sambungan, dan berhubungan dengan socket dikembalikan olehaccept
10.0.0.5:55715adalah ujung koneksi klien, dan dikaitkan dengan soket yang dilewati klien untuk menghubungkan . Port klien tidak digunakan untuk apa pun kecuali merutekan paket pada koneksi TCP ini ke proses yang benar: itu ditugaskan secara acak oleh kernel klien dari rentang port sementara.
Sekarang, S dapat dengan senang hati menerima lebih banyak koneksi klien ... masing-masing akan mendapatkan soketnya sendiri, setiap soket akan dikaitkan dengan koneksi TCP yang unik, dan setiap koneksi akan memiliki alamat jarak jauh yang unik. S akan melacak status klien (jika ada) dengan menghubungkannya dengan soket.
Jadi, kira-kira:
- alamat IP untuk perutean antar host di jaringan
- port untuk routing ke soket yang benar pada host
- Saya hampir mengatakan proses yang benar , tetapi sebenarnya mungkin untuk memiliki beberapa (biasanya anak) proses semua menerima pada soket yang sama ...
- Namun, setiap kali salah satu
acceptpanggilan bersamaan kembali, ia melakukannya hanya dalam satu proses, setiap soket koneksi masuk unik untuk satu contoh server
- soket adalah objek proses yang digunakan untuk berbicara dengan OS tentang koneksi tertentu, seperti deskriptor file
- seperti disebutkan dalam komentar, ada banyak kegunaan lain untuk soket yang tidak menggunakan port sama sekali: misalnya socketpair membuat sepasang soket yang terhubung bersama yang tidak memiliki skema pengalamatan sama sekali - satu-satunya cara untuk menggunakan pipa itu adalah dengan menjadi proses yang disebut
socketpair, menjadi anak dari proses itu dan mewarisi satu, atau secara eksplisit melewati salah satu soket dari proses itu