網路是怎樣連接的-探索協議棧和網卡

1. 創建套接字

1. 協議棧的內部結構 - 協議棧是根據套接字中記錄的控制信息來工作的 - 創建套接字時,首先分配一個套接字需要的內存空間,然後向其中寫入初始狀態 - 描述符是用來區分協議棧中多個套接字的號碼牌

2. 連接伺服器

1. 連接? - 連接實際上是通信雙方交換控制信息 - 連接的目的是為了將伺服器的IP地址和埠號等信息告知協議棧,客戶端首先向服務端發送申請通信的請求 - 在收發數據時,我們還需要一塊用來存放臨時收發數據的內存空間2. TCP頭部

通信操作中的控制信息分為兩類 1. 頭部中記錄的信息 2. 套接字(協議棧的內存空間)中記錄的信息 連接過程 1. 連接操作的第一步是在TCP模塊處創建表示連接控制信息的頭部 2. 通過TCP頭部中的發送方和接收方的埠號可以找到要連接的套接字 3. 當找到套接字後,套接字會寫入響應的狀態,並將狀態改為正在連接 4. 服務端將SYN比特及ACK控制位置成1,表示已經收到對應的網路包 5. 服務端TCP模塊會將TCP頭部傳遞給IP模塊,並委託IP模塊向客服端返迴響應 6. 客戶端收到網路包,如果SYN為1則表示連接成功,會向套接字中寫入伺服器的IP地址和埠號 7. 客戶端需要將ACK位置為1,返回服務端

3. 收發數據

1. 將HTTP請求交給協議棧 - 協議棧收到數據後,會先將數據存放在內部的發送緩衝區中,等待下一段數據 - MTU: 一個網路包的最大長度,乙太網中一般為1500位元組 - MSS: 除去頭部後,一個網路包所能容納的TCP數據的最大長度 - 當從應用程序中接收的數據長度超過或接近MSS時再發送,這樣就可以避免發送大量小包的問題了 - 此外,協議棧內部還有一個計時器,一定時間後也會將數據包發送出去2. 數據較大時,會進行拆分,拆分出來的每塊數據會加上TCP頭部然後被放進單獨的網路包中3. 通過ACK號和序號可以確定是否收到了網路包

4. TCP 採用了動態調整等待時間的方法,這個等待時間是根據ACK號返回的時間來動態確定的 5. TCP採用了滑動窗口方式來管理數據發送和ACK號的操作。 - 接收方需要告訴發送方自己最多能接受多少數據,然後發送方根據這個數值對數據發送進行控制 6. 一般會將 ACK號和窗口合併在一個包里進行發送 7. 協議棧接收數據時,會檢查收到的數據塊和TCP頭部內容,判斷數據是否丟失,如果正確則返回ACK號,然後將數據塊暫存到接收緩衝區,並將數據塊按順序連接起來還原出數據,交給應用程序

4. 從伺服器斷開並刪除套接字

1. 數據發送完畢後斷開連接 - 伺服器一方的應用程序會生成包含斷開信息的TCP頭部,將控制位的FIN比特置為1 - 客戶端會將自己的套接字標記為進入斷開操作階段,並返回給服務端一個ACK號 - 客戶端調用close來結束數據收發操作,並發送FIN比特為1的包給服務端 - 服務端返回ACK號,通信結束

2. 刪除套接字,等待一段時間後刪除

5. IP和乙太網的包收發操作

1. 包的基本知識 - IP協議根據目標地址判斷下一個IP轉發設備的位置 - 子網中的乙太網協議將包傳輸到下一個轉發設備

2. 包收發操作概覽 - IP模塊負責添加如下兩個頭部 1. MAC頭部:乙太網用到的頭部,包含MAC地址 2. IP頭部:IP用的頭部,包含IP地址 - IP對各種類型的包的收發操作都是相同的 3. IP頭的接收方IP地址填寫通信對象的IP的地址,發送IP地址需要判斷(根據路由表)發送所使用的網卡,並填寫該網卡的IP地址4. 生成乙太網需要的MAC地址 - IP地址32比特,MAC地址48比特 - MAC頭部: 接收方MAC地址,發送方MAC地址,以太類型(0800: IP協議, 0806: ARP協議) - IP模塊根據路由表Gateway欄的內容判斷應該把包發送給誰5. 通過 ARP 查詢目標路由器的 MAC 地址 - 可以通過增加 ARP 緩存來減少 ARP 包的數量,ARP 緩存每過一段時間會被刪除。

6. 乙太網的基本結構

7. 將IP包轉換成電信號或光信號發送出去 應用程序 -> 協議棧 -> 網卡驅動 -> 擴展匯流排介面 -> 網卡 - 網卡的 ROM 中包含著唯一的 MAC地址,生產網卡時寫入的 - 網卡中的 MAC 地址會有網卡驅動程序讀取並分配給 MAC 模塊 - 網卡發送出去的包

8. 給網路包再加三個控制數據 - 網卡中的 MAC 模塊會將包從緩衝區中取出,並在開頭加上報頭和起始幀分界符,在末尾加上用於檢測錯誤的 FCS(幀校驗序列) - 報頭是 01 交替出現的比特序列,用於確定讀取包的時機 - 起始幀分界符的最後兩個比特為11,網卡將這裡作為包的起始位置 - FCS(幀校驗序列)用來檢查包的傳輸過程中因噪音造成的波形紊亂 9. 向集線器發送網路包 - 網卡的MAC模塊生成通用信號,然後由 PHY(MAU) 模塊轉換成可在網線中傳輸的格式,並通過網線發送出去 10. 接收返回包 - PHY(MAU) 模塊會將信號轉換成通用格式病發送給 MAC 模塊,MAC 模塊再從頭開始將信號轉換為數字信息,並放到緩存區。 - 網卡會通知計算機收到了一個包 - 網卡向擴展匯流排的中斷信號線發送中斷操作,CPU會掛起當前處理任務,切換到操作系統的中斷處理程序,此時會調用網卡驅動,執行接收操作。 - 根據包頭部不同的協議類型,分配給不同的協議棧 11. 將伺服器的響應包從IP傳給TCP - 確定IP頭部,接收方地址和客戶端網卡地址一致,就可以接收包 - 如果收到不是發送給自己的包,IP模塊會通過ICMP消息將錯誤告知發送方 - 如果收到的包經過分片,IP模塊會將其暫存至內部的內存空間,等待IP頭部中具有相同ID的包全部到達。另外,根據IP頭部的分片偏移量欄位,可以將包還原成原始的包,這個操作叫分片重組

6. UDP協議的收發操作

1. 無需重發的數據使用UDP更加高效2. 控制用的短數據3. 音頻和視頻數據

推薦閱讀:

讓人生停止灰暗
7.尋秦記
近期觀影&閱讀筆記
讀書:《渴望生活——梵高傳》(序幕)
關於 精進,

TAG:計算機網路 | 讀書筆記 |