【PHPsocket編程專題(理論篇)】初步理解TCP/IP、Http、Socket.md


前言

我們平時說的最多的socket是什么呢,實際上socket是對TCP/IP協議的封裝,Socket本身並不是協議,而是一個調用接口(API)。那TCP/IP又是什么呢?TCP/IP是ISO/OSI的濃縮版本,那ISO/OSI又是什么呢。。。接下來我們就進入枯燥的理論篇吧

先說一下,關於這幾個概念特別是TCP/IP和HTTP,講解它們的書,隨便拿出一本都厚到可以砸死人,所以本文僅僅是淺顯的概括一下,並且還有很多的概念我都不太明白,先做個記錄吧等后續有深入的機會再回來。也希望有朋友能在留言中指點一二。

ISO/OSI

OSI(Open System Interconnect),即開放式系統互聯。 一般都叫OSI參考模型,是ISO(國際標准化組織)組織在1985年研究的網絡互聯模型。該體系結構標准定義了網絡互連的七層框架(物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層),即ISO開放系統互連參考模型。注意這僅僅是一個參考模型,實際用得更多的是更成熟的tcp/ip4層模型

image002.gif-6.5kB

上三層總稱應用層負責用戶輸出輸入的,是控制軟件方面的。下四層總稱數據流層,負責數據傳輸的,是用來管理硬件的。

OSI參考模型中的數據傳輸過程

在OSI參考模型中,不同主機對等層之間按相應協議進行通信,同一主機不同層之間通過接口進行通信。除了最低層的物理層是通過傳輸介質進行物理數據傳輸外,其他對等層之間的通信均為邏輯通信。在這個模型中,每一層將上層傳遞過來的通信數據加上若干控制位后再傳遞給下一層,最終由物理層傳遞到對方物理層,再逐級上傳,從而實現對等層之間的邏輯通信,如下圖所示。

image004.gif-6.2kB

物理層

物理層是OSI參考模型的最低層,它利用傳輸介質為數據鏈路層提供物理連接。它主要關心的是通過物理鏈路從一個節點向另一個節點傳送比特流,物理鏈路可能是銅線、衛星、微波或其他的通訊媒介。它關心的問題有:多少伏電壓代表1?多少伏電壓代表0?等問題。總的來說物理層關心的是鏈路的機械、電氣、功能和規程特性。作用是通過傳輸介質發送和接收二進制比特流。

數據鏈路層

數據鏈路層是為網絡層提供服務的,解決兩個相鄰結點之間的通信問題,傳送的協議數據單元稱為數據幀。數據幀中包含物理地址(又稱MAC地址)用mac地址確認訪問的對象是誰(發件人和收件人)、控制碼、數據及校驗碼等信息。該層的主要作用是通過校驗、確認和反饋重發等手段,將不可靠的物理鏈路轉換成對網絡層來說無差錯的數據鏈路。此外,數據鏈路層還要協調收發雙方的數據傳輸速率,即進行流量控制,以防止接收方因來不及處理發送方來的高速數據而導致緩沖器溢出及線路阻塞。

網絡層

網絡層是為傳輸層提供服務的,傳送的協議數據單元稱為數據包或分組。該層的主要作用是解決如何使數據包通過各結點傳送的問題,即通過路徑選擇算法(路由)將數據包送到目的地。另外,為避免通信子網中出現過多的數據包而造成網絡阻塞,需要對流入的數據包數量進行控制(擁塞控制)。當數據包要跨越多個通信子網才能到達目的地時,還要解決網際互連的問題。ip地址的寫入就在網絡層上的。

傳輸層

確定通過哪一個協議來傳遞,同樣傳輸層也擁有數據校驗能力,瀏覽控制功能,比如網絡卡了就稍微緩緩傳輸等,傳輸層tcp和udp,每個傳輸協議都有65355個端口,然后確認端口號,為上層協議提供端到端的可靠和透明的數據傳輸服務,傳輸層傳送的協議數據單元稱為段或報文。

會話層

會話層主要功能是管理和協調不同主機上各種進程之間的通信(對話),即負責建立、管理和終止應用程序之間的會話。會話層得名的原因是它很類似於兩個實體間的會話概念。例如,一個交互的用戶會話以登錄到計算機開始,以注銷結束。

