SOCKET是調用操做系統通訊服務的一種機制

有沒有SOCKET,網卡都會接收數據。網卡工做在數據鏈路層,它只認識鏈路上鄰近的點。它甚至不認識它隔壁的隔壁,它又怎麼可能知道傳輸層的信息呢(起點與終點,是傳輸層的信息)?。。。傳輸層的信息,只能由傳輸層來處理!數據庫

IP層存在一樣的問題。由於它也「活(動)」在網絡層。它也不處理,一樣地它也不能處理原本位於第四層即傳輸層的與傳輸相關的信息。。固然,若是一個網絡節點硬要處理它,固然也是能夠的。由於高層的信息是被低層的信息所包裹着的。只是恐怕通常的機構沒有這樣的實力來作這個事情。由於那麼多人的信息,憑一己之力,怎麼可能或者何時才能讀得完?!安全

因而可知,SOCKET只是整個網絡系統的附屬品。它並無任何主「動」的能力。主「動」的能力所有把握在第三層如下。第四層及其以上各層,都不具備「動」的能力。。。。一個數據包,若是被傳到了第四層,其實也就失去了其的動力,中止了其在網絡上的旅行。由於它已經到了。網絡

這意味着,若是從網絡上隨處給某個「SOCKET」發一個數據包,無論這個SOCKET是否真實存在,即:無論在內存中是否已經創建其對應的SOCKET對象,這個包都會被如期送達(若是至少這個「半相關」存在,而且假設網絡通暢的話)。也就是說,以任一SOCKET地址爲目標的數據包的到達與否,與在主機中是否創建相關的SOCKET對象是沒有關係的。socket

固然沒有關係!函數

一個SOCKET對象只是活在本地內存中的對象,而真正的數據包倒是來自於網絡層I/O操做。網絡I/O工做在傳輸層如下,這就決定了網絡I/O工做在SOCKET對象所在層即傳輸層之前,這就決定了與SOCKET工做有關的任何系統級或用戶級操做,都是發生在包到達之後(在接收的時候)。spa

真正的發送工做更與SOCKET對象基本上沒有任何關係。由於操做系統只要隨便往一個IP包中填入一個地址與端口均可以把包給發出去(也許不填也能夠。。。由於源地址顯然地並非路由所須要的必要信息)。操作系統

。。。code

意思是,SOCKET並非動者。通訊能力的提供者是操做系統。操做系統提供全部的協議服務。這種服務,經過SOCKET暴露給應用程序的開發者。首先,在機器級別是不存在對象這個概念的。機器只知道兩樣事情:數據與指令。在運行時,SOCKET的代碼是不存在的。存在的是SOCKET的代碼的編譯後指令。方法或函數在二進制世界其實只是指令集的界符。函數的概念其實只是爲了區分運行時的指令集。機器須要這樣的信息對運行時指令集進行劃分。不然機器就只能執行順序程序了(在原語言不提供其它的代碼邊界或標識的狀況下)。源碼的價值也在於其的二進制表明。不然其就不可能具備任何意義。這是可使用SOCKET API來討論網絡通訊的緣由。由於它擁有真正的二進制表明。當我使用API這個詞的時候,它的背後實際上是它所表明的機器級指令。。。可是不管如何,SOCKET的API並非通訊的執行者。通訊的執行者是操做系統的協議層。SOCKET API只是應用程序與操做系統的協議層之間的一座橋樑。它能夠被看做應用程序與操做系統的通訊服務之間的協議。即操做系統的通訊服務協議。應用程序經過這種協議調用操做系統的通訊服務。這顯然意味着SOCKET並非真正的通訊者。真正的通訊者是OS。另外一個證據是, SOCKET並不執行任何TCP協議操做。全部的協議操做都是操做系統完成的。而應用程序則使用SOCKET調用這些服務。另外一種說法它是一種機制,就是這個意思。由於機制意味着手段,渠道,中間者。是同樣的意思。操做系統經過這種機制向外提供通訊服務。orm

動者是操做系統(的協議層)。對象

所以, 說使用SOCKET進行通訊是錯誤的。應該說使用SOCKET調用通訊。由於它並不完成真正的通訊。它的確通訊,可是這種通訊是爲了與OS的真正通訊服務進行通訊以告訴OS爲之提供服務。另外一個方面,它只是個API,所作的所有隻是在內存中的一些操做,這些操做如何可以完成任何真正的通訊工做?真正的通訊工做要求的是端口管理,分配,偵聽,以及網絡層即IP地址的管理,分配,安全等服務,還有按協議組裝數據,路由,尋址及響應服務,和與網卡進行真正的I/O通訊以將數據放至網絡上傳播。。。。。。全部這些工做,SOCKET一點都沒有作。

所以,SOCKET,不論是「半相關」仍是「全相關」,都只是內存裏面的概念。這些概念存在的目的是爲了構建整個調用機制。它們是爲調用而存在的。它們只活在API裏面。調用的目標則是系統的通訊服務。 也能夠認爲這些是對OS服務的封裝。可是如JDBC並不進行真正的數據庫操做同樣,必須清醒地意識到SOCKET只是個API,它也不進行任何真正的通訊操做。若是它能進行,那麼它就不會存在於JAVA語言中了。由於JAVA語言甚至不能提供對內存的直接存取,更況且對I/O設備(網卡)的直接存取呢?

 

SOCKET意思是,這麼多的程序都要通訊。你要插一腳,那好,就給你一個SOCKET。SOCKET在這裏的意思是,插孔。槽。當用它來接收信息的時候,它用來區分具體的收信程序;用來發送信息的時候,它就只是個句柄。

若是綁定了地址,那麼系統應該會盡量在進行真正的通訊工做時使用這個地址。好比,若是爲服務端SOCKET綁定了地址,那麼系統將嘗試在這個地址上而不是別的地址上進行偵聽(對操做系統來講,它將造成一個資源佔用------也就是說,一旦綁定成功,其它的程序將不能綁定在相同的地址(網絡地址---人爲的,虛有的,自稱的地址)上)。

附:

維基上面的Berkeley sockets.bind()方法的描述:

bind()

bind() assigns a socket to an address. When a socket is created using socket(), it is only given a protocol family, but not assigned an address. This association with an address must be performed with the bind() system call before the socket can accept connections to other hosts. bind() takes three arguments:

  • sockfd, a descriptor representing the socket to perform the bind on.
  • my_addr, a pointer to a sockaddr structure representing the address to bind to.
  • addrlen, a socklen_t field specifying the size of the sockaddr structure.

Bind() returns 0 on success and -1 if an error occurs.

Prototype
int bind(int sockfd, const struct sockaddr *my_addr, socklen_t addrlen);
注意紅色的文字。它解釋說「綁定」是接受其它主機鏈接的前提條件。由於若是沒有綁定,就沒有註冊。不註冊,怎麼偵聽。OS不是神。OS經過這個函數獲得在系統內部路由的信息------進程路由。
相關文章
相關標籤/搜索