2016-03-06 43 views
1

我開始閱讀W. Richard Stevens的UNIX網絡編程,我對端口和套接字之間的混淆很感興趣。當我在互聯網上閱讀時,它說套接字是一個連接的端點,而對於端口號來說,它寫的是,IP地址和端口沒有形成一個唯一的對。 所以現在我的問題是:端口號和套接字之間的區別

  • (1)這兩個有什麼區別?

  • (2)插座和端口在內部如何操作。套接字是文件嗎?

  • (3)當我們使用應用程序發送數據時,數據是如何發送的?

  • (4)如果套接字在那裏,爲什麼我們使用端口號?

對不起,我的英語..在此先感謝您的答覆。

+3

從一些初學者計算機網絡書籍開始,就像Tanenbaum's一樣。 –

+0

我已經讀過,在我上一學期.... – tkhurana96

+1

然後,現在是您再次閱讀的時候了。否則,你不會問這個問題!在學習的同時培養對邏輯的理解。 –

回答

2

(1)這兩者有什麼區別?

運行IP網絡的計算機始終具有固定數量的端口 - 65535個TCP端口和65535個UDP端口。網絡數據包的標題包含一個16字節的unsigned-short字段,用於指定數據包應該傳送到哪個端口。

另一方面,套接字由每個程序按需分配。套接字充當程序和操作系統聯網堆棧之間的句柄/接口,用於構建和指定特定聯網任務的上下文。一個套接字可能綁定到一個端口,也可能不綁定到一個端口,並且也有可能(和普通)在一個特定端口上同時綁定多個套接字。

(2)插座和端口在內部如何操作。套接字是 文件嗎?

這完全取決於操作系統;而不同的操作系統會採用不同的方式。目前還不清楚這個問題中「一個文件」是什麼意思,但一般來說套接字與文件系統沒有任何關係。另一方面,Unix風格的操作系統的一個特點是套接字描述符也可以像文件系統文件描述符一樣使用 - 也就是說你可以將它們傳遞給read()/ write()/ select()等等並獲得有用的結果。其他操作系統(如Windows)不支持該功能,對於它們,您必須對套接字和文件使用完全獨立的一組函數調用。

(3)當我們使用應用程序發送數據時,數據是如何發送的?

應用程序調用send()函數(或類似的函數,如sendto()),將相關的套接字描述符和指向它想要發送的數據的指針一起傳遞,然後達到網絡堆棧將數據複製到一個數據包中並將其傳送到適當的網絡設備進行傳輸。

(4)如果套接字在那裏,爲什麼我們使用端口號?

因爲你需要的方式與其他計算機上的特定程序進行通信和計算機A在計算機B,但端口號,沒辦法知道什麼插座都存在(如果有的話)是固定的,因此有可能程序員可以將它們用作通信的集合點 - 例如,您的Web瀏覽器知道,每當服務器運行時,Web服務器幾乎肯定會監聽端口80上的傳入HTTP請求,因此它可以將其請求發送給港口80有一個合理的期望得到有用的迴應。如果它必須指定一個套接字作爲目標,那麼它會指定什麼?服務器的套接字號是任意的,並且每次服務器運行時都可能會有所不同。

+0

我理解了你的整個答案,這是一個非常好的解釋,但請你詳細說明一下:「插槽,另一方面,由每個程序分配需求。」 – tkhurana96

+1

當程序想要創建一個套接字時,所以通過調用socket()函數。當它使用套接字完成時,它會通過在套接字的文件描述符中調用close()(或在Windows的情況下,closesocket())來銷燬套接字。一個程序可能同時使用0個,1個或多個套接字,具體取決於它正在做什麼,它可能隨時關閉套接字和/或創建新套接字(如果它選擇的話)。另一方面,港口永遠不會「被創造」或「被破壞」;例如在給定的主機上總是有65535個TCP端口。 –

+0

根據你的回答(這是一個非常好的解釋),我們需要在主機上唯一標識一個應用程序,這就是爲什麼我們使用端口號,那麼如果是這種情況,那我們爲什麼不直接使用端口號只要 ? – tkhurana96

相關問題