計算機網絡分了五層(應用層,運輸層,網絡層,鏈路層,物理層),《自頂向下》的第三章詳細講解了運輸層的兩大協議以及其背後原理,其中tcp協議是本章乃至整個計算機網絡的一個重點內容,鑑於此,我以爲有必要對本章做個筆記,以鞏固運輸層的知識。算法
運輸層的目的在於爲不一樣主機(host)上的應用或者說進程提供邏輯通訊——經過運輸層協議,兩臺電腦彷彿直接相連同樣。應用無需知道底層內部實現的原理和細節,好比怎麼把遠隔世界兩地電腦上的數據進行相互傳輸。編程
本章的一些注意點:api
當運輸層收到來自上方應用層的數據時,運輸層會爲數據封上一些頭部信息,根據全部協議不一樣,封上的信息也不同。這一行爲,被稱爲多路複用。瀏覽器
當運輸層收到下方網絡層傳輸來的數據時,運輸層會檢查多路複用時封上的信息,從而正確的把數據定向到相應的進程。緩存
如何使用運輸層的協議? 操做系統提供了被稱爲socket的接口api供編程人員調用,對socket的形象理解是其是一種抽象,將複雜的實現(tcp, udp)協議的各類行爲抽造成簡單的幾個函數給開發人員使用。就像瀏覽器將發送請求報文這一http協議規定的行爲,抽象成咱們只須要輸入url而後回車便可。網絡
這裏須要注意的一點是,在通常狀況下,一個計算機端口只能被一個進程佔用。一個進程能夠建立多個socket,多個tcp socket能夠監聽同一個端口,並保證接受的數據依舊是正確的。但多個udp socket就沒法監聽同一端口。這其中的差別源於tcp和udp協議的不一樣,tcp是面向鏈接的,其有足夠狀態的信息來分辨數據來源,後定向到正確的socket。但udp不須要維持鏈接,僅僅經過端口號來決定數據的去向,因此會致使衝突。socket
一個udp socket經過一個二元組(目的ip地址,目的端口號)來標識,當輸入層收到數據時,經過檢查這個二元組,來定向數據該去往哪個udp socket。這也是爲何多個udp socket沒法監聽同一個端口的緣由,由於系統沒法再根據二元組來肯定消息的去向(它們的二元組是同樣的)。tcp
一個tcp socket經過一個四元組(源ip,源端口,目的ip,目的端口號)來標識,這也解釋爲何多個tcp socket能夠監聽同一個端口,儘管目的ip和目的端口號是同樣的,可是源ip和源端口的組合老是不一樣的。函數
相比於TCP來說,UDP是一個簡單的協議,就是把網絡層IP提供的服務封裝了下,實現了多路複用和分解,提供了端到端進程間的通訊和錯誤檢驗服務。性能
相對於TCP來講:
但:
在接收到應用層傳輸來數據後,在數據前方加上了四個字段,分別是源端口號、目的端口號、長度(包括頭部)、檢驗和,應用數據。
數據傳輸可能遇到的問題:
解決方法:
如何在保證可靠性的前提下,提升其性能?
引入流水線致使了:
其核心在於,發送方會維持一個窗口,發送方能發送的數據量取決於窗口長度,而且當丟失時會重送全部未確認的分組。
接收方會丟棄亂序到達的緩存
特色:
核心在於,收發雙方都會維持一個窗口,而且盡力保證窗口的狀態是同步的,所以當分包丟失時,發送方只會重送丟失的分組。
接收方會緩存亂序到達的分組
特色:
特色:
源端口號
目的端口號
序號(seq) - 所帶數據的第一個比特的序號,同時也是接收方期待的序號,等於接收方回覆報文中的ACK(n)中的n
確認號(ACK) - 對於一個ACK(n)來講,告訴對方n-1前的數據已經收到,下一次期待的序列號爲n
首部長度
URG
ACK - 指示,用於指示報文中確認號字段的值是有效的
PSH - 指示,當即發送發送緩存裏的數據
RST - 指示,用於強制關閉鏈接
SYN - 指示,用於握手階段也就是創建鏈接的階段
FIN - 指示,用於正常關閉鏈接
接受窗口 - 用於TCP的流量控制功能
因特網檢驗和
緊急數據指針
選項
應用數據
當連續收到4個相同的ACK時(一個正常的ACK,三個正常ACK的重複),會觸發快速重傳,當即重發分組
爲了防止太高數據流量致使接收者的接受緩存爆掉,接收者會在其tcp報文中經過 接受窗口 指示發收者還能發送多少數據
接受窗口(rwnd)公式:
TCP採用端到端的擁塞控制
三個主要問題:
經過設置一個擁塞窗口(cwnd),而且保證:LastByteSent - LastByteAcked <= min{cwnd, rwnd}
cwnd的值從1 MSS開始,而且對每個ACK,cwnd值變爲原來的2倍,直到超過閾值(ssthresh),轉爲擁塞避免模式
在每個RRT時間,cwnd的值增長一個MSS
cwnd的值降爲一半加上重複收到的重複ACK的數量,而且每個ACK,cwnd的值增長一個MSS
在實踐中,一旦timeout就會會到慢啓動的狀態,屢次重複ACK則會進入快速恢復狀態
TCP的公平性在於保證每一個鏈接的吞吐量是平均的,而不是應用或進程間。