1. 程式人生 > >01-http簡介-四層 七層 三次握手

01-http簡介-四層 七層 三次握手

blog tcp協議 int uda seq 來看 域名 內容 ast

HTTP簡介、請求方法與響應狀態碼

接下來想系統的回顧一下TCP/IP協議族的相關東西,當然這些東西大部分是在大學的時候學過的,但是那句話,基礎的東西還是要不時的回顧回顧的。接下來的幾篇博客都是關於TCP/IP協議族的,本篇博客就先簡單的聊一下TCP/IP協議族,然後聊一下HTTP協議,然後再聊一下SSL上的HTTP(也就是HTTPS)了。當然TCP/IP協議族是個老生常談的話題,網絡上關於該內容的文章一抓一大把呢,但是鑒於其重要性,還是有必要系統的總結一下的。

1. TCP/IP協議族簡述

在聊HTTP與HTTPS之前呢,我們先簡單的聊一下TCP/IP協議族。TCP/IP不單單指的就是TCP和IP這兩個協議,而是指的與其相關的各種協議。比如HTTP, FTP, DNS, TCP, UDP, IP, SNMP等等都屬於TCP/IP協議族的範疇。

1.1. TCP/IP協議的分層

TCP/IP協議族是分層管理的,在OSI標準中可以分為7層(應用層、表示層、會話層、傳輸層、網絡層、數據鏈路層、物理層,可記為:應表會傳網數物),本篇博客我們采用的是TCP/IP協議族中的四層(應用層、傳輸層、網絡層、鏈路層)。下方是對四層中每層的簡單介紹:

  • 應用層:該層是面向用戶的一層,也就是說用戶可以直接操作該層,該層決定了向用戶提供應用服務時的通信活動。本篇博客要聊的HTTP(HyperText Transfer Protocol:超文本傳輸協議)就位於該層。我們經常使用的FTP(File Transfer Protocol: 文件傳輸協議)和DNS (Domain Name System: 域名系統)都位於該層。FTP簡單的說就是用來文件傳輸的。而DNS則負責域名解析的,通過DNS可以將域名(比如:www.cnblogs.com)與IP地址(201.33.xx.09)進行相互的轉換。在7層中,又將該層分為:應用層、表示層和會話層。
  • 傳輸層:應用層的下方是傳輸層,應用層會將數據交付給傳輸層進行傳輸。TCP(Transmission Control Prococol:傳輸控制協議)和UDP(User Data Protocol: 用戶數據協議)位於該層,當然見名知意,該層是用來提供處於網絡連接中的兩臺計算機直接的數據傳輸的。TCP建立連接是需要三次握手來確認連接情況,而UDP則沒有三次握手的過程。稍後會介紹。
  • 網絡層:傳輸層的下方是網絡層,網絡層用來處理在網絡上流動的數據包,IP(Internet Protocol: 網際協議)就位於這層。該層負責在眾多網絡線路中選擇一條傳輸線路。當然這個選擇傳輸線路的過程需要IP地址和MAC地址的支持。
  • 鏈路層:在7層協議中,將鏈路層分為數據鏈路層和物理層。該部分主要是用來處理網絡的硬件部分,我們常說的NIC(Net Work Card),也就是網卡就位於這一部分,當然光纖也是鏈路層的一部分。

  

在TCP/IP協議族中的每次直接在傳輸數據時的協作關系,以及交互過程,還是引用《圖解HTTP》一書上的一張圖來解釋吧。下圖就是這四層協議在數據傳輸過程中的工作方式。下面這張圖還是相當直觀的。在發送端是應用層-->鏈路層這個方向的封包過程,每經過一層都會增加該層的頭部。而接收端則是從鏈路層-->應用層解包的過程,每經過一層則會去掉相應的首部。

  

1.2. TCP協議的三次握手

在聊HTTP協議之前,我們先簡單的聊一下TCP三次握手的過程,在後面的博客中我們將會對TCP和IP協議進行詳述,本篇博客就先簡單的聊一下做HTTP協議的基礎。

TCP協議位於傳輸層,為了確保傳輸的可靠性,TCP協議在建立連接時需要三次握手(Three-way handshaking)。下方這個簡圖就是TCP協議建立連接時三次握手的過程。

  • 第一次握手:發送端發送一個帶SYN(Synchronize [?s??kr?na?z]使同步)標誌的數據包給接收端,用於詢問接收端是否可以接收。如果可以,就進行第二次握手。
  • 第二次握手:接收端回傳給發送端一個帶有SYN/ACK(Acknowledgement [?k?n?l?d?m?nt]確認)的數據包,給發送端說,我收到你給我發送的SYN標誌了,我再給你傳一個ACK標誌,你能收到嗎?如果發送端收到了SYN/ACK這個數據包,就可以確認接收端收到了之前發送的SYN, 然後進行第三次握手。
  • 第三次握手:發送端會給接收端發送一個帶有ACK標誌的數據包,告訴接收端我可以收到你給我發送的SYN/ACK標誌。接收端如果收到了這個來自客戶端的ACK標誌,就意味著三次握手完成,連接建立,就可以開始傳輸數據了。

