網絡協議模型
網絡中的網絡協議模型共有兩種:一種是網絡標準
OSI/ISO
七層協議模型,一種是使用普遍
TCP/IP
五層協議模型。上圖就是
OSI/IOS
七層協議模型。其實這兩種都差很少,
TCP/IP
五層協議模型是把
OSI/IOS
七層模型的上三層合併成爲了應用層。
數據在網絡上的傳輸過程
在網絡傳輸上共有兩個角色:客戶端和服務端。客戶端發送請求,服務端響應請求。網絡請求在網絡協議模型上是一個拆包和封包的過程。服務器
過程以下:微信
- 數據發送端每通過一層都會封裝上這層協議的協議頭部向下傳輸。例如:對於網絡請求來講,在應用層封裝上HTTP的頭部轉換成報文,在傳輸層封裝上TCP頭部轉換成數據包,在網絡層封裝上IP的頭部轉化成IP數據報,在數據鏈路層加上MAC地址封裝成幀,而後在物理層轉換成比特流進行傳輸。
- 在物理層傳輸過程當中若是遇到交換機和路由器。遇到交換機把比特流轉換成幀,根據交換機所指MAC地址從新封裝成幀再向下轉換進行傳輸;遇到路由器拆包到網絡層,根據路由策略決定向下傳的IP地址再進行向下封裝傳輸。
- 通過萬里長征終於到達服務器,會在網絡協議模型中把第一步驟一一拆解開,最終拿到數據。響應過程當中仍是這麼一套過程。
數據通訊的三種基本方式
寫到這內心一涼,慌的拿起個人計算機網絡書看了看....網絡
單向通訊
單向通訊又稱單工通訊,即只能有一個方向的通訊而沒有反方向的交互。好比:無線電廣播、電視廣播這種。socket
雙向交替通訊
雙向交替通訊又稱半雙工通訊,即通訊的雙方均可以發送信息,但不能同時發送(固然也不能同時接收)。這種通訊方式是一方發送另外一方只能接受,等發送的一方不發了,接收的一方纔能夠發送。好比:對講機等。tcp
雙向同時通訊
雙向同時通訊又稱全雙工通訊,即通訊的雙方均可以同時發送和接受信息。顯然,雙向通訊的傳輸效率最高。TCP就是全雙工通訊。計算機網絡
說了這麼多(其實也很少),主要仍是要聊聊傳輸層TCP協議。3d
TCP
TCP協議的特色
- TCP是面向鏈接的傳輸層協議
- 每一條TCP協議只能有兩個端口
- TCP提供數據的可靠交付服務
- TCP是全雙工通訊
- 面向字節流
TCP頭部
TCP頭部共有20字節的數據,以下圖:指針
- 0-4:咱們都知道TCP協議是保證端到端可靠傳輸,首先是4個字節的目的端口和源端口
- 4-8:Sequence Number (發包的順序號)
- 8-12:Acknowledgment Number (應答號,不一樣的應答號表明者不一樣的指令,標記這次動做)
- 12-16:標記位,偏移量,時間窗口等等
- 16-20:Checksum(校驗碼)、Urgent Pointer(偏移指針)
- TCP Options TCP內置的命令(FIN,SYN就在這裏)。
- 上層數據
socket套接字
上面說到TCP的特色的時候說道每一條TCP只能有兩個端口,這端口不是別的,就是套接字端口。code
套接字接口的格式:cdn
socket = {IP地址 : 端口號}
三次握手、四次揮手
爲何三次握手、四次揮手?
TCP保證的是應用程序之間端到端的可靠傳輸。要想可靠就必需要有這個機制。
三次握手
先來張好玩的圖
三次握手總結以下:
- 客戶端對服務端說:Hi,你能收到我發的信息嗎?
- 服務器對客戶端說:我能收到,你能收到我發的嗎?
- 客戶端對服務器說:我也能收到。
是否是很是好理解,再來個詳細。
- 開始的時候客戶端和服務器的TCP鏈接都處於CLOSE狀態。當要鏈接的時候,客戶端爲主動打開,服務端爲被動打開。
- 一開始服務端服務器進程首先建立傳輸控制模塊TCB(這其中保存了鏈接重要的信息),而後服務端就處於LISTEN狀態。
- 客戶端向服務器發送一個SYN=1,seq=n(SYN=1,創建鏈接的標誌,seq爲頭部的序號位)的數據包,此時客戶端進入SYN_SENT狀態(鏈接請求已發送)。
- 服務端接收到客戶端發來的請求時,會向客戶端發送確認而且請求客戶端創建鏈接(SYN=一、ACK=一、seq=k,ack=n+1),此時服務端進入SYN_RCVD狀態(鏈接請求收到)
- 客戶端接收到服務器的確認後,而且還要向服務器發送確認,(ACK=1,seq=n+1,ack=k+1),此時TCP創建鏈接,客戶端狀態變爲EXTABLISHED(已鏈接狀態)
- 服務端接受到客戶端的確認以後,一樣也進入EXTABLISHED(已鏈接狀態)。三次握手完畢
四次揮手
在這次聊天過程當中,忽然雙方起了爭執。
四次揮手總結以下:
- 客戶端對服務端說:我不想聽你說話了,不和你聊了(此時客戶端已經把手機扔一邊了)。
- 服務端對客戶端說:你不想聽,我也要說(服務端直男癌犯了,服務端說啥客戶端都看不到)。
- 服務端對客戶端說:我也不想和你說話了,冷戰吧。
- 客戶端對服務端說:好,冷戰就冷戰,而後雙方刪了微信。
- 開始處於數據傳輸過程當中,雙方狀態爲ESTABLISHED。
- 首先客戶端向服務端發送FIN=1,seq=x(FIN=1是斷開鏈接的標誌)的數據包,進入FIN_WAIT1狀態(終止等待1)。
- 服務端接受到客戶端的請求,由於服務端這邊還要收場,因此先應答客戶端,進入CLOSE_WAIT狀態(關閉等待)。此時TCP通訊就進入到了半關閉狀態。
- 客戶端接收到服務端返回的肯定進入FIN_WAIT2狀態(終止等待2).
- 服務端處理好本身的事情以後,向客戶端發送一個FIN=1的包,進入LAST_ACK(最後確認)狀態。
- 客戶端接收到服務端發送的關閉鏈接的包,並返回個服務端確認。進入TIME_WAIT(時間等待)狀態,此時TCP鏈接尚未釋放點,必需要通過時間等待計數器設置的時間以後(2MSL),纔會進入CLOSED(關閉)狀態。
- 服務端接受到客戶端的確認以後,進入CLOSED(關閉)狀態。
- 客戶端時間等待計數器結束以後進入CLOSED(關閉)狀態。TCP鏈接釋放。
Over!
原文鏈接:TCP協議及三次握手、四次揮手