TCP/IP 协议

本文是对 TCP/IP 协议的概述,也会简要讲到网络安全、套接字编程和音视频网络,便于掌握基本概念,提供进一步深入的参考。
TCP/IP 体系结构
原则
首要目标:发展一种重复利用已有的互联网络的技术。
设计
分层模型
所有网络设备都实现了从下到上的三层,主机都实现了从下到上的所有层。
分层目的
- 协议数据单元 PDU
- 协议标识符,用于分解为何种上层协议。
- 每层都有自己的 PDU。
- 每层都将来自上层的数据看成不透明、无须解释的信息。
- 不同的网络设备根据希望执行的特定操作,只需实现协议栈中从下到上的部分子集。
- 端到端的协议直接通信,不用关心下层的协议如何运行。
标准制定
实现和软件分发
- 标准的 TCP/IP 实现首先来自 BSD 网络发布版。
- 如今每个流行的操作系统都有自己的实现。
示例
模拟了如何在一台 Internet 主机上进行分解:
链路层
目的
- 为 IP 模块发送和接收 IP 数据报。
- 还可用于携带一些支持 IP 的辅助性协议,如 ARP。
PDU
- 帧(Frame)。
- 最大传输单元 MTU:链路层携带高层协议 PDU 的有效载荷大小。
- 路径 MTU:当两台主机之间跨越多个网络通信时,每条链路可能有不同大小的 MTU,在包含所有链路的这个网络路径上,最小的 MTU 称为路径 MTU。
不同的网络硬件类型使用不同的帧格式
- 以太网
- 源地址:MAC 地址。
- 目的地址:MAC 地址
- 可寻址单个站点。
- 可寻址多个站点:
- 广播:ARP 协议。
- 组播:ICMPv6 协议。
- 数据类型字段:
- IPv4;
- IPv6;
- ARP。
- 最大 MTU:1500 字节。
- 无线局域网 Wi-Fi。
- 点到点协议 PPP。
- 环回:127.0.0.1 localhost。
- 隧道基础,隧道是在高层(或同等层)分组中携带底层数据:
- 在一个 IPv4 或 IPv6 分组中携带 IPv4 数据。
- 在一个 UDP、IPv4 或 IPv6 分组中携带以太网数据。
地址解析协议 ARP
目的
用于确定本地可达的 IPv4 子网使用的 IPv4 地址对应的硬件地址。
PDU
ARP 帧。
所属分层
链路层(辅助)。
ARP 缓存
每个主机和路由器上为每个接口维护从网络层到硬件地址的最新映射。
Internet 协议 IP
目的
- IP 协议的设计目标是为跨越不同类型物理网络的分组交换提供互操作。
- 提供了一种尽力而为、无连接的数据报交付服务:
- 尽力而为:不保证 IP 数据报能成功到达目的地,比如可能被丢弃等。
- 无连接:不维护网络单元中数据报相关的任何链接状态信息,每个数据报独立于其他数据报来处理,比如数据报可不按顺序交付等。
PDU
IP 数据包,也叫分组(Packet)。
所属分层
网络层。
IP 地址结构
- IPv4 是 32 位,目的地址可用于单播、组播和广播(路由器禁用)。
- IPv6 是 128 位,使用特殊前缀表示一个地址范围,如节点本地、链路本地和全球性等,目的地址可用于单播和组播。
IP 分片
IP 比较外出接口的 MTU 和数据的大小,如果数据报太大则进行分片。IPv4 中的分片可以在原始发送方主机和端到端路径上的任何中间路由进行。值得一提的是,数据报分片自身也可被分片。IPv6 中的分片有些不一样,它只允主机进行分片。当一个 IP 数据报被分片了,直到它到达最终目的地才会被重组,主要是因为同一数据报的不同分片可能经由不同的路径到达相同的目的地。因为任何一个分片丢失了,整个数据报就丢失了,所以要避免分片。
IP 转发
直接交付
- 使用最长前缀匹配算法,子网掩码的作用。
- 过程:
- 链路层广播;
- 与 IPv4 地址匹配的目的主机响应一个应答;
- 发送方接收应答;
- 发送方直接发送以太网帧到目的主机。
间接交付
- 过程:
- 主机到路由器;
- 路由器到连接 Internet 的路由器;
- 连接 Internet 的路由器对数据报进行网络地址转换 NAT,以使它在 Internet 中可路由。
动态主机配置协议 DHCP
目的
一种流行的客户机/服务器协议,上网设备通过 DHCP 获得基本要素。
PDU
DHCP 和 BOOTP 消息,被放到 UDP 数据报中发送。
所属分层
应用层。
基本要素
一个系统能够在 Internet 上运行的基本要素:
- 拥有一个 IP 地址和子网掩码;
- 路由器的 IP 地址;
- DNS 服务器的 IP 地址。
获得基本要素的方式:
- 手工获得信息;
- 通过一个系统获得使用的网络服务;
- 使用某种算法自动确定。
DHCP 中继
在更复杂的网络中,可通过一个或更多 DHCP 中继代理来中继 DHCP 流量。
无状态地址自动配置
一台主机从一个范围中随机选择一个地址,并检查该地址是否已在本子网中被其他系统使用。
防火墙
包过滤防火墙
目的
一个互联网路由器,能够丢弃符合(或者不符合)特定条件的数据包。
所属分层
网络层。
常见形式
- 有状态的:通过关联已经或者即将到达的数据包来推断流或者数据报的信息,即那些属于同一个传输关联的数据包或构成同一个 IP 数据报的 IP 分片。
- 无状态的:单独处理每一个数据报。
代理防火墙
目的
运行一个或多个应用层网关的主机,该主机拥有多个网络接口,能够在应用层中继两个连接/关联之间的特定类型的流量。与包过滤防火墙一样,一种常见的配置是为 "外" 接口分配一个全局路由的 IP 地址,为 "内" 接口分配一个私有的 IP 地址,因此代理防火墙支持使用私有地址范围。
所属分层
应用层,传输层等。
常见形式
- HTTP 代理防火墙,也称 Web 代理:代理对于内网用户来说就像是 Web 服务器,对于被访问的外部网站来说就像是 Web 客户端,提供 Web 缓存和内容过滤器等功能。
- SOCKS 防火墙:应用程序在开发时必须添加 SOCKS 代理支持功能,同时通过配置应用程序能够获知代理的位置及其版本,客户端就可以使用 SOCKS 协议请求代理进行网络连接。
网络地址转换 NAT
目的
允许在互联网的不同地方重复使用相同的 IP 地址集的机制。
所属分层
传输层,网络层等。
工作原理
重写通过路由器的数据包的识别信息,与具体支持的协议有关系。
基本 NAT 只执行 IP 地址的重写,每一条转换连路的公网地址都是不相同的,所以实际作用不大:
NAPT 使用传输层标识符(即 TCP 和 UDP 端口,ICMP 查询标识符),如下图中第二个实例的端口号 23479 被重写为 3000,以便区分返回的 192.168.1.2 和 192.168.1.35 的流量,每一条转换连路的公网地址都是相同的:
NAT 穿越
应用程序需要确定其流量通过 NAT 时使用的外部 IP 地址和端口号,并对其协议操作做相应的修改,如果一个应用程序分布在整个网络中,例如,有多个客户端和服务器,其中一些并不在 NAT 后,服务器可为位于 NAT 后的客户端之间传递数据,或者使这样的客户端发现对方的 NAT 绑定,并促成它们之间的直接通信。
IP 控制报文协议 ICMP
目的
- 提供与 IP 协议层配置和 IP 数据包处置相关的诊断和控制信息。
- ICMP 报文通常是由 IP 层本身、上层的传输协议,例如 TCP 或者 UDP,甚至某些情况下是用户应用触发执行的,ICMP 并不为 IP 网络提供可靠性,只是表明了某些类别的故障和配置信息。
- 类型:
- ICMPv4 是专门用于 IPv4。
- ICMPv6 是专门用于 IPv6,也发挥着更为重要的作用。
PDU
- ICMP 报文,在 IP 数据报内被封装传输的。
- 分类:
- 差错报文:
- 有关 IP 数据报传递的 ICMP 报文。
- 示例:
- ICMP 超时:
- 每个 IPv4 数据报在头部中都有一个生存周期 TTL 字段。
- 每个 IPv6 数据报在头部中都有一个跳数限制 Hop Limit 字段。
- traceroute。
- ICMP 超时:
- 信息类报文:
- 有关信息采集和配置的 ICMP 报文。
- 示例:
- ping。
- IPv6 中的邻居发现:
- 允许在同一个链路或者网段的节点(路由器和主机)找到彼此,确定它们之间是否有双向连通性,确定一个邻居是否变得不合作或者不可用。
- 差错报文:
所属分层
网络层(辅助)。
广播和本地组播
目的
- 交付至多个目的地:有许多应用程序将信息交付至多个收件方。没有播或组播,这些类型的服务往往倾向于使用 TCP 将一个单独的副本交付至每一个目的地,这是非常低效的。
- 通过客户端请求服务器:应用程序可以向一个服务器发送一个请求,而不用知道任何特定服务器的 IP 地址。这种功能在配置过程中非常有用。
PDU
UDP 数据报或ICMP 报文。
所属分层
传输层,网络层(辅助),网络层,链路层。
广播
- 影响在广播范围内所有可以到达的主机。
- IPv4:请求报文发送到定向子网的广播地址,会使用链路层广播地址发送该数据报。
组播
- 只影响那些可能对该请求有兴趣的主机。
- 通过发送方指明接收方,或是通过接收方独立地指明它们的兴趣,如在链路层网络中:
- 任源组播 ASM:对于发送方的身份是不敏感的。
- 特定源组播 SSM:对于发送方的身份是敏感的。
- 请求报文发送到 IP 组播地址,此 IP 组播地址会被映射成 MAC 组播地址,然后数据报在链路层上传递,分组到达主机,经过目的 MAC 地址、目的 IP 地址和端口号的过滤,在交付至进程,进程可以动态地加入或离开一个接口上的组播组,还可以指定它希望收听或派出的源。
IGMP 和 MLD
组播路由器了解附近的主机感兴趣的组,知道哪些主机当前属于那些组播组:
- IPv4 使用互联网组管理协议 IGMP。
- IPv6 使用的组播侦听发现协议 MLD。
用户数据报协议 UDP
目的
一种保留消息边界的面向数据报的协议,提供差错检测。
PDU
UDP 数据报。
所属分层
传输层。
域名系统 DNS
目的
将主机名称 host names 转换成 IP 地址,TCP/IP 协议实现对 DNS 一无所知,它们只对地址进行操作。
PDU
DNS 消息。
所属分层
应用层。
DNS 名称空间
DNS 中使用的所有的名称集合,并且划分成以顶级域名开始的层次结构。
地址解析器
- 获得 DNS 服务器的 IP 地址:
- IPv4:
- DHCP。
- IPv6:
- 通过 DHCPv6 获得。
- 通过 ICMPv6 路由器通知消息获得。
- IPv4:
- 联系一个本地域名服务器,该服务器可能递归地联系一个根服务器或满足该请求的其他服务器。
传输控制协议 TCP
目的
提供了一种面向连接的、可靠的字节流服务,不保留消息边界。
PDU
TCP 报文,又叫段(Segment)。
所属分层
传输层。
连接管理
TCP 连接的建立与终止
- TCP 三次握手:交换初始序列号。
- TCP 四次挥手。
TCP 状态转换图
重传
处理差错
- 差错校正码:添加一些冗余的比特,使得即使某些比特被毁,真实的信息也可以被恢复过来。
- 自动重复请求:尝试重新发送,直到信息最终被接收,TCP 采用的方式。
超时重传
- 发送数据时会设置一个计时器,若至计时器超时仍未收到数据确认信息,则会引发重传。
- 接收端在收到数据后会返回确认信息 ACK,因为可在该信息中携带测量传输该确认信息所需的时间,每个此类的测量结果称为 RTT 样本,然后需要根据一段时间内的样本值建立好的估计值,再基于估计值设置 RTO。
- RTO,Retransmission Timeout,重传超时。
- RTT,Round Trip Time,往返时间是这些时间的总和:发送分组所用的时间,接收方处理它和发送一个 ACK 所用的时间,ACK 返回到发送方所用的时间,以及发送方处理 ACK 所用的时间。
快速重传
当失序数据到达时,接收端立即返回重复 ACK,发送端在观测到一定数目的重复 ACK 后,即重传可能丢失的数据分组,而不必等到重传计时器超时,重复 ACK 可能发生在分组丢失,也可能仅为延迟到达,通常无法得知是哪种情况。
动态数据传输 - 根据接收端的反馈
延时 ACK
累积确认可以延迟一段时间发送 ACK,以便将 ACK 和相同方向上需要传的数据结合发送,减少 ACK 传输数目,可以一定程度地减轻网络负载。
Nagle 算法
限制发送端在任意时刻发送单个小数据包,减少较小数据包在网络连接中的数目,从而减小传输资源开销。
流量控制
- 基于速率:给发送方指定某个速率,同时确保数据永远不能超过这个速率发送。
- 基于窗口:滑动窗口,TCP 采用的方式。
滑动窗口
- 发送窗口和接收窗口:收发数据的缓存空间。
- 接收端发送的每个 ACK 包含一个窗口通告,告诉发送端自己还有多少缓存空间,也就是接收端通知窗口,于是发送端会发送不超过这个限度的数据。
- 通告窗口值可能为 0,表明接收端缓存已满,这时发送端停止发送,并以一定间隔不断地发送窗口探测,直到收到 ACK 表明窗口变大或收到接收端主动发送的窗口通告表明有可用缓存空间。
拥塞控制 - 根据中间传输过程的观察
拥塞
路由器因无法处理高速率到达的流量而被迫丢弃数据信息的现象称为拥塞。
当某一路由器在单位时间内接收到的数据量多于其可发送的数据量时,它就需要把多余的部分存储起来,假如这种状况持续,最终存储资源将会耗尽,路由器因此只能丢弃部分数据。
过程
慢启动与拥塞避免通过在发送方设置一个拥塞窗口来实现对其操作的控制。该拥塞窗口将与接收端通知窗口一起使用。一个标准的 TCP 会将其窗口的最小值限定为 2。随着时间的增长,慢启动要求拥塞窗口的数值指数地增加,而拥塞避免则会随着时间的推移而线性增长。在任何时刻都只能选择两种算法中的一种运行,而做出这一选择则需要比较拥塞窗口当前的数值与慢启动的阈值。如果拥塞窗口超过了阈值,那么采用拥塞避免;否则使用慢启动。慢启动起初只在建立 TCP 连接以及因超时而重新启动后使用。它也适用于连接长时间处于空闲状态的情况。在整个连接的过程中,慢启动的阈值会动态地进行调整。
关键词:
- 丢包:当检测到丢包时就会触发这些算法,无论是通过快重传算法还是超时重传。
- 两个核心算法:
- 慢启动:指数增长。
- 拥塞避免:线性增长。
- 慢启动阈值。
- 拥塞窗口:反映网络传输能力的变量。
保活机制
不是 TCP 规范中的一部分,主流 TCP 版本都实现了保活功能,应用层可以选择是否开启这一功能来建立连接。
如果在一段时间(称为保活时间,keepalive time)内连接处于非活动状态,开启保活功能的一端将向对方发送一个保活探测报文。如果发送端没有收到响应报文,那么经过一个已经提前配置好的保活时间间隔(keepalive interval),将继续发送保活探测报文,直到发送探测报文的次数达到保活探测数(keepalive probe),这时对方主机将被确认为不可到达,连接也将被中断。
网络安全
基本原则
- 机密性是指信息只能为其指定的用户(可能包含处理系统)知晓。
- 完整性是指信息在传输完成之前不能够通过未授权的方式修改。
- 可用性是指在需要的时候信息是可用的。
加密
对称密码系统
加密和解密的算法相同,它们的密钥也是相同的:
算法:
- DES 数据加密标准。
- AES 高级加密标准。
非对称(公钥)密码系统
使用接收者的公钥进行加密而用它的私钥进行解密,从而保证信息的机密性:
算法:
- RSA。
证书
重要挑战:如何正确地决定某个主体或身份的公钥?
- 数字签名:当公钥密码系统 "反向" 使用时,只有拥有 Alice 私钥的人才能够对消息进行授权或以 Alice 的身份发起上述传输过程。
- 需要用公钥证书以数字签名的方式将一个主体与一个指定的公钥绑定起来。
- 证书颁发机构是用于管理与认证一些个体与它们的公钥间的绑定关系的实体。
- 系统(如浏览器)在配置时已经安装了知名 CA 的根证书。
阅读 HTTPS 简介 图解详细过程。
TCP/IP 安全协议
加密技术的协议存在于协议栈的多个不同层次:
- 链路层的安全服务致力于保护一跳通信中的信息;
- 网络层的安全服务致力于保护两个主机之间传输的信息;
- 传输层的安全服务致力于保护进程与进程之间的通信;
- 应用层的安全服务致力于保护应用程序操纵的信息。
IPsec
IPsec 通常要求在操作系统内部或者主机与嵌入式设备的协议上来实现。
IPsec 是一个集合了许多标准的体系结构。这些标准在网络层为 IPv4、IPv6 以及移动 IPv6 提供数据源认证、完整性、机密性以及访问控制。它还为两个通信的实体提供了一种交换密钥的方法、一个加密套件以及一种标记使用压缩的方法。通信方可能是一台个人主机,也可能是一个在受保护与不受保护网络区域间提供界限的安全网关(Security Gateway,SG)。因此IPsec 适用于以下应用,比如远程访问企业局域网(形成一个 VPN),通过开放的 Internet 实现企业内部各部分的安全连接,或保证主机与扮演主机的路由器在交换路由信息时的安全。
TLS
TLS 流行的一个原因是它能够在应用程序内部或底部实现,而这些应用程序是运行于底层之上的。
TLS 是一个客户端/服务器协议,设计用于为两个应用程序的连接提供安全。记录协议提供分片、压缩、完整性保护以及对客户端与服务器之间所交换数据的加密服务。信息交换(handshaking)协议负责建立身份、进行认证、提示警报,以及为用于每一条连接的记录协议提供唯一的密钥材料。
DTLS
TLS 的一个变种称为 DTLS,它将 TLS 应用于数据报协议,比如 UDP 于 DCCP。
DNSSEC
DNS 安全不仅指 DNS 中的数据(资源记录,RR)安全,还包含在同步或更新 DNS 服务器内容时的传输安全。鉴于 DNS 在 Internet 运行中的重要作用,针对其部署安全机制会有深远的影响。
套接字编程 Socket
套接字编程主要是针对传输层(TCP、UDP 和 SCTP)进行编程,也有针对更底层协议的原始套接字。套接字编程是建立在操作系统的运行库之上,如针对 UNIX 操作系统上的进程使用 BSD 套接字进行编程,这是一个相对复杂的内容,参考 UNIX 网络编程 卷1:套接字联网 API 了解更多。
客户机/服务器模型 C/S
- 客户端:
- UNIX BSD 套接字。
- iOS CFNetwork(基于 BSD 套接字)。
- 客户程序设计范式。
- 服务器:
- 迭代:一次处理一个请求。
- 并发:同时处理多个请求,真实的服务器。
- 服务器程序设计范式。
对等模型 P2P
每个应用既是客户机,又是服务器,有时同时是两者,并能转发请求,一组 P2P 应用形成一个覆盖网络,主要问题是发现服务。
音视频网络
听过一句话,音视频技术就是计算机网络+操作系统,音视频网络因为其独有的特性,多是基于 IP 或 UDP 上构建的网络,参考 RTP: Audio and Video for the Internet 了解更多。