TCP-IP 協議、三次握手、四次揮手詳解
TCP/IP 協議模型
(TCP 協議) 傳輸控制協議是一種面向連接的、可靠的、基於字節流的方式進行有序的無差錯的數據傳輸通訊協議,它負責完成傳輸層所指定的功能,利用重發技術和擁塞控制機制,嚮應用程序提供可靠的通信連接,使它能夠自動適應網上的各種變化。比如:數據報檢測、流量控制、擁塞控制、數據排序、超時重發等
TCP/IP 是一個協議族,包括 TCP、IP、UDP、ICMP、RIP、SMTP、ARP、TFTP 等諸多協議,這些協議一起稱爲 TCP/IP 協議
各層簡單解釋:
應用層:爲應用程序提供服務,對應各種軟件,包括的協議有訪問網頁的 HTTP 協議、傳輸文件的 FTP 協議、發送郵件的 SMTP 協議 / POP3 協議、域名解析的 DNS 協議
表示層:數據格式化、數據加密,它使得不同操作系統之間通信成爲可能
會話層:管理主機之間的進程,建立、管理和維護進程之間的會話,還可利用在數據中插入校驗點來實現數據同步
傳輸層:建立、管理和維護端到端的連接,包括的協議有傳輸控制協議 TCP、用戶數據報協議 UTP
網絡層:路由選擇、流量控制、IP 地址及形成 IP 包,包括協議有互聯網協議 IP、互聯網分組交換協議 IPX
數據鏈路層:提供介質訪問及鏈路管理,成幀並保證幀的無誤傳輸,MAC 地址
物理層:生活中所看到的物理設備,比如網卡、顯卡、各接口等
TCP 報文中較爲重要的字段:
序號 (sequencenumber):用來標識從源端到目的端發送的字節流,發起方發送數據時對此進行標記,比如:一個報文段的序號爲 100,此報文段數據部分共有 200 字節,則下一個報文段序號爲 300
確認號 (acknowledgement number):指明下一個期待收到的字節序號,只有 ACK 標誌位爲 1 時確認序號字段纔有效,ack = seq+1
標誌位:
① URG:緊急指針標誌,爲 1 時表示緊急指針有效
② ACK:確認序號標誌,ACK=1 時表示有效。只有當 ACK=1 時,前面的確認號字段纔有效,TCP 連接建立後,ACK 必須爲 1
③ PSH:表示接收方在收到該報文段後應儘快將該報文段交給應用程序
④ RST:當 RST=1 時說明 TCP 連接出現了錯誤 (如主機崩潰),必須釋放連接後再重新建立連接,或者用於拒絕非法的報文段和拒絕連接請求
⑤ SYN:發起新連接,當 SYN=1,表示這是一個請求建立連接的報文段;當 SYN=1,ACK=1 時,表示對方同意建立連接,只有在前兩次握手中 SYN 才爲 1
⑥ FIN:用於釋放連接,FIN=1 表示數據已經發送完成,可以釋放連接
TCP 三次握手
所謂三次握手即是 TCP 連接建立的過程,此連接必定由一方主動打開,另一方被動打開,下圖爲客戶端主動發起連接的圖解:
首先主動打開連接的客戶端結束 CLOSED 狀態,被動打開的服務器端也結束 CLOSED 狀態,並進入 LISTEN 狀態。隨後開始 “三次握手”
① 客戶端向服務端發送一段 TCP 報文:
標誌位爲 SYN=1,表示 “請求建立新連接”;序號爲 seq=x(x 通常爲 1);隨後客戶端進入 SYN-SENT 狀態
② 服務端接收到來自客戶端的 TCP 報文之後,結束 LISTEN 狀態,並返回一段 TCP 報文:
標誌位爲 SYN=1,ACK=1,表示 “已收到請求並同意創建新連接”;序號爲 seq=y;確認號爲 ack=x+1,表示將來自客戶端的報文序號 seq 值加 1 作爲自己確認號 ack 的值;隨後服務端進入 SYN-RCVD 狀態
③ 客戶端收到服務端的同意連接 TCP 報文後,確認了雙方間數據傳輸是正常的,結束 SYN-SENT 狀態,並返回最後一段 TCP 報文:
標誌位爲 ACK=1,表示 “已收到同意連接的信號”;序號爲 seq=x+1,表示將來自服務端的確認號 ack 值作爲自己的序號值;確認號爲 ack=y+1,表示將來自服務端序號 seq 值加 1 作爲自己的確認號 ack 的值;隨後客戶端進入 ESTABLISHED 狀態
服務端收到來自客戶端的確認連接 TCP 報文之後,也確認了雙方間數據傳輸正常,結束 SYN-RCVD 狀態,進入 ESTABLISHED 狀態
在第三次握手時就可以攜帶數據了,因爲能夠發出第三次握手報文的客戶端,肯定接收到來自服務端的第二次握手報文,而僞造 IP 的客戶端是不會接收到第二次報文的,所以,能夠發出第三次握手報文的就是合法的用戶,服務端在接收到第三次握手的瞬間,狀態就會切換爲 ESTABLISHED,裏面攜帶的數據就可以按照正常流程走了
爲何兩次握手不可以呢?因爲是爲了防止服務端開啓一些無用的連接增加服務器開銷以及防止已失效的連接請求報文段突然又傳送到了服務端而產生錯誤。“第三次握手”是客戶端向服務端發送數據,目的是告訴服務器,客戶端有沒有收到服務器 “第二次握手” 時傳過去的數據,若發送的是 “收到了” 的信號,服務端接收後就正常建立 TCP 連接,否則建立 TCP 連接失敗,服務器關閉連接端口,由此減少服務器開銷及防止接收到失效請求而導致錯誤
TCP 四次揮手
所謂四次揮手即是 TCP 連接斷開的過程,下圖爲客戶端主動發起斷開連接的圖解:
①客戶端向服務端發送 TCP 報文:
標誌位爲 FIN=1,表示 “請求釋放連接”,序列號爲 seq=u,隨後客戶端進入 FIN-WAIT-1 狀態並停止向服務端發送數據
② 服務端收到從客戶端發出的釋放連接的 TCP 報文後結束 ESTABLISHED 狀態,進入 CLOSE-WAIT 狀態並返回一段 TCP 報文:
標誌位爲 ACK=1,表示 “收到釋放請求”,序列號爲 seq=v,確認號 ack=u+1,表示將來自客戶端報文序號 seq 值加 1 作爲自己的確認號 ack 的值,隨後服務端進入 CLOSE-WAIT 狀態
③ 客戶端收到服務端確認結果後,進入 FIN-WAIT-2 狀態。服務端做好了釋放連接準備後再次向客戶端發出一段 TCP 報文:
標誌位爲 FIN=1,ACK=1,表示 “已準備好釋放”,序號爲 seq=w,確認號 ack=u+1,服務器進入 LAST-ACK 狀態並停止向客戶端發送數據
④ 客戶端收到回覆後,結束 FIN-WAIT-2 狀態,進入 TIME-WAIT 狀態,並向服務端發送一段報文:
標誌位爲 ACK=1,表示 “已收到準備釋放信號”,序列號爲 seq=u+1,確認號爲 ack=w+1,表示將來自服務端報文序號 seq 值加 1 作爲自己的確認號 ack 的值,客戶端進入 TIME-WAIT 狀態,客戶端經過 2MSL 後進入 CLOSE 狀態;服務器收到確認後,立刻進入 CLOSE 狀態
(MSL 指的是 Maximum Segment Lifetime:一段 TCP 報文在傳輸過程中的最大生命週期。2MSL 即是服務端發出爲 FIN 報文和客戶端發出的 ACK 確認報文所能保持有效的最大時長)
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/ZwTXVrQZDrqoBjJw3bYedw