① 什麼UNIX是套接字
套接字是一種具有之前所說的「通信端點」概念的計算機網路數據結構。網路化的應用程序在開始任何通訊之前都必需要創建套接字。就像電話的插口一樣,沒有它就完全沒辦法通信。
套接字起源於20世紀70年代加州大學伯克利分校版本的Unix,即人們所說的BSD Unix。因此,有時人們也把套接字稱為「伯克利套接字」或「BSD套接字」。一開始,套接字被設計用在同一台主機上多個應用程序之間的通訊。這也被稱作進程間通訊,或IPC。套接字有兩種,分別是基於文件型的和基於網路型的。
Unix套接字是我們要介紹的第一個套接字家族。其「家族名」為AF_UNIX(在POSIX1.g標准中也叫AF_LOCAL),表示「地址家族:UNIX」。包括Python在內的大多數流行平台上都使用術語「地址家族」及其縮寫「AF」。而老一點的系統中,地址家族被稱為「域」或「協議家族」,並使用縮寫「PF」而不是「AF」。同樣的,AF_LOCAL(在2000-2001年被列為標准)將會代替AF_UNIX。不過,為了向後兼容,很多系統上,兩者是等價的。Python自己則仍然使用AF_UNIX。
由於兩個進程都運行在同一台機器上,而且這些套接字是基於文件的。所以,它們的底層結構是由文件系統來支持的。這樣做相當有道理,因為,同一台電腦上,文件系統的確是不同的進程都能訪問的。
另一種套接字是基於網路的,它有自己的家族名字:AF_INET,或叫「地址家族:Internet」。還有一種地址家族AF_INET6被用於網際協議第6版(IPv6)定址上。還有一些其他的地址家族,不過,它們要麼是只用在某個平台上,要麼就是已經被廢棄,或是很少被使用,或是根本就還沒有實現。所有地址家族中,AF_INET是使用最廣泛的一個。Python 2.5中加入了一種Linux套接字的支持:AF_NETLINK(無連接(稍後講解))套接字家族讓用戶代碼與內核代碼之間的IPC可以使用標准BSD 套接字介面。而且,相對之前那些往操作系統中加入新的系統調用、proc文件系統支持或是「IOCTL」等復雜的方案來說,這種方法顯得更為精巧,更為安全。
② 什麼是網路套接字
套接字(socket)是用於網路通信的基本操作單元。簡單的說就是通信的兩方的一種約定,用套接字中的相關函數來完成通信過程。
套接字可以根據通信性質分類,主要分
流式套接字(sock_stream),
數據報套接字(sock_dgram)以及原始套接字(sock_raw).
數據報套接字提供了一種不可靠的、非連接的數據包通信方式。所以
數據報套接字使用udp協議,當然,winsock
2版本還支持其他協議。
③ 網路,什麼叫套接字呢
根據我的計算機網路編程的體會,通俗地講,套接字(SOCKET)可以理解為計算機網路編程的標准介面。無論是 Windows 編程也好,還是 Linux 編程也罷,只要是涉及到網路編程,就必然離不開對套接字的操作。一般來說,網路 socket 編程採用 client/server 結構,涉及到的庫函數有:bind()、listen()、accept()、read()、write()、send()、recv()等。
關於網路 socket 編程的具體實現,可以參考《TCP IP 詳解》一套書(共三卷)。
④ socket是什麼呀
套接字(Socket),就是對網路中不同主機上的應用進程之間進行雙向通信的端點的抽象。
一個套接字就是網路上進程通信的一端,提供了應用層進程利用網路協議交換數據的機制。從所處的地位來講,套接字上聯應用進程,下聯網路協議棧,是應用程序通過網路協議進行通信的介面,是應用程序與網路協議根進行交互的介面。
套接字是通信的基石,是支持TCP/IP協議的路通信的基本操作單元。
可以將套接字看作不同主機間的進程進行雙間通信的端點,它構成了單個主機內及整個網路間的編程界面。套接字存在於通信域中,通信域是為了處理一般的線程通過套接字通信而引進的一種抽象概念。
套接字通常和同一個域中的套接字交換數據(數據交換也可能穿越域的界限,但這時一定要執行某種解釋程序),各種進程使用這個相同的域互相之間用Internet協議簇來進行通信。
Socket(套接字)可以看成是兩個網路應用程序進行通信時,各自通信連接中的端點,這是一個邏輯上的概念。它是網路環境中進程間通信的API(應用程序編程介面),也是可以被命名和定址的通信端點,使用中的每一個套接字都有其類型和一個與之相連進程。
通信時其中一個網路應用程序將要傳輸的一段信息寫入它所在主機的 Socket中,該 Socket通過與網路介面卡(NIC)相連的傳輸介質將這段信息送到另外一台主機的 Socket中,使對方能夠接收到這段信息。
Socket是由IP地址和埠結合的,提供向應用層進程傳送數據包的機制。
類型
1、數據報套接字
無連接套接字,使用用戶數據報協議(UDP)。在數據報套接字上發送或接收的每個數據包都單獨定址和路由。數據報套接字不能保證順序和可靠性,因此從一台機器或進程發送到另一台機器或進程的多個數據包可能以任何順序到達或可能根本不到達。在數據報套接字上發送廣播可能需要特殊配置。
為了接收廣播數據包,數據報套接字不應該綁定到特定地址,盡管在某些實現中,當數據報套接字綁定到特定地址時也可能接收廣播數據包。
2、流套接字
面向連接的套接字,使用傳輸控制協議(TCP)、流控制傳輸協議(SCTP) 或數據報擁塞控制協議(DCCP)。流套接字提供了無記錄邊界的有序且獨特的無錯誤數據流,並具有用於創建和銷毀連接以及報告錯誤的明確定義的機制。
流套接字以帶外功能可靠地、有序地傳輸數據。在 Internet 上,流套接字通常使用 TCP 實現,以便應用程序可以使用 TCP/IP 協議在任何網路上運行。
3、原始套接字
允許直接發送和接收 IP 數據包,無需任何特定於協議的傳輸層格式。對於其他類型的套接字,根據選擇的傳輸層協議(例如 TCP、UDP)自動封裝有效載荷,並且套接字用戶不知道與有效載荷一起廣播的協議頭的存在。從原始套接字讀取時,通常包含標頭。
從原始套接字傳輸數據包時,自動添加標頭是可選的。
大多數套接字應用程序編程介面(API),例如基於Berkeley 套接字的那些,支持原始套接字。Windows XP於 2001 年發布,在Winsock介面中實現了原始套接字支持,但三年後,微軟出於安全考慮限制了 Winsock 的原始套接字支持。
原始套接字用於與安全相關的應用程序,如Nmap。原始套接字的一個用例是在用戶空間中實現新的傳輸層協議。
原始套接字通常在網路設備中可用,用於路由協議,例如Internet 組管理協議(IGMP) 和開放最短路徑優先(OSPF),以及用於Internet 控制消息協議(ICMP) 等事情,由ping 實用程序。
以上內容參考網路-套接字
⑤ 進程間通信(IPC)——Unix域套接字 VS 網路套接字
進程間通信就是不同進程間進行數據交換的過程。因為進程間相互獨立,每個進程擁有獨立的地址空間、數據處理邏輯,操作系統保證了進程獨立運行的地址安全;但在復雜系統,單進程往往不能勝任業務需求,需要多進程的加入,多進程協作完成工作,這就離不開進程間通信這個話題了。
進程間通信有很多種方式,列舉如下:
而進程間通信按進程分布情況可以 單機內的進程間通信 和 多機間遠程調用的進程間通信 ,後者無需多講,在分布式等大型系統中是非常常見的,而進行通信的方式主要是上述方法中的網路IPC,有非常多的資料介紹相關內容,不在本文的討論范圍之內。
本文主要討論在 單機內進程間通信 中,Unix域套接字和TCP網路套接字的對比,後者屬於網路IPC。
套接字是一種應用程序介面,包括了一個用C語言寫成的應用程序開發庫,主要用於實現進程間通訊,在計算機網路通訊方面被廣泛使用。下面要討論的網路套接字和Unix套接字均屬於套接字。
在定義套接字類型的時候,網路套接字通常使用 AF_INET 進行定義;Unix域套接字則使用 AF_UNIX 進行定義。
套接字類型有三種,分別是流式套接字、數據報套接字和原始套接字。
流式套接字(SOCK_STREAM):流式套接字用於提供面向連接、可靠的數據傳輸服務。該服務將保證數據能夠實現無差錯、無重復發送,並按順序接收。流式套接字之所以能夠實現可靠的數據服務,原因在於其使用了傳輸控制協議,即TCP(The Transmission Control Protocol)協議。
數據報套接字(SOCK_DGRAM):數據報套接字提供了一種無連接的服務。該服務並不能保證數據傳輸的可靠性,數據有可能在傳輸過程中丟失或出現數據重復,且無法保證順序地接收到數據。數據報套接字使用UDP(User Datagram Protocol)協議進行數據的傳輸。由於數據報套接字不能保證數據傳輸的可靠性,對於有可能出現的數據丟失情況,需要在程序中做相應的處理。
原始套接字(SOCK_RAW):原始套接字(SOCKET_RAW)允許對較低層次的協議直接訪問,比如IP、 ICMP協議,它常用於檢驗新的協議實現,或者訪問現有服務中配置的新設備,因為RAW SOCKET可以自如地控制Windows下的多種協議,能夠對網路底層的傳輸機制進行控制,所以可以應用原始套接字來操縱網路層和傳輸層應用。比如,我們可以通過RAW SOCKET來接收發向本機的ICMP、IGMP協議包,或者接收TCP/IP棧不能夠處理的IP包,也可以用來發送一些自定包頭或自定協議的IP包。網路監聽技術很大程度上依賴於SOCKET_RAW。
原始套接字與標准套接字(標准套接字指的是前面介紹的流式套接字和數據報套接字)的區別在於:原始套接字可以讀寫內核沒有處理的IP數據包,而流式套接字只能讀取TCP協議的數據,數據報套接字只能讀取UDP協議的數據。因此,如果要訪問其他協議發送數據必須使用原始套接字。
網路通信中通常都是使用網路套接字進行通信,可用於單機進程間通信和多機進程間通信,網路套接字由五元組來標識:(源地址、源埠、目標地址、目標埠、通信協議),因而網路套接字在網路協議棧中屬於傳輸層之上的內容。所以,在使用網路套接字通信的時候,傳遞內容需要經過完整的網路協議棧四層模型中的(傳輸層-網路層-網路訪問層(數據鏈路層-物理層))。
回想在協議棧當中,對於報文的處理有哪些操作。
Unix域套接字只能用於在同一個計算機的進程間進行通信。雖然網路套接字也可以用於單機進程間的通信,但是使用Unix域套接字效率會更高,因為Unix域套接字僅僅進行數據復制,不會執行在網路協議棧中需要處理的添加、刪除報文頭、計算校驗和、計算報文順序等復雜操作,因而在單機的進程間通信中,更加推薦使用Unix域套接字。
關於套接字的使用,資料很多,不再介紹。
這里拿網路套接字和Unix域套接字出來比較的原因是,很多人在進行單機多進程開發時沒有注意到Unix域套接字的存在,而是使用了成本較高的網路套接字進行開發。Unix套接字在通信開銷方面是很小的,因而在單機通信中更加推薦使用Unix域套接字。
原文鏈接
⑥ 套接字是什麼
套接字(socket)是一個抽象層,應用程序可以通過它發送或接收數據,可對其進行像對文件一樣的打開、讀寫和關閉等操作。套接字允許應用程序將I/O插入到網路中,並與網路中的其他應用程序進行通信。網路套接字是IP地址與埠的組合。
總之,套接字Socket=(IP地址:埠號),套接字的表示方法是點分十進制的IP地址後面寫上埠號,中間用冒號或逗號隔開。每一個傳輸層連接唯一地被通信兩端的兩個端點(即兩個套接字)所確定。
(6)網路套接字都與什麼有關擴展閱讀
Socket最初是加利福尼亞大學Berkeley分校為Unix系統開發的網路通信介面。後來隨著TCP/IP網路的發展,Socket成為最為通用的應用程序介面,也是在Internet上進行應用開發最為通用的API。
Windows系統流行起來之後,由Microsoft聯合了其他幾家公司在Berkeley Sockets的基礎之上進行了擴充,共同制定了一套Windows下的網路編程介面,即Windows Sockets規范。
Windows Sockets規范是一套開放的、支持多種協議的Windows下的網路編程介面,包括1.1版和2.0版兩個版本。
參考資料來源:網路-套接字