<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                ## 2.4 TCP/IP 的傳輸層相關封包與數據 網絡層的 IP 封包只負責將數據送到正確的目標主機去,但這個封包到底會不會被接受,或者是有沒有被正確的接收, 那就不是 IP 的任務啦!那是傳送層的任務之一。從 [圖 2.1-4](#fig2.1-4) 我們可以看到傳送層有兩個重點, 一個是連接導向的 TCP 封包,一個是非連接導向的 UDP 封包,這兩個封包很重要啊!數據能不能正確的被送達目的, 與這兩個封包有關喔! * * * ### 2.4.1 可靠聯機的 TCP 協議 在前面的 OSI 七層協議當中,在網絡層的 IP 之上則是傳送層,而傳送層的數據打包成什么? 最常見的就是 TCP 封包了。這個 TCP 封包數據必須要能夠放到 IP 的數據袋當中才行喔! 所以,我們將[圖 2.1-4](#fig2.1-4) 簡化一下,將 MAC, IP 與 TCP 的封包數據這樣看: ![](https://box.kancloud.cn/2016-05-13_5735da4b4fdbe.png) 圖 2.4-1、各封包之間的相關性 想當然爾,TCP 也有表頭數據來記錄該封包的相關信息啰?沒錯啦~ TCP 封包的表頭是長這個樣子的: | 4 bits | 6 bits | 6 bits | 8 bits | 8 bits | | --- | --- | | Source Port | Destination Port | | Sequence Number | | Acknowledge Number | | Data Offset | Reserved | Code | Window | | Checksum | Urgent Pointer | | Options | Padding | | Data | 圖 2.4-2、TCP 封包的表頭資料 上圖就是一個 TCP 封包的表頭數據,各個項目以 Source Port, Destination Port 及 Code 算是比較重要的項目,底下我們就分別來談一談各個表頭數據的內容吧! * Source Port & Destination Port (來源埠口 & 目標端口) 什么是埠口(port)?我們知道 IP 封包的傳送主要是藉由 IP 地址連接兩端, 但是到底這個聯機的通道是連接到哪里去呢?沒錯!就是連接到 port 上頭啦! 舉例來說,鳥哥的網站有開放 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 (資料補償) 在圖 2.4-2 倒數第二行有個 Options 字段對吧!那個 Options 的字段長度是非固定的,而為了要確認整個 TCP 封包的大小,就需要這個標志來說明整個封包區段的起始位置。 * Reserved (保留) 未使用的保留字段。 * Code (Control Flag, 控制標志碼) 當我們在進行網絡聯機的時候,必須要說明這個聯機的狀態,好讓接收端了解這個封包的主要動作。 這可是一個非常重要的句柄喔!這個字段共有 6 個 bits ,分別代表 6 個句柄,若為 1 則為啟動。分別說明如下: * URG(Urgent):若為 1 則代表該封包為緊急封包, 接收端應該要緊急處理,且圖 2.4-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 有興趣而已,這樣未來在談到防火墻的時候,你才會比較清楚為啥每個 TCP 封包都有所謂的『狀態』條件!那就是因為聯機方向的不同所致啊!底下我們會進一步討論喔! 至于其他的數據,就得請您自行查詢網絡相關書籍了! * Window (滑動窗口) 主要是用來控制封包的流量的,可以告知對方目前本身有的緩沖器容量(Receive Buffer) 還可以接收封包。當 Window=0 時,代表緩沖器已經額滿,所以應該要暫停傳輸數據。 Window 的單位是 byte。 * Checksum(確認檢查碼) 當數據要由發送端送出前,會進行一個檢驗的動作,并將該動作的檢驗值標注在這個字段上; 而接收者收到這個封包之后,會再次的對封包進行驗證,并且比對原發送的 Checksum 值是否相符,如果相符就接受,若不符就會假設該封包已經損毀,進而要求對方重新發送此封包! * Urgent Pointer(緊急資料) 這個字段是在 Code 字段內的 URG = 1 時才會產生作用。可以告知緊急數據所在的位置。 * Options(任意資料) 目前此字段僅應用于表示接收端可以接收的最大數據區段容量,若此字段不使用, 表示可以使用任意資料區段的大小。這個字段較少使用。 * Padding(補足字段) 如同 IP 封包需要有固定的 32bits 表頭一樣, Options 由于字段為非固定, 所以也需要 Padding 字段來加以補齊才行。同樣也是 32 bits 的整數。 談完了 TCP 表頭數據后,再來讓我們了解一下這個表頭里面最重要的端口信息吧! * 通訊端口 在上圖的 TCP 表頭數據中,最重要的就屬那 16 位的兩個咚咚,亦即來源與目標的端口。由于是 16 位,因此目標與來源端口最大可達 65535 號 (2 的 16 次方)! 那這個埠口有什么用途呢?上面稍微提到過,網絡是雙向的,服務器與客戶端要達成聯機的話, 兩邊應該要有一個對應的埠口來達成聯機信道,好讓數據可以透過這個信道來進行溝通。 那么這個埠口怎么打開呢?就是透過程序的執行!舉例來說,鳥哥的網站上,必須要啟動一個 WWW 服務器軟件, 這個服務器軟件會主動的喚起 port 80 來等待客戶端的聯機。你想要看我網站上的數據,就得要利用瀏覽器, 填入網址,然后瀏覽器也會啟動一個埠口,并將 TCP 的表頭填寫目標端口為 80 ,而來源端口是你主機隨機啟動的一個埠口, 然后將 TCP 封包封裝到 IP 后,送出到網絡上。等鳥站主機接收到你這個封包后,再依據你的埠口給予回應。 這么說你或許不好理解,我們換個說法好了。假如 IP 是網絡世界的門牌,那么這個埠口就是那個門牌號碼上建筑物的樓層! 每個建筑物都有 1~65535 層樓,你需要什么網絡服務,就得要去該對應的樓層取得正確的資料。但那個樓層里面有沒有人在服務你呢? 這就得要看有沒有程序真的在執行啦。所以,IP 是門牌,TCP 是樓層,真正提供服務的, 是在該樓層的那個人 (程序)! **Tips:** 曾經有一個朋友問過我說:『一部主機上面這么多服務,那我們跟這部主機進行聯機時,該主機怎么知道我們要的數據是 WWW 還是 FTP 啊?』就是透過埠口啊!因為每種 Client 軟件他們所需要的數據都不相同,例如上面提到的瀏覽器所需要的數據是 WWW ,所以該軟件默認就會向服務器的 port 80 索求數據;而如果你是使用 filezilla 來進行與服務器的 FTP 數據索求時, filezilla 當然預設就是向服務器的 FTP 相關埠口 (預設就是 port 21) 進行連接的動作啦!所以當然就可以正確無誤的取得 Client 端所需要的數據了 再舉個例子來說,一部主機就好像是一間多功能銀行,該銀行內的每個負責不同業務的窗口就好像是通訊端口, 而我們民眾就好像是 Client 端來的封包。當你進入銀行想要繳納信用卡賬單時, 一到門口服務人員就會指示你直接到該窗口去繳納,當然,如果你是要領錢,服務人員就會請你到領錢的窗口去填寫數據, 你是不會跑錯的對吧! ^_^。萬一跑錯了怎么辦?呵呵!當然該窗口就會告訴你『我不負責這個業務,你請回去!』, 呵呵!所以該次的聯機就會『無法成功』咯! ![](https://box.kancloud.cn/2016-05-13_5735736501917.gif) * 特權埠口 (Privileged Ports) 你現在了解了埠口的意義后,再來想想,網絡既然是雙向的,一定有一個發起端。問題是,到底要聯機到服務器取得啥玩意兒? 也就是說,哪支程序應該在哪個端口執行,以讓大家都知道該埠口就是提供哪個服務,如此一來,才不會造成廣大用戶的困擾嘛! 所以啰,Internet 上面已經有很多規范好的固定 port (well-known port), 這些 port number 通常小于 1024 ,且是提供給許多知名的網絡服務軟件用的。 在我們的 Linux 環境下,各網絡服務與 port number 的對應默認給他寫在 /etc/services 檔案內喔! 底下鳥哥列出幾個常見的 port number 與網絡服務的對應: | 端口 | 服務名稱與內容 | | --- | --- | | 20 | FTP-data,文件傳輸協議所使用的主動數據傳輸端口 | | 21 | FTP,文件傳輸協議的命令通道 | | 22 | SSH,較為安全的遠程聯機服務器 | | 23 | Telnet,早期的遠程聯機服務器軟件 | | 25 | SMTP,簡單郵件傳遞協議,用在作為 mail server 的埠口 | | 53 | DNS,用在作為名稱解析的領域名服務器 | | 80 | WWW,這個重要吧!就是全球信息網服務器 | | 110 | POP3,郵件收信協議,辦公室用的收信軟件都是透過他 | | 443 | https,有安全加密機制的WWW服務器 | 另外一點比較值得注意的是,小于 1024 以下的埠口要啟動時, 啟動者的身份必須要是 root 才行,所以才叫做特權埠口嘛!這個限制挺重要的,大家不要忘記了喔! 不過如果是 client 端的話,由于 client 端都是主動向 server 端要數據, 所以 client 端的 port number 就使用隨機取一個大于 1024 以上且沒有在用的 port number。 * Socket Pair 由于網絡是雙向的,要達成聯機的話得要服務器與客戶端均提供了 IP 與埠口才行。 因此,我們常常將這個成對的數據稱之為 Socket Pair 了! * 來源 IP + 來源埠口 (Source Address + Source Port) * 目的 IP + 目的埠口 (Destination Address + Destination Port) 由于 IP 與埠口常常連在一起說明,因此網絡尋址常常使用『 IP:port 』來說明,例如想要連上鳥哥的網站時, 正確的鳥哥網站寫法應該是:『 linux.vbird.org:80 』才對! * * * ### 2.4.2 TCP 的三向交握 TCP 被稱為可靠的聯機封包,主要是透過許多機制來達成的,其中最重要的就是三向交握的功能。 當然, TCP 傳送數據的機制非常復雜,有興趣的朋友請自行參考相關網絡書籍。 OK,那么如何藉由 TCP 的表頭來確認這個封包有實際被對方接收,并進一步與對方主機達成聯機? 我們以底下的圖示來作為說明。 ![](https://box.kancloud.cn/2016-05-13_5735da4b691cc.png) 圖 2.4-3、三向交握之封包連接模式 在上面的封包連接模式當中,在建立聯機之前都必須要通過三個確認的動作, 所以這種聯機方式也就被稱為三向交握(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 來建立聯機,所以總共會進行三次的交談! 在設定防火墻或者是追蹤網絡聯機的問題時,這個『雙向』的概念最容易被忽略, 而常常導致無法聯機成功的問題啊!切記切記! **Tips:** 鳥哥上課談到 TCP 最常做的事就是,叫一個同學起來,實際表演三向交握給大家看! 1\. 鳥哥說:A同學你在不在? 2\. A同學說:我在!那鳥哥你在不在? 3\. 鳥哥說:我也在 此時兩個人就確認彼此都可以聽到對方在講啥,這就是可靠聯機啦! ^_^ ![](https://box.kancloud.cn/2016-05-13_5735736501917.gif) * * * ### 2.4.3 非連接導向的 UDP 協議 UDP 的全名是:『User Datagram Protocol, 用戶數據流協議』,UDP 與 TCP 不一樣, UDP 不提供可靠的傳輸模式,因為他不是面向連接的一個機制,這是因為在 UDP 的傳送過程中,接受端在接受到封包之后,不會回復響應封包 (ACK) 給發送端,所以封包并沒有像 TCP 封包有較為嚴密的檢查機制。至于 UDP 的表頭資料如下表所示: | 16 bits | 16 bits | | --- | --- | | Source Port | Destination Port | | Message Length | Checksum | | Data | 圖 2.4-4、UDP 封包的表頭資料 TCP 封包確實是比較可靠的,因為通過三向交握嘛!不過,也由于三向交握的緣故, TCP 封包的傳輸速度會較慢。 至于 UDP 封包由于不需要確認對方是否有正確的收到數據,故表頭數據較少,所以 UDP 就可以在 Data 處填入更多的資料了。同時 UDP 比較適合需要實時反應的一些數據流,例如影像實時傳送軟件等, 就可以使用這類的封包傳送。也就是說, UDP 傳輸協議并不考慮聯機要求、聯機終止與流量控制等特性, 所以使用的時機是當數據的正確性不很重要的情況,例如網絡攝影機! 另外,很多的軟件其實是同時提供 TCP 與 UDP 的傳輸協議的,舉例來說,查詢主機名的 DNS 服務就同時提供了 UDP/TCP 協議。由于 UDP 較為快速,所以我們 client 端可以先使用 UDP 來與服務器聯機。 但是當使用 UDP 聯機卻還是無法取得正確的數據時,便轉換為較為可靠的 TCP 傳輸協議來進行數據的傳輸啰。 這樣可以同時兼顧快速與可靠的傳輸說! **Tips:** 那么上課時怎么介紹 UDP 呢?很簡單喔!鳥哥就會說:『現在老師就是在進行 UDP 的傳送,因為老師一直講一直講, 俺也沒有注意到你有沒有聽到,也不需要等待你的響應封包!就這樣一直講!當然,你沒有聽到鳥哥講啥,我也不會知道...』 ![](https://box.kancloud.cn/2016-05-13_5735736501917.gif) * * * ### 2.4.4 網絡防火墻與 OSI 七層協定 由上面的說明當中,我們知道數據的傳送其實就是封包的發出與接受的動作啦!并且不同的封包上面都有不一樣的表頭 (header),此外,封包上面通常都會具有四個基本的信息,那就是 socket pair 里面提到的『來源與目的 IP 以及來源與目的端的 port number』 。當然啦,如果是可靠性聯機的 TCP 封包,還包含 Control Flag 里面的 SYN/ACK 等等重要的信息呢!好了,開始動一動腦筋,有沒有想到『網絡防火墻』的字眼啊? 封包過濾式的網絡防火墻可以抵擋掉一些可能有問題的封包, Linux 系統上面是怎么擋掉封包的呢?其實說來也是很簡單,既然封包的表頭上面已經有這么多的重要信息, 那么我就利用一些防火墻機制與軟件來進行封包表頭的分析,并且設定分析的規則,當發現某些特定的 IP 、特定的埠口或者是特定的封包信息(SYN/ACK等等),那么就將該封包給他丟棄, 那就是最基本的防火墻原理了! 舉例來說,大家都知道 Telnet 這個服務器是挺危險的,而 Telnet 使用的 port number 為 23 ,所以,當我們使用軟件去分析要送進我們主機的封包時, 只要發現該封包的目的地是我們主機的 port 23 ,就將該封包丟掉去!那就是最基本的防火墻案例啦! 如果以 OSI 七層協議來說,每一層可以抵擋的數據有: * 第二層:可以針對來源與目標的 MAC 進行抵擋; * 第三層:主要針對來源與目標的 IP ,以及 ICMP 的類別 (type) 進行抵擋; * 第四層:針對 TCP/UDP 的埠口進行抵擋,也可以針對 TCP 的狀態 (code) 來處理。 更多的防火墻信息我們會在[第九章防火墻](http://linux.vbird.org/linux_server/0250simple_firewall.php)與[第七章認識網絡安全](http://linux.vbird.org/linux_server/0210network-secure.php)當中進行更多的說明喔! * * *
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看