傳輸層的作用
按照OSI參考模型的劃分,傳輸層負(fù)責(zé)管理兩個(gè)節(jié)點(diǎn)之間的數(shù)據(jù)傳輸。更具體的,網(wǎng)絡(luò)層能夠根據(jù)IP地址,將數(shù)據(jù)發(fā)送到指定的目標(biāo)主機(jī),而傳輸層則需要將數(shù)據(jù)發(fā)送到更為具體的某一個(gè)具體的應(yīng)用程序。
傳輸層中有兩個(gè)非常具有代表性的傳輸層協(xié)議,他們分別是TCP和UDP。TCP是面向連接的,負(fù)責(zé)可靠的通信傳輸,而UDP則是不具有可靠性的,常被用于廣播和細(xì)節(jié)控制交給應(yīng)用的通信傳輸。
端口號(hào)
數(shù)據(jù)鏈路和IP中的地址,分別指的是MAC地址和IP地址,前者用來識(shí)別同一鏈路中不同的計(jì)算機(jī),后者用來識(shí)別TCP/IP網(wǎng)絡(luò)中互連的主機(jī)和路由器。在傳輸層中,也有類似于地址的概念,那就是端口號(hào)。端口號(hào)用來識(shí)別同一臺(tái)計(jì)算機(jī)中進(jìn)行通信的不同應(yīng)用程序,因此,它也被稱為程序地址。
- 端口號(hào)的作用
一臺(tái)計(jì)算機(jī)上同時(shí)運(yùn)行多個(gè)程序,例如瀏覽器,email客戶端,ssh客戶端等程序都可以同時(shí)運(yùn)行,傳輸層正是利用這些端口號(hào)識(shí)別本機(jī)中正在進(jìn)行通信的應(yīng)用程序,并準(zhǔn)確的將數(shù)據(jù)傳輸。

- 如何進(jìn)行通信識(shí)別
TCP/IP中,要識(shí)別一個(gè)通信,通常要5個(gè)要素:源地址IP,目標(biāo)地址IP,協(xié)議號(hào),源端口號(hào),目標(biāo)端口號(hào),只有這5個(gè)信息完全一致,才能識(shí)別他們是否為同一個(gè)通信。

- 端口號(hào)如何確定
在實(shí)際進(jìn)行通信時(shí),要事先確定端口號(hào)。確定端口號(hào)的方法主要有兩種: - 標(biāo)準(zhǔn)既定的端口號(hào):一般0-1023的為知名端口號(hào)。
- 時(shí)序分配法:服務(wù)端有必要監(jiān)聽端口號(hào),接受服務(wù)的客戶端沒有必要確定端口號(hào),這種方法下,客戶端應(yīng)用程序可以完全不用自己設(shè)置端口號(hào),而全權(quán)交給操作系統(tǒng)進(jìn)行分配。操作系統(tǒng)可以為每個(gè)應(yīng)用程序分配互不沖突的端口號(hào)。
- 端口號(hào)與協(xié)議
端口號(hào)由其使用的傳輸層協(xié)議決定。因此,不同的傳輸協(xié)議可以使用相同的端口號(hào)。
UDP
UDP不提供復(fù)雜的控制機(jī)制,利用IP提供面向無連接的通信服務(wù)。并且它是將應(yīng)用程序發(fā)來的數(shù)據(jù)在收到的那一刻,立即按照原樣發(fā)送到網(wǎng)絡(luò)上的一種機(jī)制。因此,UDP不提供擁塞控制,丟包重發(fā),順序控制等功能,但能夠簡單高效的發(fā)送數(shù)據(jù),通常用于以下幾方面:
- 包總量較少的通信(DNS、SNMP等)
- 視頻、音頻等多媒體通信(即時(shí)通信)
- 限定于LAN等特定網(wǎng)絡(luò)中的應(yīng)用通信
- 廣播通信(廣播、多播)
TCP
相對于UDP的面向無連接快速簡單高效,TCP則是一種面向連接的,具備順序控制、重發(fā)控制、擁塞管理等機(jī)制的可靠的通信傳輸協(xié)議。
TCP通過檢驗(yàn)和、序列號(hào)、確認(rèn)應(yīng)答、重發(fā)控制、連接管理以及窗口控制等機(jī)制實(shí)現(xiàn)可靠性傳輸。
- 通過序列號(hào)與確認(rèn)應(yīng)答提高可靠性
在TCP中,當(dāng)發(fā)送端的數(shù)據(jù)到達(dá)接收主機(jī)時(shí),接收端主機(jī)會(huì)返回一個(gè)已收到消息的通知。這個(gè)消息叫做確認(rèn)應(yīng)答(ACK)。另外,為了避免接收重復(fù)的數(shù)據(jù),TCP中會(huì)給每個(gè)數(shù)據(jù)添加序列號(hào),接收端查詢接收數(shù)據(jù)TCP首部中的序列號(hào)和數(shù)據(jù)的長度,將自己下一步應(yīng)該接收的序列號(hào)作為確認(rèn)應(yīng)答返送出去。通過序列號(hào)和確認(rèn)應(yīng)答,TCP可以實(shí)現(xiàn)可靠傳輸。

