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