2013-07-18 57 views
-2

我知道套接字在網絡程序中被廣泛使用,我可以用它編寫代碼。但我不明白一些事情:什麼是套接字的定義,爲什麼需要它以及它是如何工作的?

1.爲什麼我們需要插座?

如果它被網絡層用來區分應用層程序,爲什麼不使用appliation名稱或其他uniqueue屬性?

套接字是標準嗎?

套接字只是在Linux或其他操作系統的結構?

2.套接字如何工作?

圍繞套接字有很多功能,例如bind,accept,listen,send等。例如,send()通過TCP發送msg給dest,以及它如何發送msg給網絡層?它發送消息到TCP緩衝區嗎?網絡層進程如何讀取tcp緩衝區數據以及如何將數據發送到較低層進程?

如果我使用send(int sockfd, const void *buf, size_t len, int flags)函數,第一個參數'sockfd'是一個未定義的套接字,比如隨機int,結果會導致什麼結果?爲什麼?什麼是os進程?

+0

這對SO來說太寬泛了。我建議你閱讀「Unix網絡編程」這本書,它很好地解釋了它。 – Barmar

+3

你爲什麼試圖將所有關於套接字的問題都塞進這個問題?此外,這些問題並不表示出誠意的嘗試,以便您首先回答自己的問題。 – jxh

回答

3

套接字起源於伯克利(因此名稱爲Berkeley sockets),它們旨在成爲通過網絡進行的進程間通信的「標準」抽象。

  1. POSIX套接字是一個標準,他們是,基本上原來的Berkeley套接字(作爲接口)
  2. 接口是非常有據可查的,它指定如果,例如,您使用會發生什麼sendsockfd參數的隨機int。 「以及它如何發送消息到網絡層?」是圖書館如何實施的問題,在不同的操作系統上有不同的答案。從用戶角度來看,這應該是沒有關係的。
3

在UNIX上,套接字是一種文件描述符。在Windows上,SOCKET是一種HANDLE。文件描述符和HANDLE是這些操作系統允許在資源上執行各種操作(例如讀取和寫入)的方式。網絡連接因此被視爲由OS的網絡服務提供的OS資源。

套接字API或多或少是標準的,儘管每個操作系統都可以提供操作系統特定的API以及標準API的操作系統特定選項。

套接字的底層實現很可能涉及到一個結構。

操作系統如何實現套接字API與實現其他系統調用沒有多大區別。最終將API轉換爲將數據傳遞到網絡堆棧的系統調用。網絡堆棧將管理自己的緩衝區,但send()通常會導致用戶空間中的數據被複制到網絡緩衝區(這與調用write()系統調用時發生的情況不同)。網絡堆棧通過其代碼處理數據,並將其傳遞到不同的層(通常是:socket-> TCP-> IP-> ethernet driver)。在最底層,它與OS用來與物理設備通信的任何設備驅動程序相似。

當你傳遞一個非套接字文件描述符send(),我希望你得到一個錯誤,要麼EBADFEINVAL,或ENOTSOCK,最有可能的。

相關問題