- 重發(fā)超時(shí)確定
重發(fā)超時(shí)是指在重發(fā)數(shù)據(jù)之前,等待確認(rèn)應(yīng)答到來的那個(gè)特定時(shí)間間隔。如果超過這個(gè)時(shí)間仍未收到確認(rèn)應(yīng)答,發(fā)送端將進(jìn)行數(shù)據(jù)重發(fā)。那么,這個(gè)重發(fā)超時(shí)的具體時(shí)間長度是如何確定的呢?
TCP中,在每次發(fā)包時(shí)都會(huì)計(jì)算往返時(shí)間及其偏差。將這個(gè)往返時(shí)間(報(bào)文段的往返時(shí)間)和偏差時(shí)間相加,重發(fā)超時(shí)的時(shí)間就是比這個(gè)總和稍大一點(diǎn)的值。

- 連接管理(三次握手和四次握手)
TCP提供面向連接的通信傳輸,連接是指各種設(shè)備、線路,或網(wǎng)絡(luò)中進(jìn)行通信的兩個(gè)應(yīng)用程序?yàn)榱讼嗷鬟f信息而專有的、虛擬的通信線路,也叫虛擬電路。一旦建立了連接,進(jìn)行通信的應(yīng)用程序只使用這個(gè)虛擬的通信線路發(fā)送和接收數(shù)據(jù),就可以保障信息的傳輸。建立一個(gè)TCP連接需要發(fā)送三個(gè)包,也稱為三次握手,斷開一個(gè)了解需要發(fā)送四個(gè)包,也稱為四次握手。

- TCP以段為單位發(fā)送數(shù)據(jù)
在建立TCP連接的同時(shí),也可以確定發(fā)送數(shù)據(jù)包的單位,我們稱之為“最大消息長度(MSS)”。TCP在傳送大量數(shù)據(jù)時(shí),是以MSS的大小將數(shù)據(jù)進(jìn)行分割傳送。進(jìn)行重發(fā)也是以MSS為單位。
MSS是在三次握手的時(shí)候,在兩端主機(jī)之間被計(jì)算得出的。兩端主機(jī)在發(fā)出建立連接的請求時(shí),會(huì)在TCP首部中寫入MSS選項(xiàng)。告訴對方自己的接口能夠適應(yīng)的MSS的大小,然后會(huì)在兩者之間選擇一個(gè)較小的值投入使用。

- 利用窗口控制提高速度
TCP以段為單位,每發(fā)一個(gè)段,進(jìn)行一次確認(rèn)應(yīng)答的處理,不過,這種方式下,包的往返時(shí)間越長通信性能越低。為了解決這個(gè)問題,TCP引入了窗口這個(gè)概念。即使在往返時(shí)間較長的情況下,它也能夠控制網(wǎng)絡(luò)性能的下降。如下圖所示,確認(rèn)應(yīng)答不再是以每個(gè)分段,而是以更大的單位進(jìn)行確認(rèn)時(shí),轉(zhuǎn)發(fā)時(shí)間將會(huì)被大幅的縮短。也就是說,發(fā)送端主機(jī),在發(fā)送了一個(gè)段以后,不必要一直等待確認(rèn)應(yīng)答,而是繼續(xù)發(fā)送。
窗口大小就是指無需等待確認(rèn)應(yīng)答而可以繼續(xù)發(fā)送數(shù)據(jù)的最大值。這個(gè)機(jī)制實(shí)現(xiàn)了使用大量的緩沖區(qū),通過對多個(gè)段同時(shí)進(jìn)行確認(rèn)應(yīng)答的功能。

- 窗口控制與重發(fā)機(jī)制
在使用窗口控制中,如果出線段丟失該怎么辦?考慮兩種情況: - 數(shù)據(jù)已經(jīng)到達(dá)對端,但是,確認(rèn)應(yīng)答未能返回,這種情況下,是不需要進(jìn)行重發(fā)的,在未使用窗口控制的情況下,沒有收到確認(rèn)應(yīng)答的數(shù)據(jù)也是會(huì)被重發(fā),而使用了窗口控制以后,某些確認(rèn)應(yīng)答即便丟失也無需重發(fā)。
- 某個(gè)報(bào)文段丟失了,如下圖所示,當(dāng)1001~2000的報(bào)文段丟失以后,發(fā)送端會(huì)一直收到序號(hào)為1001的確認(rèn)應(yīng)答,而發(fā)送端主機(jī)如果連續(xù)3次收到同一個(gè)確認(rèn)應(yīng)答,就會(huì)將其所對應(yīng)的數(shù)據(jù)進(jìn)行重發(fā)。這種機(jī)制比之前的超時(shí)管理更加高效,因此被稱為高速重發(fā)機(jī)制。

- 流控制
TCP提供了一種機(jī)制,可以讓發(fā)送端根據(jù)接收端的實(shí)際接收能力控制發(fā)送的數(shù)據(jù)量,這就是流控制。他的具體操作是,接收端主機(jī)向發(fā)送端主機(jī)通知自己可以接收數(shù)據(jù)的大小,發(fā)送端發(fā)送不超過這個(gè)限度的數(shù)據(jù),該大小限度就是窗口大小。TCP首部中,專門有一個(gè)字段用來通知窗口大小。

- 擁塞控制
有了TCP的窗口控制,收發(fā)主機(jī)之間能夠連續(xù)的發(fā)送大量數(shù)據(jù)包,然而,如果在通信剛開始是就發(fā)送大量數(shù)據(jù),也可能會(huì)引發(fā)其他問題。
計(jì)算機(jī)網(wǎng)絡(luò)處于一個(gè)共享環(huán)境,因此,可能會(huì)因?yàn)槠渌鳈C(jī)之間的通信使得網(wǎng)絡(luò)擁堵。在網(wǎng)絡(luò)擁堵時(shí),如果突然發(fā)送大量的數(shù)據(jù),極有可能會(huì)導(dǎo)致整個(gè)網(wǎng)絡(luò)的癱瘓。TCP為了防止該問題的出現(xiàn),在通信一開始就會(huì)通過一個(gè)叫做慢啟動(dòng)的算法得出的數(shù)值,對發(fā)送數(shù)據(jù)量進(jìn)行控制。
為了在發(fā)送端調(diào)節(jié)所要發(fā)送數(shù)據(jù)的量,定義了一個(gè)叫做“擁塞窗口”的概念。再慢啟動(dòng)的時(shí)候,將這個(gè)擁塞窗口的大小設(shè)置為1個(gè)數(shù)據(jù)段(1MSS)發(fā)送數(shù)據(jù),之后每一次收到一次確認(rèn)應(yīng)答(ACK),擁塞窗口的值就加1.在發(fā)送數(shù)據(jù)包時(shí),將擁塞窗口的大小和接收端主機(jī)通知的窗口大小做比較,然后按照他們當(dāng)匯總較小的那個(gè)值,發(fā)送比其還要小的數(shù)據(jù)量。

TCP和UDP首部的格式
- UDP首部的格式

如圖所示:UDP首部由源端口號(hào),目標(biāo)端口,包長和校驗(yàn)組成。
- TCP首部的格式

TCP首部主要包括源端口號(hào),目標(biāo)端口號(hào),序列號(hào),確認(rèn)應(yīng)答號(hào),數(shù)據(jù)偏移,控制位,窗口大小,校驗(yàn)和等字段組成,但沒有表示包長度和數(shù)據(jù)長度的字段。可由IP層獲知TCP的包長,由TCP的包長可知數(shù)據(jù)的長度。