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