1.3. TCP協議的四次揮手

TCP三次握手是TCP連接建立的過程,TCP四次揮手則是TCP連接釋放的過程。下面是TCP四次揮手的流程圖:

當客戶端沒有數據再需要發送給服務端時,就需要釋放客戶端的連接,這整個過程為:

  1. 客戶端發送一個報文給服務端(沒有數據),其中FIN設置為1,Sequence Number置為u,客戶端進入FIN_WAIT_1狀態
  2. 服務端收到來自客戶端的請求,發送一個ACK給客戶端,Acknowledge置為u+1,同時發送Sequence Number為v,服務端進入CLOSE_WAIT狀態
  3. 服務端發送一個FIN給客戶端,ACK置為1,Sequence置為w,Acknowledge置為u+1,用來關閉服務端到客戶端的數據傳送,服務端進入LAST_ACK狀態
  4. 客戶端收到FIN後,進入TIME_WAIT狀態,接著發送一個ACK給服務端,Acknowledge置為w+1,Sequence Number置為u+1,最後客戶端和服務端都進入CLOSED狀態

這裏的一個問題是,為什麽TCP連接的建立只需要三次握手而TCP連接的釋放需要四次握手呢:

因為服務端在LISTEN狀態下,收到建立請求的SYN報文後,把ACK和SYN放在一個報文裏發送給客戶端。而連接關閉時,當收到對方的FIN報文時,僅僅表示對方沒有需要發送的數據了,但是還能接收數據,己方未必數據已經全部發送給對方了,所以己方可以立即關閉,也可以將應該發送的數據全部發送完畢後再發送FIN報文給客戶端來表示同意現在關閉連接。

從這個角度而言,服務端的ACK和FIN一般都會分開發送。

2. HTTP報文結構

HTTP協議全稱是HyperText Transfer Protocol,即超文本傳輸協議,用戶客戶端和服務器之前的通信,目前普遍使用版本為HTTP/1.1。協議本質上就是規範,我們之前提到過的“面向接口”編程,其實就是“面向協議”編程。先定義好類的協議,也就是接口,相關類都遵循該協議,這樣一來我們就規範了這些類的調用方式。而HTTP協議是規範客戶端和服務器之間通信的協議。也就是說所有的客戶端或者服務器都遵循了HTTP這個通信協議,那麽也就是意味著他們對外傳輸數據的接口是一直的,就可以在其中間連接上管道,這樣一來就可以進行傳輸了。

這些協議就是接口,有著共同的通信協議,多個端就可以相互通信。采用相同的協議,就是便於個個設備之間進行溝通交流。HTTP協議的作用如下所示。

    

HTTP協議的作用是用來規範通信內容的,在HTTP協議中可以分為請求報文和響應報文。顧名思義,請求報文是請求方發出的信息,而響應報文是響應端收到請求後響應的內容。接下來我們就來看看請求報文和響應報文的整體結構。

1.1. 請求報文(Request Message)結構

下方是請求報文的整體結構。請求報文主要分為兩大部分,一個是請求頭(Request Headers)另一個是請求體(Request Body)。這兩者之間由空行分割。在請求頭中又分為請求行(Request Line),請求頭部字段,通用頭部字段和實體頭部字段等,這個稍後會詳細介紹。下方就是請求報文的結構。

  

下方這個截圖就是請求博客園某個頁面時的Request Headers。在請求行中的第一個“GET”是當前請求的方法,稍後會做介紹。中間的就是請求資源的路徑,最後一個HTTP/1.1就是當前使用請求協議及其版本。下方這些就是請求頭了,稍後會對常用的請求頭進行解說。而請求體就是你往服務端傳輸的數據,比如form表單神馬的。

  

1.2. 響應報文(Response Message)結構

聊完請求報文,接下來我們來聊聊響應報文,響應報文的結構與請求報文的結構類似,也分為報文頭和報文體。下方就是響應報文的結構圖。響應頭(Response Headers)分為狀態行(State Line),響應頭部字段,通用頭部字段、實體頭部字段等。響應頭與響應體中間也是有空行進行分割的。

  

下方截圖就是上述請求報文發出後的響應頭,響應體就是對於的HTML等前端資源了。在響應頭中,第一行就是狀態行,“HTTP/1.1”表示使用的HTTP協議的1.1版本,狀態200表示響應成功,"OK"則是狀態原因短語。常用狀態,稍後會詳細介紹。

  

01-http簡介-四層 七層 三次握手