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:80
harus 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, accept
mengembalikan 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:80
mewakili S end 's sambungan, dan berhubungan dengan socket dikembalikan olehaccept
10.0.0.5:55715
adalah 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
accept
panggilan 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