2.3收發(fā)數(shù)據(jù)

2.3收發(fā)數(shù)據(jù)

  1. 將HTTP消息交給協(xié)議棧

    1. 應(yīng)用程序調(diào)用socket庫中的write將發(fā)送的數(shù)據(jù)交給協(xié)議棧
    2. 協(xié)議棧收到數(shù)據(jù)后執(zhí)行發(fā)送操作。
    1. 協(xié)議棧收到數(shù)據(jù)之后并不會(huì)馬上發(fā)送,影響協(xié)議棧發(fā)送的兩大因素

      1. 數(shù)據(jù)長度:當(dāng)從應(yīng)用程序中收到的數(shù)據(jù)長度超過或者接近MSS時(shí)發(fā)送

        1. MTU: 一個(gè)網(wǎng)絡(luò)包的最大長度,以太網(wǎng)中一般為1500字節(jié)
        2. MSS: 出去頭部之后,一個(gè)網(wǎng)絡(luò)包所能容納的TCP數(shù)據(jù)的最大長度
        3. [圖片上傳失敗...(image-fa024d-1587223590343)]
      2. 時(shí)間:協(xié)議棧內(nèi)部有一個(gè)計(jì)時(shí)器,經(jīng)過一段時(shí)間之后,網(wǎng)絡(luò)包就會(huì)發(fā)送出去。

  2. 對較大的數(shù)據(jù)進(jìn)行拆分

    1. 當(dāng)發(fā)送緩沖區(qū)的數(shù)據(jù)超過MSS長度時(shí),數(shù)據(jù)會(huì)被以沒MSS長度為單位進(jìn)行拆分放進(jìn)單獨(dú)的網(wǎng)絡(luò)包進(jìn)行發(fā)送。
    2. [圖片上傳失敗...(image-b5a3da-1587223590344)]
  3. 使用ACK號確認(rèn)網(wǎng)絡(luò)包已收到

    1. TCP具備確認(rèn)是否成功收到網(wǎng)絡(luò)包

      1. 通過序號和ACK號進(jìn)行數(shù)據(jù)確認(rèn)
      2. TCP數(shù)據(jù)收發(fā)是雙向的,客戶端和服務(wù)端需要各自計(jì)算序號,雙方在連接的過程中相互告知自己計(jì)算的序號和初始值。
      1. 序號和ACK號交互的實(shí)際過程
      1. [圖片上傳失敗...(image-620e08-1587223590344)]

        1. 客戶端將到服務(wù)端方向通信相關(guān)的序號初始值,發(fā)送給服務(wù)端。
        2. 服務(wù)端通過初始值算出ACK號并返回作為確認(rèn),同時(shí)也計(jì)算出到客戶端方向的通信的序號初始值,發(fā)客戶端給
        3. 客戶端根據(jù)初始值算出ACK返回給服務(wù)端
        4. 客戶端向服務(wù)端發(fā)送請求,序號和數(shù)據(jù)一起發(fā)送
        5. 服務(wù)度收到數(shù)據(jù)并返回ACK號
        6. 同7
        7. 同服務(wù)端向客戶端發(fā)送數(shù)據(jù)正好相反
    1. 通過“序號”和“ACK號”可以確認(rèn)接收方是否收到了網(wǎng)絡(luò)包
  4. 根據(jù)網(wǎng)絡(luò)包平均返回時(shí)間調(diào)整ACK號等待時(shí)間

    1. TCP采用了動(dòng)態(tài)調(diào)整等待時(shí)間的方法

      1. 等待時(shí)間是根據(jù)ACK號返回所需要的時(shí)間來確定的
  5. 使用窗口有效管理ACK號

    1. 滑動(dòng)窗口:發(fā)送一個(gè)包之后,不等待ACK號返回,直接發(fā)送后續(xù)一系列包
    2. [圖片上傳失敗...(image-66c507-1587223590344)]
    1. 接收緩沖區(qū):接收方的TCP收發(fā)數(shù)據(jù)存放的地方
    2. 緩沖區(qū)溢出:數(shù)據(jù)達(dá)到速率比處理數(shù)據(jù)并發(fā)給應(yīng)用程序的速率要快,數(shù)據(jù)越來越大就會(huì)造成溢出。
    1. 滑動(dòng)窗口的結(jié)局思路:接收方告知發(fā)送方最多能處理多少的數(shù)據(jù),發(fā)送方根據(jù)這個(gè)值控制發(fā)送數(shù)據(jù)
  6. ACK和窗口的合并

    1. 確定返回ACK號和更新窗口的時(shí)機(jī)??梢蕴岣呤瞻l(fā)數(shù)據(jù)的效率。
    2. 在等待發(fā)送ACK號的時(shí)候正好更新窗口,就可以吧ACK和更新窗口放在一個(gè)網(wǎng)絡(luò)包里一起發(fā)送。
  7. 接受HTTP響應(yīng)消息

    1. 協(xié)議棧檢查收到的數(shù)據(jù)塊和TCP頭部的內(nèi)容,判斷是否有數(shù)據(jù)丟失
    2. 如果沒有問題返回ACK號
    3. 協(xié)議棧將數(shù)據(jù)暫存到接受緩沖區(qū)中
    4. 將數(shù)據(jù)連接起來還原出原始數(shù)據(jù)
    5. 將原始數(shù)據(jù)復(fù)制到應(yīng)用程序指定的內(nèi)存地址中
    6. 最后控制流程交回應(yīng)用程序
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 2.3.1 將HTTP請求消息交給協(xié)議棧 首先,協(xié)議棧不關(guān)心應(yīng)用程序傳來的數(shù)據(jù)是什么內(nèi)容,在協(xié)議??磥?,發(fā)送的數(shù)據(jù)...
    ShutLove閱讀 270評論 0 0
  • 前言:網(wǎng)絡(luò)知識非常的重要,如果你不是做程序的,那么一些網(wǎng)絡(luò)常識還是得知道的;而做程序的,就更不用說了,不僅需要了解...
    Dwyane_Coding閱讀 689評論 0 9
  • 個(gè)人認(rèn)為,Goodboy1881先生的TCP /IP 協(xié)議詳解學(xué)習(xí)博客系列博客是一部非常精彩的學(xué)習(xí)筆記,這雖然只是...
    貳零壹柒_fc10閱讀 5,215評論 0 8
  • 運(yùn)輸層協(xié)議概述 從通信和信息處理的角度看,運(yùn)輸層向它上面的應(yīng)用層提供通信服務(wù),它屬于面向通信部分的最高層,同時(shí)也是...
    srtianxia閱讀 2,783評論 0 2
  • 1.TCP報(bào)頭格式 UDP報(bào)頭格式 TCP報(bào)頭格式 UDP報(bào)頭格式 具體的各部分解釋看 TCP報(bào)文格式詳解 - ...
    杰倫哎呦哎呦閱讀 2,757評論 0 5

友情鏈接更多精彩內(nèi)容