表示層

表示層處理流經結點的數據編碼的表示方式問題,以保證一個系統應用層發出的信息可被另一系統的應用層讀出。二進制數據過來以后,究竟是圖片,音樂,電影,文字呢?這個就由表示層來搞定,另外在由應用層輸入到表示層的時候,表示層又把文字,音樂等數據轉換為二進制數據

應用層

應用層是OSI參考模型的最高層,是用戶與網絡的接口。該層通過應用程序來完成網絡用戶的應用需求,如文件傳輸、收發電子郵件等。
給用戶提供服務的接口,也就是我們開發用於交互的程序;

f60169dfcd358e1ccdbf1a61.jpg-84.6kB

通過初步的了解,我知道IP協議對應於網絡層,TCP協議對應於傳輸層,而HTTP協議對應於應用層,三者從本質上來說沒有可比性,socket則是對TCP/IP協議的封裝和應用(程序員層面上)。

TCP/IP

TCP/IP模型實際上是OSI模型的一個濃縮版本,它只有四個層次。

d009b3de9c82d158935225be800a19d8bd3e42e8.jpg-13kB

手機能夠使用聯網功能是因為手機底層實現了TCP/IP協議,可以使手機終端通過無線網絡建立TCP連接。TCP協議可以對上層網絡提供接口(socket),使上層網絡數據的傳輸建立在“無差別”的網絡之上。

建立起一個TCP連接需要經過“三次握手”:
第一次握手:客戶端發送syn包(syn=j)到服務器,並進入SYN_SEND狀態,等待服務器確認;
第二次握手:服務器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時服務器進入SYN_RECV狀態;
第三次握手:客戶端收到服務器的SYN+ACK包,向服務器發送確認包ACK(ack=k+1),此包發送完畢,客戶端和服務器進入ESTABLISHED狀態,完成三次握手。

握手過程中傳送的包里不包含數據,三次握手完畢后,客戶端與服務器才正式開始傳送數據。理想狀態下,TCP連接一旦建立,在通信雙方中的任何一方主動關閉連接之前,TCP 連接都將被一直保持下去。斷開連接時服務器和客戶端均可以主動發起斷開TCP連接的請求,斷開過程需要經過“四次握手”(過程就不細寫了,就是服務器和客戶端交互,最終確定斷開)

以對話的形式來比喻這個過程:“客戶端:你在酒店嗎,在的話我就來了。服務端:我在酒店的,房間是308號,速來!客戶端:好的,我來了,你等我哦,么么噠”。然后客戶端才真正的去找服務端;

TCP和UDP的區別

一、TCP是面向鏈接的,雖然說網絡的不安全不穩定特性決定了多少次握手都不能保證連接的可靠性,但TCP的三次握手在最低限度上(實際上也很大程度上保證了)保證了連接的可靠性;而UDP不是面向連接的,UDP傳送數據前並不與對方建立連接,對接收到的數據也不發送確認信號,發送端不知道數據是否會正確接收,當然也不用重發,所以說UDP是無連接的、不可靠的一種數據傳輸協議。
二、也正由於1所說的特點,使得UDP的開銷更小數據傳輸速率更高,因為不必進行收發數據的確認,所以UDP的實時性更好。知道了TCP和UDP的區別,就不難理解為何采用TCP傳輸協議的MSN比采用UDP的QQ傳輸文件慢了,但並不能說QQ的通信是不安全的,因為程序員可以手動對UDP的數據收發進行驗證,比如發送方對每個數據包進行編號然后由接收方進行驗證啊什么的,即使是這樣,UDP因為在底層協議的封裝上沒有采用類似TCP的“三次握手”而實現了TCP所無法達到的傳輸效率。

HTTP

