网络基础 - 常見的通訊協定 IP/TCP/UDP/ICMP

来源:互联网 发布:python index函数 编辑:程序博客网 时间:2024/04/24 15:39

IP 封包的表頭

現在我們知道 IP 這個資料封包 (packet) 是需要放置在 MAC 訊框裡面的,所以當然不能比 MAC 所能容許的最大資料量還大!但是 IP 封包其實可以到 65535 bytes 那麼大的吶! 那麼 IP 封包除了資料之外,他的表頭資料 (head) 是長怎樣呢? 在圖三的 MAC 訊框表頭裡面最重要的莫過於那個網路卡硬體位址, 那麼在 IP 表頭裡面當然就以來源與目標的 IP 位址為最重要囉! 除此之外, IP 表頭裡面還含有哪些重要資料呢?如底下所示:(下圖第一行為每個欄位的 bit 數)

4 bits4 bits8 bits3 bits13 bitsVersionIHLType of ServiceTotal LengthIdentificationFlagsFragmentation OffsetTime To LiveProtocolHeader ChecksumSource AddressDestination AddressOptionsPaddingData圖八、IP 封包的表頭資料
在上面的圖示中有個地方要注意,那就是『每一行所佔用的位元數為 32 bits』, 也就是說, IP 封包的表頭資料是 32 bits 的倍數喔!那各個表頭的內容分別介紹如下:
  • Version(版本)
    宣告這個 IP 封包的版本,例如目前慣用的還是 IPv4 這個版本,在這裡宣告的。
  • IHL(Internet Header Length, IP表頭的長度)
    告知這個 IP 封包的表頭長度,使用的單位應該是字組 (word) ,一個字組為 4bytes 大小喔。
  • Type of Service(服務類型)
    這個項目的內容為『PPPDTRUU』,表示這個 IP 封包的服務類型,主要分為:
    PPP:表示此 IP 封包的優先度; D:若為 0 表示一般延遲(delay),若為 1 表示為低延遲;
    T:若為 0 表示為一般傳輸量 (throughput),若為 1 表示為高傳輸量;
    R:若為 0 表示為一般可靠度(reliability),若為 1 表示高可靠度。
    UU:保留尚未被使用。
    我們前面談到 gigabit 乙太網路時曾提到 Jumbo frame 對吧!可以提高 MTU, 由於 gigabit 乙太網路的種種相關規格可以讓這個 IP 封包加速且降低延遲, 某些特殊的標誌就是在這裡說明的。
  • Total Length(總長度)
    指這個 IP 封包的總容量,包括表頭與內容 (Data) 部分。最大可達 65535 bytes。
  • Identification(辨別碼)
    我們前面提到 IP 袋子必須要放在 MAC 袋子當中。不過,如果 IP 袋子太大的話, 就得先要將 IP 再重組成較小的袋子然後再放到 MAC 當中。而當 IP 被重組時, 每個來自同一筆資料的小 IP 就得要有個識別碼以告知接收端這些小 IP 其實是來自同一個封包才行。 也就是說,假如 IP 封包其實是 65536 那麼大 (前一個 Total Length 有規定), 那麼這個 IP 就得要再被分成更小的 IP 分段後才能塞進 MAC 訊框中。那麼每個小 IP 分段是否來自同一個 IP 資料,呵呵!這裡就是那個識別碼啦!
  • Flags(特殊旗標)
    這個地方的內容為『0DM』,其意義為:
    D:若為 0 表示可以分段,若為 1 表示不可分段
    M:若為 0 表示此 IP 為最後分段,若為 1 表示非最後分段。
  • Fragment Offset(分段偏移)
    表示目前這個 IP 分段在原始的 IP 封包中所佔的位置。 就有點像是序號啦,有這個序號才能將所有的小 IP 分段組合成為原本的 IP 封包大小嘛! 透過 Total Length, Identification, Flags 以及這個 Fragment Offset 就能夠將小 IP 分段在收受端組合起來囉!
  • Time To Live(TTL, 存活時間)
    表示這個 IP 封包的存活時間,範圍為 0-255。當這個 IP 封包通過一個路由器時, TTL 就會減一,當 TTL 為 0 時,這個封包將會被直接丟棄。說實在的,要讓 IP 封包通過 255 個路由器,還挺難的~ ^_^
  • Protocol Number(協定代碼)
    由於網路上面的封包協定太多了,每個協定都是裝在 IP 當中的, 所以 IP 當然就得在表頭上面告知收受端,這個 IP 內含有的資料是什麼協定才行。 一般常見的網路協定如下所示:
    IP 內的號碼協定名稱(全名)1ICMP (Internet Control Message Protocol)2IGMP (Internet Group Management Protocol)3GGP (Gateway-to-Gateway Protocol)4IP (IP in IP encapsulation)6TCP (Transmission Control Protocol)8EGP (Exterior Gateway Protocol)17UDP (User Datagram Protocol)當然啦,我們比較常見到的還是那個 TCP, UDP, ICMP 說!
  • Header Checksum(表頭檢查碼)
    用來檢查這個 IP 表頭的錯誤檢驗之用。
  • Source Address
    還用講嗎?當然是來源的 IP 位址,相關的 IP 我們之前提過囉!
  • Destination Address
    有來源還需要有目標才能傳送,這裡就是目標的 IP 位址。
  • Options (其他參數)
    這個是額外的功能,提供包括安全處理機制、路由紀錄、時間戳記、 嚴格與寬鬆之來源路由等。
  • Padding(補齊項目)
    由於 Options 的內容不一定有多大,但是我們知道 IP 每個資料都必須要是 32 bits, 所以,若 Options 的資料不足 32 bits 時,則由 padding 主動補齊。
