http://www.cnblogs.com/glacierh/p/4854009.html
2015
TCP/IP通常被認為是一個四層協(xié)議:
TCP/IP協(xié)議族中不同層次的協(xié)議如下:
互聯(lián)網(wǎng)上的每個接口必須有唯一的IP地址,5類不同的IP地址格式和返回如下:
當應(yīng)用程序用TCP傳送數(shù)據(jù)時,數(shù)據(jù)被送入?yún)f(xié)議棧,然后逐個通過每一層直到被當作一串比特流送入網(wǎng)絡(luò),其中每一層對收到的數(shù)據(jù)都要增加一些首部信息。
鏈路層主要有三個目的:
環(huán)回接口允許運行在同一臺主機上的客戶程序和服務(wù)器程序通過TCP/IP進行通信,IP地址127.0.0.1被分配給這個接口,并命名為localhost。
目的地址的環(huán)回地址時,照樣還是傳輸層和網(wǎng)絡(luò)層的所有過程,只是當IP數(shù)據(jù)報離開網(wǎng)絡(luò)層時把它返回給自己,這樣做簡化了設(shè)計,因為環(huán)回接口可以看作是網(wǎng)絡(luò)層下面的一個鏈路層。網(wǎng)絡(luò)層把一份數(shù)據(jù)報傳送給環(huán)回接口,就像傳送給其它鏈路層一樣,只不過環(huán)回接口把它返回到IP的輸入隊列中。
以太網(wǎng)對數(shù)據(jù)幀的長度有一個限制,最大值是1500。鏈路層的這個特性稱作MTU(最大傳輸單元)。如果IP層數(shù)據(jù)報的長度比鏈路層的MTU還要大,那么IP層就需要進行分片,每一片都要小于MTU。
如果兩臺主機之間的通信要通過多個網(wǎng)絡(luò),那么每個網(wǎng)絡(luò)的鏈路層就可能有不同的MTU。兩臺通信主機路徑中的最小MTU,被稱為路徑MTU。兩個方向上的選路不一定對稱,因此路徑MTU在兩個方向上不一定是一致的。
IP是TCP/IP協(xié)議族中最為核心的協(xié)議。所有的TCP、UDP、ICMP及IGMP數(shù)據(jù)都以IP數(shù)據(jù)報格式傳輸。
IP提供不可靠、無連接的數(shù)據(jù)服務(wù)。不可靠的是指它不能保證IP數(shù)據(jù)報能成功地到達目的地;無連接是指IP并不維護任何關(guān)于后續(xù)數(shù)據(jù)報的狀態(tài)信息,每個數(shù)據(jù)報的處理是相互獨立的。
IP數(shù)據(jù)報格式如下圖所示,普通的IP首部長為20字節(jié),除非含有選項字段。
總長度字段是指整個IP數(shù)據(jù)報的長度,該字段長16位,所以IP數(shù)據(jù)報的最大長度為65535字節(jié)。
最后一個字段是任選項,是數(shù)據(jù)報中的一個可變長的可選信息,如記錄路徑、時間戳等,這些選項一般很少使用。
IP路由選擇是簡單的,對于主機來說,如果目的主機與源主機直接相連或都在一個共享網(wǎng)絡(luò)上,那么IP數(shù)據(jù)報就直接送到目的主機上;否則主機九堡數(shù)據(jù)報發(fā)往一默認的路由器上,由路由器來轉(zhuǎn)發(fā)該數(shù)據(jù)報。
IP層既可以配置成路由器的功能,也可以配置成主機的功能。IP層在內(nèi)存中有一個路由表,當收到一份數(shù)據(jù)報并進行發(fā)送時,它都要對該表搜索一次。當數(shù)據(jù)報來自某個網(wǎng)絡(luò)接口時,IP首先檢查目的IP地址是否為本機的IP地址之一或者IP廣播地址。如果是的話,數(shù)據(jù)報就被送到由IP首部協(xié)議字段所指定的協(xié)議模塊進行處理。如果數(shù)據(jù)報的目的不是這些地址,如果IP層被設(shè)置為路由器的功能,那么就對數(shù)據(jù)報進行轉(zhuǎn)發(fā),否則數(shù)據(jù)報被丟棄。
IP路由選擇是逐跳進行的,IP并不知道到達任何目的的完整路徑,所有IP路由選擇只為數(shù)據(jù)報傳輸提供下一站路由器的IP地址。IP路由選擇主要完成這些功能:
如果上面的步驟都沒有成功,數(shù)據(jù)報就不能被傳送。
現(xiàn)在所有主機都要求支持子網(wǎng)編址。不是把IP地址看成單純的一個網(wǎng)絡(luò)號和一個主機號組成,而是吧主機號再分成一個子網(wǎng)號和一個主機號。
主機通過子網(wǎng)掩碼來確定IP地址多少位用于子網(wǎng)號,多少位用于主機號。子網(wǎng)掩碼是一個32位的值,值為1的位留給網(wǎng)絡(luò)號和子網(wǎng)號,為0的位留給主機號。
給定IP地址和子網(wǎng)掩碼以后,主機就可以確定IP數(shù)據(jù)報的目的是:(1)本子網(wǎng)上的主機;(2)本網(wǎng)絡(luò)中其它子網(wǎng)的主機;(3)其它網(wǎng)絡(luò)上的主機。
ICMP(Internet控制報文協(xié)議)是IP層一個組成部分,它傳遞差錯報文以及其他需要注意的信息,ICMP報文通常被IP層或更高層協(xié)議(TCP或UDP)使用,一些ICMP報文把差錯報文返回給用戶進程。ICMP是在IP數(shù)據(jù)報內(nèi)部被傳輸?shù)摹?/p>
ICMP的一個規(guī)則是,ICMP差錯報文必須包括生成該差錯報文的數(shù)據(jù)報IP首部,還必須至少包括跟在該IP首部后面的前8個字節(jié)。這樣就包含了UDP的首部,接收ICMP的系統(tǒng)就可以根據(jù)源端口號來把差錯報文與某個特定的用戶進程相關(guān)聯(lián)。
Ping程序目的是為了測試另一臺主機是否可達。該程序發(fā)送一份ICMP回顯請求報文給主機,并等待返回ICMP回顯應(yīng)答。Ping程序還能測出到這臺主機的往返時間。大多數(shù)的TCP/IP實現(xiàn)都在內(nèi)核中直接支持Ping服務(wù),這種服務(wù)器不是一個用戶進程。
Ping程序通過在ICMP報文數(shù)據(jù)中存放請求的時間值來計算往返時間。當應(yīng)答返回時,用當前時間減去存放在ICMP報文中的時間值,既是往返時間。
Traceroute程序可以讓我們看到IP數(shù)據(jù)報從一臺主機傳到另一臺主機所經(jīng)過的路由,Traceroute程序還可以讓我們使用IP源路由選項。
Traceroute程序的操作過程是,它發(fā)送一份TTL字段為1的IP數(shù)據(jù)報給目的主機。處理這份數(shù)據(jù)報的第一個路由器將TTL值減1,丟棄改數(shù)據(jù)報,并發(fā)回一份超時ICMP報文。這樣就得到了該路徑的第一個路由器地址。然后Traceroute程序發(fā)送一份TTL為2的數(shù)據(jù)報,這樣我們就可以得到第二個路由器的地址。繼續(xù)這個過程直至該數(shù)據(jù)報到達目的主機。
Traceroute程序發(fā)送一份UDP數(shù)據(jù)報給目的主機,但它選擇一個不可能的值作為UDP端口號,將使目的主機的UDP模塊產(chǎn)生一份"端口不可達"錯誤的ICMP報文,這樣就可以區(qū)分接收到的ICMP報文是超時還是端口不可達,以判斷什么時候結(jié)束。
UDP是一個簡單的面向數(shù)據(jù)報的傳輸層協(xié)議。應(yīng)用程序必須關(guān)心IP數(shù)據(jù)報的長度,如果它超過了MTU,就要對IP數(shù)據(jù)報進行分片。
UDP首部的各字段如下圖:
端口號表示發(fā)送進程和接收進程,TCP端口號由TCP來查看,而UDP端口號由UDP來查看,TCP端口號和UDP端口號是相互獨立的。
IP數(shù)據(jù)報的最大長度時65535字節(jié),這是由IP首部16比特總長度字段所限制的。除去20字節(jié)的IP首部和8字節(jié)的UDP首部,UDP數(shù)據(jù)報中用戶數(shù)據(jù)的最長長度為65507字節(jié)。
IP把MTU與數(shù)據(jù)報長度進行比較,如果需要則進行分片。分片可以發(fā)生在原始發(fā)送端主機上,也可以發(fā)生在中間路由器上。把一份IP數(shù)據(jù)報分片以后,只有到達目的地才進行重新組裝。重新組裝由目的端的IP層來完成,其目的是使分片和重新組裝過程對傳輸層透明。
IP數(shù)據(jù)報中的標識字段包含一個唯一值,該值在數(shù)據(jù)報分片時被復(fù)制到每個片中。標志字段用其中一個比特來表示"更多的片",除最后一片外,其它每個組成數(shù)據(jù)報的片都要報該比特置1。片偏移字段指的是該片偏移原始數(shù)據(jù)報開始處的位置。
由于IP層本身沒有超時重傳的機制,即使只丟失一片數(shù)據(jù)也要重傳整個數(shù)據(jù)報。如果對數(shù)據(jù)報分片的是中間路由器,而不是起始端系統(tǒng),那么起始端系統(tǒng)就無法知道數(shù)據(jù)報是如何被分片的。所以要避免分片。
需要注意的是,任何傳輸層首部只出現(xiàn)在第1片數(shù)據(jù)中。
TCP提供一種面向連接的、可靠的字節(jié)流服務(wù)。TCP通過以下方式來提供可靠性:
TCP首部的數(shù)據(jù)格式如下圖:
序號用來標識從TCP發(fā)送端想TCP接收端發(fā)送的數(shù)據(jù)字節(jié)流,它表示在這個報文段中的第一個數(shù)據(jù)字節(jié),TCP用需要對每個字節(jié)進行計數(shù)。確認序號包含發(fā)送確認的一端所期望收到的下一個序號,確認序號是上次已成功收到的數(shù)據(jù)字節(jié)序號加1。
TCP的流量控制由連接的每一端通過聲明的窗口大小來提供,這個值是接收端正期望接收的字節(jié)。窗口大小是一個16位的字段,所以窗口大小最大是65535字節(jié),新的窗口擴大選項允許這個值按比例變化以提供更大的窗口。
TCP使用滑動窗口協(xié)議的形式進行流量控制。該協(xié)議允許發(fā)送方在停止并等待確認前可以連續(xù)發(fā)送多個分組,可以加速數(shù)據(jù)的傳輸。
使用TCP的滑動窗口協(xié)議時,接收方不必確認每一個收到的分組,ACK是累積的,它們表示接收方已經(jīng)正確收到了一直到確認序號減1的所有字節(jié)。
在應(yīng)用程序讀取了TCP緩沖區(qū)的數(shù)據(jù)后,TCP在需要的時候會發(fā)送一個ACK,它并不確認任何新數(shù)據(jù),只是用來增加窗口的右邊沿,因此被稱為窗口更新。
滑動窗口的動態(tài)性總結(jié)如下:
TCP需要支持一種被稱為慢啟動的算法,該算法通過觀察到新分組進入網(wǎng)絡(luò)的速率應(yīng)該與另一端返回確認的速率相同而進行工作。慢啟動為發(fā)送方的TCP增加了另一個窗口:擁塞窗口,擁塞窗口被初始化為1個報文段,每收到一個ACK,擁塞窗口就增加一個報文段。發(fā)送方取擁塞窗口與通告窗口中的最小值作為發(fā)送上限。擁塞窗口是發(fā)送方使用的流量控制,而通告窗口則是接收方使用的流量控制。
對每個連接,TCP管理4個不同的定時器:
TCP在對端ACK超時后按照一定的時間間隔進行重試,在多次重試仍超時后最終會放棄并發(fā)送一個復(fù)位信號。每次重試的時間間隔是一種被稱為指數(shù)退避的倍乘關(guān)系,直至一個最大值,如重傳間隔每次重傳時增加1倍直至64秒。
TCP超時與重傳中最重要的部分就是對一個給定連接的往返時間(RRT)的測量。由于路由器和網(wǎng)絡(luò)流量均會變化,因此我們認為這個時間可能經(jīng)常會發(fā)生變化,TCP應(yīng)該跟蹤這些變化并相應(yīng)地改變其超時時間。
TCP在收到一個失序的報文段時,立即需要產(chǎn)生一個ACK,這個重復(fù)的ACK目的在于讓對方知道收到一個失序的報文段。發(fā)送端端不知道的ACK是由一個丟失的報文段引起的,還是由于僅僅出現(xiàn)了幾個報文段的重新排序,如果一連串收到3個或3個以上重復(fù)ACK,就非常可能是一個報文段丟失了,于是發(fā)送端就重傳丟失的數(shù)據(jù)報文段,而無需等待超時定時器溢出,這就是快速重傳算法。
聯(lián)系客服