google php Python Android wordpress shell 云计算 Ubuntu java 微软 程序员 apache linux Firefox 开源 mysql nginx 编程 Windows centos

iOS Socket理論知識

網絡七層由下往上分別為物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層。 
其中物理層、數據鏈路層和網絡層通常被稱作媒體層,是網絡工程師所研究的對象; 
傳輸層、會話層、表示層和應用層則被稱作主機層,是用戶所面向和關心的內容。

http協議對應於應用層
tcp/udp協議對應於傳輸層
ip協議對應於網絡層
三者本質上沒有可比性。何況HTTP協議是基於TCP連接的。TCP/IP是傳輸層協議,主要解決數據如何在網絡中傳輸;而HTTP是應用層協議,主要解決如何包裝數據。我們在傳輸數據時,可以只使用傳輸層(TCP/IP),但是那樣的話,由於沒有應用層,便無法識別數據內容,如果想要使傳輸的數據有意義,則必須使用應用層協議,應用層協議很多,有HTTP、ftptelnet等等,也可以自己定義應用層協議。WEB使用HTTP作傳輸層協議,以封裝HTTP文本信息,然後使用TCP/IP做傳輸層協議將它發送到網絡上。Socket是對TCP/IP協議的封裝,Socket本身並不是協議,而是一個調用接口(API),通過Socket,我們才能使用TCP/IP協議。

原文出自:閱讀原文
什麽是Socket?
Socket又稱之為“套接字”,是系統提供的用於網絡通信的方法。它的實質並不是一種協議,沒有規定計算機應當怎麽樣傳遞消息,只是給程序員提供了一個發送消息的接口,程序員使用這個接口提供的方法,發送與接收消息。

Socket描述了一個IP、端口對。它簡化了程序員的操作,知道對方的IP以及PORT就可以給對方發送消息,再由服務器端來處理發送的這些消息。所以,Socket一定包含了通信的雙方,即客戶端(Client)與服務端(server)。

TCP
TCP是面向連接的、傳輸可靠(保證數據正確性且保證數據順序)、用於傳輸大量數據(流模式)、速度慢,建立連接需要開銷較多(時間,系統資源)。

TCP是一種流模式的協議,是面向連接的,也就是說,在連接持續的過程中,socket中收到的數據都是由同一臺主機發出的(劫持什麽的不考慮),因此,知道保證數據是有序的到達就行了,至於每次讀取多少數據不關心。

TCP三次握手
所謂三次握手(Three-way Handshake),是指建立一個TCP連接時,需要客戶端和服務器總共發送3個包。三次握手的目的是連接服務器指定端口,建立TCP連接,並同步連接雙方的序列號和確認號並交換TCP窗口大小信息。在socket編程中,客戶端執行connect()時,將觸發三次握手(圖片來源於網絡):

image

SYN(synchronous)是同步標誌;ACK (Acknowledgement)是確認標誌,seq是序列號。

第一次握手:客戶端發送一個TCP的SYN標誌位置1的包,指明客戶打算連接的服務器的端口,以及初始序號X,保存在包頭的序列號字段裏。
第二次握手:服務器發回確認包(ACK)應答。即SYN標誌位和ACK標誌位均為1同時,將確認序號設置為客戶的序列號加1以,即X+1。
第三次握手:客戶端再次發送確認包(ACK) SYN標誌位為0,ACK標誌位為1。並且把服務器發來ACK的序號字段+1,放在確定字段中發送給對方.並且在數據段放寫序列號的+1。
關於三次握手,知乎上有個段子我覺得挺好的。

「餵餵餵,能聽到嗎?」

「沒問題。能聽到就回一聲。」

「沒問題。」

TCP四次揮手
四次揮手的流程:

image

當Server端收到Client端的SYN連接請求報文後,可以直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連接時,當Server端收到FIN報文時,很可能並不會立即關閉SOCKET,所以只能先回復一個ACK報文,告訴Client端,”你發的FIN報文我收到了”。只有等到我Server端所有的報文都發送完了,我才能發送FIN報文,因此不能一起發送。故需要四步握手。

TCP客戶端-服務器程序設計基本框架
image

UDP
UDP是面向無連接、傳輸不可靠、用於傳輸少量數據(數據包模式)、速度快的傳輸層協議。註意,UDP傳輸的是數據報包,而TCP是流。

UDP是面向無連接的協議,只要知道接收端的IP和端口,且網絡是可達的,任何主機都可以向接收端發送數據。這時候,如果一次能讀取超過一個報文的數據,則會亂套。比如,主機A向發送了報文P1,主機B發送了報文P2,如果能夠讀取超過一個報文的數據,那麽就會將P1和P2的數據合並在了一起,這樣的數據是沒有意義的。

UDP客戶端-服務端程序設計基本框架
image

Socket的通信過程
每一個應用或者說服務都有一個端口。比如DNS的端口號53,http的端口號80都是對應一個應用或者服務的端口。我們能由DNS請求到查詢信息,是因為DNS服務器時時刻刻都在監聽53端口,當收到我們的查詢請求以後,就能夠返回我們想要的IP信息。所以,從程序設計上來講,應該包含以下步驟:

服務端利用Socket監聽端口;
客戶端發起連接;
服務端返回信息,建立連接,開始通信;
客戶端,服務端斷開連接。
Socket原理
套接字(socket)是通信的基石,是支持TCP/IP協議的網絡通信的基本操作單元。它是網絡通信過程中端點的抽象表示,包含進行網絡通信必須的五種信息:連接使用的協議,本地主機的IP地址,本地進程的協議端口,遠地主機的IP地址,遠地進程的協議端口。

應用層通過傳輸層進行數據通信時,TCP會遇到同時為多個應用程序進程提供並發服務的問題。多個TCP連接或多個應用程序進程可能需要通過同一個 TCP協議端口傳輸數據。為了區別不同的應用程序進程和連接,許多計算機操作系統為應用程序與TCP/IP協議交互提供了套接字(Socket)接口。應用層可以和傳輸層通過Socket接口,區分來自不同應用程序進程或網絡連接的通信,實現數據傳輸的並發服務。

Socket連接
建立Socket連接至少需要一對套接字,其中一個運行於客戶端,稱為ClientSocket,另一個運行於服務器端,稱為ServerSocket。

套接字之間的連接過程分為三個步驟:

服務器監聽:服務器端套接字並不定位具體的客戶端套接字,而是處於等待連接的狀態,實時監控網絡狀態,等待客戶端的連接請求
客戶端請求:指客戶端的套接字提出連接請求,要連接的目標是服務器端的套接字。為此,客戶端的套接字必須首先描述它要連接的服務器的套接字,指出服務器端套接字的地址和端口號,然後就向服務器端套接字提出連接請求
連接確認:當服務器端套接字監聽到或者說接收到客戶端套接字的連接請求時,就響應客戶端套接字的請求,建立一個新的線程,把服務器端套接字的描述發給客戶端,一旦客戶端確認了此描述,雙方就正式建立連接。而服務器端套接字繼續處於監聽狀態,繼續接收其他客戶端套接字的連接請求

延伸阅读

    评论