你只要知道 IP 表頭裡面還含有: TTL, Protocol, 來源 IP 與目標 IP 也就夠了! 而這個 IP 表頭的來源與目標 IP ,以及那個判斷通過多少路由器的 TTL ,就能瞭解到這個 IP 將被如何傳送到目的端吶。下一節我們將介紹一下那麼 IP 封包是如何被傳送到目的地?
TCP 協定
在前幾個小節內談到的 IP 與路由的相關說明中,我們知道 IP 與路由僅能將資料封包傳送到正確的目標而已, 但是這個目的地是否真的能夠收下來這個封包?那可就不一定了。要確認該資料能否正確的被目的端所接收, 就必須要在資料封包上面多加一些參數來判斷才行。

在前面的 OSI 七層協定當中,在網路層的 IP 之上則是傳送層,而傳送層的資料打包成什麼? 最常見的就是 TCP 封包了。這個 TCP 封包資料必須要能夠放到 IP 的資料袋當中才行喔! 所以,我們可以將 MAC, IP 與 TCP 的封包資料這樣看:
|<---------------------------------------MAC总长度------------>|
|             |<-------------------------IP总长度------------->|
|             |              |<----------TCP总长度------------>|
|-------------|--------------|-------------|-------------------|
|   MAC表头   |    IP表头    |   TCP表头   |     实际的资料    |
|--------------------------------------------------------------|
圖十一、各封包之間的相關性
所以說,IP 除了表頭之外的 Data 內容其實就是 TCP 封包的表頭與內容;而 MAC 的 Data 內容, 就是一個完整的 IP 封包資料!這也是我們上頭提到的,最終還是得以 MAC 能夠支援的最大容許容量, 才能夠決定 IP 與 TCP 封包是否需要再進行分段的工作。那麼既然 MAC 與 IP 都有表頭資料, 想當然爾,TCP 也有表頭資料來記錄該封包的相關資訊囉??沒錯啦~ TCP 封包的表頭是長這個樣子的:

