tcp建立連接通過三次握手、釋放連接通過四次揮手
一、tcp建立連接通過三次握手
首先tcp的特性:tcp是面向連接的安全可靠的傳輸協議。
傳輸連接是用來傳送tcp報文的。tcp傳輸連接的建立和釋放是每一次面向連接的通信中必不可少的過程。因此,傳輸連接就有三個階段:連接建立、數據傳輸、連接釋放。傳輸連接的管理就是使傳輸連接的建立和釋放都能正常的進行。
在tcp連接建立的過程中要解決以下三個問題:
1.要使每一方都能夠確知對方的存在。
2.要允許雙方協商一些參數(如最大窗口值、是否使用窗口擴大選項和時間戳選項以及服務質量等)。
3.能夠對傳輸實體資源(如緩存大小、連接表中的項目等)進行分配。
tcp連接的建立采用客戶服務器模式。主動發起建立連接的應用進程叫做客戶端(client),而被動等待連接建立的應用進程叫服務器(server)。
tcp建立連接的過程如下圖所示:
解釋連接過程:
主機A是運行的tcp客戶端程序,主機B是運行的tcp服務器端程序。最初兩端的tcp進程都處於closed(關閉)狀態。注意是A主動打開連接,而B是被動打開連接。
B的tcp服務器進程先創建傳輸控制塊PCB(pcb存儲了每一個連接中的一些重要信息,如:tcp連接表,到發送和接收緩存的指針,到重傳隊列的指針,當前的發送和接收序號等),准備接收客戶A進程的連接請求。然后服務器進程就處於listen(收聽)狀態,等待客戶的連接請求。如果有請求則做出響應。
第一次握手
A的tcp客戶進程也是首先創建傳輸控制塊PCB,然后向服務器B發出連接請求報文段,這時首部中的同步為SYN=1,同時選擇一個初始序號seq=x。TCP規定,SYN報文段(即SYN=1的報文段)不能攜帶數據,但是要消耗掉一個序號。 這時tcp客戶進程進入SYN-SENT(同步已發送)狀態。
第二次握手
B收到連接請求報文段后,如同意建立連接,則向A發送確認。在確認報文段中應把SYN位和ACK位都置為1,確認號是ack=x+1,同時也為自己選擇一個初始序號seq=y。請注意這個SYN=1的報文段也不能攜帶數據,但同樣要消耗掉一個序號。這時tcp服務器進程進入SYN-RCVD(同步收到)狀態。
第三次握手
TCP客戶A進程收到B的確認后,還要向B發出確認。確認報文段的ACK置為1,確認號ack=y+1,而自己的序號seq=x+1。TCP的標准規定,ACK報文段可以攜帶數據。這時tcp連接已經建立,A進入established(已建立連接)狀態。當B收到A的確認后,也進入established(已建立連接)狀態。
至此連接的三次握手完成。
可以簡單的這樣理解:
客戶進程:請求連接,發送一個同步報文syn=1,序號seq=x
服務器進程:收到,允許連接,發送一個確認報文ack=x+1,seq=y
客戶進程:好的,發送一個確認報文ack=y+1,序號seq=x+1,這時客戶進程已建立連接
服務器進程:收到,這時服務器進程已建立連接。
完成連接,開始傳輸和接收數據。
為什么客戶A還要向服務器B發送一次確認?因為這主要是為了防止已失效的連接請求報文段突然又傳送到了B,從而產生錯誤。
二、tcp釋放連接的四次揮手過程
tcp釋放連接的過程比較復雜,需要經過四次握手也叫四次揮手過程。
數據傳輸結束后,通信的雙方都可釋放連接。現在客戶進程A和服務器進程B都處於established(連接)狀態,如下圖所示:
客戶A的應用進程先向其TCP發出連接釋放報文段,並停止在發送數據,主動關閉TCP連接。A把連接釋放報文段首部的終止控制位FIN置1,其序號為seq=u,它等於前面已傳送過的數據的最后一個字節的序號加1。這時A進入FIN-WAIT-1(終止等待1)狀態,等待服務器B的確認。注意:TCP規定,FIN報文段即使不攜帶數據也要消耗掉一個序號。
服務器B收到連接釋放報文段后即發出確認,確認號是ack=u+1,而這個報文段自己的序號是v即seq=v,等於B前面已傳送過的數據的最后一個字節的序號加1。然后B進入CLOSE-WAIT(關閉等待)狀態。TCP服務器進程這時應通知高層應用進程,因而從A到B這個方向的連接就釋放了,這時的TCP連接處於半關閉(half-close)狀態,即客戶進程A已經沒有數據要發送了,但是B若要發送數據,A仍然要接收。也就是說從B到A這個方向的連接並沒有關閉,這個狀態可能會持續一段時間。
客戶進程A收到來自B的確認后,就進入FIN-WAIT-2(終止等待2)狀態,等待B發出的連接釋放報文段。
若服務器B已經沒有要向A發送的數據,其應用進程就通知TCP釋放連接。這時B發出的連接釋放報文段必須使FIN=1。現假定B的序號seq=w(在半關閉狀態B可能又發送了一些數據)。B還必須重復上次已發送過的確認號ack=u+1。這時B就進入了LAST-ACK(最后確認)狀態,等待A的確認。
客戶進程A在收到B的連接釋放報文段后,必須對此發出確認。在確認報文段中把ACK置為1,確認號ack=w+1,而自己的序號seq=u+1(根據TCP標准,前面發送過的FIN報文段要消耗掉一個序號)。然后進入到TIME-WAIT(時間等待)狀態。注意:現在TCP連接還沒有釋放掉。必須經過時間等待計時器(TIME-WAIT timer)設置的時間2MSL后,客戶進程A才進入到CLOSED狀態。時間MSL叫做最長報文段壽命(Maximum Segment Lifetime)。當A撤銷相應的傳輸控制塊PCB后,就結束了這次的TCP連接。
為什么A在TIME-WAIT(時間等待)狀態必須等待2MSL的時間呢?有兩個原因。
原因之一:
為了保證客戶A進程發送的最后一個確認ACK報文段能夠達到B。這個確認ACK報文段有可能丟失,因而使處在LAST-ACK狀態的B收不到對已發送的FIN+ACK報文段的確認。B會超時重傳這個FIN+ACK報文段,而A就能在2MSL時間內收到這個重傳的FIN+ACK報文段。接着A重傳一次確認,重新啟動2MSL計時器。最后A和B都能正常進入到CLOSED狀態。如果A在TIME-WAIT狀態不等待一段時間,而是在發送完ACK報文段后立即釋放連接,那么就無法收到B超時重傳的FIN+ACK報文段,因而也不會在發送一次確認報文段。這樣B就無法按照正常步驟進入CLOSED狀態。
原因之二:
防止“已失效的連接請求報文段”出現在本連接中。A在發送完最后一個ACK報文段后,在經過時間2MSL,就可以使本連接持續的時間內所產生的所有報文段都從網絡中消失。這樣就可以使下一個新的連接中不會出現這種舊的連接請求報文段。
B只要收到了A發出的確認,就進入CLOSED狀態。同樣,B在撤銷相應的傳輸控制塊PCB后就結束了這次TCP連接。注意:B結束tcp連接的時間要比A早一些。
除了時間等待計時器外,TCP還設有一個保活計時器(keepalive timer)。設想有這樣的情況:客戶已主動與服務器建立了連接,但后來客戶端的主機突然出故障,顯然服務器以后就不能在收到客戶發來的數據。因此,應當有措施使服務器不在白白等待下去,否則將會浪費很多資源,這就要使用保活計時器。服務器每收到一次客戶的數據,就重新設置保活計時器,時間的設置通常是兩小時。若兩小時沒有收到客戶的數據,服務器就發送一個探測報文段,以后則每隔75分鍾發送一次,若一連發送10個探測報文段后客戶仍沒有響應,服務器就認為客戶端出現了故障,緊接着就關閉這個連接。
三、輸入URL地址按下enter經歷的過程
http是一種協議,計算機之間要彼此通信需要共同遵守協議規則。
1、用戶將url(例如www.baidu.com
)輸入至地址欄並回車后,首先瀏覽器會開啟一個線程來處理這個請求對URL判斷,如果是http協議就按照web方式處理;
2、然后瀏覽器會先搜索自身的DNS(Domain Name System,域名系統)緩存開始,一級一級往上搜索。意思是瀏覽器先在自身的DNS緩存(這涉及瀏覽器的緩存機制)中搜索是否有www.baidu.com
這個域名;如果瀏覽器從自身的DNS緩存中未搜索到(也有可能是因為緩存已經失效,即緩存的時間到期了。以chrome為例,你可以在地址欄輸入:chrome://net-internals/#dns來查詢自己曾經訪問過的網站),那么瀏覽器會搜索操作系統(本地計算機)自身的DNS緩存, 如果本地操作系統的DNS緩存還是沒找到,那么瀏覽器便會嘗試去讀取本地的HOST文件,這個HOST文件可以根據以下路徑找到,即C:\Windows\System32\drivers\etc
如下圖所示:
如果在HOST文件中還是沒有找到對應的配置項,那么便會從路由器(前提是你連接的是無線網絡,如果是寬帶連接,那么便會省略該步)緩存中搜索;計算機在通信時是通過IP地址辨識,而不是域名。域名只是為了方便用戶使用。域名查找順序:本地緩存->系統緩存->瀏覽器緩存->ISP緩存->根域名服務器->主域名服務器。只要在其中某一個地方找到ip地址就進入下一步操作。
DNS通過解析域名獲得ip地址,其流程如下:
1、在主機查詢DNS緩存,如果沒有就會給本地的DNS服務器發送查詢請求;
2、本地的DNS服務器向根域名服務器發送查詢請求,根域名服務器返回該域名的一級域名服務器;
3、本地服務器給返回的一級域名服務器發送查詢請求,然后依次類推直到查詢到該域名的IP地址為止。
3、如果上述過程,在任何一個緩存中找到,那么便直接在屏幕中顯示頁面內容,如果都沒找到的話,瀏覽器會發起一個DNS的系統調用,就是向本地主DNS服務器(一般來說是你寬帶運營商提供的服務器)發起一個域名解析請求。 寬帶運營商服務器會查看本身緩存,查找對應的條目,看有沒有過期或者有沒有這個條目;如果依舊沒查找到,運營商服務器會代替瀏覽器發起一個迭代DNS解析的請求。意思是運營商服務器會去找根域(就是運營商服務器的上級服務器)的DNS IP地址,如果根域服務器查不到www.baidu.com
的IP地址,但能查到com域的頂級域的IP地址,那么它便會將com域的頂級域的IP地址返回給運營商服務器,運營商服務器拿到后,會去詢問com域的DNS服務器是否查的到www.baidu.com
的IP地址,如果它查不到www.baidu.com
的IP地址,但查的到baidu.com這個域的IP地址,那么它會將baidu.com域的IP地址返回給運營商服務器,運營商服務器拿到后,會去詢問baidu.com域的DNS服務器(這個服務器一般域名注冊商提供的,如萬維網等)能否查到www.baidu.com
的IP地址。一般到這個域的時候,只要是經過網站注冊備案的,都能在這里查到(如果還沒查到,那么就要進行其他的處理了)。查到之后就把www.baidu.com
的IP地址返回給運營商DNS服務器,運營商DNS服務器拿到結果之后,會把這個結果返回給操作系統內核同時緩存(緩存的時間根據自己緩存時間長短來)起來,操作系統內核把結果返回給瀏覽器,瀏覽器最終就拿到了www.baidu.com
對應的IP地址。
4、通過DNS服務器解析后獲得了網址的IP地址,瀏覽器就向域名對應的IP地址服務器發起TCP連接,即發起HTTP“三次握手”,即這個tcp連接請求要經過層層的路由設備到達服務器端以后進入到網卡,然后進入到內核的TCP/IP協議棧,還有可能要經過防火牆的過濾,最終到達Web服務端,然后建立起TCP/IP的連接。
5、TCP/IP連接建立起來以后,瀏覽器就可以向服務器發送HTTP請求了;(例如GET請求一個根域里的一個域名地址,www.baidu.com
)
6、服務器端接受到這個請求后,根據路徑參數經過后端的一些處理后,把處理后的結果返回給瀏覽器;
7、瀏覽器拿到了完整的HTML頁面代碼或者其他的數據結果后,瀏覽器開始下載HTML文檔,同時設置緩存並關閉TCP連接。瀏覽器在解析和渲染這個頁面的時候,里面的js,CSS,圖片等靜態資源也是一個個HTTP請求,都需要經過上述的幾個主要步驟。
8、瀏覽器根據拿到的資源對頁面進行渲染,最終把一個完整的頁面呈現給用戶。(即瀏覽器對整個HTML結構進行解析,形成DOM樹,同時對相應的CSS文件進行解析,形成CSS樹,然后結合DOM樹和CSS樹形成一個繪制樹。得到繪制樹后,需要計算每個節點在頁面中的位置,這個過程稱為layout(布局)。layout的過程是在一個連續的二維平面上進行的,接下來需要將這些結果柵格化映射到屏幕的離散二維平面上,這一過程稱為paint(着色)。現代瀏覽器為提升性能,將頁面划分多個 layer,各自進行paint然后組合成一個頁面(composite layers))。
至此就完成了按下回車鍵時所經過的過程。
四、過程中用到的協議以及作用
1、域名解析用到DNS協議;
2、DNS服務器是基於UDP的,因此會用到UDP協議;
3、得到IP地址后,瀏覽器會與服務器建立HTTP連接,用到HTTP協議,如果用到了HTTPS協議還會對HTTP協議內容進行加密;
4、http協議生成GET請求報文,將該報文傳給TCP層處理,用到了TCP協議,TCP層若有需要會對HTTP數據報分片,分片依據路徑MTU和MSS;
5、TCP的數據報會發送給IP層,用到IP協議,IP層通過路由選擇,將數據發送給目的端口;
6、以太網協議需要知道目的IP地址的物理地址,需要用到ARP協議;
五、用到了網絡模型中的哪些層以及每一層的作用
互聯網中每個網絡設備間的通信都必須遵守TCP/IP協議標准。利用TCP/IP進行通信時,會通過分層順序與對端進行通信,發送數據會依次經過應用層,傳輸層,網絡層,數據鏈路層,物理層。而接受數據的順序剛好相反。如下圖所示:
各層數據包封裝報頭信息如下
1、DNS協議,HTTP協議,HTTPS協議屬於應用層
應用層是體系結構中的最高層。應用層確定進程之間通信的性質以滿足用戶的需要。這里所說的進程就是指正在運行的程序。應用層不僅需要提供應用進程需要的信息交換,而且還要作為相互作用的應用進程的用戶代理,來完成一些為進行語義上有意義的交換所必須的功能。
2、TCP、UDP協議屬於傳輸層
傳輸層的任務就是負責主機中兩個進程間的通信。因特網的傳輸層可使用兩種不同的協議;即面向連接的傳輸控制協議TCP和無連接的用戶數據報協議UDP。面向連接的服務能夠提供可靠的交付,兩種方式都各有其優點。
3、IP協議和ARP協議屬於網絡層
網絡層負責為分組交換網上的不同主機提供通信。在發送數據時,網絡層將傳輸層產生的報文段或用戶數據報封裝成分組或者包進行傳送。在TCP/IP體系中,分組也叫作IP數據報。網絡層的另一個任務就是選擇合適的路由,使源主機傳輸層傳下來的分組能夠交付到目的主機。
4、數據鏈路層
當發送數據時,數據鏈路層的任務是將在網絡層交下來的IP數據報組裝成幀,在兩個相鄰節點間的鏈路上傳送以幀為單位的數據。每一幀包括數據和必要的控制信息(如同步信息、地址信息、差錯控制以及流量控制等信息)。控制信息使接收端能夠知道一個幀從那個比特開始到那個比特結束。控制信息還使接收端能夠檢測到所收到的幀中有沒有差錯。
5、物理層
物理層的任務就是透明的傳送比特流。在物理層上所傳輸的數據單位是比特。傳遞信息所利用的一些物理媒介,如雙絞線、同軸電纜、光纜等,並不是在物理層之內而是在物理層的下面。因此也有人把物理媒體當做第0層。
六、總結
總的來說,當按下回車鍵時要經過DNS域名解析,將URL地址解析為ip地址,然后瀏覽器就向這個ip地址的服務器發起tcp連接,即tcp三次握手,連接成功后就服務器端進行處理,將處理結果返回給客戶端,客戶端將結果進行渲染,從而展示給用戶,完成結束之后釋放tcp連接,即四次揮手。
七、參考博文
(1) https://blog.csdn.net/Charles_Tian/article/details/80204526
(2) https://blog.csdn.net/qq_41943585/java/article/details/102495684
(3) https://blog.csdn.net/zgege/article/details/81587502
(4) https://blog.csdn.net/qq_38950316/article/details/81087809