1. 程式人生 > >HTTP的三次握手

HTTP的三次握手

 

在講三次握手之前,希望大家理解一個概念,什麼概念呢? 就是在我們的客戶端和我們的伺服器之間進行http請求,傳送和返回的過程當中,我們是需要去建立一個tcp connection的東西,因為 http是不存在連線這麼一個概念的,它只有一個請求和響應這麼一個概念,那麼請求和響應都是一個數據包,它們之間是需要一個傳輸的通道的,那麼這個傳輸的通道在哪裡呢?就在tcp裡面,去建立了這麼一個從客戶端發起,服務端接收的這麼一個連線,這個連線呢,是可以一直保持在那邊,然後我們的http請求是在連線這個基礎上面去傳送的,那這裡就有一個概念,就是在tcp連線上面,是可以傳送多個http請求的,在不同的版本里面,這個模式是不一樣的

 

在http/1.0裡面,這個連線是在http請求建立的時候,就去建立這個tcp連線,然後連線建立完之後,然後請求傳送過去,然後伺服器響應之後呢,這個tcp連線它就關閉了 然後在http/1.1裡面,這個連線我們可以通過某種方式去申明這個連線可以一直保持在那邊,然後保持在那邊是什麼意思呢?就是我們這個請求,第一個請求傳送之後,這個連線沒有關,然後第二個請求進來的時候,它還可以在這個連線上面進行傳送,這有什麼好處呢?就是因為tcp連線,我們這節課要講的,在建立過程當中,是有三次握手這麼一個消耗的,三次握手就是代表著有三次網路傳輸,客戶端傳送一次,然後服務端返回一次,然後客戶端再發送一次,這個時候才建立了tcp連線,然後才能去傳送http請求,所以如果把連線一直保持在那邊,那麼第二個http請求就沒有三次握手的開銷 在http2裡面還有一個好處就是,http2裡面tcp連線上面的http請求是可以併發的,這就導致什麼呢,就是說我們同一個使用者對同一個伺服器發起一個網頁請求的時候,它只需要一個tcp連線,那麼具體什麼含義呢,我們後期課程會詳細的講,現在要清楚tcp連線和http請求之間的關係


 

 

在http的三次握手當中,首先客戶端發起一個我要傳送一個數據包的請求,傳送到服務端,這裡面呢會有一個標誌SYN=1,Seq=X,syn是一個標識,就是我這是一個建立請求的資料包,然後seq等於一個數字,一般來說都是1,然後服務端接收之後,知道了我有一個客戶要跟我建立連線了,那建立這個連線之後呢,服務端就會開啟一個tcp,socket的一個埠,然後這個埠開啟了之後,它返回給客戶端,它返回的資料裡面也是一個SYN=1,ACK=X+1,Seq=Y,然後它會返回一個ACK,ACK就等於第一次傳送過來的Seq,就是X,然後+1,然後它再發送一個Seq,這個是伺服器端的一個Seq,然後客戶端拿到之後,服務端允許我們開啟建立這個連線,然後客戶端再去傳送它的ACK=Y+1,Seq=Z,它再發送一個Seq,等於一個新的數字Z,這就是tcp去建立的一個過程

 

為什麼要進行這樣一個三次握手呢,這是為了防止服務端這邊開啟一些無用的連線,因為我們知道網路傳輸是有延遲的,因為我們之間可能隔著非常遠的距離,要通過一個光纖,然後各種中間的代理伺服器來進行一個傳輸,在傳輸的過程當中,比如客戶端傳送一個SYN=1,建立連線的請求,如果服務端就直接建立了這個連線,然後返回內容給客戶端,但是這個資料包因為網路傳輸的原因,它丟了,丟了以後,客戶端就一直沒有接收到伺服器返回到這個東西,然後客戶端可能設定了一個超時時間,關閉了,關閉了之後才發現一個新的建立連線的請求,這個時候服務端是不知道的,如果沒有第三次握手,服務端根本不知道客戶端有沒有接收到我返回到資訊,並且沒有說要去建立還是關閉這個請求,服務端就開在那邊,等著客戶端傳送實際到請求資料,那麼這個時候服務端這個開銷就浪費了,因為它不知道這個連線已經建立失敗了,可能客戶端已經建立新到連線去了,所以呢,我們需要三次握手,讓客戶端和服務端察覺到我們因為網路原因端一些問題導致資料沒有查到,這個埠,這個連線已經關閉了,我們需要一直等在那邊的情況, 三次握手主要是規避網路傳輸當中延遲而導致伺服器開銷的一些問題

 

接下來看下三次握手資料包的相信內容,Wireshark抓包工具

13789是本機的一個埠,80是伺服器端的一個埠,因為有三次握手,客戶端和伺服器之間有三個來回,只要找到同一個埠的來回,就可以找到這三次握手

如圖,這三次是完整的三次握手的過程,第一次握手可以看到傳送了一個SYN標示位,為了簡單演示,說SYN=1,其實,就是SYN佔據了第一個標識位,用圖片只是為了更形象的展示這三個過程,返回的時候是一個SYN,再加上一個ACK。最後客戶端再發送一個ACK給服務端,作為第一個標識位,這樣一個過程就完成了一個三次握手