1. 程式人生 > >【網路協議-3】Socket

【網路協議-3】Socket

1.Socket(套接字):

Socket是對TCP/IP協議的封裝,Socket本身並不是協議,而是一個呼叫介面(API),Socket只是為了更方便地使用TCP/IP協議棧而已,是對TCP/IP協議的抽象,提供給我們一些最基本的函式介面。

  • 流式套接字(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


常用函式:

建立Socket例項:

  public Socket(AddressFamily addressFamily,SocketType socketType,ProtocolType protocolType); 

  • addressFamily 引數指定 Socket 使用的定址方案
  • socketType 引數指定 Socket 的型別
  • protocolType 引數指定 Socket 使用的協議 

例如建立TCP和UDP套接字:

  Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
  Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);