Socket TCP通訊 一:什么是Socket TCP?


一:什么是Socket TCP?

二:Socket TCP用來做什么?

三:Socket TCP怎樣來使用?

 

一:什么是Socket TCP.

1.簡介

Socket(套接字)可以看成是兩個網絡應用程序進行通信時,各自通信連接中的端點,這是一個邏輯上的概念。

它是網絡環境中進程間通信的API(應用程序編程接口),也是可以被命名和尋址的通信端點,使用中的每一個套接字都有其類型和一個與之相連進程。

通信時其中一個網絡應用程序將要傳輸的一段信息寫入它所在主機的 Socket中,該 Socket通過與網絡接口卡(NIC)相連的傳輸介質將這段信息送到另外一台主機的 Socket中,使對方能夠接收到這段信息。

Socket是由IP地址和端口結合的,提供向應用層進程傳送數據包的機制  。

 

2.表示方法

套接字Socket=(IP地址:端口號),套接字的表示方法是點分十進制的lP地址后面寫上端口號,中間用冒號或逗號隔開。

每一個傳輸層連接唯一地被通信兩端的兩個端點(即兩個套接字)所確定。

例如:如果IP地址是210.37.145.1,而端口號是23,那么得到套接字就是(210.37.145.1:23)

 

3.主要類型

1.流套接字(SOCK_STREAM)
 
                  流套接字用於提供面向連接、可靠的數據傳輸服務。
 
                  該服務將保證數據能夠實現無差錯、無重復送,並按順序接收。
 
                  流套接字之所以能夠實現可靠的數據服務,原因在於其使用了傳輸控制協議,即TCP(The Transmission Control Protocol)協議
 
2.數據報套接字(SOCK_DGRAM)
 
                  數據報套接字提供一種無連接的服務。
 
                  該服務並不能保證數據傳輸的可靠性,數據有可能在傳輸過程中丟失或出現數據重復,且無法保證順序地接收到數據。
 
                  數據報套接字使用UDP( User DatagramProtocol)協議進行數據的傳輸。
 
                  由於數據報套接字不能保證數據傳輸的可靠性,對於有可能出現的數據丟失情況,需要在程序中做相應的處理  。
 
3.原始套接字(SOCK_RAW)
 
                  原始套接字與標准套接字(標准套接字指的是前面介紹的流套接字和數據報套接字)的區別
 
                  在於:原始套接字可以讀寫內核沒有處理的IP數據包,而流套接字只能讀取TCP協議的數據,數據報套接字只能讀取UDP協議的數據。
 
                  因此,如果要訪問其他協議發送的數據必須使用原始套接  。
 
4.工作流程
 
要通過互聯網進行通信,至少需要一對套接字,其中一個運行於客戶端,我們稱之為 Client Socket,另一個運行於服務器端,我們稱之為 Server Socket
 
根據連接啟動的方式以及本地套接字要連接的目標,套接字之間的連接過程可以分為三個步驟
 
(1)服務器監聽。
 
(2)客戶端請求。
 
(3)連接確認
 
1.服務器監聽
 
所謂服務器監聽,是指服務器端套接字並不定位具體的客戶端套接字,而是處於等待連接的狀態,實時監控網絡狀態
 
2.客戶端請求
 
所調客戶端請求,是指由客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。
 
為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然后就向服務器端接字提出連接請求  
 
3.連接確認
 
所謂連接確認,是指當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求,就會響應客戶端套接字的請求,建立一個新的線程,並把服務器端套接字的描述發送給客戶端。
 
一旦客戶端確認了此描述,連接就建立好了。而服務器端套接字繼續處於監聽狀態,接收其他客戶端套接字的連接請求
 
5.主要特點
 
根據套接字的不同類型,可以將套接字調用分為面向連接服務和無連接服務  。
 
面向連接服務的主要特點如下:
 
(1)數據傳輸過程必須經過建立連接、維護連接和釋放連接3個階段  ;
 
(2)在傳輸過程中,各分組不需要攜帶目的主機的地址  ;
 
(3)可靠性好,但由於協議復雜,通信效率不高  ;
 
面向無連接服務的主要特點如下:
 
(1)不需要連接的各個階段;
 
(2)每個分組都攜帶完整的目的主機地址,在系統中獨立傳送  ;
 
(3)由於沒有順序控制,所以接收方的分組可能出現亂序、重復和丟失現象  ;
 
(4)通信效率高,但可靠性不能確保  ;
 
6.TCP/IP協議

TCP/IP【TCP(傳輸控制協議)和IP(網際協議)】提供點對點的鏈接機制,將數據應該如何封裝、定址、傳輸、路由以及在目的地如何接收,都加以標准化。

它將軟件通信過程抽象化為四個抽象層,采取協議堆棧的方式,分別實現出不同通信協議。

協議族下的各種協議,依其功能不同,被分別歸屬到這四個層次結構之中,常被視為是簡化的七層OSI模型。

它們之間好比送信的線路和驛站的作用,比如要建議送信驛站,必須得了解送信的各個細節。

TCP(Transmission Control Protocol,傳輸控制協議)是一種面向連接的、可靠的、基於字節流的通信協議,數據在傳輸前要建立連接,傳輸完畢后還要斷開連接,客戶端在收發數據前要使用 connect() 函數和服務器建立連接。

建立連接的目的是保證IP地址、端口、物理鏈路等正確無誤,為數據的傳輸開辟通道。

 

