一:什么是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.主要類型
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 的典型應用就是 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 而設計的數據傳輸函數,針對普通文件的輸入輸出函數就無效了。