Apakah browser web menggunakan port keluar yang berbeda untuk tab yang berbeda?

58

Di browser web yang mendukung memiliki banyak tab, seperti Firefox, apakah tab yang berbeda yang pergi ke domain situs web yang berbeda menggunakan port khusus untuk setiap domain ?.

Atau apakah browser menggunakan port tunggal untuk mengelola semua tab dan karenanya semua domain ?.

yoyo_fun
sumber
Browser menggunakan 2 port saat menghubungkan ke situs web, 80 untuk koneksi http, 443 untuk koneksi https. en.wikipedia.org/wiki/List_of_TCP_and_UDP_port_numbers
Moab
7
Saya tahu port yang digunakan untuk terhubung ke server, tetapi saya bertanya-tanya tentang nomor port yang digunakan untuk terhubung dari klien (komputer host).
yoyo_fun
2
Saya pikir istilah "port keluar" tidak tepat. Port bersifat dua arah. Mungkin Anda bisa mengatakannya. "port lokal," sebagai gantinya. Port lokal digunakan sebagai port sumber (keluar) untuk mengirim permintaan, dan port tujuan (masuk) untuk menerima respons.
Ron Maupin
6
Port ditetapkan oleh OS dan setiap koneksi baru diberi port lokal baru untuk membuatnya berbeda dari semua koneksi terbuka lainnya.
Ex Umbris
1
@ExUmbris: Itu mungkin strategi yang masuk akal dan sederhana, tetapi koneksi TCP diidentifikasi oleh quad {IP lokal, port lokal, IP jarak jauh, port jarak jauh}. Port lokal tidak diperlukan untuk keunikan, yang merupakan hal yang baik: server web tidak dapat menggunakan port lokal sama sekali untuk keunikan. Dan dari sudut pandang server web, IP jarak jauh tidak unik karena banyak pengguna mungkin berada di belakang satu gateway / proxy.
MSalters

Jawaban:

55

Apakah browser menggunakan port yang berbeda untuk terhubung ke situs web yang berbeda?

Ya mereka melakukanya.

Berikut ini contohnya, memperlihatkan koneksi Firefox saya saat ini (saya punya 9 tab terbuka) di Windows 7:

masukkan deskripsi gambar di sini

Catatan:

  • Anda dapat melihat bahwa semua port lokal berbeda.

  • Port jarak jauh biasanya 80 (HTTP), 443 (HTTPS) atau 8080 (HTTP Alternate).

  • Proses lengkap rendering halaman web dijelaskan di bawah ini. Lihat khususnya langkah 5, 6, 13 dan 15 (yang dicetak tebal):

    • Secara umum rendering halaman web tunggal menggunakan beberapa koneksi, tidak semuanya akan ke alamat remote yang sama.

    • Ini karena halaman web sering menyertakan sumber daya yang dihosting di tempat lain (file javascript, dll).

  • Beberapa koneksi ke situs web yang sama (misalnya stackoverflow.com) juga memiliki port lokal yang berbeda (karena mereka adalah koneksi terpisah di tab berbeda yang merender halaman yang berbeda).


Merender halaman web - langkah demi langkah

catatan:

  • Langkah 5, 6, 13 dan 15 (yang dicetak tebal) secara langsung relevan dengan pertanyaan.

Pernahkah Anda memikirkan apa yang terjadi ketika Anda menjelajahi web? Ini tidak sesederhana kelihatannya:

  1. Anda mengetik URL ke bilah alamat di browser pilihan Anda.
  2. Browser mem-parsing URL untuk menemukan protokol, host, port, dan path.
  3. Ini membentuk permintaan HTTP (itu kemungkinan besar protokol)
  4. Untuk mencapai host, pertama-tama perlu menerjemahkan host yang dapat dibaca manusia menjadi nomor IP, dan melakukan ini dengan melakukan pencarian DNS pada host
  5. Kemudian soket harus dibuka dari komputer pengguna ke nomor IP itu, pada port yang ditentukan (paling sering port 80)
  6. Ketika koneksi terbuka, permintaan HTTP dikirim ke tuan rumah
  7. Tuan rumah meneruskan permintaan ke perangkat lunak server (paling sering Apache) yang dikonfigurasi untuk mendengarkan pada port yang ditentukan
  8. Server memeriksa permintaan (paling sering hanya jalur), dan meluncurkan plugin server yang diperlukan untuk menangani permintaan (sesuai dengan bahasa server yang Anda gunakan, PHP, Java, .NET, Python?)
  9. Plugin mendapatkan akses ke permintaan penuh, dan mulai menyiapkan respons HTTP.
  10. Untuk membangun respons, sebuah basis data (kemungkinan besar) diakses. Pencarian basis data dilakukan, berdasarkan parameter di jalur (atau data) dari permintaan
  11. Data dari database, bersama dengan informasi lain yang diputuskan untuk ditambahkan oleh plugin, digabungkan menjadi string teks yang panjang (mungkin HTML).
  12. Plugin menggabungkan data itu dengan beberapa data meta (dalam bentuk HTTP header), dan mengirimkan respons HTTP kembali ke browser.
  13. Browser menerima respons, dan mem-parsing HTML (yang dengan probabilitas 95% rusak) dalam respons
  14. Pohon DOM dibangun dari HTML yang rusak
  15. Permintaan baru dibuat ke server untuk setiap sumber daya baru yang ditemukan dalam sumber HTML (biasanya gambar, style sheet, dan file JavaScript). Kembali ke langkah 3 dan ulangi untuk setiap sumber daya.
  16. Lembar style diuraikan, dan informasi render di masing-masing akan dilampirkan ke simpul yang cocok di pohon DOM
  17. Javascript diurai dan dieksekusi, dan node DOM dipindahkan dan informasi gaya diperbarui sesuai
  18. Browser membuat halaman pada layar sesuai dengan pohon DOM dan informasi gaya untuk setiap node
  19. Anda melihat halaman di layar
  20. Anda merasa kesal seluruh proses itu terlalu lambat.