創建Socket連接時,可以指定使用的傳輸層協議,Socket可以支持不同的傳輸層協議(TCP或UDP),當使用TCP協議進行連接時,該Socket連接就是一個TCP連接。

  socket則是對TCP/IP協議的封裝和應用(程序員層面上)。

也可以說,TPC/IP協議是傳輸層協議,主要解決數據 如何在網絡中傳輸,而HTTP是應用層協議,主要解決如何包裝數據。

關於TCP/IP和HTTP協議的關系,網絡有一段比較容易理解的介紹:

                      “我們在傳輸數據時,可以只使用(傳輸層)TCP/IP協議,但是那樣的話,如 果沒有應用層,便無法識別數據內容,

                       如果想要使傳輸的數據有意義,則必須使用到應用層協議,應用層協議有很多,比如HTTP、FTP、TELNET等,也 可以自己定義應用層協議。

                       WEB使用HTTP協議作應用層協議,以封裝HTTP文本信息,然后使用TCP/IP做傳輸層協議將它發到網絡上。”

                       我們平時說的最多的socket是什么呢,實際上socket是對TCP/IP協議的封裝,Socket本身並不是協議,而是一個調用接口(API),通過Socket,我們才能使用TCP/IP協議。

                       實際上,Socket跟TCP/IP協議沒有必然的聯系。

                       Socket編程接口在設計的時候,就希望也能適應其他的網絡協議。

                       所以說,Socket的出現 只是使得程序員更方便地使用TCP/IP協議棧而已,是對TCP/IP協議的抽象,從而形成了我們知道的一些最基本的函數接口,

                      比如create、 listen、connect、accept、send、read和write等等。網絡有一段關於socket和TCP/IP協議關系的說法比較容易理解:

                      “TCP/IP只是一個協議棧,就像操作系統的運行機制一樣,必須要具體實現,同時還要提供對外的操作接口。

                      這個就像操作系統會提供標准的編程接口,比如win32編程接口一樣,TCP/IP也要提供可供程序員做網絡開發所用的接口,這就是Socket編程接口。” 

                      實際上,傳輸層的TCP是基於網絡層的IP協議的,而應用層的HTTP協議又是基於傳輸層的TCP協議的,而Socket本身不算是協議,就像上面所說,它只是提供了一個針對TCP或者UDP編程的接口。

                      socket是對端口通信開發的工具,它要更底層一些.

什么是 socket?

socket 的原意是“插座”,在計算機通信領域,socket 被翻譯為“套接字”,它是計算機之間進行通信的一種約定或一種方式。通過 socket 這種約定,一台計算機可以接收其他計算機的數據,也可以向其他計算機發送數據。

我們把插頭插到插座上就能從電網獲得電力供應,同樣,為了與遠程計算機進行數據傳輸,需要連接到因特網,而 socket 就是用來連接到因特網的工具。

socket是什么?


socket 的典型應用就是 Web 服務器和瀏覽器:瀏覽器獲取用戶輸入的 URL,向服務器發起請求,服務器分析接收到的 URL,將對應的網頁內容返回給瀏覽器,瀏覽器再經過解析和渲染,就將文字、圖片、視頻等元素呈現給用戶。

學習 socket,也就是學習計算機之間如何通信,並編寫出實用的程序。

UNIX/Linux 中的 socket 是什么?

在 UNIX/Linux 系統中,為了統一對各種硬件的操作,簡化接口,不同的硬件設備也都被看成一個文件。對這些文件的操作,等同於對磁盤上普通文件的操作。

你也許聽很多高手說過,UNIX/Linux 中的一切都是文件!那個家伙說的沒錯。

為了表示和區分已經打開的文件,UNIX/Linux 會給每個文件分配一個 ID,這個 ID 就是一個整數,被稱為文件描述符(File Descriptor)。例如:

  • 通常用 0 來表示標准輸入文件(stdin),它對應的硬件設備就是鍵盤;
  • 通常用 1 來表示標准輸出文件(stdout),它對應的硬件設備就是顯示器。


UNIX/Linux 程序在執行任何形式的 I/O 操作時,都是在讀取或者寫入一個文件描述符。一個文件描述符只是一個和打開的文件相關聯的整數,它的背后可能是一個硬盤上的普通文件、FIFO、管道、終端、鍵盤、顯示器,甚至是一個網絡連接。

請注意,網絡連接也是一個文件,它也有文件描述符!你必須理解這句話。

我們可以通過 socket() 函數來創建一個網絡連接,或者說打開一個網絡文件,socket() 的返回值就是文件描述符。有了文件描述符,我們就可以使用普通的文件操作函數來傳輸數據了,例如:

  • 用 read() 讀取從遠程計算機傳來的數據;
  • 用 write() 向遠程計算機寫入數據。


你看,只要用 socket() 創建了連接,剩下的就是文件操作了,網絡編程原來就是如此簡單!

Window 系統中的 socket 是什么?

Windows 也有類似“文件描述符”的概念,但通常被稱為“文件句柄”。因此,如果涉及 Windows 平台將使用“句柄”,如果涉及 Linux 平台則使用“描述符”。

與 UNIX/Linux 不同的是,Windows 會區分 socket 和文件,Windows 就把 socket 當做一個網絡連接來對待,因此需要調用專門針對 socket 而設計的數據傳輸函數,針對普通文件的輸入輸出函數就無效了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM