Http,Socket,Tcp,Udp,Ip原理區別

TCP,UDP,IP

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三次握手

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,表明確認碼)。

在這裏插入圖片描述

TCP四次揮手

第一次揮手: 客戶端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

http是應用層的協議,它實現了怎麼發數據和怎麼收數據,定義了收發的格式,同時定義了是短鏈接。當一次傳輸數據結束就斷開連接。

特色

  1. 只能客戶端主動發出請求,服務器被動響應。服務器沒辦法主動給客戶端發數據。
  2. http1.0是個短鏈接,當一次連接數據傳送完畢後,就會斷開連接。
  3. http1.1前端和後臺能夠配置成長連接,默認60s,當一次連接成功,發送完一次數據後,60s內若是前端再一次請求數據那麼將複用上一次tcp通道,而且倒計時從新刷新。當60s結束後客戶端沒進行請求數據,這時候tcp就會斷開連接。這個倒計時時間是支持設置的。

請求

  1. 請求行
    說明了是get方法,仍是post方法等等,說明了協議版本http 1.1等,get方法會有URL。這裏get方法參數每每要求ASCII碼,也就是不能有中文,而且還有長度限制,post沒有。其實這裏每每是瀏覽器等做出的限制,而不是post的請求行中就不能放參數。

  2. 請求頭
    包含了User-Agent:瀏覽器類型,請求數據的來源。 Accept:能夠接收的數據類型,這裏要和服務器的Content-Type匹配。服務器發送的類型和客戶端能夠接收的類型要一致。 Accept-Encoding,Accept-Language等等。 Content-Type:發送內容的類型,每每post方法纔會有,由於post方法的參數是在請求體裏。 請求頭部也能夠本身添加新字段,好比常見的添加token,userId等。

  3. 空行

  4. 請求體
    通常只有post方法請求體中才會有數據。

響應

  1. 狀態行
    包含協議以及協議的版本,狀態碼。
    1.xxx: 剛開始接收到數據。
    2.xxx: 已經接收到數據,能夠解析數據。
    3.xxx: 重定向。
    4.xxx: 客戶端的錯誤。
    5.xxx: 服務端錯誤。
    這些都是http的狀態碼,其實還要後臺本身定義的錯誤碼,和這裏的狀態碼不同。

  2. 響應報頭
    Date: 接收到請求的日期時間。
    Content-Type: 響應的數據類型。
    Content-Length: 響應數據的內容長度。

  3. 空行

  4. 響應報文
    常見的是返回了html網頁內容,或者返回了json數據。

Http請求過程

  1. 首先客戶端發送http請求鏈接服務器,tcp協議三次握手創建鏈接。
  2. 客戶端開始發送請求數據,服務器例如java會在線程池裏拿出來一個線程來接收此次http的請求。
  3. 服務器拿到請求後進行資源查找,以後會返回數據給客戶端,這個過程就是相應。
  4. 客戶端拿到服務器返回的數據後保存處理,進行四次揮手斷開http連接。 這時候java的那個處理請求的線程將會放回java線程池,等待下次請求。

socket

socket是套接字,是對TCP/IP的封裝。它對數據傳輸的二者提供了一個全雙工的管道。
它和http同樣,傳輸數據前要經歷三次握手連接也要經歷四次揮手斷開連接。和http協議的區別在於,socket是一個長連接。http是短鏈接。socket雖然是長連接,可是因爲網絡等緣由也有可能會斷開連接。因此每每會提供一個心跳包,每隔一段時間向服務器發送一個規定好的心跳,若是某一個時間發送沒有收到心跳,那表明已經斷開連接了。

HTTP長鏈接和Socket區別

  1. http1.1長鏈接是爲了屢次請求服務器能夠複用tcp通道,這樣就省去了銷燬tcp和再次建立tcp通道的時間。
  2. socket目的是爲了客戶端和服務器之間造成管道,保持二者均可以相互通信。
  3. http1.1這種長鏈接在必定程度上提升了請求速度,可是又有別於socket。設計初衷是不同的。
相關文章
相關標籤/搜索