概述
為了追求效率,我們寫代碼,不可能去關注底層知識,但往往到出了問題,或者性能調優。我們就會速手無策,仔細為自己查缺補漏,總結知識點。
網絡協議
互聯網的本質就是一系列的網絡協議,讓不同計算機能夠互相通信。這個協議就叫做OSI協議,根據不同的功能和分工,人為划分七層,當然你也可以划分五層,4層。實際上這些都是不存在的,只是為了讓人更好理解這些都是做什么用的。
物理層:網絡通信的數據傳輸介質,連接不同結點的電纜與設備構成。這些都是專業的說法,其實說白了就是雙絞線(網線),光纜這些東西,當然也包括無線電波。傳的是比特流,就是0101101。。。這些電信號。
數據鏈路層:物理地址尋址、數據的成幀、流量控制、數據的檢錯、重發,負責物理層面的互聯,通信傳輸。接收到比特流,還得人為的分組,讓比特流變得有意義的,這就是數據鏈路層干得活。它以太網協議將電信號分組,一組電信號稱之為一個數據包(幀)。然后控制幀在物理信道上傳輸包括糾錯,調節發送速率(防止高速的發送方把低速接收方淹沒,需要某種流量控制機制使發送方得知接收方當前還有多少空間)確保數據的可靠性,每一幀都含有報頭(head)和數據(data),報頭包含發送者(網卡地址),接收者(網卡地址),數據里就是數據包的具體內容。通過數據鏈路層,我們就可以建立局域網,並讓同一局域網絡的兩台計算機通信,數據鏈路層就像是一個社區郵差,他認識社區的每戶人家,社區中的每個人都可以將信(幀)交給他,讓他送給同一社區的另一戶人家。
網絡層:數據在節點之間創建邏輯鏈路,通過路由選擇算法,按一定的原則在多個節點的通信子網中選擇一條到達目的節點的最佳路徑過程,說白就是講數據傳輸到目標地址。現在我要找另一社區的老王,我寫了一封信,交給郵差,郵差並不認識另一個社區的人,就把信交給郵局處理,郵局根據上面的地址(IP)就能查到對應的地址描述,然后交給另一個社區的郵局。這封信可能要多個郵局的轉發,才能到達老王手里。
傳輸層:負責建立和斷開通信連接(數據流動的邏輯通路),記憶數據的分隔等數據傳輸相關的管理。當發送大量數據時,時間有點長,網絡可能會發生中斷。怎么保證大量數據的准確性,如果我發送的這個文件數據包可能有一萬個包,發送一個,就告訴一次,我收到了,丟了就再發一次,保證我都能准確完整接收到數據包,這就是TCP協議(TCP協議是會綁定IP和端口的協議)。與之對應的還有一個UDP協議,適用於發送少量數據,發出去就拉倒,不管你接沒接收,在多人游戲中,一般都是UDP協議,即使丟幾個包也只是卡一下,但如果網絡不好。。那游戲體驗能把電腦砸了。
會話層:不同機器上的用戶之間建立和管理會話(服務器驗證登錄,斷電續傳)。我向老王共享了一個文件夾,老王通過我的IP地址要訪問我的共享文件夾(建立會話),這時就會要求他輸入我的我腦上的賬號密碼,這是建立會話過程中的身份驗證,權限鑒定。老王從我共享的文件夾拷貝數據,這過程就花了幾分鍾,然后關閉了和我電腦的共享窗口,這時我又傳了一個文件上去。老王有過來連接,這時會發現不需要輸入密碼就能共享到我文件了,這是因為這條會話還沒斷開(根據應用層設置的時間維護),身份鑒定環節就省略了(保持會話),這時,電腦卡住了,我無奈重啟機器(斷開會話),老王重新連接我共享文件夾就要去身份鑒定了。
表示層:處理兩個通信系統中交換信息的數據格式變換,數據加密和解密,數據壓縮和恢復。我給老王寫的一封信,准備早上九點出發去找他,信里的內容是"我上午九點來",可是老王理解成了我九點到他家,雖然信沒看錯,但因為不同理解,產生了錯誤的結果。表示層就是專門負責這些有關網絡中計算機信息表達方式的問題,除了編碼外,還包括數組,浮點數,聲音等多種數據結構,以達到在網絡中傳輸的信息雙方的解釋都是一樣的,在計算機內部表示法和網絡的標准表示法之間進行轉換。
應用層:為應用程序提供服務並規定應用程序中通信相關的細節。
TCP協議三次握手建立連接
兩台計算機如何交流,就好比我們兩個人,使用同一種語言自然而然的就能表達我們的想法,因此計算機他們也需要定義共通的東西進行交流,TCP/IP為此而生,它不是一個協議而是一個協議家族的統稱,它們的成員包括TCP協議,HTTP協議,IP協議等等,本章講的是TCP協議建立連接和斷開連接的過程,客戶端程序想要訪問服務器某個應用程序就必須發送一個通信請求,經過三次握手建立連接四次揮手終止連接,下面看看具體過程。
位碼就是TCP標志位,有6種標示==>建立聯機(SYN),確認(ACK),傳送(PSH),結束(FIN),重置(RST),USG(緊急)
狀態===>CLOSED(初始化狀態),SYN_SENT(等待狀態),ESTABLISHED(連接建立狀態),LISTEN(監聽狀態),SYN_RCVD(表示接收到SYN報文),
三次握手
- 第一次握手:客戶端發送位碼SYN = 1,seq = 0的數據包到服務器,並進入SYN_SENT狀態等待確認,服務器由SYN = 1知道,有客戶端要建立聯機了。
- 第二次握手:服務器收到要確認聯機的信息,向客戶端發送SYN = 1,ACK = 1,ack number = 1(客戶端的seq + 1),seq = 0的數據包,服務器進入接收到報文狀態。
- 第三次握手:客戶端接收到服務器發送的數據包,檢查ack number是否是第一次發送的seq + 1,位碼ACK是否為1,驗證正確。再次向服務器發送一個ack number = 1(服務器發送過來的seq + 1),ack = 1,seq = 1的數據包。服務器收到后確認ack = 1,ack number= 1(服務器seq+1),建立連接成功。
抓包工具查看握手過程
第二次握手
第三次握手
TCP四次揮手斷開連接
可以發現,三次握手是客戶端先發起的,而四次揮手客戶端和服務器都可以率先發起揮手的動作。客戶端和服務器總共發送4個包確認連接斷開,也形象稱為四次揮手。
狀態=====>FIN_WAIT1(主動關閉連接,發送FIN報文,進入終止等待1),FIN_WAIT2(終止等待2),TIME_WAIT(等待狀態),CLOSE_WAIT(等待關閉狀態),LAST_ACK(最后等待狀態)
四次揮手
- 第一次揮手:數據傳輸完成后,客戶端A發出連接釋放報文並停止發送數據,報文的報頭中FIN=1,ACK = 1,seq number =73396,ack number = 13704(已經傳輸完成最后一個字節的序號+1),數據包發送給服務器端,並進入FIN_WAIT1狀態。
- 第二次揮手:服務器收到這個連接釋放報文,發出確認報文,ACK = 1,ack number = 73397,seq number =13704(序列號)給客戶端,進入半關閉狀態,並且通知高層應用進程,客戶端向服務器的方向就釋放了。這時,客戶端已經沒有數據發送了,但服務器如果向客戶端發送數據,客戶端依然接受,這個階段就是CLOSE_WAIT狀態的持續時間。
- 第三次揮手:客戶端收到服務器的確認報文后,進入了終止等待2狀態,繼續等待服務器發送連接釋放的報文。服務器把最后的數據發送完畢后,向客戶端發送連接釋放的報文,FIN = 1,ACK = 1,ack number = 73397,seq number=13704(序列號)發送完后,服務器進入最后確認的狀態,等待客戶端確認。
- 第四次揮手:客戶端收到服務器連接釋放報文后,必須向服務器發出確認報文,ACK = 1,ack number = 13705,seq number = 73397,然后客戶端進入時間等待狀態,此時的TCP連接未釋放,必須經過2MSL(最長報文壽命)的時間后,客戶端撤銷相應TCB(傳輸控制塊)后,進入CLOUSED狀態,這是因為如果網絡不可靠,確認報文可能發丟了,服務器端會不斷FIN給客戶端,再這2MSL時間內可以重新發一次確認報文,然后再次等待2MSL,如果這時間內沒在收到FIN報文,就推斷確認報文已經被服務器接收。服務器則只是收到客戶端發出的確認,立即進入CLOUSED狀態。
抓包工具查看揮手過程
第二次揮手
第三次揮手
第四次揮手
握手要三次?揮手要四次?
TCP協議的雙方是雙工的,也就是說通信雙方都可以向對方發送消息,也都可以獨立關閉自己自己一方的通信通道。在這順便說下半雙工,說白了就是不同時,A可以給B發消息,B也可以給A發消息,但A給B發的時候,B不能給A發。三次握手確認兩件事,知道雙方都准備好了,初始序列號進行確認協商。如果只有兩次,可能會造成死鎖。客戶端給服務器發送請求連接,服務器收到這個請求,並發送確認報文。發送完后,服務器按兩次握手的協定,認為連接已經建立,開始發送數據。但這時因為某種原因,服務器的確認報文傳丟了,客戶端懵逼了,不知道服務器是否收到自己的請求,建立什么序列號。客戶端就認為連接還未建立,忽略服務器傳來的任何數據,傻傻的等待服務器的確認報文,服務器發出的數據超時后,就重復發出同樣數據,死鎖就產生了。如果是四次握手哪?四次握手是可行的,但是這樣一來會造成資源的浪費,因為三次握手已經確認好所有的事情了,沒必要在浪費一次資源。
服務器收到客戶端的請求連接報文,立即就可以給應答建立聯機了。但關閉連接時,服務器收到這個關閉連接的報文,並不能立即停止,因為還有數據未發送完畢,只能回一個“我知道啦”的應答報文。只有數據全部發送完畢后,服務器才發送說FIN,“我數據傳完了”的報文等待確認,然后終止連接。所有需要四次揮手。
===============================================================
如發現錯誤,請及時留言,lz及時修改,避免誤導后來者。感謝!!!