1. 程式人生 > >TCP/IP 系列之初印象

TCP/IP 系列之初印象

TCP/IP 初印象

當我們聊 TCP/IP 的時候,一般是在說整個網路協議棧。也就是大家熟知的 OSI 七層模型。我們先拋開七層協議和三次握手這些生硬的知識點,簡單聊聊網路協議棧到底是做什麼的。

網路協議要解決的問題很簡單,打個比方,就是讓身處不同地方的兩個人,能完成聊天通訊。無論我們談及哪一方面的網路知識點,最後都不會脫離這個最基本的場景模型。

首先我們需要分清楚流和包的概念,這也是不少初學者容易混淆的問題。當我們以 iPhone 上的 App 客戶端,向我們的 Server 發資料的時候,我們可以用 Charles、MITMProxy 這類工具抓包,但我們同時也知道 TCP 是基於流的協議,這二者的區別和聯絡在哪呢?

0 和 1 是計算機世界的基礎粒子,大量的 0 和 1 組合在一起就形成了一個流(Stream),客戶端向伺服器傳送資料的時候,說白了就是一堆 0 和 1 的組合。一次完整的 http 會話是建立在一個 TCP 連線之上,這個 TCP 連線的生命週期內所有傳送的資料最後可以看做是一個流。而在這個流裡,我們可以按照某種規則把它切割成一個個的包(packet)。比如 TCP 三次握手裡就包含了 SYN,SYN+ACK,ACK 三個包,而這三個包,不過是整個 TCP Stream 最開始的部分資料而已。

所以簡單來說,一個 TCP 連線裡,是既有流的概念,又有包的存在,有些問題場景下會談論流,另一些則會說起包,端看具體的場景如何。

在開始學習 TCP/IP 之前,最好能在腦中形成一幅 Gif 動態影象,客戶端和伺服器之間有兩根管道,一根上行(從客戶端到伺服器),一根下行(從伺服器到客戶端),管道里流動著無數的 0 和 1,有時候管道里是滿的,有時候管道里則空空如也,每次傳送資料,都會有大量的 0 和 1 從一端湧向另一端。

有了這個基本的抽象理解,就可以進一步填補一些影象細節。

比如 0 和 1 是以什麼形式流動的呢?這個在不同時代裡,所用的物理硬體不同,原理自然也不同,現在大多用的是光纖,光纖裡的 0 和 1 流動可以用下圖表示:

物理層離應用層較遠,深入學習的意義無法立竿見影,遇到實在費解的,可以先跳躍式的閱讀,但有些基礎的細節還是需要明白的。比如,我們知道光速大致是 300000 km/s ,而光在光纖中的物理傳播速度大概是光速的 ⅔,這個知識點可以幫助我們大概估算一個 TCP 連線中的 RTT 值。RTT 即 Round Trip Time,表示一個包從傳送方發出,到收到接收方的反饋,一共耗時多少。RTT 值反應的網路延時的狀況,在很多場景下分析問題都有意義,比如 TCP 重發機制中的 RTO 就跟 RTT 有關,後面的文章我們會細說。一些知識點往往是環環相扣的,跳過的內容過多,後面學習起來會更費解。

延遲

再說下延遲的概念,延遲和頻寬是我們談及網路狀況的兩個重要指標。延遲看上去很好理解,延遲對應的英文術語是 Latency,不少人會覺得延遲主要跟通訊雙方的物理距離相關,距離越遠,自然延遲越高。其實網路延遲嚴格來說,是由兩部分組成的,其一是 Transmission Delay,另一個是 Propagation Delay。這裡出現了一個新單詞 Delay,Delay 和 Lantency 的含義在中文語境裡很難區分,但在英文語境下,二者的使用卻是有明顯的場景差別的,這也是為什麼讀英文原版很重要,可以讓被描述的問題細節更清晰。

先說 Transmission Delay。計算機世界裡的 0 和 1, 最後要能在光纖中傳輸,需要在 Physical Layer 將數字訊號轉化為物理訊號,這個轉化也是存在速度瓶頸的,我們用 Rate (bits/seconds) 來描述這個轉化的速度,Rate 表示每一秒鐘裡,硬體裝置能將多少 bits 轉化為光訊號放入光纖中,那麼 Transmission Delay 就可以用如下公式表示:

Transmission Delay = M / Rate

M 表示有多少 bits。

Transmission Delay 描述的是硬體轉化訊號的延遲,這一步裡訊號還沒有正式進入光纖中傳播,這種延遲和通訊雙方的物理距離是沒有關係的。

再來是 Propagation Delay。這才是大部分人所理解的傳播延遲,和距離直接相關。也可以用如下公式表示:

Propagation Delay = L / S

L 表示兩地的物理距離,S 表示光纖中的傳播速度,即為 ⅔ 光速。

最後我們才是所說的網路延遲:

Latency = Transmission Delay + Propagation Delay

像這種知識細節,如果不去看書,是很難形成準確認知的,這種細節豐滿的認知不是快餐式技術文章可得,需要靜下心來,花時間慢慢啃,一旦形成之後,就牢固的沉澱在記憶裡,這樣才算真正掌握了這方面的知識。

管道容量

再說個有意思的知識點。我們經常將網路通道比作自來水管道,這種比喻其實很貼切,網路管道和自來水管道一樣,也是存在容量限制的。也就是說,光在光纖中傳播的時候,會像自來水一樣,填滿整個光纖,光纖也存在管道容量的限制。有時候,光纖管道會變得很擁擠,一旦擁擠起來,有些包就要排隊等待,延遲就會增加,丟包率也會隨之上升,整個網路狀況就會變差,這也是為什麼 TCP 要做 Flow Control(流控),Flow Control 也是個很經典且有趣的問題,後面會專門寫文章介紹。

網路管道的容量也是可以通過上面提到的元素,用公式計算的:

BD = Rate * Propagation Delay

大家可以思考下這個公式為什麼會是這樣。

好啦,序篇就到這,後面的文章裡,我會逐個講解一些關鍵且重要的知識點。一同進步吧,同時歡迎大家進入小編交流群:624212887,一起交流學習。