tcp套接字的資料收發無邊界。伺服器端即使呼叫1次write函式傳輸40位元組的資料,客戶端也有可能通過4次read函式呼叫每次讀取10位元組。但此處也有一些疑問,伺服器端一次性傳輸了40位元組,而客戶端居然可以緩慢地分批接收。客戶端接收10位元組後,剩下的30位元組在
何處等候呢?是不是像飛機為等待著陸而在空中盤旋一樣,剩下30位元組也在網路中徘徊並等待接收呢?
實際上, write函式呼叫後並非立即傳輸資料, read函式呼叫後也並非馬上接收資料。更準確地說,如圖所示, write函式呼叫瞬間,資料將移至輸出緩衝; read函式呼叫瞬間,從輸入緩衝讀取資料。
呼叫write函式時,資料將移到輸出緩衝,在適當的時候(不管是分別傳送還是一次性傳送)傳向對方的輸入緩衝。這時對方將呼叫read函式從輸入緩衝讀取資料。這些i/o緩衝特性可整理如下。
「不會發生超過輸入緩衝大小的資料傳輸。」
根本不會發生這類問題,因為tcp會控制資料流。tcp 中有滑動視窗(sliding window) 協議,用對話方式呈現如下。
write 函式返回的時間點write 函式和windows 的send 函式並不會在完成向對方主機的資料傳輸時返回,而是在資料移到輸出緩衝時。但tcp 會保證對輸出緩衝資料的傳輸,所以說write 函式在資料傳輸完成時返回。要準確理解這句話。tcp套接字從建立到消失所經過程分為如下3步。
tcp 內部工作原理1: 與對方套接字的連線
三次握手
tcp 內部工作原理2: 與對方主機的資料交換
圖給出了主機a分2次(分2個資料報)向主機b傳遞200位元組的過程。首先,主機a通過1個資料報傳送100個位元組的資料` 資料報的seq為1200 。主機b為了確認這一點,向主機a傳送ack1301 訊息。
此時的ack號為1301而非1201, 原因在千ack號的增蜇為傳輸的資料位元組數。假設每次ack號不加傳輸的位元組數,這樣雖然可以確認資料報的傳輸,但無法明確100位元組全都正確傳遞還是丟失了一部分,比如只傳遞了80位元組。因此按如下公式傳遞ack訊息:
ack 號 = seq 號+ 傳遞的宇節數+ 1
最後加1 是為了告知對方下次要傳遞的seq號。
下面分析傳輸過程中資料報消失的情況。
上圖表示通過seq 1301 資料報向主機b傳遞100位元組資料。但中間發生了錯誤,主機b未收到。經過一段時間後,主機a仍未收到對於seq 1301 的ack確認,因此試著重傳該資料報。為了完成資料報重傳, tcp套接字啟動計時器以等待ack應答。若相應計時器發生超時(time-out!)則重傳。
tcp 的內部工作原理3: 斷開與套接字的連線
三次握手:a:「喂,你聽得到嗎?」a->syn_send
b:「我聽得到呀,你聽得到我嗎?」應答與請求同時發出 b->syn_rcvd | a->established
a:「我能聽到你,今天balabala……」b->established
四次揮手:
a:「喂,我不說了。」a->fin_wait1
b:「我知道了。等下,上一句還沒說完。balabala…..」b->close_wait | a->fin_wait2
b:」好了,說完了,我也不說了。」b->last_ack
a:」我知道了。」a->time_wait | b->closed
a等待2msl,保證b收到了訊息,否則重說一次」我知道了」,a->closed
tcp三次握手:第一次:客服端向伺服器傳送請求命令syn;
第二次:伺服器應客戶端請求ack,同時向客戶端傳送請求syn;
第三次:客戶端響應伺服器的請求ack;
四次揮手:
第一次:客戶端向伺服器傳送fin用來關閉伺服器和客戶端的資料傳送;
第二次:伺服器接收到fin並向伺服器傳送ack;
第三次:伺服器關閉與客戶端的連線,並傳送fin給客戶端;
第三次:客戶端傳送ack報文確認
運輸層4 TCP可靠運輸的工作原理
寫在前面 本文章是針對 計算機網路第七版 的學習筆記 運輸層1 運輸層協議概述 運輸層2 使用者資料報協議udp 運輸層3 傳輸控制協議tcp概述 運輸層4 tcp可靠運輸的工作原理 運輸層5 tcp報文段的首部格式 運輸層6 tcp可靠傳輸的實現 運輸層7 tcp的流量控制和擁塞控制 運輸層8 t...
基礎知識4 TCP狀態
listening 偵聽來自遠方的tcp埠的連線請求 首先服務端需要開啟乙個socket進行監聽,狀態為listen syn sent 客戶端syn sent狀態,當請求連線時客戶端首先要傳送同步訊號給要訪問的機器,此時狀態為syn sent,如果連線成功了就變為established 如果發現有很...
報文分析4 TCP協議的頭結構
tcp協議的頭結構 埠 2位元組 目的埠 2位元組 序號 4位元組 確認序號 4位元組 頭長度 4位 保留 6位 urgack pshrst synpin 視窗大小 2位元組 校驗和 16位 緊急指標 16位 選項 可選 資料 1 tcp源埠 source port 16位的源埠包含初始化通訊的埠號...