1. 程式人生 > >三次握手,四次揮手

三次握手,四次揮手

首先我們知道HTTP協議通常承載於TCP協議之上,HTTPS承載於TLS或SSL協議層之上
這裡寫圖片描述

通過上面這張圖我們能夠知道。
在Http工作之前,Web瀏覽器通過網路和Web伺服器建立鏈連線,該連線是通過Tcp來完成的,該協議和Ip共同組成了Internet,即著名的Tcp/Ip協議族,Http是比Tcp更高的應用層協議,一般Tcp介面的埠好是80。
TCP 被稱為“面向連線”的傳輸層協議。關於它的具體細節,就不展開了。你只需知道:傳輸層主要有兩個協議,分別是 TCP 和 UDP。TCP 比 UDP 更可靠。你可以把 TCP 協議想象成某個水管,傳送端這頭進水,接收端那頭就出水。並且 TCP 協議能夠確保,先發送的資料先到達(與之相反,UDP 不保證這點)

一、TCP簡介
TCP(Transmission Control Protocol) 傳輸控制協議
TCP是主機對主機層的傳輸控制協議,提供可靠的連線服務,採用三次握手確認建立一個連線:
位碼即tcp標誌位,有6種標示:SYN(建立聯機) ACK(確認) PSH(傳送) FIN(結束) RST(重置) URG(緊急)
Sequence number(順序號碼) Acknowledge number(確認號碼)

二、TCP三次握手
這裡寫圖片描述

第一次握手:客戶端傳送了一個帶有SYN(建立連線)的Tcp報文到伺服器,這個三次握手中的開始。表示客戶端想要和服務端建立連線。

第二次握手:服務端接收到客戶端的請求,返回客戶端報文,這個報文帶有SYN(建立連線)和ACK(確認)標誌,詢問客戶端是否準備好。

第三次握手:.客戶端再次響應服務端一個ACK(確認),表示我已經準備好。

思考:為什麼要三次握手呢,有人說兩次握手就好了
舉一個例子:已失效的連線請求報文段,
client傳送了第一個連線的請求報文,但是由於網路不好,這個請求沒有立即到達服務端,而是在某個網路節點中滯留了,直到某個時間才到達server,本來這已經是一個失效的報文,但是server端接收到這個請求報文後,還是會想client發出確認的報文,表示同意連線。假如不採用三次握手,那麼只要server發出確認,新的建立就連線了,但其實這個請求是失效的請求,client是不會理睬server的確認資訊,也不會向服務端傳送確認的請求,但是server認為新的連線已經建立起來了,並一直等待client發來資料,這樣,server的很多資源就沒白白浪費掉了,採用三次握手就是為了防止這種情況的發生,server會因為收不到確認的報文,就知道client並沒有建立連線。這就是三次握手的作用。

三、TCP的四次揮手
這裡寫圖片描述

第一次握手:TCP傳送一個FIN(結束),用來關閉客戶到服務端的連線。

第二次握手:服務端收到這個FIN,他發回一個ACK(確認),確認收到序號為收到序號+1,和SYN一樣,一個FIN將佔用一個序號。

第三次握手:服務端傳送一個FIN(結束)到客戶端,服務端關閉客戶端的連線。

第四次握手:客戶端傳送ACK(確認)報文確認,並將確認的序號+1,這樣關閉完成。

思考:那麼為什麼是4次揮手呢?
可能有人會有疑問,tcp我握手的時候為何ACK(確認)和SYN(建立連線)是一起傳送。揮手的時候為什麼是分開的時候傳送呢.
因為當Server端收到Client端的SYN連線請求報文後,可以直接傳送SYN+ACK報文。其中ACK報文是用來應答的,SYN報文是用來同步的。但是關閉連線時,當Server端收到FIN報文時,很可能並不會立即關閉 SOCKET,所以只能先回復一個ACK報文,告訴Client端,”你發的FIN報文我收到了”。只有等到我Server端所有的報文都發送完了,我才能傳送FIN報文,因此不能一起傳送。故需要四步握手。