Sumber Merender halaman web - langkah demi langkah

DavidPostill
sumber
63

Setiap koneksi ke situs web menggunakan soket yang berbeda dengan tujuan default port TCP 80 untuk HTTP biasa dan 443 untuk HTTPS. Agar soket menjadi unik, kombinasi dari alamat IP sumber, sumber port TCP, alamat IP tujuan dan port TCP tujuan harus berbeda.

Jika Anda memiliki beberapa koneksi ke situs web yang sama (dengan asumsi situs web hanya menggunakan 1 alamat IP) dari komputer yang sama, port TCP sumber yang berbeda harus digunakan. Dengan cara ini, setiap koneksi unik.

Namun, harus dicatat bahwa pada HTTP 1.1, semua koneksi bersifat persisten untuk periode waktu tertentu (kecuali dinyatakan sebaliknya). Ini berarti bahwa koneksi yang sama dapat digunakan kembali oleh browser Anda jika banyak sumber daya dari situs web yang sama diminta (misalnya file css / js). Ini juga berlaku jika Anda memiliki beberapa contoh situs web yang sama di browser Anda.

Jika Anda menggunakan Windows, netstat -no -p TCPperintah ini akan menunjukkan semua soket TCP aktif dan ID proses yang terkait, termasuk yang ada di browser Anda:

masukkan deskripsi gambar di sini

Jika Anda menggunakan Unix / Linux (Debian dalam kasus ini), Anda dapat menggunakan perintah netstat -ntpatau ss -t:

masukkan deskripsi gambar di sini

Egon Olieux
sumber
4
Perhatikan bahwa netstat juga akan menampilkan koneksi non-browser, misalnya koneksi email untuk klien email, koneksi berita untuk pembaca berita. Koneksi ini akan berada pada port jarak jauh yang berbeda.
DavidPostill
Kecuali saya kehilangan sesuatu, sepertinya Anda membuat asumsi bahwa penanya menggunakan Windows, meskipun ia belum menyebutkan sistem operasi. Ini juga baik untuk membuat daftar OS apa yang Anda maksud setiap kali memberikan perintah konsol.
user45623
9
@ user45623: Meskipun tangkapan layar adalah tangkapan layar Windows, netstat -nharus berfungsi di sebagian besar sistem operasi, termasuk Linux dan Mac OS.
Heinzi
1
Pada Windows (mungkin juga OS lain) yang dapat Anda gunakan netstat -n -ountuk melihat proses yang dibuat koneksi mana. Atau Anda dapat menjalankan tcpview SysInternal untuk melihat daftar dalam GUI, dengan nama proses dan ikon dan semuanya.
Jonathan
Sekarang pertanyaannya adalah, apakah browser web menggunakan kembali koneksi dari tab yang berbeda jika mereka mengarah ke server yang sama?
John Dvorak
11

Mengenai tab untuk situs web yang berbeda, tidak ada dalam TCP yang mengharuskan port lokal berbeda, selama tuple {IP lokal, port lokal, IP target, port target} unik. Untuk tab ke situs web yang sama, situasinya jauh lebih kompleks.

Browser, seperti perangkat lunak klien lainnya, menggunakan port lokal yang berbeda per koneksi keluar ke target yang sama. Secara umum itu akan membentuk beberapa koneksi ke situs web mana pun, untuk mengambil sumber daya yang disematkan seperti gambar, CSS, JavaScript, dll. Ini juga akan menyatukan koneksi tersebut untuk kemungkinan penggunaan kembali.

