背景
早期的網絡是基於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確認序號
第四次揮手:當客戶端收到服務端的斷開連接的報文后,客戶端同樣需要繼續發送一個確認包的報文給服務端。
通過這四次的相互溝通和連接,不斷時客戶端還是服務端,都已經做好了斷開的准備