IP TCP UDP HTTP
IP協議對應於網絡層,TCP、UDP協議對應於傳輸層,而HTTP協議對應於應用層。
IP協議是網絡層協議,是一種不可靠的、無鏈接的傳送機制稱爲Internet協議,解決的是主機之間如何通訊的問題
TCP、UDP是傳輸層協議,解決的是數據如何傳輸的問題
HTTP是應用層協議,解決的是數據如何包裝的問題
Socket自己並非協議,而是一個針對TCP或者IP的調用接口(API),解決的是區分不一樣的應用程序進程間的網絡通訊和鏈接,從而實現數據傳輸併發服務的問題
傳輸層的TCP是基於網絡層的IP協議的,而應用層的HTTP協議又是基於傳輸層的TCP協議的。而Socket自己不算是協議,就像上面所說,它只是提供了一個針對TCP協議或者IP協議的編程接口。
socket鏈接、TCP鏈接、UDP鏈接、HTTP鏈接?
建立Socket鏈接時,能夠指定使用的傳輸層協議,Socket能夠支持不一樣的傳輸層協議(TCP或UDP),當使用TCP/UDP協議進行鏈接時,該Socket鏈接就是一個TCP鏈接/UDP鏈接。
一般狀況下 Socket 鏈接就是TCP鏈接,所以 Socket 鏈接一旦創建,通訊雙方便可開始相互發送數據內容,直到雙方鏈接斷開。但在實際網絡應用中,客戶端到服務器之間的通訊每每須要穿越多箇中間節點,例如路由器、網關、防火牆等,大部分防火牆默認會關閉長時間處於非活躍狀態的鏈接而致使 Socket 鏈接斷連,所以須要經過輪流詢問告訴網絡,該鏈接處於活躍狀態。
而HTTP鏈接使用的是「請求—響應」的方式,不只在請求時須要先創建鏈接,並且須要客戶端向服務器發出請求後,服務器端才能回覆數據。
不少狀況下,須要服務器端主動向客戶端推送數據,保持客戶端與服務器數據的實時與同步,此時若雙方創建的是Socket鏈接,服務器就能夠直接將數據傳送給客戶端;若雙方創建的是HTTP鏈接,則服務器須要等到客戶端發送一次請求後才能將數據傳回給客戶端,所以,客戶端定時向服務器端發送鏈接請求,不只能夠保持在線,同時也是在「詢問」服務器是否有新的數據,若是有就將數據傳給客戶端。
TCP和UDP的區別?
一、TCP是面向鏈接,可靠、穩定的,缺點:慢,效率低,佔用系統資源高,容易被攻擊。雖說網絡的不安全不穩定特性決定了多少次握手都不能保證鏈接的可靠性,但TCP的三次握手在最低限度上(實際上也很大程度上)保證了鏈接的可靠性;
而UDP非面向鏈接,快,比TCP稍安全,缺點:不可靠、不穩定。UDP傳送數據前並不與對方創建鏈接,對接收到的數據也不發送確認信號,發送端不知道數據是否會正確接收,固然也不用重發,因此說UDP是無鏈接的、不可靠的一種數據傳輸協議。
二、也正因爲1所說的特色,使得UDP的開銷更小,數據傳輸速率更高,由於沒必要進行收發數據的確認,因此UDP的實時性更好。
知道了TCP和UDP的區別,就不難理解爲什麼採用TCP傳輸協議的MSN比採用UDP的QQ傳輸文件慢了,但並不能說QQ的通訊是不安全的,
由於程序員能夠手動對UDP的數據收發進行驗證,好比發送方對每一個數據包進行編號而後由接收方進行驗證啊什麼的,
即便是這樣,UDP由於在底層協議的封裝上沒有采用相似TCP的「三次握手」,而實現了TCP沒法達到的傳輸效率。
三、TCP應用場景 如:瀏覽器使用HTTP,QQ文件傳輸等
四、UDP應用場景 如:QQ語音、QQ視頻等
五、轉發
TCP三次握手和四次揮手?
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。
tcp四次揮手
TCP鏈接的拆除須要發送四個包,所以稱爲四次揮手(four-way handshake)。客戶端或服務器都可主動發起揮手動做,在socket編程中,任何一方執行close()操做便可產生揮手操做。
其實有個問題,爲何鏈接的時候是三次握手,關閉的時候倒是四次揮手?
由於當Server端收到Client端的SYN鏈接請求報文後,能夠直接發送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。可是關閉鏈接時,當Server端收到FIN報文時,極可能並不會當即關閉SOCKET,因此只能先回復一個ACK報文,告訴Client端,」 你發的FIN報文我收到了」。只有等到我Server端全部的報文都發送完了,我才能發送FIN報文,所以不能一塊兒發送。故須要四步握手。
tcp socket和udp socket的具體實現
經常使用的Socket類型有兩種:流式Socket(SOCK_STREAM)和數據報式Socket(SOCK_DGRAM)。流式是一種面向鏈接的 Socket,針對於面向鏈接的TCP服務應用;數據報式 Socket 是一種非面向鏈接的 Socket ,對應於非面向鏈接的UDP服務應用。