關於 TCP/IP 必須要知道的 10 個問題 (上)


一、TCP/IP
TCP/IP協定模型(Transmission Control Protocol/Internet Protocol),
包含了一系列構成互聯網基礎的網路通訊協定,是Internet的核心協議。
基於TCP/IP的參考模型將協定分成四個層次,
它們分別是鏈路層、網路層、傳輸層和應用層。下圖表示TCP/IP模型與OSI模型各層的對照關係

TCP/IP協定族按照層次由上到下,層層包裝。
最上面的是應用層,這裡面有http,ftp 等等我們熟悉的協議。
而第二層則是傳輸層,著名的TCP和UDP協定就在這個層次。
第三層是網路層,IP協定就在這裡,
它負責對資料加上IP位址和其他的資料以確定傳輸的目標。
第四層是資料連結層,這個層次為待傳送的資料加入一個乙太網協定頭,
並進行CRC編碼,為最後的資料傳輸做準備。

上圖清楚地表示了TCP/IP協議中每個層的作用,而TCP/IP協議通信的過程其實就對應著資料入棧與出棧的過程。
入棧的過程,資料發送方每層不斷地封裝首部與尾部,添加一些傳輸的資訊,
確保能傳輸到目的地。出棧的過程,資料接收方每層不斷地拆除首部與尾部,得到最終傳輸的資料。

上圖以HTTP協議為例,具體說明。
二、資料連結
實體層負責0、1位元流與物理設備電壓高低、光的閃滅之間的互換。
資料連結層負責將0、1序列劃分為資料幀從一個節點傳輸到臨近的另一個節點,
這些節點是通過MAC來唯一標識的(MAC,物理位址,一個主機會有一個MAC位址)。

  • 封裝成幀: 把網路層資料包加頭和尾,封裝成幀,幀頭中包括源MAC位址和目的MAC位址。
  • 透明傳輸:零比特填充、轉義字元。
  • 可靠傳輸: 在出錯率很低的鏈路上很少用,但是無線鏈路WLAN會保證可靠傳輸。
  • 差錯檢測(CRC):接收者檢測錯誤,如果發現差錯,丟棄該幀。
三、網路
1IP協議
IP協定是TCP/IP協定的核心,所有的TCP,UDP,IMCP,IGMP的資料都以IP資料格式傳輸。
要注意的是,IP不是可靠的協議,這是說,IP協定沒有提供一種資料未傳達以後的處理機制,
這被認為是上層協議:TCP或UDP要做的事情。

1.1 IP地址
在資料連結層中我們一般通過MAC地址來識別不同的節點,
而在IP層我們也要有一個類似的位址標識,這就是IP位址。
32位元IP位址分為網路位元和位址位元,這樣做可以減少路由器中路由表記錄的數目,
有了網路位址,就可以限定擁有相同網路位址的終端都在同一個範圍內,
那麼路由表只需要維護一條這個網路位址的方向,
就可以找到相應的這些終端了。A類IP地址: 0.0.0.0~127.0.0.0

B類IP地址:128.0.0.1~191.255.0.0
C類IP地址:192.168.0.0~239.255.255.0
1.2 IP協議頭
這裡只介紹:八位的TTL欄位。這個欄位規定該資料包在穿過多少個路由之後才會被拋棄。
某個IP資料包每穿過一個路由器,該資料包的TTL數值就會減少1,當該資料包的TTL成為零,
它就會被自動拋棄。這個欄位的最大值也就是255,
也就是說一個協議包也就在路由器裡面穿行255次就會被拋棄了,
根據系統的不同,這個數位也不一樣,一般是32或者是64。

