第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

是否可以在同一端口上創(chuàng)建多個(SSL)ServerSocket?

是否可以在同一端口上創(chuàng)建多個(SSL)ServerSocket?

心有法竹 2023-04-19 10:31:10
public class ServerThread implements Runnable {    private static final int port = 10000;    @Override    public void run() {        ServerSocket serverSocket = new ServerSocket(port);        while (true) {            Socket clientSocket = serverSocket.accept();            ClientThread clientThread = new ClientThread(clientSocket);            // handle the client request in a separate thread        }    }}如果我有 10 個不同的線程運行 ServerThread.run(),這會起作用嗎?或者我應(yīng)該為所有線程使用相同的 ServerSocket 對象嗎?文檔說:ServerSocket 的構(gòu)造函數(shù)在無法監(jiān)聽指定端口時拋出異常(例如,該端口已被使用)您可能想知道為什么我首先要這樣做,而不是簡單地讓一個線程運行 ServerSocket.accept()。好吧,我的假設(shè)是(如果我錯了請糾正我)accept() 方法可能需要一些時間才能完成建立連接,特別是如果 ServerSocket 是 SSL(因為握手)。所以如果兩個客戶端同時想要連接,一個必須等待另一個。這對于高流量服務(wù)器來說是非常糟糕的。更新:似乎 accept() 方法將在屬于隊列的連接建立后立即返回。這意味著如果有一排客戶端等待連接,服務(wù)器線程可以以最快的方式處理請求并且只需要一個線程。(除了為每個請求創(chuàng)建一個新線程并啟動線程所花費的時間,但使用線程池時該時間可以忽略不計)ServerSocket 還有一個名為“backlog”的參數(shù),您可以在其中設(shè)置隊列中的最大連接數(shù)。根據(jù)《Java 基礎(chǔ)網(wǎng)絡(luò)》一書 3.3.3TCP 本身可以在接受連接方面領(lǐng)先于 TCP 服務(wù)器應(yīng)用程序。它維護一個連接到偵聽套接字的“積壓隊列”,TCP 本身已完成但尚未被應(yīng)用程序接受。這個隊列存在于底層 TCP 實現(xiàn)和創(chuàng)建監(jiān)聽套接字的服務(wù)器進程之間。預(yù)完成連接的目的是加快連接階段,但隊列的長度是有限的,以免預(yù)先形成太多與服務(wù)器的連接,這些服務(wù)器由于任何原因不以相同的速率接受它們。當(dāng)接收到傳入連接請求且積壓隊列未滿時,TCP 完成連接協(xié)議并將連接添加到積壓隊列。此時,客戶端應(yīng)用程序已完全連接,但服務(wù)器應(yīng)用程序尚未收到連接作為 ServerSocket.accept 的結(jié)果值。當(dāng)它這樣做時,該條目將從隊列中刪除。我仍然不確定在 SSL 的情況下,握手是否也由 ServerSocket.accept() 并行完成以進行同時連接。更新 2 ServerSocket.accept() 方法本身根本不做任何真正的網(wǎng)絡(luò)。一旦操作系統(tǒng)建立了新的 TCP 連接,它就會返回。操作系統(tǒng)本身持有一個等待 TCP 連接的隊列,可以通過 ServerSocket 構(gòu)造函數(shù)中的“backlog”參數(shù)來控制:ServerSocket serverSocket = new ServerSocket(port, 50); //this will create a server socket with a maximum of 50 connections in the queueSSL 握手在客戶端調(diào)用 Socket.connect()之后完成。因此,一個 ServerSocket.accept() 線程就足夠了。
查看完整描述

1 回答

?
慕標(biāo)5832272

TA貢獻1966條經(jīng)驗 獲得超4個贊

以下是關(guān)于您的問題的一些想法:

您不能listen()在同一個 IP+端口上使用多個ServerSocket.?如果可以,操作系統(tǒng)會將 SYN 數(shù)據(jù)包傳輸?shù)侥膫€套接字?*

TCP 確實維護了預(yù)先接受的連接的積壓,因此調(diào)用將accept()(幾乎)立即返回積壓隊列中的第一個(最舊的)套接字。它通過自動發(fā)送 SYN-ACK 數(shù)據(jù)包來回復(fù)客戶端發(fā)送的 SYN,并等待回復(fù) ACK(3 次握手)來實現(xiàn)。但是,正如@zero298 所建議的那樣,盡可能快地接受連接通常不是問題。問題將是處理與您將接受的所有套接字的通信所產(chǎn)生的負載,這很可能會使您的服務(wù)器崩潰(這實際上是一次 DoS 攻擊)。實際上這個參數(shù)通常在這里 太多并發(fā)連接在積壓隊列中等待太久backlogaccept()在到達您的應(yīng)用程序之前,ed 將被 TCP 丟棄。

我建議您使用ExecutorService線程池來運行某個最大數(shù)量的線程,而不是為每個客戶端套接字創(chuàng)建一個線程,每個線程處理與一個客戶端的通信。這允許系統(tǒng)資源的優(yōu)雅降級,而不是創(chuàng)建數(shù)百萬個線程,這反過來會導(dǎo)致線程饑餓、內(nèi)存問題、文件描述符限制……再加上精心選擇的積壓值,您將能夠獲得您的服務(wù)器在不崩潰的情況下可以提供的最大吞吐量。run()如果您擔(dān)心 SSL 上的 DoS,您的客戶端線程方法應(yīng)該做的第一件事就是調(diào)用startHandshake()新連接的套接字。

關(guān)于 SSL 部分,TCP 本身不能做任何 SSL 預(yù)接受,因為它需要執(zhí)行加密/解碼、與密鑰庫對話等,這遠遠超出了它的規(guī)范。請注意,在這種情況下您還應(yīng)該使用SSLServerSocket。

積壓隊列用于 TCP 堆棧已完成但尚未被應(yīng)用程序接受的連接。與 SSL 無關(guān)。JSSE 不會進行任何協(xié)商,直到您在已接受的套接字上執(zhí)行一些 I/O,或在其上調(diào)用 startHandshake(),這兩者都將在處理連接的線程中執(zhí)行。我看不出如何利用它制造 DOS 漏洞,至少不是特定于 SSL 的漏洞。如果您遇到 DOS 情況,很可能您正在 accept() 線程中執(zhí)行本應(yīng)在連接處理線程中完成的 I/O。

*:雖然Linux >=3.9 做了某種負載平衡,但僅適用于 UDP(所以不是?SSLServerSocket并且有選項SO_REUSEPORT,這并不是在所有平臺上都可用。


查看完整回答
反對 回復(fù) 2023-04-19
  • 1 回答
  • 0 關(guān)注
  • 168 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號