背景
早期的網路是基於OSI(開放式系統網際網路,一般叫OSI參考模型)模型,該模型是由ISO國際標準組織制定的,包含了七層(應用層、表示層、會話層、傳輸層、網路層、資料鏈路層、物理層),即複雜又不實用,以至於招到了許多批評,所以,當時就有一批技術人員為了方便開發,提高效率,自己開發了一套新的協議,TCP/IP協議,在簡化的計算機網路OSI模型中,她完成了第四層傳輸層所指定的功能
概念
TCP/IP協議(Transmission Control Protocol),翻譯過來是傳輸控制協議,是一種面向連線的、可靠的、基於位元組流的傳輸層通訊協議。包含有四層(應用層、傳輸層、網際層、網路介面層),不過從實質來講,TCP/IP協議只有最上面的三層,因為最下面的網路介面層基本上和一般的通訊鏈路的功能上沒多大差別
-
應用層:負責處理特定的應用程式細節。包含各種應用程式協議,如:Telnet遠端登入、FTP檔案傳輸協議、SMTP簡單郵件傳送協議、SNMP簡單網路管理協議
-
傳輸層:為網路提供了流量控制,錯誤控制和確認服務。在TCP/IP協議族裡面,又包含兩個互不相同的傳輸協議:TCP和UDP,後面會講解
-
網際層:提供獨立於硬體的邏輯定址,實現實體地址與邏輯地址的轉換,網際層(也叫網路層)協議包括IP協議、ICMP協議以及OGMP協議( Internet 組管理協議)
-
網路介面層:通常包括作業系統中的裝置驅動程式和計算機中對應的網路介面卡,它們一起處理與電纜或其他人護額傳輸媒介的物理介面細節,對應的裝置有,傳輸介質、網路卡、交換機
TCP與UDP
TCP和UDP是兩種最為著名的傳輸層協議,二者都使用IP作為網路層協議儘管TCP和UDP都使用相同的網路層(IP),TCP卻嚮應用層提供與UDP完全不同的服務
TCP
TCP,傳輸控制協議,面向連線的協議,可靠的位元組流服務。面向連線意味著兩個使用TCP的應用(通常是一個客戶和一個伺服器)在彼此交換資料之前必須建立一個TCP連線
特點:
-
只支援一對一傳輸(端對端的傳輸)
-
資料大小無限制
-
建立連線通道
-
速度慢,但是可靠性高
UDP協議
使用者資料包協議,是OSI參考模型中一種無連線的傳輸層協議,提供面向事務的簡單不可靠資訊傳送服務,UDP提供了無連線通訊,適合於一次傳輸少量資料,UDP報文沒有可靠性保證、順序保證和流量控制欄位等,可靠性較差。但是正因為UDP協議的控制選項較少,在資料傳輸過程中延遲小、資料傳輸效率高,適合對可靠性要求不高的應用程式,或者可以保障可靠性的應用程式,如DNS、TFTP、SNMP
特點:
- 可以一對一、一對多、多對一和多對多的互動通訊
- 速度快,但可靠性低
- 資料有大小限制(64k)
- 不需要建立連線
應用:
一般應用於QQ、微信等即時聊天上
TCP和UDP的區別
- TCP面向連線(如打電話要先撥號建立連線),UDP是無連線的,即傳送資料之前不需要建立連線
- TCP提供可靠的服務,也就是說通過TCP連線傳送的資料,無差錯,無丟失,不重複,且按序到達;TCP通過校驗和重傳控制,序號標識,滑動視窗、確認應答實現可靠傳輸。如丟包時的重發控制,還可以對次序亂掉的分包進行順序控制,UDP盡最大努力交付,即不保證可靠交付
- UDP具有較好的實時性,工作效率比TCP高,適用於對高速傳輸和實時性有較高的通訊或廣播通訊
- 每一條TCP連線只能是點對點,UDP支援一對一、一對多、多對一和多對多的互動通訊
- TCP對系統資源要求較多,UDP對系統資源要求較少
三次握手與四次揮手
這個是前端面試中,最經常考的,所以呢,這個我們得重點掌握才行。
tcp的首部資料
在瞭解三次握手和四次揮手之前,我們得先了解tcp頭部資料的巨集觀位置和首部報文格式,方便我們後面理解
巨集觀位置
- 資料從應用層->傳輸層->網路層->鏈路層,沒經過一次都會在保溫中增加相應的首部
- tcp資料被封裝在ip資料包中
首部報文格式
一行有32個bit即32位,1個位元組=8個位,即一行有4個位元組
- 16位源埠和16位目的埠:告知主機該報文段是來自哪裡(源埠Source Port)以及傳給哪個上層協議或應用程式
- 32位序號:用於對位元組流進行編號
- 確認號:期望收到的下一個報文段的序號
- 選項:長度不定
- 資料:該TCP協議包負載的資料
標識位說明:
- URC:緊急標誌,為1時,表示緊急指標有效
- ACK:確認標誌,連線建立成功,總為1,為1時確認號有效
- PSH:接收方應儘快把這個報文交給應用層
- RST:復位標誌,重建連線
- SYN:同步標誌,該標誌僅在三次握手建立TCP連線時有效,它提示TCP連線的服務端檢查序列編號,該序列編號為TCP連線初始端(一般是客戶端)的初始序列編號。
- FIN:關閉連線標誌
三次握手
- 三次握手機制是為了保證建立一個安全可靠的連線
- tcp連線是全雙工的,資料在兩個方向上能同時傳遞
第一次握手:第一次握手是有客戶端發起的,客戶端向服務端傳送一個報文,在報文裡面SYN標誌位為1,seq攜帶一位32位的序列號,當服務端收到這個報文之後,就在知道客戶端是想要和我建立一個新的連線
第二次握手:第二次握手是由服務端發起的,服務端在收到客戶端在第一次握手時發的報文之後,確定客戶端是想和自己建立連線後,,於是服務端就向客戶端傳送了一個確認訊息包,在這個包裡面,SYN標誌位和ACK標誌位都為1,並攜帶32位的確認序號
以上兩次握手後,對於客戶端而言,已經明確了客戶端既能給服務端發小心,也能收到服務端的響應。但是對服務端而言,兩次握手是不夠的,到目前為止,服務端只知道一件事情,客戶端發給我的訊息我能收到,但是客戶端能不能收到我的訊息我是不知道的,所以,還需要進行第三次握手
第三次握手:第三次握手就是當客戶端收到服務端傳送的響應報文之後,還要繼續去給服務端進行回應,在報文裡面攜帶一個32位的確認序號。
通過以上三次握手之後,不管是客戶端還是服務端,都知道,我既能給對方傳送訊息,也能收到對方的響應,那麼這個連線就被安全的建立了
四次揮手
第一次揮手:第一次揮手也是由客戶端發起的,客戶端會傳送一個報文,報文裡面FIN標誌位為1,表示關閉連線,當服務端收到這個報文之後,就知道客戶端想要和我斷開連線了
第二次揮手:第二次報文是由服務端發起的,當服務端收到客戶端的報文之後,服務端辭職可能還有未傳送完的報文訊息,需要繼續傳送,所以此時客戶端只能告訴客戶端,我知道你要和我斷開連線啦,但是我還沒準備好,需要等我一下等我好了之後我會通知你的(此時的報文訊息裡面包含32位確認序號ack和確認標誌ACK=1)
第三次揮手:此時的服務端已經準備好了,於是就告訴客戶端,我可以斷開連線啦,在這條訊息報文裡面FIN=1,並攜帶32位的ack確認序號
第四次揮手:當客戶端收到服務端的斷開連線的報文後,客戶端同樣需要繼續傳送一個確認包的報文給服務端。
通過這四次的相互溝通和連線,不斷時客戶端還是服務端,都已經做好了斷開的準備