可以把網絡層和傳輸層想成一個“快遞系統”:
- 網絡層(IP 層) = 郵政系統:只負責把“包裹”(IP 數據報)從 A 地搬到 B 地,不保證順序、不保證不丟、不保證不重復。
- 傳輸層(TCP/UDP 層) = 快遞公司:在郵政系統之上提供“增值服務”——對 TCP 來說,就是可靠、按序、不重復、流量受控的端到端運輸;對 UDP 來說,就是“無連接、盡力而為”的快送。
下面用一次典型的 TCP 通信 說明兩者如何“接力配合”。
1. 建立連接(三次握手)
- 應用層調用
connect()
? - TCP(傳輸層) 生成 SYN 段
? - TCP 把 SYN 交給 IP(網絡層),IP 加上源/目的 IP 地址,生成 IP 數據報,查路由表,發出去。
? - 對端 IP 收到后上交 TCP;TCP 回 SYN-ACK,再交給 IP 發回。
? - 發起端 IP 收到 SYN-ACK → TCP → 回 ACK → 交給 IP → 連接建立完成。
網絡層只負責把“SYN、SYN-ACK、ACK”這些 IP 數據報送到正確主機;
傳輸層負責根據這些“控制段”完成邏輯上的三次握手。
2. 數據傳輸
-
發送端
- TCP 把應用數據切片成合適大小的 TCP 段,編好序號、計算校驗和、設置窗口。
- 每個 TCP 段被封裝成 IP 數據報(加 IP 頭),IP 根據路由逐跳轉發。
- 網絡層可能出現 亂序、丟包、重復,TCP 不理會,IP 也不保證。
-
接收端
- IP 層收到數據報后,根據協議字段 6(TCP)上交 TCP。
- TCP 根據序號 重排、去重、確認、滑動窗口流量控制。
- 若發現丟包,TCP 啟動 重傳,重傳時仍用 IP 再發一次。
- 數據完整且有序后,TCP 按序交付給應用層。
網絡層只管“送到”;
傳輸層負責“整理好再交給應用”。
3. 連接拆除(四次揮手)
- 傳輸層發送 FIN/ACK 控制段;
- 這些控制段仍由 網絡層封裝成 IP 數據報發走;
- 雙方 FIN + ACK 都到達后,TCP 連接正式關閉。
4. 與 UDP 的配合(簡要)
- UDP 沒有連接、確認、重傳,只是把應用數據封裝成 UDP 數據報 → 交給 IP → IP 盡力送到對端。
- 網絡層仍負責路由、轉發;UDP 只提供端口復用和輕量校驗,不保證可靠性。
一張圖總結
應用層數據│
┌───┴──────────┐
│ 傳輸層(TCP) │ 分段、編號、確認、重傳、流量控制
└───┬──────────┘│ TCP段
┌───┴──────────┐
│ 網絡層(IP) │ 路由、尋址、轉發(不保證可靠性)
└───┬──────────┘│ IP數據報
┌───┴──────────┐
│ 鏈路層 │ 真正在物理媒介上發幀
└──────────────┘
一句話總結
網絡層提供“主機到主機”的可達性;傳輸層在網絡層之上提供“進程到進程”的端到端語義(可靠或不可靠)。二者一前一后,共同完成完整的網絡通信。
邏輯上的三次握手?啥意思
“邏輯上的三次握手”強調的是:
三次握手是一套“狀態機規則”,由傳輸層(TCP)負責完成;網絡層(IP)只負責把三次握手過程中產生的 3 個報文(SYN、SYN-ACK、ACK)當作普通數據報從 A 主機搬到 B 主機,完全不感知“握手”這件事。
換句話說:
-
物理、網絡層看到的:
只是 3 個普通的 IP 數據報,按路由轉發即可,不知道它們有什么順序、含義。 -
傳輸層(TCP)看到的:
它根據這 3 個報文里的控制位(SYN、ACK)以及序號、確認號,維護一張狀態表:- 收到 SYN → 回 SYN-ACK → 收到 ACK → 狀態變為 ESTABLISHED。
這套規則就是“邏輯上的三次握手”——只在 TCP 的邏輯狀態機里存在,IP 層根本不 care。
- 收到 SYN → 回 SYN-ACK → 收到 ACK → 狀態變為 ESTABLISHED。
舉個生活類比
- IP 層像郵差:只負責把 3 封信(SYN、SYN-ACK、ACK)送到正確地址。
- TCP 層像收信人:必須按順序讀完這三封信,并在心里完成“合同簽訂”——這就是邏輯上的三次握手。
普通客戶端中的應用程序,計算機是如何知道,某一包數據是要給自己的
一句話:
客戶端進程并不會「監聽端口」,但它仍然
① 臨時占用了操作系統分配的端口
② 在 TCP/UDP 首部里寫明了「四元組」
③ 操作系統根據四元組把返回包直接交給該進程
1. 四元組——“身份證”
每個網絡連接在客戶端發起時就確定了一個唯一標識:
(源IP, 源Port, 目的IP, 目的Port)
- 瀏覽器訪問
www.example.com:80
時,Windows 會給這個進程隨機分配一個臨時端口,例如 52341。 - 于是四元組變成:
(本機IP, 52341, 93.184.216.34, 80)
2. 操作系統如何“認識”返回包
- 服務器回包的 IP 首部里:
源 IP = 93.184.216.34,目的 IP = 本機 - TCP/UDP 首部里:
源端口 = 80,目的端口 = 52341 - 操作系統維護一張“套接字表”:
收到報文后,按表查找,直接把數據拷到對應進程的內核緩沖區。四元組 → 進程句柄
3. 客戶端不需要 listen,但仍“登記”
- 發起
connect()
時,內核把這條四元組登記進表。 - 關閉連接(或進程退出)后,表項被刪除,端口回收。
- 因此返回包總能精確找到進程,不會出現“誰都能收”的情況。
4. 類比生活
- 瀏覽器 ≈ 張三
- 操作系統 ≈ 小區門衛
- 張三給快遞站寄包裹,包裹上寫
發件人:張三,A棟523室 收件人:快遞站
- 快遞站回寄時,包裹上寫
發件人:快遞站 收件人:張三,A棟523室
- 門衛一看門牌號,直接送到張三家門口,不會送錯。
一句話總結
客戶端進程不監聽端口,但操作系統為它臨時“注冊”了四元組;所有返回包按四元組精準投遞,因此絕不會搞錯收件人。