网络协议通常都是分层开发的,一个协议族(protocol suite)则是不同 layer(层)上的协议的集合,TCP/IP 协议族是我们常用的一个协议族,其包含 4 个 layer:
- Link layer 也被叫做 Data link layer(数据链路层)或者 Network interface layer(网络接口层)。此 Layer 主要包括设备的驱动(device driver)和 NIC(网卡)。这一层主要用来解决物理接口上硬件的细节问题
- Network layer(网络层)处理 Packet(分组)在网络中移动,例如 Packet 的路由就发生在此 Layer。TCP/IP 协议族里面,IP 协议就在此 Layer 上
- Transport layer(传输层)主要解决两台主机之间数据流动的问题,在 TCP/IP 协议族里面,有两个非常不同的 Transport 协议:TCP 和 UDP
- Application layer(应用层)主要处理特定的应用程序细节。不同的 TCP/IP 实现下都会提供一些通用的程序:Telnet、FTP、SMTP 等
各层协议:
Application layer — Telnet、FTP、HTTP、SMTP、DNS 等
Transport layer — TCP、UDP
Network layer — IP、ICMP、IGMP
Transport layer 协议:
通常来说,程序员最关心了两个协议就是 Transport layer 的 TCP 和 UDP 协议了:
- TCP 协议提供了两台主机之间可靠的通讯,使得 Application layer 无需关注这些细节
- UDP 协议只是为 Application layer 提供非常简单的服务,它只是将 datagrams(数据报)从一台主机发送到另外一台,并不保证数据能够到达另一端,可靠性必须要由 Application layer 来提供
TCP/IP 协议族协议分层图示:
数据的封装
当一个应用程序使用 TCP 发送数据的时候,数据被发送到协议栈(protocol stack)上,然后通过各个 Layer 最终以 Bits 流发送到网络上。每个 Layer 都会在数据上加一些 Header 信息(有时候还需要加上尾部信息),下图显示了这个过程:
其中:
- TCP 发送给 IP 的数据单元被叫做 TCP Segment(TCP 报文段)
- IP 发送给网络接口的数据单元被叫做 IP Packet(IP 分组)
- 通过以太网传送的 bits 流被叫做 Frame(帧)
UDP 发送给 IP 的数据单元被叫做 UDP Datagram(UDP 数据报),UDP Header 为 8 个字节。
UDP 和 TCP 都使用了一个 2 个字节的端口号(port numbers)来标识一个应用程序,UDP 和 TCP 把源和目标 port numbers 保存在 Header 中。
数据的分用(Demultiplexing)
当主机接收到数据的时候,数据就从协议栈的底部向上走,逐步去掉各个协议加上去的 Header。每个协议盒都会查看 Header 的标识来决定上层是由哪一个协议盒来接受数据,这被叫做数据的分用: