互联网四层模型


Internet Protocol

Internet Protocal简称IP,是互联网四层模型中Network Layer中一层的概念

IP的功能

  • 输入:(目标 IP 地址, 数据载荷( payload ))
  • 输出:IP数据报,包含了:
      • source IP address(源 IP 地址)
    • destination IP address(目标 IP 地址)
    • TTL( Time to LIve )
    • payload( 真正传输的数据 )
    • protocol

Best-effort Delivery

Best-effort Delivery是IP的一个特点,它表示网络尽力而为的特性,但是不承诺结果 note 里列出了多种可能情况:

  • Delivered once
    送达一次
  • Never delivered
    根本没送到
  • Delivered n > 1 times
    送达了多次
  • Delivered with altered or truncated payload
    内容被改了,或者被截断了
  • Delivered to wrong destination
    送错地方了
  • Delivered after another datagram that was sent later
    后发的包先到了,顺序乱了

UDP( User Datagram Protocol )

UDP 接收的输入比 IP 多一个东西:

  • 目标 IP 地址
  • 目标端口号 dst port
  • payload UDP 会把它封装成一个 User Datagram,里面包含
  • source port
  • destination port
  • payload 然后这个 UDP 数据报会作为 IP 的 payload,再交给 IP 去发送。

IP和UDP的主要区别

The fundamental difference between UDP and IP is that UDP is port-to-port, while IP is host-to-host.

操作系统为每个用户程序分配不同的端口,避免相互干扰. 需要注意的是,IP和UDP都是unreliable


常见问题与解答

Q1: 数据在传输中被篡改怎么办?

  • UDP 和 IP 都包含一个轻量级校验和(checksum),用于检测数据是否被篡改。
  • 如果校验失败,数据报可能被丢弃。

Q2: Firefox 如何知道目标端口?

  • 类似于知道目标 IP 地址,通常由应用程序(如浏览器)根据服务类型确定。
  • 配置文件如 /etc/services 中记录了常见服务的端口号。

Q3: Firefox 如何知道自己的源端口?

  • 由操作系统内核自动分配,确保不与其它程序冲突。

Q4: 如何接收数据?

  • 使用 UDPSocket::recv,可以获取源地址和数据载荷。

Q5: 是否必须使用 /etc/services 中指定的端口?

  • 不一定,服务可以运行在任意端口上,只要客户端知道即可。

协议栈与模块化

  • 协议栈由多个模块组成,每一层只与上下层交互,不需要知道整个世界的全部细节
  • 每一层通过服务抽象(service abstraction)向上层提供服务

UDP和IP的分层关系

唯一需要注意的一点就是:

Routers only look at the IP layer, not the application payload.


如何在 UDP 上构建可靠性?

示例:可靠的数据检索服务

  • 服务名:host cs144.keithw.org
  • 实现方式:
    • 客户端不断发送请求,直到收到响应
    • 最终要么返回结果,要么超时
  • 这种“可靠检索”适合只读操作,重复请求不会造成问题

可靠检索 vs 可靠动作

  • 可靠检索:可以重复请求,适合查询类操作
  • 可靠动作:如“发射鱼雷”,必须确保只执行一次
  • 服务的设计取决于它提供的可靠性类型