傳送端應用程式通過套接字介面將資料傳向傳輸層之後,這些資料就歸傳輸層管了,這裡就是tcp協議。tcp協議會管理乙個傳送快取,所有通過套接字介面的資料會被放到這個傳送快取中去,然後tcp每次從這個快取中拿出資料,將資料傳遞到網路層。其實這個過程就是多路復用。
我們可以這麼理解,把整個過程想象成乙個快遞系統,我們每家每戶就相當於應用程式,當我們要寄快遞的時候,我們是不是要把快遞交給快遞員,這裡這個快遞員就相應於套接字。我們的快遞是通過快遞員傳遞的嗎?當然不是,快遞員會把每個收集的快遞包裹放到乙個分發中心,然後通過物流來運輸快遞。這裡的這個分發中心就相當於tcp協議的傳送快取。
這些傳送快取中的資料是被多次運輸才最終被送走的,就像在分發中心有十幾噸的貨物,但我的貨車最多只能運輸一噸的貨物,那麼就只能將貨物打包成乙個個一噸重的包裹再通過貨車進行運輸。在tcp協議中也是一樣,tcp每次能從發生快取中取出資料的上限叫做最大報文長度(mss),這個mss由你自己主機的傳送能力所決定。tcp會為每個取出的資料段加上乙個tcp首部,這個tcp首部會指示這個資料的一些資訊,比如要傳向**,序列號等等。需要注意的是,mss指的是資料段的最大長度,並不是指包括tcp首部的tcp報文段。
1.tcp報文段結構
源埠號和目的埠號都是16位元字,也就是說埠號的長度為2^16 -1 = 65535。也就是說可用埠號是0~65535。其中0到1023是周知埠號,也就是某些特定的應用程式所要使用的,比如http用的是80埠,dns用的是53埠等等。所以一般的應用程式被分配的埠號會從1024開始分配。
序號指的是資料字節流的位元組號,用seq表示。比如資料是1000個位元組,而mss大小為100位元組,則第乙個報文序號為0,第二個報文序號是0+100=100,而不是0+1=1。第三個報文序號就是100+100=200了。序號指的是位元組流首位元組的位元組號,而不是指這是第幾個位元組流。
確認號是主機a期望從主機b收到的下一位元組的序號,用ack表示。比如主機a已經收到序號為500的報文段,則主機a會傳送乙個確認號為501的響應報文,表示已經收到了500之前的所有報文段,期待收到從501開始的報文段。確認號對於tcp傳輸資料可靠協議來說是非常重要的。
檢驗和是用來檢測資料是否發生損失的。
接收視窗是用來為流量控制服務的,流量控制我會在下文講到。
資料段就是tcp從傳送快取中取出的資料。
一條tcp連線的每一側主機都會為該連線設定接收快取(模擬之前的傳送快取)。tcp協議將接收到的資料放到接收快取中,需要的應用程式從該快取中取走資料。需要注意的是,應用程式並不是每次資料一到達就立即取走,而是在自己需要的都是才去拿走資料。所以如果應用程式取走的比較少,而tcp協議接收的比較多,久而久之,這個接收快取就會被填滿,導致接收快取傳送溢位。
為了避免這個情況,tcp協議提供了流量控**務。tcp協議在報文首部增加接收視窗(rwnd)字段用來指示接收快取中空閒區的大小。只要保證傳送端傳送的資料量控制在接收視窗大小之內,就不會使對方接收快取發生溢位現象。
首先我們得知道什麼是擁塞,擁塞指的是網路中傳輸的資料達到了承載上限,有可能會導致資料丟包的發生。
我們知道網路資料的傳輸是經過乙個個路由器的,路由器接收傳入資料,通過將傳入資料導向指定的資料鏈路。路由器會管理乙個快取佇列,當從鏈路中導向路由器資料的速率大於路由器匯出速率的時候,路由器會將多出來的資料放到快取佇列中。但這個快取空間也是有限的,如果快取空間已滿,這時新到來乙個資料。那麼這個資料或者快取佇列中的某個資料就會被丟棄,從而導致丟包。
因為tcp協議是可靠的資料傳輸協議,所有當丟包發生的時候,tcp協議會讓發生端重新傳送丟失的資料報,並且降低傳送速率,因為丟包的發生已經說明當前速率超過了網路承載的上限。tcp協議用擁塞視窗(cwnd)(模擬之前的接收視窗)來控制傳送速率。
那麼如何知道丟包的發生呢?一種方法是檢測超時,就是我這個資料報傳送一段時間後仍未檢測到確認訊號,那麼就說明這個資料報已經丟失。另一種情況是當我收到多個冗餘確認訊號時,也說明有丟包的發生。這個傳送在流水線可靠傳輸協議的情況下。可以這麼理解,主機a成功傳送序號為100的報文段給主機b,主機b會反饋確認號為101的報文段給主機a,說明報文100已經收到,期待報文101。主機a接著傳送序號為101的報文,這個報文在網路中發生丟包。在流水線傳輸協議中,主機a會繼續傳輸接下來的報文,也就是序號為102,103…的報文,但報文數量不會超過視窗值(這個視窗值是之前設定過的)。當主機b接收到報文102時發現報文101還未送到,所以仍會傳送確認訊號101給主機a,並把報文102放到快取視窗中去;同理,當主機b接收到報文103時發現報文101仍未送達,所以依然會傳送確認訊號101。那麼對於主機a來說,它就接收到了多次相同的101確認訊號,我們稱之為冗餘訊號。主機a就會得出判斷,報文101已經發生丟包。
計算機網路 傳輸層
為什麼要劃分傳輸層?既然網路層已經能把源主機上發出的資料傳送給目的主機,那麼為什麼還需要加上乙個傳輸層呢?這就需要我們理解主機使用者應用層通訊的主體,位於兩台網路主機中真正的資料通訊主體並不是這兩台主機,而是兩台主機中的各種網路應用程序.同一時間一台主機上可能有多個程序同時執行,這時候就需要為應用程...
計算機網路(傳輸層)
網路層提供了主機之間的邏輯通訊,運輸層為運輸在不同主機上的程序之間提供了邏輯通訊。運輸層協議是在端系統中而不是在路由器中實現的。運輸協議能夠提供的服務常常受制於底層網路層協議的服務模型。底層無法提供時延或頻寬保證,運輸層協議也無法提供。但是即使底層網路協議不可靠,運輸協議也可以提供可靠的資料傳輸服務...
計算機網路 傳輸層
運輸層最重要的兩種協議 tcp協議,udp協議 真正的通訊 兩個主機之間應用程序的通訊 運輸層的重要功能 1 復用 傳送方的不同應用程序使用同乙個運輸層協議傳輸資料 應用層 運輸層 2 分用 接收方的運輸層在剝去報文首部後把資料真正交付到目的應用程序 運輸層 應用層 網路層和運輸層的區別 網路層說明...