2010-08-14 63 views
0

我是網絡初學者,我有幾個關於網絡的問題。 1)進程如何執行從網絡上不同計算機發送的代碼。通常一個進程的代碼段在加載後不能被改變以確保保護。 (另外我可以執行一些任意代碼來破壞進程的內存) 2)一個進程也可以聽到多個端口嗎?多個進程可以聽到同一個端口?例如兩個與端口80相關的https。如何區分這些進程以及如何確保保護? 3)另外我想知道如何在套接字中實現監聽。它們是作爲軟件中斷實現的嗎?一個進程如何執行網絡代碼

任何好書的建議非常感謝。

感謝&問候,

像老鼠。

回答

2

問:一個進程如何執行從另一臺機器發送的代碼?
答:一般來說,這是一個壞主意,因爲安全問題難以充分探索。但是,這可以通過將網絡交付代碼保存到單獨的可執行文件然後啓動這個新程序來完成。這也可以在大多數系統上完成,只需將接收到的原始字節視爲代碼;將字節加載到堆中(不是堆棧!),將地址轉換爲函數指針並調用它。雖然如此,但這幾乎肯定是壞主意

問:一個進程可以同時監聽多個端口嗎? A:是的。順便說一下,HTTPS是端口443. HTTP是端口80.

問:多個進程可以在同一個端口上偵聽(使用相同協議,在同一地址上)?
答:不可以。其他進程可能能夠竊聽並接收數據包,但它們不會直接綁定到端口。通常,只有一個進程可以綁定到給定的協議/端口/地址三元組。

問:在監聽套接字時如何實現阻塞?答:由操作系統,以自己的方式。通常情況下,當線程在非就緒套接字上調用acceptreadpoll/select時,線程會進入「阻塞」狀態,並且在某些數據到達之前不會接收CPU時間。

+0

如果是這樣,我的谷歌瀏覽器firefox如何能夠同時獲取http請求。 – mousey 2010-08-14 06:43:56

+0

@mousey他們不是網絡服務器,所以他們不聽端口80.另一端。 – 2010-08-14 16:37:18

+0

爲了澄清上述說法,Chrome和Firefox正在偵聽(不同的)隨機高編號端口,而不是端口80. – Borealid 2010-08-14 16:42:35

1

1)進程如何執行從網絡上不同計算機發送的代碼。通常一個進程的代碼段在加載後不能被改變以確保保護。

這與網絡無關。一旦你通過套接字接收到數據,它就在你的本地存儲器中。之後你做的是特定操作系統。例如,在Windows上,您可以使用VirtualProtect將頁面標記爲可執行文件。

2)也可以聽到多個端口的進程?

當然,只需爲每個您想要聽的端口創建一個不同的套接字。當然,要同時使用它們,您需要使用非阻塞套接字或者在單獨的線程中運行每個套接字。

3)另外,我想知道如何在套接字中實現監聽。它們是作爲軟件中斷實現的嗎?

這完全是OS特有的。 listen只是設置套接字,以便它可以接受連接。在此之後到達的任何連接請求(這可能發生在TCP/IP驅動程序的某處)由操作系統放入隊列中。當你稍後調用accept時,操作系統從這個隊列中抽出第一個掛起的連接並返回一個套接字。

+0

其實,我不認爲'聽'是一個阻止呼叫。你可能會想到「接受」。 – Borealid 2010-08-14 06:36:32

+0

是的監聽不是阻止呼叫。接受或recv全部阻止 – mousey 2010-08-14 06:40:13

+0

糟糕,固定。當我寫這些時,我不知道我在想什麼。 :) – casablanca 2010-08-14 16:19:37