netWork

netWork

OSI是Open System Interconnection的縮寫,意爲開放式系統互聯。國際標準化組織(ISO)制定了OSI模型,該模型定義了不一樣計算機互聯的標準,是設計和描述計算機網絡通訊的基本框架。OSI模型把網絡通訊的工做分爲7層,分別是物理層、數據鏈路層、網絡層、傳輸層、會話層、表示層和應用層。 首先來看看OSI的七層模型:緩存

OSI七層網絡模型

sevenlayer

TCP/IP 參考模型

TCP/IP是傳輸控制協議/網絡互聯協議的簡稱。早期的TCP/IP模型是一個四層結構,從下往上依次是網絡接口層、互聯網層、傳輸層和應用層。後來在使用過程當中,借鑑OSI七層參考模型,將網絡接口層劃分爲了物理層和數據鏈路層,造成五層結構。服務器

fivelayer

傳輸層

傳輸層是面向鏈接的、可靠的的進程到進程通訊的協議。TCP提供全雙工服務,即數據可在同一時間雙向傳播。TCP將若干個字節構成一個分組,此分組稱爲報文段(Segment)。提供了一種端到端的鏈接。 傳輸層的協議主要是TCP ,TCP(Transimision Control Protocal)是一種可靠的、面向鏈接的協議,傳輸效率低。網絡

TCP協議

http協議其實就是TCP連接和一些使用連接得規則。
TCP 提供了可靠得比特傳輸管道
ip分組承載了tcp片斷, 每一個ip分組都包括:框架

  • 一個ip分組首部
  • 一個tcp段首部
  • 一個tcp數據塊

ip首部包含了來源和目的地ip地址,長度和其餘得一些標記。
TCP段首部包含了TCP端口號、 tcp控制標記、以及用於數據排序和完整性檢查得一些數字值
image.pngtcp

  • 如何保證TCP連接得正確性

經過 <源ip地址、 源端口號、目的ip地址、目的端口號> 保證了惟一性spa

  • 驗證數據是否接收到計算機網絡

    1. 32位序列號 TCP用序列號對數據包進行標記,以便在到達目的地後從新重裝,假設當前的序列號爲 s,發送數據長度爲 l,則下次發送數據時的序列號爲 s + l。在創建鏈接時一般由計算機生成一個隨機數做爲序列號的初始值
    2. 確認應答號 它等於下一次應該接收到的數據的序列號。假設發送端的序列號爲 s,發送數據的長度爲 l,那麼接收端返回的確認應答號也是 s + l。發送端接收到這個確認應答後,能夠認爲這個位置之前全部的數據都已被正常接收。
  • 控制位 TCP的鏈接、傳輸和斷開都受這六個控制位的指揮設計

    1. PSH(push急迫位) 緩存區將滿,馬上傳輸速度
    2. RST(reset重置位) 鏈接斷了從新鏈接
    3. URG(urgent緊急位) 緊急信號
    4. ACK(acknowledgement 確認)爲1表示確認號
    5. SYN(synchronous創建聯機) 同步序號位 TCP創建鏈接時要將這個值設爲1
    6. FIN發送端完成位,提出斷開鏈接的一方把FIN置爲1表示要斷開鏈接

這裏寫圖片描述

三次握手

TCP是面向鏈接的,不管哪一方向另外一方發送數據以前,都必須先在雙方之間創建一條鏈接。在TCP/IP協議中,TCP 協議提供可靠的鏈接服務,鏈接是經過三次握手進行初始化的。三次握手的目的是同步鏈接雙方的序列號和確認號 並交換 TCP窗口大小信息。
handshake23d

  • 客戶端先向服務器發送數據,該數據報是長度爲159的數據。
  • 服務器收到報文後, 也向客戶端發送了一個數據進行確認(ACK),而且返回客戶端要請求的數據,數據的長度爲111,將seq設置爲1,ack設置爲160(1 + 159)。
  • 客戶端收到服務器返回的數據後進行確認(ACK),將seq設置爲160, ack設置爲112(1 + 111)。
爲何不能兩次:

當客戶端想要創建鏈接時發送一個SYN,而後等待ACK,結果這個SYN由於網絡問題沒有及時到達B,因此客戶端在一段時間內沒收到ACK後,在發送一個SYN,服務器也成功收到,而後客戶端也收到ACK,這時客戶端發送的第一個SYN終於到了服務器,對於服務器來講這是一個新鏈接請求,而後服務器又爲這個鏈接申請資源,返回ACK,然而這個SYN是個無效的請求,客戶端收到這個SYN的ACK後也並不會理會它,而服務器殊不知道,服務器會一直爲這個鏈接維持着資源,形成資源的浪費blog

四次揮手

  • 第一次揮手:客戶端向服務器發送一個FIN報文段,將設置seq爲160和ack爲112,;此時,客戶端進入 FIN_WAIT_1狀態,這表示客戶端沒有數據要發送服務器了,請求關閉鏈接;
  • 第二次揮手:服務器收到了客戶端發送的FIN報文段,向客戶端回一個ACK報文段,ack設置爲1,seq設置爲112;服務器進入了CLOSE_WAIT狀態,客戶端收到服務器返回的ACK報文後,進入FIN_WAIT_2狀態;
  • 第三次揮手:服務器會觀察本身是否還有數據沒有發送給客戶端,若是有,先把數據發送給客戶端,再發送FIN報文;若是沒有,那麼服務器直接發送FIN報文給客戶端。請求關閉鏈接,同時服務器進入LAST_ACK狀態;
  • 第四次揮手:客戶端收到服務器發送的FIN報文段,向服務器發送ACK報文段,將seq設置爲161,將ack設置爲113,而後客戶端進入TIME_WAIT狀態;服務器收到客戶端的ACK報文段之後,就關閉鏈接;此時,客戶端等待2MSL後依然沒有收到回覆,則證實Server端已正常關閉,客戶端也能夠關閉鏈接了。

參考資料

珠峯培訓《http權威指南》《圖解http》

相關文章
相關標籤/搜索