TCP是傳輸層的協議,UDP也是傳輸層的協議,IP是網絡層的協議。html
IP:是用來找到目標計算機。如A向B發送數據,那麼要找到對方B的計算機,找到後就肯定了網絡間的通道,A - B。也就是說IP是來肯定網絡間的路徑的。前端
TCP:是用來實現通訊的,它是一個全雙工的協議(後面會說明)。在IP實現了網絡間路徑後,TCP提供了這個路徑的全雙工通訊的能力。這個連接的創建要經歷三次握手,斷開連接要四次揮手(後面會說明)。java
UDP: 是和TCP類似的,也是提供了通訊能力。不過和TCP有區別。TCP是點對點的通信,UDP支持一對多,多對一,一對一等。UDP不須要連接,直接發數據,相對來講速度更快,可是不保證數據必定會到達,適合廣播。json
全雙工: 表示A能夠給B發送數據的同時,B也能夠給A發送數據。瀏覽器
半雙工:表示A給B發送數據的時候,B不能給A發送數據。當B給A發送數據的時候,A不能給B發送數據。服務器
單工: 表示要麼是A只能夠給B發送數據,或者B只能給A發送數據。數據是單向發送的不是雙向的。網絡
TCP創建鏈接須要三次握手,斷開連接須要四次揮手。如下例子中A爲客戶端,B爲服務器,來講明三次握手與四次揮手過程。socket
注意:TCP是一個全雙工的協議,因此下邊創建鏈接時候SYN=1發送兩遍,A要向B創建鏈接發送SYN=1。B也要向A創建鏈接也要發送SYN=1。同理四次揮手時候也要發送兩遍FIN=1。tcp
第一次握手: 客戶端A發送SYN=1(表明要向B創建鏈接),seq=a(A發送數據的一個序列號)到服務器。
第二次握手:服務器B收到數據後,向客戶端A發送ACK=1(表明應答收到),SYN=1(表明要向A創建鏈接),seq=b(B發送數據的一個序列號),ack=a+1(等於收到數據時候的seq+1,表明確認碼)。post
第三次握手:客戶端A收到數據後先看下ack是否是上次發的seq+1=a+1。確保沒問題後會向服務器B發送ACK=1(表明應答收到),seq=a+1(A發送數據的下一個序列號),ack=b+1(等於收到數據時候的seq+1,表明確認碼)。
第一次揮手: 客戶端A向服務器B發送FIN=1(A請求斷開服務器鏈接),seq=a(本次數據序列號)。
第二次揮手:服務器B向客戶端A發送ACK=1(應答,收到數據)seq=a+1(表明還有數據沒發送)。
第三次揮手:服務器向客戶端A發送FIN=1(服務器要斷開A的連接),seq=b(本次數據的序列號),ack=a+1(確認碼,表明沒有數據要發送了)。
第四次揮手:客戶端A驗證收到的ack是否是等於a+1,確保B沒有數據在發送了。而後發送給服務器B,ACK(應答),seq=a+1(本次數據序列號)。
http是應用層的協議,它實現了怎麼發數據和怎麼收數據,定義了收發的格式,同時定義了是短鏈接。當一次傳輸數據結束就斷開連接。
請求行
說明了是get方法,仍是post方法等等,說明了協議版本http 1.1等,get方法會有URL。這裏get方法參數每每要求ASCII碼,也就是不能有中文,而且還有長度限制,post沒有。其實這裏每每是瀏覽器等做出的限制,而不是post的請求行中就不能放參數。
請求頭
包含了User-Agent:瀏覽器類型,請求數據的來源。 Accept:能夠接收的數據類型,這裏要和服務器的Content-Type匹配。服務器發送的類型和客戶端能夠接收的類型要一致。 Accept-Encoding,Accept-Language等等。 Content-Type:發送內容的類型,每每post方法纔會有,由於post方法的參數是在請求體裏。 請求頭部也能夠本身添加新字段,好比常見的添加token,userId等。
空行
請求體
通常只有post方法請求體中才會有數據。
狀態行
包含協議以及協議的版本,狀態碼。
1.xxx: 剛開始接收到數據。
2.xxx: 已經接收到數據,能夠解析數據。
3.xxx: 重定向。
4.xxx: 客戶端的錯誤。
5.xxx: 服務端錯誤。
這些都是http的狀態碼,其實還要後臺本身定義的錯誤碼,和這裏的狀態碼不同。
響應報頭
Date: 接收到請求的日期時間。
Content-Type: 響應的數據類型。
Content-Length: 響應數據的內容長度。
空行
響應報文
常見的是返回了html網頁內容,或者返回了json數據。
socket是套接字,是對TCP/IP的封裝。它對數據傳輸的二者提供了一個全雙工的管道。
它和http同樣,傳輸數據前要經歷三次握手連接也要經歷四次揮手斷開連接。和http協議的區別在於,socket是一個長連接。http是短鏈接。socket雖然是長連接,可是因爲網絡等緣由也有可能會斷開連接。因此每每會提供一個心跳包,每隔一段時間向服務器發送一個規定好的心跳,若是某一個時間發送沒有收到心跳,那表明已經斷開連接了。