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

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                完整的 TCP 頭部如下圖所示 ![](https://img.kancloud.cn/6e/54/6e54819173511a6be862500b13be7aa4_1021x305.png) ![](https://img.kancloud.cn/ff/ac/ffaccb2feea0c7a45e7f84c35bc22fe8_1442x318.png) ## 源端口號、目標端口號 上圖中 源端口號 Source Port: 443 目標端口號 Destination Port: 9524 TCP 報文頭部里沒有源 ip 和目標 ip 地址,只有源端口號和目標端口號 源 IP、源端口、目標 IP、目標端口構成了 TCP 連接的「四元組」。一個四元組可以唯一標識一個連接。 ## 序列號(Sequence number) TCP 是面向字節流的協議,通過 TCP 傳輸的字節流的每個字節都分配了序列號,序列號(Sequence number)指的是本報文段第一個字節的序列號。 ![](https://img.kancloud.cn/f7/33/f733820efa3a26454df72549fa91f9de_1932x522.png) 序列號加上報文的長度,就可以確定傳輸的是哪一段數據。序列號是一個 32 位的無符號整數,達到 2^32-1 后循環到 0。 在 SYN 報文中,序列號用于交換彼此的初始序列號,在其它報文中,序列號用于保證包的順序。 ## 確認號(Acknowledgment number, ACK) TCP 使用確認號(Acknowledgment number, ACK)來告知對方下一個期望接收的序列號,**小于此確認號的所有字節都已經收到**。 關于確認號有幾個注意點: * 不是所有的包都需要確認的 * 不是收到了數據包就立馬需要確認的,可以延遲一會再確認 * ACK 包本身不需要被確認,否則就會無窮無盡死循環了 * 確認號永遠是表示小于此確認號的字節都已經收到 ![](https://img.kancloud.cn/c3/9c/c39cce6058b17052a2600c669b0dd928_1274x560.png) ## TCP Flags (標記) TCP 有很多種標記,有些用來發起連接同步初始序列號,有些用來確認數據包,還有些用來結束連接。TCP 定義了一個 8 位的字段用來表示 flags,大部分都只用到了后 6 個,如下圖所示 ![](https://img.kancloud.cn/1b/0b/1b0b2a0bbe72dbb75372f370547dc2ce_1015x301.png) 通常所說的 SYN、ACK、FIN、RST 其實只是把 flags 對應的 bit 位置為 1 而已,這些標記可以組合使用,比如 SYN+ACK,FIN+ACK 等 最常見的有下面這幾個: * SYN(Synchronize):用于發起連接數據包同步雙方的初始序列號 * ACK(Acknowledge):確認數據包 * RST(Reset):這個標記用來強制斷開連接,通常是之前建立的連接已經不在了、包不合法、或者實在無能為力處理 * FIN(Finish):通知對方我發完了所有數據,準備斷開連接,后面我不會再發數據包給你了。 * PSH(Push):告知對方這些數據包收到以后應該馬上交給上層應用,不能緩存起來 ## 窗口大小(Window Size) ![](https://img.kancloud.cn/4a/5b/4a5b2dcb12aa2b9f8760bf16696e4f0d_986x289.png) 可以看到用于表示窗口大小的"Window Size" 只有 16 位,也就是最大窗口大小是 65535 字節(64KB)。 由于太小,因此TCP 協議引入了「TCP 窗口縮放」選項 作為窗口縮放的比例因子,比例因子值的范圍是 0 ~ 14,其中最小值 0 表示不縮放,最大值 14。比例因子可以將窗口擴大到原來的 2 的 n 次方,比如窗口大小縮放前為 1050,縮放因子為 7,則真正的窗口大小為 1050 \* 128 = 134400 窗口縮放值在三次握手的時候指定 # 測試題 1、如果一個 TCP 連接正在傳送 5000 字節的數據,第一個字節的序號是 10001,數據被分為 5 段,每個段攜帶 1000 字節,請問每個段的序號是什么? 2、A B 兩個主機之間建立了一個 TCP 連接,A 主機發給 B 主機兩個 TCP 報文,大小分別是 500 和 300,第一個報文的序列號是 200,那么 B 主機接收兩個報文后,返回的確認號是() * A、200 * B、700 * C、800 * D、1000 3、客戶端的使用 ISN=2000 打開一個連接,服務器端使用 ISN=3000 打開一個連接,經過 3 次握手建立連接。連接建立起來以后,假定客戶端向服務器發送一段數據`Welcome the server!`(長度 20 Bytes),而服務器的回答數據`Thank you!`(長度 10 Bytes ),試畫出三次握手和數據傳輸階段報文段序列號、確認號的情況。
                  <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>

                              哎呀哎呀视频在线观看