Tidak mungkin untuk mengatakan apakah tab yang berbeda untuk situs web yang sama, akan menggunakan koneksi berbeda , karena (a) biasanya tidak ada satu koneksi per tab, dan (b) tergantung pada waktu dan otentikasi, koneksi mungkin digunakan kembali di antara tab; dan karena itu tidak mungkin untuk mengidentifikasi koneksi itu maka tidak mungkin untuk mengidentifikasi port lokal juga.

pengguna207421
sumber
Terima kasih. Apa artinya "menggabungkan" suatu koneksi?
yoyo_fun
Alih-alih menutupnya, mengembalikannya ke kolam, dan hanya menutupnya jika tetap ada di sana untuk beberapa interval waktu habis; dan mencari di kolam terlebih dahulu sebelum membuat koneksi baru ke target itu. Ini adalah bagaimana HTTP keep-live diimplementasikan.
user207421
Jadi kumpulan adalah struktur data dalam memori yang menyimpan koneksi terbuka dan belum ditutup?
yoyo_fun
Itu benar, biasanya peta dikunci oleh target IP: port.
user207421
2
@ EJP: Perhatikan bahwa untuk HTTPS, tidak aman untuk mengunci peta berdasarkan IP dan port target; Anda juga perlu membedakan antara koneksi ke nama host yang berbeda meskipun mereka memutuskan untuk menyelesaikan ke IP dan port yang sama. Bisa dibilang browser juga harus menjaga koneksi untuk tab yang berbeda terpisah jika setidaknya satu tab dalam mode penyamaran.
Henning Makholm
6

Iya. Tidak, mungkin. Tergantung.

Pertama, browser dapat menggunakan salah satu dari strategi ini untuk koneksi:

  1. Koneksi tunggal (tidak mungkin untuk peramban apa pun yang lebih baru dari 1995)
  2. Satu koneksi per tab (pada dasarnya sama dengan # 1, hanya sedikit lebih baik)
  3. Satu koneksi per sumber daya (naif, tetapi tidak bekerja sangat buruk)
  4. Kumpulan koneksi dengan koneksi yang tetap hidup, menggunakan kembali
  5. Sesuatu yang berbeda (baca: hal-hal aneh)

Anda tidak memiliki cara untuk mengetahui strategi mana yang akan digunakan browser, meskipun menggunakan kumpulan koneksi (dan menggunakan kembali koneksi) adalah asumsi yang masuk akal.

Kedua, cara TCP bekerja, Anda memiliki port sumber, dan port tujuan untuk setiap koneksi. Sepasang sumber / alamat tujuan / port menentukan koneksi.
Anda selalu [1] menggunakan port yang terkenal (seperti 80 atau 443) untuk terhubung ke server (yang ia dengarkan pada alamat yang diiklankan), tetapi port lain dipilih secara acak. Jadi, tergantung dari sisi mana Anda melihat suatu koneksi, ia memiliki satu atau banyak port yang memungkinkan.

Dengan demikian, tab yang sama mungkin (dan biasanya akan) menggunakan beberapa port yang berbeda pada akhirnya, tetapi pada prinsipnya tab yang berbeda mungkin (jika koneksi dikumpulkan dan sumber daya yang berbeda di tab yang berbeda dimuat dari server yang sama) menggunakan port yang sama.

Karena pertanyaan secara eksplisit menyebutkan keluar , dalam kasus "normal", nomor port akan sama terlepas dari tab mana yang ada, atau salah satu dari dua port yang mungkin (80 dan 443). Meskipun tentu saja dimungkinkan untuk secara eksplisit meminta port yang berbeda (seperti 8080) dalam sebuah URL. Itu agak langka.


[1] Ya, tidak selalu ... tapi jangan terlalu rumit.

Damon
sumber
Satu faktor lain ... port sisi klien biasanya dipilih oleh OS, bukan browser; dan port sisi klien yang dilihat server mungkin berbeda dari yang dilihat browser, jika koneksi melalui perangkat NAT. Sebagian besar OS mengalokasikan baik secara linier atau acak dalam rentang porta yang dapat dikonfigurasi (dapat dikonfigurasi), tetapi browser dapat meminta port-sumber yang sama di beberapa koneksi ke server yang berbeda. (Dan OP bertanya tentang port klien, bukan port server.)
david
@david: Sulit untuk mengatakan yang mana yang benar (atau apa yang harus dijawab) karena Q adalah berita gembira yang ambigu, maka perjalanan saya mencakup semua perjalanan yang agak panjang. OP bertanya tentang port keluar pada klien. "Klien" menyarankan agar kita berbicara tentang port sumber (dalam istilah TCP) yang merupakan salah satu yang dipilih secara bebas atau acak (oleh implementasi), tetapi "keluar" menunjukkan itu benar-benar port tujuan yang sedang kita bicarakan. Yang jauh lebih baik digambarkan sebagai "port on server" dalam kata-kata awam. Komentar Anda tentang NAT benar seperti yang terlihat dari server, tetapi tidak memengaruhi klien.
Damon