http中的socket是怎麽一回事
首先我們先看一下socket的定義:是在傳輸層和應用層中間的一個抽象層,是實現網絡通信的接口。
那麽什麽是傳輸層,什麽是應用層呢?網絡又是怎樣通信的呢?為了弄清這兩個問題,我們需要弄清一個概念TCP/IP四層模型和OSI七層模型。
OSI: Open System Interconnection的縮寫,意為開放式系統互聯。
TCP/IP(Transmission Control Protocol/Internet Protocol)即傳輸控制協議/網間協議,定義了主機如何連入因特網及數據如何在它們之間傳輸的標準。
OSI七層模型是TCP四層模型的延申拓展,我們就簡單了解一下這七層究竟是什麽定義,每層負責什麽。如果對這方面有興趣的極客,可以google一下具體的詳細資料。
1.物理層:機械,電子,一些定時接口的比特流傳輸。
2.數據鏈路層:實現物理尋址,將比特流實現按邏輯電路傳輸。
3.網絡層:控制子網的運行,路由的選擇,將信號發送到哪裏。
4.傳輸層:接受下一層會話層的數據,有必要時對數據進行分割,傳給網絡層傳輸。
5.會話層:不同機器上的客戶建立會話通信。
6.表示層:信息語法語義以及他們的關聯,比如壓縮,加密。
7.應用層:各種應用程序協議,比如HTTP FTP SMTP。
那麽通過以上簡單介紹,大家應該對數據傳輸的有了個簡單初步認識。我們都知道每臺接入互聯網的計算機都只有唯一的IP域名,我們使用的所有網絡程序,比如QQ,LOL等,要進行數據的交流,必須要與相同的域名進行連接,那麽這麽多進程怎麽才能區分這個網絡信息是給我自己的進程的呢?所以每個進程都要綁定端口號,通過IP+端口可以唯一確定信息交流的準確性。socket完成的就是這個任務,每個網絡程序調用自身的socket來監聽端口,完成信息交流傳輸,而且信息的交流還要依賴於TCP/IP協議。那麽我們再深入了解一下TCP/IP協議,有助於我們深入了解數據間的傳輸。
1.客戶端和服務端的交流,首先依賴於套接字(也是socket,英文翻譯是插座,比較形象,類似於電器和電站之間的連接形式),可以理解為一條管道,所以我們的計算機可能有很多管道同時在工作,管道的終點就是服務端創建的套接字,首先客戶端先創建一個套接字,會返回一個描述符,描述符的作用是客戶端判斷進行交流的網絡信息應該走哪條管道,但是這個描述符只有計算機自己知道,服務端並不知道,所以它不能代替端口,作用可以理解為建立好這個端口。
2.管道建立好之後,就是數據的傳輸,網絡中的數據,並不是源源不斷連續的,而是以一個個包的形式來傳遞,正式因為傳遞和處理速度之快,你感覺不到他的斷斷續續。遵循TCP形式的包的統一格式是這樣的
簡述一下作用:
報頭:一串0101……規則序列。服務端讀取時,知道是一個穩定的數據包,他的信息馬上要來了。
起始幀分界符:尾數為11。服務端以此作為數據包的起點。
FCS:它是一串 32 比特的序列,是通過一個公式對包中從頭到尾的所有內容進行計算而得出來的,受到幹擾時值會改變,一旦接收方計算的和發送方不一樣時就說明此包失真。
MAC頭部 :包含了發送方和接收方的MAC地址,MAC地址位於計算機網卡的ROM中,全世界獨一無二,跟指紋一樣。
IP頭部:包含了發送方和接收方的IP信息。
TCP頭部:除了發送方端口號,接收方端口號之外,還有如下重要字段:
序號,ACK號:這兩者作用是確保包沒有遺漏,如有,會自動補發。
控制位:1.ACK:(與上方ACK不同)告知數據已接收。
2.SYN:發送方和接收方互相確認的信號,表示已連接。
3.FYN:表示斷開連接。
有了以上概念,我們來看一下TCP三次握手:(seq表示序號)
第一次握手:客戶端SYN=1請求連接,序號=J(標記值,無實際意義,用來確定發送了多少信息),
第二次握手:服務端SYN=1請求連接,ACK=1(已經接收到客戶端的連接請求),ack=J+1(已收到你發的J單位信息,請確認你沒有漏發),seq=K(標記值無意義,用來確定收到了多少單位信息)
第三次握手:客戶端ACK=1(已經接收到服務端的連接請求),ACK=K+1(收到了你發的K大小單位信息,請確認你沒有漏發)
TCP四次揮手:
第一次揮手:客戶端FIN = M請求斷開
第二次揮手:服務端ack=M+1(已收到M單位大小信息,請確認你沒有漏發)
第二次揮手:服務端FIN = N請求斷開
第四次揮手:客戶端ACK=1(確認斷開) ack=N+1(已經收到你的N單位信息,請確認你沒有漏發)
總結:socket是網絡傳輸必要的標識符,它的作用是建立一個發送方接收方之間的管道,通過socket庫中的一些命令recv ,send等來完成收發信息的操作。是TCP傳輸協議的必要條件之一。相信你已經對文章開頭:socket是在傳輸層和應用層中間的一個抽象層,是實現網絡通信的接口。有了更加充分的認識吧。
http中的socket是怎麽一回事