计算机网络中:传输层和网络层之间是如何配合的

发布于:2025-07-22 ⋅ 阅读:(14) ⋅ 点赞:(0)

可以把网络层和传输层想成一个“快递系统”:

  • 网络层(IP 层) = 邮政系统:只负责把“包裹”(IP 数据报)从 A 地搬到 B 地,不保证顺序、不保证不丢、不保证不重复。
  • 传输层(TCP/UDP 层) = 快递公司:在邮政系统之上提供“增值服务”——对 TCP 来说,就是可靠、按序、不重复、流量受控的端到端运输;对 UDP 来说,就是“无连接、尽力而为”的快送。

下面用一次典型的 TCP 通信 说明两者如何“接力配合”。


1. 建立连接(三次握手)

  1. 应用层调用 connect()
  2. TCP(传输层) 生成 SYN 段
  3. TCP 把 SYN 交给 IP(网络层),IP 加上源/目的 IP 地址,生成 IP 数据报,查路由表,发出去。
  4. 对端 IP 收到后上交 TCP;TCP 回 SYN-ACK,再交给 IP 发回。
  5. 发起端 IP 收到 SYN-ACK → TCP → 回 ACK → 交给 IP → 连接建立完成。

网络层只负责把“SYN、SYN-ACK、ACK”这些 IP 数据报送到正确主机;
传输层负责根据这些“控制段”完成逻辑上的三次握手。


2. 数据传输

  • 发送端

    1. TCP 把应用数据切片成合适大小的 TCP 段,编好序号、计算校验和、设置窗口。
    2. 每个 TCP 段被封装成 IP 数据报(加 IP 头),IP 根据路由逐跳转发。
    3. 网络层可能出现 乱序、丢包、重复,TCP 不理会,IP 也不保证。
  • 接收端

    1. IP 层收到数据报后,根据协议字段 6(TCP)上交 TCP。
    2. TCP 根据序号 重排去重确认滑动窗口流量控制
    3. 若发现丢包,TCP 启动 重传,重传时仍用 IP 再发一次。
    4. 数据完整且有序后,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 主机,完全不感知“握手”这件事。

换句话说:

  1. 物理、网络层看到的
    只是 3 个普通的 IP 数据报,按路由转发即可,不知道它们有什么顺序、含义。

  2. 传输层(TCP)看到的
    它根据这 3 个报文里的控制位(SYN、ACK)以及序号、确认号,维护一张状态表:

    • 收到 SYN → 回 SYN-ACK → 收到 ACK → 状态变为 ESTABLISHED。
      这套规则就是“逻辑上的三次握手”——只在 TCP 的逻辑状态机里存在,IP 层根本不 care。

举个生活类比

  • 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室
    
  • 门卫一看门牌号,直接送到张三家门口,不会送错。

一句话总结

客户端进程不监听端口,但操作系统为它临时“注册”了四元组;所有返回包按四元组精准投递,因此绝不会搞错收件人。


网站公告

今日签到

点亮在社区的每一天
去签到