2.3收發(fā)數(shù)據(jù)
將HTTP消息交給協(xié)議棧
- 應用程序調用socket庫中的write將發(fā)送的數(shù)據(jù)交給協(xié)議棧
- 協(xié)議棧收到數(shù)據(jù)后執(zhí)行發(fā)送操作。
協(xié)議棧收到數(shù)據(jù)之后并不會馬上發(fā)送去件,影響協(xié)議棧發(fā)送的兩大因素
數(shù)據(jù)長度:當從應用程序中收到的數(shù)據(jù)長度超過或者接近MSS時發(fā)送
- MTU: 一個網(wǎng)絡包的最大長度笨农,以太網(wǎng)中一般為1500字節(jié)
- MSS: 出去頭部之后就缆,一個網(wǎng)絡包所能容納的TCP數(shù)據(jù)的最大長度
- [圖片上傳失敗...(image-fa024d-1587223590343)]
時間:協(xié)議棧內部有一個計時器,經(jīng)過一段時間之后谒亦,網(wǎng)絡包就會發(fā)送出去竭宰。
對較大的數(shù)據(jù)進行拆分
- 當發(fā)送緩沖區(qū)的數(shù)據(jù)超過MSS長度時,數(shù)據(jù)會被以沒MSS長度為單位進行拆分放進單獨的網(wǎng)絡包進行發(fā)送诊霹。
- [圖片上傳失敗...(image-b5a3da-1587223590344)]
使用ACK號確認網(wǎng)絡包已收到
TCP具備確認是否成功收到網(wǎng)絡包
- 通過序號和ACK號進行數(shù)據(jù)確認
- TCP數(shù)據(jù)收發(fā)是雙向的羞延,客戶端和服務端需要各自計算序號渣淳,雙方在連接的過程中相互告知自己計算的序號和初始值脾还。
- 序號和ACK號交互的實際過程
[圖片上傳失敗...(image-620e08-1587223590344)]
- 客戶端將到服務端方向通信相關的序號初始值,發(fā)送給服務端入愧。
- 服務端通過初始值算出ACK號并返回作為確認鄙漏,同時也計算出到客戶端方向的通信的序號初始值嗤谚,發(fā)客戶端給
- 客戶端根據(jù)初始值算出ACK返回給服務端
- 客戶端向服務端發(fā)送請求,序號和數(shù)據(jù)一起發(fā)送
- 服務度收到數(shù)據(jù)并返回ACK號
- 同7
- 同服務端向客戶端發(fā)送數(shù)據(jù)正好相反
- 通過“序號”和“ACK號”可以確認接收方是否收到了網(wǎng)絡包
根據(jù)網(wǎng)絡包平均返回時間調整ACK號等待時間
TCP采用了動態(tài)調整等待時間的方法
- 等待時間是根據(jù)ACK號返回所需要的時間來確定的
使用窗口有效管理ACK號
- 滑動窗口:發(fā)送一個包之后怔蚌,不等待ACK號返回巩步,直接發(fā)送后續(xù)一系列包
- [圖片上傳失敗...(image-66c507-1587223590344)]
- 接收緩沖區(qū):接收方的TCP收發(fā)數(shù)據(jù)存放的地方
- 緩沖區(qū)溢出:數(shù)據(jù)達到速率比處理數(shù)據(jù)并發(fā)給應用程序的速率要快,數(shù)據(jù)越來越大就會造成溢出桦踊。
- 滑動窗口的結局思路:接收方告知發(fā)送方最多能處理多少的數(shù)據(jù)椅野,發(fā)送方根據(jù)這個值控制發(fā)送數(shù)據(jù)
ACK和窗口的合并
- 確定返回ACK號和更新窗口的時機〖瑁可以提高收發(fā)數(shù)據(jù)的效率竟闪。
- 在等待發(fā)送ACK號的時候正好更新窗口,就可以吧ACK和更新窗口放在一個網(wǎng)絡包里一起發(fā)送杖狼。
接受HTTP響應消息
- 協(xié)議棧檢查收到的數(shù)據(jù)塊和TCP頭部的內容炼蛤,判斷是否有數(shù)據(jù)丟失
- 如果沒有問題返回ACK號
- 協(xié)議棧將數(shù)據(jù)暫存到接受緩沖區(qū)中
- 將數(shù)據(jù)連接起來還原出原始數(shù)據(jù)
- 將原始數(shù)據(jù)復制到應用程序指定的內存地址中
- 最后控制流程交回應用程序