---恢復內容開始---
OSI&TCP/IP模型
要弄清tcp
udp
socket
http
websocket
之間的關系,首先要知道經典的OSI
七層模型,與之對應的是TCP/IP
的四層模型。
OSI 模型包括了七層,而 TCP/IP 模型只有四層。雖然它們具有功能相當的網絡層、傳輸層和應用層,但其它層並不相同。
我們一般使用的網絡數據傳輸由下而上共有七層,分別為物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層、應用層,也被依次稱為 OSI 第一層、第二層、⋯⋯、 第七層。
TCP/IP 模型中沒有專門的表示層和會話層,它將與這兩層相關的表達、編碼和會話控制等功能包含到了應用層中去完成。另外,TCP/IP 模型還將 OSI 的數據鏈路層和物理層包括到了一個網絡訪問層中。
OSI 模型在網絡層支持無連接和面向連接的兩種服務,而在傳輸層僅支持面向連接的服 務。TCP/IP 模型在互聯網層則只支持無連接的一種服務,但在傳輸層支持面向連接和無連 接兩種服務。
TCP/IP 由於有較少的層次,因而顯得更簡單,並且作為從因特網(INTERNET)上發展起來的協議,已經成了網絡互連的事實標准。但是,目前還沒有實際網絡是建立在 OSI 七層模型基礎上的,OSI 僅僅作為理論的參考模型被廣泛使用。
從圖中可以看出,tcp
udp
工作在傳輸層,http
websocket
工作在應用層,而socket
不屬於七層模型中的任一層,可以理解為socket
工作在傳輸層與應用層中間的隱含層中。
幾者之間的關系
socket
本身不是一種協議,而是對傳輸層中的TCP/UDP
協議進行了封裝,對用戶隱藏了內部TCP/UDP
是如何傳輸的,只提供一套接口(API)給程序員調用,從而完成socket
編程。通過socket
接口,我們才能使用TCP/UDP
協議。
關於socket
與TCP/UDP
的關系,類似操作系統與接口之間的關系:TCP/IP
只是一個協議棧,就像操作系統的運行機制一樣,必須要具體實現,同時還要提供對外的操作接口。這個就像操作系統會提供標准的編程接口,比如win32編程接口一樣,TCP/IP
也要提供可供程序員做網絡開發所用的接口,這就是Socket
編程接口。
而我們通常瀏覽網頁用到的http
協議,是建立在TCP
協議之上的一種應用層協議。http
協議最顯著的特點是它是一種無狀態連接,客戶端發送的每次請求都需要服務器回送響應,在請求結束后,會主動釋放連接,是一種“短連接”。
幾者之間的關系概況
對於幾者之間的關系,可以概況為:
http
websocket
等應用層協議通過socket
接口從而調用tcp
udp
等傳輸層協議,從而達到網絡通信。
tcp
udp
=》 socket
=》 http
websocket
總結
綜上所述,我們編程不會直接去調用tcp
udp
,而是通過他們封裝好的接口socket
去通信。可以說,現在幾乎網絡上所有的通信,底層都是通過socket
完成的,一切皆Socket
。
補充。。。
tcp和udp的區別
TCP是面向連接的、傳輸可靠(保證數據正確性且保證數據順序)、用於傳輸大量數據(流模式)、速度慢,建立連接需要開銷較多(時間,系統資源)。
TCP是一種流模式的協議,是面向連接的,也就是說,在連接持續的過程中,Socket 中收到的數據都是由同一台主機發出的(劫持什么的不考慮),因此,知道保證數據是有序的到達就行了,至於每次讀取多少數據不關心。
TCP:面向連接、傳輸可靠(保證數據正確性,保證數據順序)、用於傳輸大量數據(流模式)、速度慢,建立連接需要開銷較多(時間,系統資源)。
UDP:面向非連接、傳輸不可靠、用於傳輸少量數據(數據包模式)、速度快。
關於TCP是一種流模式的協議,UDP是一種數據報模式的協議,這里要說明一下,TCP是面向連接的,也就是說,在連接持續的過程中,socket 中收到的數據都是由同一台主機發出的(劫持什么的不考慮),因此,知道保證數據是有序的到達就行了,至於每次讀取多少數據自己看着辦。
而UDP是無連接的協議,也就是說,只要知道接收端的IP和端口,且網絡是可達的,任何主機都可以向接收端發送數據。這時候,如果一次能讀取超過一個報文的數據,則會亂套。比如,主機A向發送了報文P1,主機B發送了報文P2,如果能夠讀取超過一個報文的數據,那么就會將P1和P2的數據合並在了一 起,這樣的數據是沒有意義的。
TCP三次握手
所謂三次握手(Three-way Handshake),是指建立一個TCP連接時,需要客戶端和服務器總共發送3個包。
三次握手的目的是連接服務器指定端口,建立TCP連接,並同步連接雙方的序列號和確認號並交換 TCP 窗口大小信息.在 Socket 編程中,客戶端執行connect()時。將觸發三次握手。
首先了解一下幾個標志,SYN(synchronous),同步標志,ACK (Acknowledgement),即確認標志,seq應該是Sequence Number,序列號的意思,另外還有四次握手的fin,應該是final,表示結束標志。
第一次握手:客戶端發送一個TCP的SYN標志位置1的包指明客戶打算連接的服務器的端口,以及初始序號X,保存在包頭的序列號(Sequence Number)字段里。
第二次握手:服務器發回確認包(ACK)應答。即SYN標志位和ACK標志位均為1同時,將確認序號(Acknowledgement Number)設置為客戶的序列號加1以,即X+1。
第三次握手:客戶端再次發送確認包(ACK) SYN標志位為0,ACK標志位為1。並且把服務器發來ACK的序號字段+1,放在確定字段中發送給對方.並且在數據段放寫序列號的+1。
常用的Socket類型有兩種:流式Socket(SOCK_STREAM)和數據報式Socket(SOCK_DGRAM)。流式是一種面向連接的 Socket,針對於面向連接的TCP服務應用;數據報式 Socket 是一種無連接的 Socket ,對應於無連接的UDP服務應用。
---恢復內容結束---