2ARPRARP協議
ARP 是根據IP位址獲取MAC位址的一種協議。ARP(位址解析)協定是一種解析協定,
本來主機是完全不知道這個IP對應的是哪個主機的哪個介面,當主機要發送一個IP包的時候,
會首先查一下自己的ARP快取記憶體(就是一個IP-MAC位址對應表緩存)。
如果查詢的IP-MAC值對不存在,那麼主機就向網路發送一個ARP協定廣播包,
這個廣播包裡面就有待查詢的IP地址,而直接收到這份廣播的包的所有主機都會查詢自己的IP位址,
如果收到廣播包的某一個主機發現自己符合條件,
那麼就準備好一個包含自己的MAC位址的ARP包傳送給發送ARP廣播的主機。
而廣播主機拿到ARP包後會更新自己的ARP緩存(就是存放IP-MAC對應表的地方)。
發送廣播的主機就會用新的ARP緩存資料準備好資料連結層的的資料包發送工作。
RARP協議的工作與此相反,不做贅述。

3ICMP協議
IP協定並不是一個可靠的協定,它不保證資料被送達,那麼,自然的,保證資料送達的工作應該由其他的模組來完成。
其中一個重要的模組就是ICMP(網路控制報文)協定。
ICMP不是高層協定,而是IP層的協議。當傳送IP資料包發生錯誤。
比如主機不可達,路由不可達等等,ICMP協定將會把錯誤資訊封包,然後傳送回給主機。
給主機一個處理錯誤的機會,這 也就是為什麼說建立在IP層以上的協議是可能做到安全的原因。
四、ping
ping可以說是ICMP的最著名的應用,是TCP/IP協議的一部分。
利用“ping”命令可以檢查網路是否連通,可以很好地説明我們分析和判定網路故障。
例如:當我們某一個網站上不去的時候。通常會ping一下這個網站。
ping會回顯出一些有用的資訊。一般的資訊如下:
ping這個單詞源自聲納定位,而這個程式的作用也確實如此,它利用ICMP協議包來偵測另一個主機是否可達。
原理是用類型碼為0的ICMP發請求,受到請求的主機則用類型碼為8的ICMP回應。
五、Traceroute
Traceroute是用來偵測主機到目的主機之間所經路由情況的重要工具,也是最便利的工具。
Traceroute的原理是非常非常的有意思,它收到到目的主機的IP後,
首先給目的主機發送一個TTL=1的UDP資料包,而經過的第一個路由器收到這個資料包以後,
就自動把TTL減1,而TTL變為0以後,路由器就把這個包給拋棄了,
並同時產生 一個主機不可達的ICMP資料包給主機。
主機收到這個資料包以後再發一個TTL=2的UDP資料包給目的主機,
然後刺激第二個路由器給主機發ICMP資料 報。如此往復直到到達目的主機。
這樣,traceroute就拿到了所有的路由器IP。
六、TCP/UDP
TCP/UDP都是是傳輸層協議,但是兩者具有不同的特性,
同時也具有不同的應用場景,下面以圖表的形式對比分析。
面向報文面向報文的傳輸方式是應用層交給UDP多長的報文,UDP就照樣發送,即一次發送一個報文。
因此,應用程式必須選擇合適大小的報文。若報文太長,則IP層需要分片,降低效率。
若太短,會是IP太小。面向位元組流面向位元組流的話,
雖然應用程式和TCP的交互是一次一個資料塊(大小不等),但TCP把應用程式看成是一連串的無結構的位元組流。
TCP有一個緩衝,當應用程式傳送的資料塊太長,TCP就可以把它劃分短一些再傳送。
關於擁塞控制,流量控制,是TCP的重點,後面講解。TCP和UDP協議的一些應用

什麼時候應該使用TCP
當對網路通訊品質有要求的時候,比如:整個資料要準確無誤的傳遞給對方,
這往往用於一些要求可靠的應用,比如HTTP、HTTPS、FTP等傳輸檔的協議,POP、SMTP等郵件傳輸的協定。

什麼時候應該使用UDP
當對網路通訊品質要求不高的時候,要求網路通訊速度能儘量的快,這時就可以使用UDP。