HTTP屬於TCP/IP應用層協議,應用層協議有很多,比如HTTP、FTP、TELNET等,也可以自己定義應用層協議。
WEB使用HTTP協議作應用層協議,以封裝HTTP文本信息,然后使用TCP/IP做傳輸層協議將它發到網絡上。
HTTP協議是建立在請求/響應模型上的。首先由客戶建立一條與服務器的TCP鏈接,並發送一個請求到服務器,請求中包含請求方法、URI、協議版本以及相關的MIME樣式的消息。服務器響應一個狀態行,包含消息的協議版本、一個成功和失敗碼以及相關的MIME式樣的消息。
HTTP/1.0為每一次HTTP的請求/響應建立一條新的TCP鏈接,因此一個包含HTML內容和圖片的頁面將需要建立多次的短期的TCP鏈接。一次TCP鏈接的建立將需要3次握手。但HTTP/1.1里面有所改變,可以在一次連接中處理多個請求,並且多個請求可以重疊進行,不需要等待一個請求結束后再發送下一個請求。
由於HTTP在每次請求結束后都會主動釋放連接,因此HTTP連接是一種“短連接”,要保持客戶端程序的在線狀態,需要不斷地向服務器發起連接請求。通常的做法是即時不需要獲得任何數據,客戶端也保持每隔一段固定的時間向服務器發送一次“保持連接”的請求,服務器在收到該請求后對客戶端進行回復,表明知道客戶端“在線”。若服務器長時間無法收到客戶端的請求,則認為客戶端“下線”,若客戶端長時間無法收到服務器的回復,則認為網絡已經斷開。
我們的網站和APP開發都是基於http協議來的,常用的get和post都是屬於http協議中的方法,在瀏覽器中輸入網址到打開網站就是一個http的旅程:http://blog.csdn.net/saiwaifeike/article/details/8789624

SOCKET

socket的英文原義是“孔”或“插座”。作為BSD UNIX的進程通信機制,取后一種意思。通常也稱作”套接字”,用於描述IP地址和端口,是一個通信鏈的句柄。
Socket是應用層與TCP/IP協議族通信的中間軟件抽象層,它是一組接口。
05172918-d2b39f21a08a4550b4e3c5bce482a220.jpg-36.6kB

通過Socket,我們才能使用TCP/IP協議。實際上,Socket跟TCP/IP協議沒有必然的聯系。Socket編程接口在設計的時候,就希望也能適應其他的網絡協議。所以說,Socket的出現只是使得程序員更方便地使用TCP/IP協議棧而已,是對TCP/IP協議的抽象,從而形成了我們知道的一些最基本的函數接口,比如create、listen、connect、accept、send、read和write等等。

05172951-a955fce4e5d04082828e717fe0e102f9.jpg-26kB

先從服務器端說起。服務器端先初始化Socket,然后與端口綁定(bind),對端口進行監聽(listen),調用accept阻塞,等待客戶端連接。在這時如果有個客戶端初始化一個Socket,然后連接服務器(connect),如果連接成功,這時客戶端與服務器端的連接就建立了。客戶端發送數據請求,服務器端接收請求並處理請求,然后把回應數據發送給客戶端,客戶端讀取數據,最后關閉連接,一次交互結束。

套接字(socket)是通信的基石,是支持TCP/IP協議的網絡通信的基本操作單元。它是網絡通信過程中端點的抽象表示,包含進行網絡通信必須的五種信息:連接使用的協議,本地主機的IP地址,本地進程的協議端口,遠地主機的IP地址,遠地進程的協議端口。

SOCKET連接與TCP連接

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

Socket連接與HTTP連接

由於通常情況下Socket連接就是TCP連接,因此Socket連接一旦建立,通信雙方即可開始相互發送數據內容,直到雙方連接斷開。但在實際網絡應用中,客戶端到服務器之間的通信往往需要穿越多個中間節點,例如路由器、網關、防火牆等,大部分防火牆默認會關閉長時間處於非活躍狀態的連接而導致 Socket 連接斷連,因此需要通過輪詢告訴網絡,該連接處於活躍狀態。
而HTTP連接使用的是“請求—響應”的方式,不僅在請求時需要先建立連接,而且需要客戶端向服務器發出請求后,服務器端才能回復數據。
很多情況下,需要服務器端主動向客戶端推送數據,保持客戶端與服務器數據的實時與同步。此時若雙方建立的是Socket連接,服務器就可以直接將數據傳送給客戶端;若雙方建立的是HTTP連接,則服務器需要等到客戶端發送一次請求后才能將數據傳回給客戶端,因此,客戶端定時向服務器端發送連接請求,不僅可以保持在線,同時也是在“詢問”服務器是否有新的數據,如果有就將數據傳給客戶端。


免責聲明!

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



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