計算機網絡 - 傳輸層(TCP/UDP層)

1、簡介

TCP/IP協議中,傳輸層給應用層提供服務
TCP/IP協議棧中,傳輸層只包含兩個協議:緩存

  • TCP協議:可靠性傳輸,面向鏈接,提供差錯檢測
  • UDP協議:不可靠傳輸,無鏈接

  • 通常約定用傳輸層協議 + 端口號來標識上面應用層使用了什麼協議。

  • 數據在網絡上傳輸,經過網絡層的IP地址找到目標主機,經過傳輸層的端口號定位目標主機上的服務(應用程序)。因此傳輸層爲相互通訊的應用進程提供了邏輯通訊網絡

  • 端口號:16位,本地惟一便可,只有本地意義。優化

2、UDP協議

主要特色操作系統

  • 無鏈接,發送以前不須要創建鏈接,通常一個數據包就能完成的通訊使用UDP。例如,請求CDN解析網址。
  • 最大努力交付。不保證可靠交付,不使用擁塞控制。
  • 面向報文的。適合多媒體通訊的要求。適合於多播通訊。
  • 支持一對1、一對多、多對一和多對多的交互通訊。
  • 首部開銷小,只有8字節。

UDP數據報結構3d

  • 僞首部:2個字節。爲了計算檢驗和,取網絡層首部的一部分信息參與計算。

3、 TCP協議

TCP協議的特色指針

  • 面向鏈接
  • 只能是點對點的通訊
  • 提供可靠交付的服務
  • 實現擁塞控制功能
  • 實現流量控制功能
  • 面向字節流傳輸

流式傳輸cdn

應用層發送數據是把數據放到了操做系統的TCP發送緩存中。操做系統發送時,去TCP發送緩存中取數據組成TCP數據包。應用層一次發送了8個字節的數據,操做系統第一次從發送緩存取出5個字節發送是能夠的。或者應用層分別發送了一個8字節和一個10字節的包,操做系統從緩存中取出18個字節一次發送也是徹底能夠的。接收端解析後,把字節流按順序放入TCP接收緩存,每次從緩存中取必定的字節(跟發送端應用程序一次發送多少個字節沒有關係)數遞交給應用層。blog

因爲應用層一次發送數據的大小和傳輸層一次遞交給接收端應用層的數據的大小不必定徹底同樣,因此應用層須要處理TCP粘包問題。進程

套接字(Socket)資源

IP+端口能夠表達TCP傳輸中的一個端點。IP+Port稱爲套接字。

如何實現可靠傳輸
(後面我會更新一篇專欄更加詳細的闡述可靠性傳輸的實現)

  • 自動重傳協議(ARQ)

    發送端發送一個數據以後等待接收端響應成功接收的確認後,再發送下一個數據包(中止等待協議)。
    必定時間內沒有收到確認,發送端重傳這個數據包(超時重傳),最大等待時間略大於往返時延(RTT)。因此重傳是自動進行的。

    若是接收端發送的確認丟失,或者確認遲到即確認沒有在最大等待時間內到達發送端,這兩種狀況也都會致使發送端進行超時重傳。這種狀況下,接收端會丟棄重複的數據。因此TCP協議還支持去重的功能。

    通俗來講,ARQ協議就是,只要你沒在必定時間內告訴我收到了,我就認爲你沒收到。

    中止等待協議實現簡單,可是信道利用率低。由於發送數據的時間要遠小於等待的時間。

  • 流水線傳輸

上面提到的ARQ傳輸協議的信道利用率很是低,已經被淘汰。目前TCP協議中採用流水線傳輸。即發送端發送一個數據包後,不等待接收端的ACK就當即發送下一個準備好的數據包。當一個包發送了時間x以後,還沒收到收到這個包的ACK,就會重傳這個包。x的取值略大於網絡的往返時延TTL。假設在時間x內,能夠發送n個數據包,那麼發送端必需要緩存n個尚未收到ack的數據包。即發送端維護一個發送窗口。

發送窗口內是發送了尚未收到ACK的數據包,當發送窗口內有數據收到ACK以後,就能夠被移出窗口,而且窗口左邊沿向前推動。當窗口內的數據大於窗口的最大長度時,就不能繼續發送數據了,須要等待ACK或者進行重傳。

舉個例子,上圖中假如滑動窗口的大小是5,此時窗口已經被佔滿。有兩種狀況,若是收到了數據包1的ACK那麼數據包1被溢出窗口,窗口向前推動繼續發送第6個包。若是沒收到ACK,會重傳數據包1,其實窗口也會向前推動,次數數據包6的內容跟數據包1的內容相同,即數據包1的重傳。

累計確認是對上述機制的進一步優化,即接收端若是收到了連續的數據包一、二、3,只須要在ACK裏回覆收到了3,發送端就能夠隱式的知道一、二、3都發送成功了。

TCP報文段格式:

  • 源端口、目標端口:用於標識TCP連接兩端進行通訊的兩個應用程序。
  • 序號:應用層下發的數據在傳輸層可能被分段傳輸。序號指的是。TCP數據包數據部分的第一個字節是應用層下發的數據的第幾個字節。
  • 確認號:TCP數據包中數據部分的最後一個字節是應用層下發的數據中的第幾個字節再加上1。接收端發送ACK時攜帶的是這個確認號,實際上接收發送端下一個發送數據的序號。
  • 數據偏移:數據部分起始位置相對於整個數據包的偏移字節數。因爲首部有長度可變的部分,因此須要數據偏移。
  • URG:若是爲1,優先傳輸,無論發送緩存中還有多少多少數據在排隊。
  • ACK:若是是0,確認號無效,不然有效。
  • SYN:SYN=1,表示是創建會話的控制包。此時發送端序號=0,確認號=0,ACK=0(確認號無效)。接收端序號=0,確認號=1,ACK=1(發送端知道鏈接創建成功了,能夠開始發送第一個數據包了)。
    SYN攻擊:利用創建會話的機制進行攻擊,給主機發送大量創建鏈接的請求,請求數據包中填寫一個不存在的源IP地址。形成主機一直在等待創建鏈接。或者目標IP和源IP都填寫主機本身的IP,讓主機跟本身創建大量的TCP鏈接。佔用大量的主機資源,形成主機不能繼續響應正常的鏈接創建請求。
  • PSH: 若是是1。接收端緩存優先把這個數據包遞交給應用層,無論接收緩存裏是否還有未向上遞交的數據。
  • RST:若是是1,表明異常中斷,告訴對端當即斷開鏈接。
  • FIN:若是是1。通訊正常結束,釋放鏈接。
  • 窗口:TCP通訊中,須要告訴對端本身的接收緩存最多能存放多少字節的數據。對端獲知後設置本身的發送緩存爲一樣的大小。在創建鏈接的SYN數據包中通知對端。
  • 校驗和:與上面提到的UDP協議中的校驗和的計算方式一致。
  • 緊急指針:URG爲1時設置的緊急指針纔會生效。指示URG包中前多少個字節是須要緊急處理的。
  • 選擇(可變長度):能夠用於通知對端本身可以處理的最大的TCP數據報的長度。能夠用於通知對端本身是否支持選擇性確認。
相關文章
相關標籤/搜索