<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>

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                # 2.4 TCP/IP 的傳輸層相關封包與數據 ## 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 bitsSource Port Destination PortSequence NumberAcknowledge NumberData Offset Reserved Code WindowChecksum Urgent PointerOptions PaddingData圖 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 bitsSource Port Destination PortMessage Length ChecksumData圖 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>

                              哎呀哎呀视频在线观看