Bagaimana cara server mengetahui port klien yang akan dikirim?


26

Seperti yang saya pahami, inilah yang terjadi ketika klien membuat permintaan koneksi:

  1. Server akan terikat ke nomor port tertentu. Nomor port selalu terikat dengan proses mendengarkan. Karena hanya server yang mendengarkan koneksi masuk, kami tidak perlu mengikat di sisi klien
  2. Server akan terus mendengarkan nomor port itu.
  3. Klien akan mengirim connect()permintaan.
  4. Server akan menerima permintaan menggunakan accept(). Segera setelah server menerima permintaan klien, kernel mengalokasikan nomor port acak untuk server lebih lanjut send()dan receive(), karena nomor port yang sama pada server tidak dapat digunakan untuk mengirim serta mendengarkan, dan port sebelumnya masih mendengarkan koneksi baru

Mengingat semua itu, bagaimana server mengetahui port apa yang diterima klien? Saya tahu klien akan mengirim segmen TCP dengan port sumber dan port tujuan, sehingga server akan menggunakan port sumber segmen tersebut sebagai port tujuan, tetapi fungsi apa yang dipanggil server untuk mencari tahu tentang port itu? Apakah itu accept()?


Jawaban:


33

Itu adalah bagian dari header TCP (atau UDP, dll.), Dalam paket. Jadi server mencari tahu karena klien mengatakannya. Ini mirip dengan bagaimana ia mengetahui alamat IP klien (yang merupakan bagian dari header IP).

Misalnya, setiap paket TCP menyertakan header IP (dengan IP sumber, IP tujuan, dan protokol [TCP], setidaknya). Lalu ada header TCP (dengan port sumber dan tujuan, ditambah lagi).

Ketika kernel menerima paket SYN (awal koneksi TCP) dengan IP jarak jauh 10.11.12.13 (di header IP) dan port jarak jauh 12345 (di header TCP), ia kemudian mengetahui IP jarak jauh dan port . Ini mengirim kembali SYN | ACK. Jika ACK dikembalikan, listenpanggilan mengembalikan soket baru, yang diatur untuk koneksi itu.

Soket TCP diidentifikasi secara unik oleh empat nilai (IP jarak jauh, IP lokal, port jarak jauh, port lokal). Anda dapat memiliki banyak koneksi / soket, selama setidaknya satu dari itu berbeda.

Biasanya, port lokal dan IP lokal akan sama untuk semua koneksi ke proses server (mis. Semua koneksi ke sshd akan berada di local-ip: 22). Jika satu mesin jarak jauh membuat banyak koneksi, masing-masing akan menggunakan port jarak jauh yang berbeda. Jadi segalanya kecuali port jarak jauh akan sama, tetapi tidak apa-apa — hanya satu dari empat yang harus berbeda.

Anda dapat menggunakan, misalnya, wirehsark untuk melihat paket, dan itu akan memberi label semua data untuk Anda. Berikut adalah port sumber yang disorot (perhatikan itu disorot dalam paket yang diterjemahkan, serta hex dump di bagian bawah):

Wireshark menunjukkan paket TCP SYN


> Terima kasih atas penjelasannya. Jadi, Anda bermaksud mengatakan bahwa deskriptor soket server baru (yaitu tuple) yang diperoleh setelah accept () akan memiliki port klien dan detail alamat klien dan menggunakan server deskriptor soket baru untuk mengirim dan menerima data ke dan dari client. deskriptor file socket baru akan memiliki nomor port server baru yang ditugaskan oleh kernel, ip server, ip klien dan port klien. Apakah saya benar?
Subi Suresh

@ SubiSuresh ya, tuple disimpan di dalam kernel, terkait dengan deskriptor file itu.
derobert

> Terima kasih derobert. Jadi saya menyimpulkan bahwa deskriptor soket server baru akan memiliki port klien dan alamat klien, yang diperoleh server dari accept (). Pemahaman saya baik-baik saja, bukan?
Subi Suresh

@ Suburesh Ya, itu benar. Dari sudut pandang aplikasi, Anda biasanya tidak peduli (kecuali untuk logging). Kernel memastikan data yang Anda write(dll.) Pergi ke tempat yang tepat.
derobert

> terima kasih atas bantuan Anda dan saya pikir saya mengerti maksudnya. ;-)
Subi Suresh

2

"Sambungkan permintaan ( connect()panggilan sistem program klien , biasanya) menyebabkan jabat tangan tiga arah . Paket pertama jabat tangan 3-arah (dari klien ke server) memiliki set bendera SYN, dan termasuk nomor port TCP program klien kernel ditugaskan untuk itu.

Anda dapat melihat ini di artikel tentang paket Nmap vs Natural SYN . Decoding paket Nmap SYN memiliki frasa "source.60058> dest.22". Decoding "paket SYN yang sah" memiliki frasa "source.35970> dest.80" di dalamnya. Kedua paket SYN memberi tahu kernel jarak jauh bahwa paket-paket itu masing-masing berasal dari port TCP 60058 dan port 35970.


> Tapi Bruce yang terjadi di bagian belakang. Tapi bagaimana server saya mengambil detail seperti nomor port karena biasanya dalam program server klien, saya belum pernah melihat fungsi apa pun untuk mengambil port klien dan alamat klien
Subi Suresh

Panggilan sistem getpeername()harus memungkinkan Anda melakukan itu pada soket yang terbuka. The accept()system call bahwa kode server harus menggunakan untuk mendapatkan file descriptor socket untuk berkomunikasi kembali ke klien memiliki parameter ( "sockaddr" di halaman manual saya) yang berisi alamat IP calon klien dan nomor port TCP.
Bruce Ediger

> Tolong jangan keberatan jika saya elloborate. Dari semua input yang saya mengerti saya accept () memiliki struktur sockaddr_in diisi dengan detail klien dan deskriptor socket server baru dikembalikan setelah accept () akan secara otomatis memiliki port dan alamat klien. Thats why kita dapat mengirim menggunakan send (new server socket descriptor). Saya harap, sampai pada intinya? Ini hanya untuk memastikan bahwa apa yang saya pahami benar. Baik kan?
Subi Suresh

@ Subi Suresh - Saya yakin Anda menulis kebenaran.
Bruce Ediger

1

Soket TCP adalah soket berorientasi aliran. Dua deskriptor soket (yang dimiliki oleh Anda dan rekan Anda) terhubung dengan andal. Jadi Anda tidak perlu khawatir tentang port klien - cukup tulis deskriptor soket Anda!

Juga, jangan ragu untuk mendapatkanockockname (2) jika Anda benar-benar ingin tahu itu (untuk logging mungkin).


0

Koneksi ditentukan oleh tuple (sumber IP, port sumber, IP tujuan, port tujuan). Jawaban sebaliknya.


@vondrand Titik itu saya mengerti von. Tapi dari mana fungsi server datang untuk mengetahui tentang nomor port klien? Tanpa mengetahui nomor port klien bagaimana akan mengirim. Jadi apakah server menggunakan struktur di accept () untuk mengambil klien Pelabuhan ?
Subi Suresh
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.