4 bits6 bits6 bits8 bits8 bitsSource PortDestination PortSequence NumberAcknowledge NumberData
OffsetReservedCodeWindowChecksumUrgent PointerOptionsPaddingData圖十二、TCP 封包的表頭資料
上圖就是一個 TCP 封包的表頭資料,各個項目以 Source Port, Destination Port 及 Code 算是比較重要的項目,底下我們就分別來談一談各個表頭資料的內容吧!
  • Source Port & Destination Port ( 來源埠口 & 目標埠口 )
    什麼是埠口(port)?我們知道 IP 封包的傳送主要是藉由 IP 位址連接兩端, 但是到底這個連線的通道是連接到哪裡去呢?沒錯!就是連接到 port 上頭啦! 舉例來說,鳥站 (http://linux.vbird.org) 有開放 WWW 伺服器, 這表示鳥站的主機必須要啟動一個可以讓 client 端連接的端口,這個端口就是 port , 中文翻譯成為埠口。同樣的,用戶端想要連接到鳥哥的鳥站時,就必須要在 client 主機上面啟動一個 port ,這樣這兩個主機才能夠利用這條『通道』來傳遞封包資料喔! 這個目標與來源 port 的紀錄,可以說是 TCP 封包上最重要的參數了! 下個小單元我們還會繼續介紹。
  • Sequence Number ( 封包序號 )
    由於 TCP 封包必須要帶入 IP 封包當中,所以如果 TCP 資料太大時(大於 IP 封包的容許程度), 就得要進行分段。這個 Sequence Number 就是記錄每個封包的序號, 可以讓收受端重新將 TCP 的資料組合起來。
  • Acknowledge Number ( 回應序號 )
    為了確認主機端確實有收到我們 client 端所送出的封包資料,我們 client 端當然希望能夠收到主機方面的回應,那就是這個 Acknowledge Number 的用途了。 當 client 端收到這個確認碼時,就能夠確定之前傳遞的封包已經被正確的收下了。
  • Data Offset (資料補償)
    在圖十二倒數第二行有個 Options 欄位對吧!那個 Options 的欄位長度是非固定的, 而為了要確認整個 TCP 封包的大小,就需要這個標誌來說明整個封包區段的起始位置。
  • Reserved (保留)
    未使用的保留欄位。
  • Code (Control Flag, 控制標誌碼)
    當我們在進行網路連線的時候,必須要說明這個連線的狀態,好讓接收端瞭解這個封包的主要動作。 這可是一個非常重要的控制碼喔!這個欄位共有 6 個 bits ,分別代表 6 個控制碼,若為 1 則為啟動。分別說明如下:

    • URG(Urgent):若為 1 則代表該封包為緊急封包, 接收端應該要緊急處理,且圖十二當中的 Urgent Pointer 欄位也會被啟用。
    • ACK(Acknowledge):若為 1 代表這個封包為回應封包, 則與上面提到的 Acknowledge Number 有關。
    • PSH(Push function):若為 1 時, 代表要求對方立即傳送緩衝區內的其他對應封包,而無須等待緩衝區滿了才送。
    • RST(Reset):如果 RST 為 1 的時候, 表示連線會被馬上結束,而無需等待終止確認手續。這也就是說,這是個強制結束的連線, 且發送端已斷線。
    • SYN(Synchronous):若為 1 , 表示發送端希望雙方建立同步處理,也就是要求建立連線。通常帶有 SYN 標誌的封包表示『主動』要連接到對方的意思。
    • FIN(Finish):若為 1 ,表示傳送結束, 所以通知對方資料傳畢,是否同意斷線,只是發送者還在等待對方的回應而已。
    其中比較常見到的應該是 ACK/SYN/FIN 等,這三個控制碼是務必要記下來的, 這樣未來在談到防火牆的時候,您才會比較清楚為啥每個 TCP 封包都有所謂的『狀態』條件! 那就是因為連線方向的不同所致啊!底下我們會進一步討論喔!
  • Window (滑動視窗)
    主要是用來控制封包的流量的,可以告知對方目前本身有的緩衝器容量(Receive Buffer) 還可以接收封包。當 Window=0 時,代表緩衝器已經額滿,所以應該要暫停傳輸資料。 Window 的單位是 byte。
  • Checksum(確認檢查碼)
    當資料要由發送端送出前,會進行一個檢驗的動作,並將該動作的檢驗值標注在這個欄位上; 而接收者收到這個封包之後,會再次的對封包進行驗證,並且比對原發送的 Checksum 值是否相符,如果相符就接受,若不符就會假設該封包已經損毀,進而要求對方重新發送此封包!
  • Urgent Pointer(緊急資料)
    這個欄位是在 Code 欄位內的 URG = 1 時才會產生作用。可以告知緊急資料所在的位置。
  • Options(任意資料)
    目前此欄位僅應用於表示接收端可以接收的最大資料區段容量,若此欄位不使用, 表示可以使用任意資料區段的大小。這個欄位較少使用。
  • Padding(補足欄位)
    如同 IP 封包需要有固定的 32bits 表頭一樣, Options 由於欄位為非固定, 所以也需要 Padding 欄位來加以補齊才行。同樣也是 32 bits 的整數。


通訊埠口與 Socket
在剛剛上頭提到的 TCP 表頭資料後,您大概也清楚了要建立一個 TCP 封包時所需要檢驗的相關參數可不少啊!其中最重要的就屬通訊埠口 (port) 了。 這個 port 主要是由主機的程式所觸發的,網路上面的其他 client 端, 可以通過這個埠口直接與啟動該 port 的程式相互溝通, 而達到資料傳輸的目的。我們都知道二進位程式 (binary program) 才是真的主機認識的程式指令, 那麼我們要啟動網路服務時,其實也就是啟動一個 program 就是了。但是網路上面如何與您的 program 互通資料呢?就是透過在網路介面上面的 port 來達成的啦。

不過,必須要注意的是 port 的溝通是雙向的, 舉例來說,當我們要使用瀏覽器連接到奇摩雅虎查閱資料時, 我們必須要使用 client 端主機的瀏覽器連接到 Yahoo 主機的 WWW 伺服器軟體上面。 由於是透過網路介面,所以我們的瀏覽器也必須要啟動一個 port 並且透過這個 port 連接到 Yahoo 主機的 WWW port 上頭去,然後透過 TCP 封包上頭各項參數的確認後, 才能夠建立連線,並進一步開始傳輸資料啊!

現在來想一想,我們的主機上面有多少網路介面的 port 可用呢? 基本上就有 65536 (216)。那我們連線到 Yahoo 時, 是連線到 Yahoo 主機的那個 port 啊?如果不知道幾號 port ,那又該如何建立起這個連線呢? 所以囉,Internet 上面已經有很多規範好的固定 port (well-known port) 在提供使用者建立伺服器時啟用的 port number 啦。這些 port number 通常小於 1024 , 且是提供給許多知名的網路服務軟體用的。在我們的 Linux 環境下, 各網路服務與 port number 的對應預設給他寫在 /etc/services 檔案內喔! 不過如果是 client 端的話,由於 client 端都是主動向 server 端要資料, 所以 client 端的 port number 就使用隨機取一個大於 1024 以上且沒有在用的 port number 來進行連線了。底下鳥哥列出幾個常見的 port number 與網路服務的對應:

連接埠口服務名稱與內容20FTP-data,檔案傳輸協定所使用的主動資料傳輸埠口21FTP,檔案傳輸協定的命令通道22SSH,較為安全的遠端連線伺服器23Telnet,早期的遠端連線伺服器軟體25SMTP,簡單郵件傳遞協定,用在作為 mail server 的埠口53DNS,用在作為名稱解析的領域名稱伺服器80WWW,這個重要吧!就是全球資訊網伺服器110POP3,郵件收信協定,辦公室用的收信軟體都是透過他443https,有安全加密機制的WWW伺服器
另外一點比較值得注意的是,小於 1023 以下的埠口要啟動時, 啟動者的身份必須要是 root 才行!這個限制挺重要的,大家不要忘記了喔!

曾經有一個朋友問過我說:『一部主機上面這麼多服務,那我們跟這部主機進行連線時,該主機怎麼知道我們要的資料是 WWW 還是 FTP 啊?!』呵呵!這就是 port 的不同的結果啦!因為每種 Client 軟體他們所需要的資料都不相同,例如上面提到的瀏覽器( Netscape 以及 IE ) 他們所需要的資料是 WWW ,所以該軟體預設就會向主機的 80 port 索求資料;而如果您是使用 cuteftp 來進行與主機的 FTP 資料索求時, cuteftp 這個 Client 軟體當然預設就是向主機的 FTP 相關埠口 ( 預設就是 port 21 ) 進行連接的動作啦!所以當然就可以正確無誤的取得 Client 端所需要的資料了

舉個例子來說,一部主機就好像是一間多功能銀行,該銀行內的每個負責不同業務的窗口就好像是通訊埠口,而我們民眾就好像是 Client 端來的封包。當您進入銀行想要繳納信用卡帳單時,一到門口服務人員就會指示您直接到該窗口去繳納,當然,如果您是要領錢,服務人員就會請您到領錢的窗口去填寫資料,您是不會跑錯的對吧! ^_^。萬一跑錯了怎麼辦?呵呵!當然該窗口就會告訴您『我不負責這個業務,您請回去!』,呵呵!所以該次的連線就會『無法成功』咯!
談過了通訊埠口後,再來聊一聊每個封包的基本內容有哪些資料呢?這就得要談論到 Socket Pair ( 成對的端口 )了! 當本機發送出封包時,主機是根據 IP 封包內的 IP 位址來判別來源與目的地的行進路線, 並且,也需要 TCP 封包內的 port number 來告知 Client 與 Server 是以哪一個埠口來進行連線的對吧! 所以呢,一個連線過程所包含的底下這些咚咚就稱為成對插槽 (socket pair) 了:
  • 來源 IP ( Source Address )
  • 目的 IP ( Destination Address )
  • 來源埠口 ( Source Port )
  • 目的埠口 ( Destination Port )
這四個封包的基本資訊是相當重要的!您得必須要瞭解喔!


封包的傳送
OK,從前面這樣一路看下來,相信您對於 OSI 七層協定當中的 MAC 訊框與 IP 封包有一定程度的瞭解了, 也知道七層協定必須要在不同的主機之間一再地拿出來察看,因為 Internet 是用 IP 來傳遞封包資料, 而實體線路則是使用 MAC 訊框。那我們也瞭解 TCP 封包的表頭資料後,再來就是要瞭解一下, 那我如何利用 TCP 這個傳送層的協定來進行實際的封包接收呢? 當然是得要透過 TCP 表頭的 Sequence Number 來組合收集大的 TCP 封包, 也必須要透過 Code (Control Flags) 來瞭解到這個封包的特性才行。 說穿了,我們可以使用信封袋來說明,實際的內容 (data) 是在信封袋當中的, 而信封的外面的資訊就是各個封包的表頭資料啦!

那麼如何藉由 TCP 的表頭來確認這個封包有實際被對方接收,並進一部與對方主機達成連線? 我們以底下的圖示來作為說明。
   |----------------------| 
   |1. 随机选取>1024的port|/        |-------------------|
A  |2. 发送TCP表头:       | -/SYN   |1.有监听的port     |
   |   a. SYN=1,Seq=10001 |   -/    |2.发送的TCP表头:   | B
   |-----------------------     ->  | a. ACK=1,ack=10002|
                                    | b. SYN=1,seq=20001|
                                   /|-------------------|
                          SYN/ACK /-
                               /-
   |----------------------|  <-
   |发送TCP表头:          |         |-------------------|
C  |  a. ACK=1,ack=20002  | /       |根据收到的表头确认 |
   |                      |  -/ACK  |收到的所有封包无误 |D
   |-----------------------    ->   |开始接受传送       |
                                    |-------------------|
                           <-------->
在上面的封包連接模式當中,在建立連線之前都必須要通過三個確認的動作, 所以這種連線方式也就被稱為三向交握(Three-way handshake)。 那麼我們將整個流程依據上面的 A, B, C, D 四個階段來說明一下:
  • A:封包發起
    當用戶端想要對伺服器端連線時,就必須要送出一個要求連線的封包, 此時用戶端必須隨機取用一個大於 1024 以上的埠口來做為程式溝通的介面。 然後在 TCP 的表頭當中,必須要帶有 SYN 的主動連線(SYN=1),並且記下發送出連線封包給伺服器端的序號 (Sequence number = 10001 ) 。
  • B:封包接收與確認封包傳送
    當伺服器接到這個封包,並且確定要接收這個封包後,就會開始製作一個同時帶有 SYN=1, ACK=1 的封包, 其中那個 acknowledge 的號碼是要給 client 端確認用的,所以該數字會比(A 步驟)裡面的 Sequence 號碼多一號 (ack = 10001+1 = 10002), 那我們伺服器也必須要確認用戶端確實可以接收我們的封包才行,所以也會發送出一個 Sequence (seq=20001) 給用戶端,並且開始等待用戶端給我們伺服器端的回應喔!
  • C:回送確認封包
    當用戶端收到來自伺服器端的 ACK 數字後 (10002) 就能夠確認之前那個要求封包被正確的收受了, 接下來如果用戶端也同意與伺服器端建立連線時,就會再次的發送一個確認封包 (ACK=1) 給伺服器,亦即是 acknowledge = 20001+1 = 20002 囉。
  • D:取得最後確認
    若一切都順利,在伺服器端收到帶有 ACK=1 且 ack=20002 序號的封包後,就能夠建立起這次的連線了。
也就是說,你必須要瞭解『網路是雙向的』這個事實! 所以不論是伺服器端還是用戶端,都必須要透過一次 SYN 與 ACK 來建立連線, 所以總共會進行三次的交談! 在設定防火牆或者是追蹤網路連線的問題時,這個『雙向』的概念最容易被忽略, 而常常導致無法連線成功的問題啊!切記切記!

在建立了連線之後,該次連線通道就可以在用戶端與伺服器端建立起一對 socket pair , 然後通過該 socket pair 進行 TCP 封包的 PSH、FIN 等資料傳輸與連線中斷等動作囉!
UDP 協定
UDP 的全名是:『User Datagram Protocol, 用戶資料流協定』,UDP 與 TCP 不一樣, UDP 不提供可靠的傳輸模式,因為他不是連線導向的一個機制,這是因為在 UDP 的傳送過程中,接受端在接受到封包之後,不會回覆回應封包 ( ACK ) 給發送端,所以封包並沒有像 TCP 封包有較為嚴密的驗證機制。至於 UDP 的表頭資料如下表所示:

16 bits16 bitsSource PortDestination PortMessage LengthChecksumData圖十四、UDP 封包的表頭資料
TCP 封包確實是比較可靠的,因為通過三向交握嘛!不過,也由於三向交握的緣故, TCP 封包的傳輸速度會較慢。 至於 UDP 封包由於不需要確認對方是否有正確的收到資料,故表頭資料較少,也因為如此所以 UDP 就可以在 Data 處填入更多的資料了。同時 UDP 比較適合需要即時反應的一些資料流,例如即時通訊軟體或者是影像即時傳送軟體等, 就可以使用這類的封包傳送說。也就是說, UDP 傳輸協定並不考慮連線要求、連線終止與流量控制等特性, 所以使用的時機是當資料的正確性不很重要時,例如上面提到的即時通訊軟體啊!

另外,很多的軟體其實是同時提供 TCP 與 UDP 的傳輸協定的,舉例來說,查詢主機名稱的 DNS 服務就同時提供了 UDP/TCP 協定。由於 UDP 較為快速,所以我們 client 端可以先使用 UDP 來與伺服器連線。 但是當使用 UDP 連線卻還是無法取得正確的資料時,便轉換為較為可靠的 TCP 傳輸協定來進行資料的傳輸囉。 這樣可以同時兼顧快速與可靠的傳輸說!
ICMP 協定
ICMP 的全稱是『 Internet Control Message Protocol, 網際網路訊息控制協定 』。 基本上,ICMP 是一個錯誤偵測與回報的機制,最大的功能就是可以確保我們網路的連線狀態與連線的正確性! 同樣的,ICMP 封包也是必須要裝在 IP 封包的 Data 內才行喔! 因為在 Internet 上面有傳輸能力的就是 IP 封包啦! ICMP 有相當多的類別可以偵測與回報,底下是比較常見的幾個 ICMP 的類別 (Type):

類別代號類別名稱與意義0Echo Reply (代表一個回應信息)3Destination Unreachable (表示目的地不可到達)4Source Quench (當 router 的負載過高時,此類別碼可用來讓發送端停止發送訊息)5Redirect (用來重新導向路由路徑的資訊)8Echo Request (請求回應訊息)11Time Exceeded for a Datagram (當資料封包在某些路由傳送的現象中造成逾時狀態,此類別碼可告知來源該封包已被忽略的訊息)12Parameter Problem on a Datagram (當一個 ICMP 封包重複之前的錯誤時,會回覆來源主機關於參數錯誤的訊息)13Timestamp Request (要求對方送出時間訊息,用以計算路由時間的差異,以滿足同步性協定的要求)14Timestamp Reply (此訊息純粹是回應 Timestamp Request 用的)15Information Request (在 RARP 協定應用之前,此訊息是用來在開機時取得網路信息)16Information Reply (用以回應 Infromation Request 訊息)17Address Mask Request (這訊息是用來查詢子網路 mask 設定信息)18Address Mask Reply (回應子網路 mask 查詢訊息的)
那麼我們是如何利用 ICMP 來檢驗網路的狀態呢?最簡單的指令就是 ping 與 traceroute 了, 這兩個指令可以透過 ICMP 封包的輔助來確認與回報網路主機的狀態。在設定防火牆的時候, 我們最容易忽略的就是這個 ICMP 的封包了,因為只會記住 TCP/UDP 而已~事實上, ICMP 封包可以幫助連線的狀態回報,除了上述的 8 可以考慮關閉之外,基本上, ICMP 封包也不應該全部都擋掉喔!
MTU 的限制
我們在本章的第一部份談到 MAC 時,不是有提到標準乙太網路封包的資訊容量大約在 1500bytes 嗎? 所以 IP 封包、TCP 封包以及其他相關的封包,如果能夠控制在 1500 bytes 內的話, 那麼 IP 封包將不需要重組成可以放進 MAC 訊框的分段了!

讓我們來想一個小案例,假設你的資料量大到 60000 bytes 好了,如果你使用的傳輸協定為 TCP 封包, 萬一你沒有考慮到 MAC 訊框的大小,而讓整筆資料放到可以容納最大 65535 bytes 的 IP 封包內, 此時 IP 封包已經建立好成為內含 60000 bytes 的資料包了,但是再往下到達資料連接層時,唉~ 這個 IP 封包就得要進行重組,好讓 IP 封包可以放到 MAC 訊框當中!您說,這個時候不是又得讓系統多進行一段手續, 而導致網路效能的低落嗎?

此時,如果能夠規範 TCP 以及 IP 在包起來時就考慮訊框的最大容量時, 不就可以減少很多資料重組的問題囉?呵呵呵呵!沒錯啊! 那就是最大傳輸單元 (Maximum Transmission Unit, MTU) 這個設定值的重要性啊!

一般來說,我們的 Gigabit 網路卡已經可以支援 Jumbo frame ,所以 MTU 值都可以到達 9000 bytes 左右, 不過,不建議您設定 MTU 成為 9000 喔!為什麼呢?因為我們的封包總是需要在 Internet 上面跑吧? 您無法確認所有的網路媒體都是支援那麼大的 MTU 對吧! 如果您的 9000 bytes 封包通過一個不支援 Jumbo frame 的網路媒體時, 好一點的是該網路媒體 (例如 router ) 會主動的幫您重組封包而進行傳送, 差一點的可能就直接回報這個封包無效而丟棄了~那個時候可就糗大囉~ 所以, MTU 設定為 9000 這種事情,大概僅能在內部網路的環境作作~ 舉例來說,很多的內部叢集系統 (cluster) 就將他們的內部網路環境 MTU 設定為 9000, 但是對外的介面卡可還是原本的標準 1500 喔! ^_^

也就是說,不論您的網路媒體支援 MTU 到多大,您必須要考量到您的封包需要傳到目的地時, 所需要經過的所有網路媒體,然後再來決定您的 MTU 設定才行。
Tips:
事實上,MTU 不會剛好等於 1500 吶!這是因為不論是 IP 封包或者是 TCP 封包都會有表頭資料, 這些表頭資料都會佔用去一些位元容量,所以 MTU 就會比標準乙太網路容量的 1500 小一些。
封包過濾的防火牆概念
由上面的說明當中,我們知道資料的傳送其實就是封包的發出與接受的動作啦!並且不同的封包上面都有不一樣的表頭 ( header ),此外,封包上面通常都會具有四個基本的資訊,那就是 socket pair 裡面提到的『來源與目的 IP 以及來源與目的端的 port number』 。當然啦,如果是可靠性連線的 TCP 封包,還包含 Control Flag 裡面的 SYN/ACK 等等重要的資訊呢!好了,開始動一動腦筋, 有沒有想到『網路防火牆』的字眼啊? 網路防火牆可以抵擋掉一些可能有問題的封包,那麼在 Linux 系統上面是怎麼擋掉封包的呢?其實說來也是很簡單,既然封包的表頭上面已經有這麼多的重要資訊, 那麼我就利用一些防火牆機制與軟體來進行封包表頭的分析,並且設定分析的規則,當發現某些特定的 IP 、特定的埠口或者是特定的封包資訊(SYN/ACK等等),那麼就將該封包給他丟棄, 那就是最基本的防火牆原理了!

舉例來說,大家都知道 Telnet 這個伺服器是挺危險的,而 Telnet 使用的 port number 為 23 ,所以,當我們使用軟體去分析要送進我們主機的封包時, 只要發現該封包的目的地是我們主機的 port 23 ,就將該封包丟掉去!那就是最基本的防火牆案例啦! 更多的防火牆資訊我們會在後頭的『簡易防火牆』與 『認識網路安全』當中進行更多的說明喔!