本篇包含
- 预备知识
- 应用层
- 传输层
思维导图如下:
预备知识
计算机网络发展的四个阶段
第一阶段(60 年代初期到 60 年代中期)
面向终端的计算机网络:主机是网络的中心和控制者,终端(键盘和显示器)分布在各处并与主机相连,用户通过本地的终端使用远程的主机。只提供终端和主机之间的通信,子网之间无法通信。
第二阶段(60 年代中期到 70 年代中期)
采用分组交换技术实现计算机 — 计算机之间的通信,使计算机网络的结构、概念都发生了变化,形成了通信子网和资源子网的网络结构。
- 第二代计算机网络是计算机网络的“形成与发展”阶段
- 美国的 ARPA 网就是第二代网络的代表: ARPA
第三阶段(70 年代中期到 80 年代末期)
现代计算机网络互连阶段,特征是网络体系结构的形成和网络协议的标准化。 在计算机通信系统的基础之上,重视网络体系结构和协议标准化的研究,建立全网统一的通信规则,用通信协议软件来实现网络内部及网络与网络之间的通信,通过网络操作系统,对网络资源进行管理,极大的简化了用户的使用,使计算机网络对用户提供透明服务 。
1981 年国际标准化组织(ISO)制订:开放体系互联基本参考模型(OSI/RM),实现不同厂家生产的计算机之间实现互连。 TCP/IP 协议也是诞生于该阶段。
第四阶段 –高速、综合化网络
-
宽带综合业务数字网:信息高速公路
-
ATM 技术、ISDN、千兆以太网
-
交互性:网上电视点播、电视会议、可视电话、网上购物、网上银行、网络图书馆等高速、可视化。
Internet 就是这一代网络的典型代表,已经成为人类最重要的、最大的知识宝库。第四代计算机网络属于计算机网络的“继续发展”阶段。
网络性能指标
速率相关
-
比特 bit: 数据计量单位 01 组成。
-
速率 rate: 是指计算机网络中的主机在数字信道上,单位时间内从一端传送到另一端的数据量,即数据传输率,也称数据率或比特率。比特(bit)是数据量的最小单位,s(秒)是时间的最小单位。所以速率单位为 bit/s 或 bps(bit persecond),类似的有 kb/s(k=106)、Gb/s(G=1012),1Byte=8bit 1B=8b1B/s=8b/s(或 1Bps=8bps)。
3)、Mb/s(M=10
9)、Tb/s(T=10
-
带宽 bandwidth: 计算机网络中的主机在数字信道上,单位时间内从一端传送到另一端的最大数据量,即最大速率。单位是比特/秒。
-
吞吐量 throughput: 吞吐量是指对网络、设备、端口或其他设施在单位时间内成功地传送数据的数量(以比特、字节等测量单位),也就是说吞吐量是指在没有帧丢失的情况下,设备能够接收并转发的最大数据速率。
时延 Delay
-
节点处理时延 proc: 路由器或主机在收到数据包时,要花费一定时间进行处理,例如分析数据包的首部、进行首部差错检验,查找路由表为数据包选定准发接口,这就产生了处理时延。
-
排队时延 queue: 等待输出链路可用,进入路由器之后要先在输入队列中排队等待处理。在路由器确定了转发接口后,还要在输出队列中排队等待转发,这就产生了排队时延。
-
传输时延 trans: 传输延迟也叫发送时延, 将所有分组推向链路的时间 。取决于路由器的拥塞程度
其他
-
时延带宽积: 时延带宽积表示链路可容纳的比特数,因此,链路的时延带宽积又称为以比特为单位的链路长度。时延带宽积=传播时延 × 带宽。
-
往返时间 RTT: 往返时间 RTT,表示从发送方发送数据开始,到发送方收到来自接收方的确认(接收方收到数据后便立即发送确认),总共经历的时间。往返时间一般就会包括分组在网络中的各种时延。在一定程度上反映了网络的拥塞程度。
-
信道利用率: 信道利用率指出某信道有百分之几的时间是被利用的(有数据通过),等于发送时延除以发送时延加上往返传输时延。完全空闲的信道的利用率是零。利用率越接近于 1,时延急剧增大,信道利用率越高。
计算机网络的分类
按照覆盖的地理范围进行分类,计算机网络可以分为局域网、城域网和广域网三类。
- 局域网(LAN)。局域网是一种在小区域内使用的,由多台计算机组成的网络,覆盖范围通常局限在 10 千米范围之内,属于一个单位或部门组建的小范围网。
- 城域网(MAN)。城域网是作用范围在广域网与局域网之间的网络,其网络覆盖范围通常可以延伸到整个城市,借助通信光纤将多个局域网联通公用城市网络形成大型网络,使得不仅局域网内的资源可以共享,局域网之间的资源也可以共享。
- 广域网(WAN) 广城网是一种远程网,涉及长距离的通信,覆盖范围可以是个国家或多个国家,甚至整个世界。由于广域网地理上的距离可以超过几千千米,所以信息衰减非常严重,这种网络一般要租用专线,通过接口信息处理协议和线路连接起来,构成网状结构,解决寻径问题。
常见网络的拓扑结构
星型拓扑
星型拓扑是由中央节点和通过点到点通信链路接到中央节点的各个站点组成。 优点:可靠性高,方便管理,易于扩展,传输效率高. 缺点:线路利用率低,中心节点需要很高的可靠性和冗余度。
总线拓扑
总线拓扑结构采用一个信道作为传输媒体,所有站点都通过相应的硬件接口直接连到这一公共传输媒体上,该公共传输媒体即称为总线。 优点:费用较低,易于扩展,线路的利用率高; 缺点:可靠性不高,维护困难,传输效率低。
环型拓扑
在环型拓扑中各节点通过环路接口连在一条首尾相连的闭合环型通信线路中,环路上任何节点均可以请求发送信息。 优点:令牌控制,没有线路竞争,实时性强,传输控制容易; 缺点:维护困难,可靠性不高
计算机网络交换技术
数据交换的基本概念:通常将数据在通信子网中各节点间的数据传输过程称为数据交换。
分类:网络中常用的数据交换技术可分为两大类:电路交换和存储转发交换,其中存储转发交换技术又可分为报文交换和分组交换。
电路交换
传统的电路交换要求每个主机之间必须直接连接, 假设网络中有$C_n^2$条链路, 十分浪费资源. 为了改进, 引入交换机, 让主机连入到交换机上, 通过交换技术实现两台主机的连接.
从通信资源的分配角度来看,“交换”就是按照某种方式动态地分配传输线路的资源。 电路交换的 3 个阶段:
- 建立连接
- 通信
- 关闭连接
报文交换
报文整个地发送,一次一跳。报文交换是分组交换的前身。
报文交换采用“存储-转发”方式进行传送,无需事先建立线路,事后更无需拆除。它的优点是:线路利用率高、故障的影响小、可以实现多目的报文;缺点是:延迟时间长且不定、对中间节点的要求高、通信不可靠、失序等,不适合计算机网络,处理时间大于分组交换。
分组交换
分组交换是一种数位通信网络。它将资料组合成适当大小的区块,称为封包,再通过网络来传输。这个传送封包的网络是共享的,每个单位都可以独立把封包再传送出去,而且配置自己需要的资源。
分组又称为包,而分组的首部也可称为“包头”。分组是在互联网中传送的数据单元。 分组的首部包含了诸如目的地址和源地址等重要控制信息,每一个分组才能在互联网中独立地选择传输路径,并被正确地交付到分组传输的终点。
路由器是用来进行分组交换的。路由器收到一个分组,先暂时存储一下,检查其首部,查找转发表,按照首部中的目的地址,找到合适的接口转发出去,把分组交给下一个路由器。这样一步一步地(有时会经过几十个不同的路由器)以存储转发的方式,把分组交付最终的目的主机。各路由器之间必须经常交换彼此掌握的路由信息,以便创建和动态维护路由器中的转发表,使得转发表能够在整个网络拓扑发生变化时及时更新。
为了提高分组交换网的可靠性,互联网的核心部分常采用网状拓扑结构,使得当发生网络拥塞或少数结点、链路出现故障时,路由器可灵活地改变转发路由而不致引起通信的中断或全网的瘫痪。
分析: 分组交换在传送数据之前不必先占用一条端到端的链路的通信资源。分组在哪段链路上传送才占用这段链路的通信资源。分组在传输时一段一段地断续占用通信资源(转发),而且还省去了建立连接和释放连接的开销,因而数据的传输效率更高。同时可靠性更高。
但是,这种非端到端占用资源就会导致存储转发时需要排队,这就产生了时延。此外,分组所携带的首部种的控制信息也会占用一定的开销。 分组交换的特点:
-
存储转发传输: 与报文交换机能够开始向输出链路传输该分组的第一个比特之前, 必须接收到整个分组. 仅当路由器接收到所有分组之后才能向链路传输该分组. 通过 N 条速率均为 R 的链路组成的路径, 从源到目的地发送一个分组, 端到端的时延是:
-
转发表和路由选择协议: 当源主机要向目的地端系统发送一个分组时,源在该分组的首部包含了目的地的 IP 地址. 路由器有一个转发表,用于将目的地址映射为输出链路,路由器会根据分组的地址在转发表里面查找对应的输出链路。
3 种交换网络的对比
分组交换与报文交换都是采用存储-转发交换方式. 报文交换以完整报文进行 “存储-转发”, 分组交换以较小的分组进行 “存储-转发”。
计算机网络协议基本概念
网络协议是为计算机网络中进行数据交换而建立的规则、标准或者说是约定的集合。
网络协议是由三个要素组成: (1) 语义。语义是解释控制信息每个部分的意义。它规定了需要发出何种控制信息,以及完成的动作与做出什么样的响应。例如数字减去数字是有意义的,数字减去文本一般来说就没有意义。 (2) 语法。语法是用户数据与控制信息的结构与格式,以及数据出现的顺序。例如,括号要成对,结束要使用分号等。 (3) 时序。时序是对事件发生顺序的详细说明。(也可称为“同步”)。 例如,可以先加上某个数值,然后再减去某个数值。 人们形象地把这三个要素描述为:语义表示要做什么,语法表示要怎么做,时序表示做的顺序。
网络层次结构的划分
为什么要在网络中使用分层
类比于在软件工程中使用分层结构,分层的目的是屏蔽底层细节。分层就是层层交付,下层向上层提供服务。对于上层来说,如同两个对等层之间直接交流,他们不关心底层的细节与实现,底层的存在是透明的。
在分层体系结构中,各层之间是完全独立的,某一层并不需要知道他的下一层是如何实现的,而仅仅是需要知道下层提供的服务。由于每一层都只是实现一种相对独立的功能,因而可以将一个难以处理的复杂问题分解为若干个小问题。
TCP/IP 协议簇
现代网络使用的是 TCP/IP 协议簇, 但是在 TCP/IP 协议簇之前,还有一种协议理论: OSI 协议。 但由于 OSI 理论过于复杂,因此并没有得到广泛应用。
互联网中广泛使用的是 TCP/IP 的四层协议,但是在教学过程中, 我们学习的是五层协议,注意区分。
(1)应用层: 应用层协议定义的是应用进程间通信和交互的规则。 这里的进程就是指主机中正在运行的程序。在互联网中的应用层协议很多,如域名系统DNS,支持万维网应用的HTTP 协议,支持电子邮件的SMTP 协议,等等。应用层交互的数据单元称为报文(message)。
(2)运输层: 负责向两台主机中进程之间的通信提供通用的数据传输服务。运输层主要使用两种协议:传输控制协议 TCP(Transmission Control protocol,提供面向连接的、可靠的数据传输服务)和用户数据报协议 UDP (User Datagram Protocol,提供无连接的、尽最大努力的数据传输服务(不保证数据传输的可靠性))。
(3)网络层: 网络层负责为分组交换网上的不同主机提供通信服务。在发送数据时,网络层把运输层产生的报文段或用户数据报封装成分组或包进行传送。在 TCP/IP 体系中,由于网络层使用 IP 协议,因此分组也叫做 IP 数据报,或简称为数据报。无论在哪一层传送的数据单元,都可笼统地用“分组”来表示。网络层的另一个任务就是要选择合适的路由,使源主机运输层所传下来的分组,能够通过网络中的路由器找到目的主机。
(4)数据链路层: 数据链路层常简称为链路层。我们知道,两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。在两个相邻结点之间传送数据时,数据链路层将网络层交下来的 IP 数据报组装成帧(framing,在两个相邻结点间的链路上传送帧(fame)。每一帧包括数据和必要的控制信息(如同步信息、地址信息、差错控制等)。
(5)物理层: 在物理层上所传数据的单位是比特。因此物理层要考虑用多大的电压代表“1”或“0”,以及接收方如何识别出发送方所发送的比特。物理层还要确定连接电缆的插头应当有多少根引脚以及各引脚应如何连接。请注意,传递信息所利用的些物理媒体,如双绞线、同轴电缆、光缆、无线信道等,并不在物理层协议之内而是在物理层协议的下面。因此也有人把物理层下面的物理媒体当作第 0 层。注意 mac 地址并不属于物理层而是属于数据链路层。
应用层
应用层是网络协议栈的最上面的一层。应用层协议定义的是应用进程间通信和交互的规则。 这里的进程就是指主机中正在运行的程序。在互联网中的应用层协议很多,如域名系统 DNS,支持万维网应用的 HTTP 协议,支持电子邮件的 SMTP 协议,等等。应用层交互的数据单元称为报文(message)。
网络应用模型
应用层协议原理
研发网络应用程序的核心是写出能够运行在不同的端系统和通过网络彼此通信的程序。例如,在网络应用程序中,有两个互相通信的不同程序:一个是运行在用户主机上的浏览器程序;另一个是运行在 Web 服务器主机上的 Web 服务器程序。
体系结构
主要分为 p2p 模型和 客户/服务器模型
(1) 在客户-服务器体系结构 (client-server architecture)中,有一个总是打开的主机称为服务器,它服务于来自许多其他称为客户的主机的请求。著名的应用程序包括 Web、FTP、Telnet 和电子邮件。
(2) 在一个 P2P 体系结构(P2P architecture)中,对位于数据中心的专用服务器有最小的(或者没有)依赖。相反,应用程序在间断连接的主机对之间使用直接通信,这些主机对被称为对等方。
进程通信
在以上两种体系结构中, 服务器或者客户的服务都是以进程的形式运行在主机上的。不同主机中的进程是如何进行信息通信的?
客户与服务器进程
在 CS 架构中,浏览器或者客户端被称为客户,Web 服务器被称为服务器。在 P2P 架构中, 一个进程充当两种角色:用户和服务器。
在一对进程之间的通信会话场景中,发起通信(即在会话开始时发起与其他进程的联系)的进程称为客户,在会话开始时等待联系的被称为服务器。
进程与计算机网络之间的接口
在一台主机上肯定不止运行了一个进程, 分布在多个主机上的进程是如何进行通信的?实际上,每个进程之间会有一个 套接字(socket) 的软件接口存在,套接字是应用程序的内部接口,应用程序可以通过它发送或接收数据,可对其进行像对文件一样的打开、读写和关闭等操作。套接字允许应用程序将 I/O 插入到网络中,并与网络中的其他应用程序进行通信。
Socket 是同一台主机内的应用层和传输层之间的接口。 程序开发者对于传输层的控制仅限于: 1 选择传输层协议 2 也许可以设定几个传输层参数。
Socket 是对 TCP/IP 协议的封装,复杂的 TCP/IP 协议族隐藏在 Socket 接口后面。它的出现使得程序员能够更加方便地借助于 TCP/IP 协议栈通信。
进程寻址
进程寻址用于解决 socket 往哪发送数据的问题。不同主机之间需要使用 IP 地址进行标识,同一主机上的进程用端口号进行标识。例如, Web 应用程序需要用 80 端口来标示,邮件服务器程序需要使用 25 来标示。
端口的分类: 公认端口(WellKnownPorts)0-1023:其中 80 端口分配给 WWW 服务,21 端口分配给 FTP 服务等。访问网站默认访问服务器的 80 端口。
注册端口(RegisteredPorts)1024-49151:分配给用户进程或应用程序。这些进程主要是用户选择安装的一些应用程序,而不是已经分配好了公认端口的常用程序。
动态端口(Dynamic Ports)49152-65535:动态端口的范围是从 49152 到 65535。之所以称为动态端口,是因为它 一般不固定分配某种服务,而是动态。
应用层协议
应用程序的应用层协议选择
应用层协议有很多, 应用程序应该怎样选择适合自己的应用层协议?主要从以下四个方面进行考量。
数据传输是否可靠: 分组在计算机网络中会存在丢包问题,丢包问题的严重性跟网络应用程序的性质有关,如果像是电子邮件、文件传输、远程主机、Web 文档传输的过程中出现问题,数据丢失可能会造成非常严重的后果。如果像是网络游戏,多人视频会议造成的影响可能比较小。鉴于此,数据传输的可靠性也是首先需要考虑的问题。因此,如果一个协议提供了这样的确保数据交付的服务,就认为提供了 可靠数据传输(reliable data transfer),能够忍受数据丢失的应用被称为 容忍丢失的应用(loss-tolerant application)。
吞吐量: 吞吐量就是在网络应用中数据传输过程中,发送进程能够向接收进程交付比特的速率。具有吞吐量要求的应用程序被称为 带宽敏感的应用(bandwidth-sensitive application)。带宽敏感的应用具有特定的吞吐量要求,而 弹性应用(elastic application) 能够根据当时可用的带宽或多或少地利用可供使用的吞吐量。
定时: 运输层协议也能提供定时保证,如同吞吐量保证一样,定时保证可以以多种形式实现。例如,可以设置发送方注入进套接字的每个比特到达接收方的套接字不迟于 100ms。这种服务对交互式实时应用程序非常适用。
安全性:
在发送主机中,运输层协议能够加密由发送进程传输的所有数据;在接收主机中,运输层协议能够在数据交付给接收进程之前解密这些数据。
因特网能够提供的运输服务
一个应用层协议需要选择适合他的运输层协议支撑他的该应用层协议的服务。 运输层提供了两种运输协议: 1)TCP 服务 1 . 面向连接的服务
在应用层数据报发送后, TCP 让客户端和服务器互相交换运输层控制信息。这个握手过程就是提醒客户端和服务器需要准备好接受数据报。握手阶段后,一个 TCP 连接(TCP Connection)
就建立了。这是一条全双工的连接,即连接双方的进程都可以在此连接上同时进行收发报文。当应用程序结束报文发送后,必须拆除连接。
2 . 可靠的数据服务 通信进程能够依靠 TCP,无差错、按适当顺序交付所有发送的数据。应用程序能够依靠 TCP 将相同的字节流交付给接收方的套接字,没有字节的丢失和冗余。
3 . 拥塞控制 TCP 的拥塞控制并不一定为通信进程带来直接好处,但能为因特网带来整体好处。当接收方和发送方之间的网络出现拥塞时,TCP 的拥塞控制会抑制发送进程(客户端或服务器),我们会在后面具体探讨拥塞控制
2)UDP 服务: 基于“尽力而为”的网络层
- 面向非连接
- 不可靠连接
- 没有拥塞控制
网络层与传输层之间的对比
在之前我们介绍过了运输层的 tcp 和 udp,为了和应用层协议做区分,我们对比一下应用层和运输层。
常见的应用对应的应用层协议
Web 和 HTTP
关于 HTTP
Web 即 World Wide Web。是全世界使用最广泛的网络应用。提供了文件以及其他 web 资源访问服务,所有的文件通过 URL(统一资源定位器)来定位。在浏览器中输入 url 就可以访问这网站的资源文件。
HTTP 协议(HyperText Transfer Protocol),它定义了网络通信中消息的结构,以及客户端和服务端如何交换消息,消息可以称为 HTTP 报文(HTTP Message)。HTTP 网络通信由客户端应用程序和服务端应用程序构成,客户端应用程序为 Web 浏览器,服务端应用程序为 Web 服务器。HTTP 通信的过程是:浏览器通过 URL 指定要访问的资源,然后发送 HTTP 请求给服务器,服务器收到请求后,响应 HTTP 请求。浏览器收到的服务器的响应信息后,渲染该资源文件。
关于 URL 统一资源定位器,例如 https://www.yzh.im:80/index.html:
- 协议:其中
https://
v 告诉浏览器使用何种协议。另外,浏览器也知道如何处理其他协议。例如, mailto: 协议指示浏览器打开邮件客户端;ftp:协议指示浏览器处理文件传输。 - 主机 www.yzh.im 是一个域名,它指示了需要向网络上的哪一台主机发起请求。当然,也可以直接向主机的 IP address 地址发起请求。
- 端口:两个主机之间要发起 TCP 连接需要两个条件,主机 + 端口。它表示用于访问 Web 服务器上资源的入口。如果访问的该 Web 服务器使用 HTTP 协议的标准端口(HTTP 为 80,HTTPS 为 443)授予对其资源的访问权限,则通常省略此部分。否则端口就是 URI 必须的部分。
- 路径:/index.html 代表访问服务器根目录下的 index.html 文件。
HTTP 分类
http 分为持久性连接和非持久性连接。
- 非持久性连接在每个 TCP 链接都在服务器发送完成后关闭。每个 TCP 连接只传输一个请求报文和响应报文。
- 在采用 HTTP 1.1 持续连接的情况下,服务器在发送响应后保持该 TCP 连接打开不关闭。在相同的客户与服务器之间,后续的请求和响应报文能够通过相同的连接进行传送。
HTTP 报文
HTTP 请求报文
请求报文格式如下
(Request Line) method URL Version(Header Lines) header_field_name: value header_field_name: value ...(Entity Body) ...
字段说明:
- 请求头(request line)中定义了 http 请求的关键参数。其中 Method 字段表示请求的方式,常用的请求方式为 GET,POST。URL 字段用来定位资源,Version 字段用来说明当前使用的协议版本。
- 头部行(Header Lines)中定义了可选的参数,用来辅助 HTTP 请求。
- 数据域(Entity Body) 用来传输数据。
例如:
HTTP 响应报文
格式如下:
(Status Line) version status_code phrase(Header Lines) header_field_name: value header_field_name: value ...(Entity Body) ...
字段说明:
- 状态行(Status Line)定义了响应报文的关键参数。其中 Version 用来说明当前使用的协议版本,Status Code 表示请求结果的状态码,phrase 为状态码的说明。
- 头部行(Header Lines)中定义了可选的参数,用来辅助 HTTP 响应。
- 数据域(Entity Body) 用来传输数据。响应的数据一般是 HTML 文本,或者 JSON 文本。
常见的状态码:
- 200 OK:请求成功。
- 301 Moved Permanently:资源位置永久移动,请求会自动重定向到资源新的 URL。
- 400 Bad Request:错误的请求。
- 404 Not Found:请求的资源不存在服务器中。
- 505 HTTP Version Not Supported:HTTP 协议版本不支持。
例如:
Cookie
HTTP 服务器是无状态化的,这简化了服务器的设计,这让工程师可以去开发能同时处理大量数据的高性能服务器。但是有时 Web 站点希望能去识别用户,为此 HTTP 使用了 cookie 来进行用户跟踪。 cookie 技术有 4 个组件:
- 在 HTTP 响应报文中的一个 cookie 首部行;
- 在 HTTP 请求报文中的一个 cookie 首部行;
- 在用户端系统中保留有一个 cookie 文件,并由用户的浏览器进行管理;
- 位于 Web 站点的一个后端数据库。
DNS
什么是 dns
实现域名到主机 IP 的转换。DNS 是一个实现在多个 DNS 服务器的分布式数据库。一个应用层协议允许去查询分布式数据库。它提供了将域名转换为 IP 地址的服务。
DNS 的全称是 Domain Name System,DNS ,它是一个由分层的 DNS 服务器(DNS server)实现的分布式数据库;它还是一个使得主机能够查询分布式数据库的应用层协议。
与 HTTP、FTP、SMTP 协议一样,DNS 协议也是应用层协议。它运行在 UDP 之上,使用客户机/服务器模式在通信的端系统之间运行,在通信的端系统之间通过下面的端到端运输层协议来传送 DNS 报文。DNS 通常由其他应用层协议(包括 HTTP、FTP、SMTP)所使用,用于将用户提供的主机名解析为 IP 地址。
在浏览器中键入一个域名来访问网站,DNS 的工作流程如下: 【1】用户主机上运行着 DNS 应用的客户端 【2】浏览器从 URL 中提取出要访问的网站的主机名,将主机名传送给本机的 DNS 客户端 【3】DNS 客户端向 DNS 服务器发送一个包含主机名的请求 【4】DNS 客户端收到一份来自服务器的回答报文,其中包含对应于主机名的 IP 地址 【5】浏览器向对应的 IP 地址定位的 HTTP 服务器发起一个 TCP 连接
除了提供 IP 地址到主机名的转换,DNS 还提供了下面几种重要的服务: 主机别名(host aliasing),有着复杂的主机名的主机能够拥有一个或多个其他别名,比如说一台名为 relay1.west-coast.enterprise.com 的主机,同时会拥有 enterprise.com 和 www.enterprise.com 的两个主机别名,在这种情况下,relay1.west-coast.enterprise.com 也称为 规范主机名,而主机别名要比规范主机名更加容易记忆。应用程序可以调用 DNS 来获得主机别名对应的规范主机名以及主机的 IP 地址。
邮件服务器别名(mail server aliasing),同样的,电子邮件的应用程序也可以调用 DNS 对提供的主机名进行解析。
负载分配(load distribution),一个域名关联一组 IP 地址,多个服务器依次处理 HTTP 请求,从而减少了单个服务器的压力。
DNS 的工作概述
假设运行在用户主机上的某些应用程序(如 Web 浏览器或邮件阅读器) 需要将主机名转换为 IP 地址。这些应用程序将调用 DNS 的客户端,并指明需要被转换的主机名。用户主机上的 DNS 收到后,会使用 UDP 通过 53 端口向网络上发送一个 DNS 查询报文,经过一段时间后,用户主机上的 DNS 会收到一个主机名对应的 DNS 回答报文。因此,从用户主机的角度来看,DNS 就像是一个黑盒子,其内部的操作你无法看到。但是实际上,实现 DNS 这个服务的黑盒子非常复杂,它由分布于全球的大量 DNS 服务器以及定义了 DNS 服务器与查询主机通信方式的应用层协议组成。
DNS 最早的一种简单设计只是在因特网上使用一个 DNS 服务器。该服务器会包含所有的映射。这是一种集中式
的设计,这种设计并不适用于当今的互联网,因为互联网有着数量巨大并且持续增长的主机,这种集中式的设计会存在以下几个问题
单点故障(a single point of failure)
,如果 DNS 服务器崩溃,那么整个网络随之瘫痪。通信容量(traaffic volume)
,单个 DNS 服务器不得不处理所有的 DNS 查询,这种查询级别可能是上百万上千万级远距离集中式数据库(distant centralized database)
,单个 DNS 服务器不可能邻近
所有的用户,假设在美国的 DNS 服务器不可能临近让澳大利亚的查询使用,其中查询请求势必会经过低速和拥堵的链路,造成严重的时延。维护(maintenance)
,维护成本巨大,而且还需要频繁更新。
所以 DNS 不可能集中式设计,它完全没有可扩展能力,因此采用分布式设计
,所以这种设计的特点是 分布式、层次数据库。
首先分布式设计首先解决的问题就是 DNS 服务器的扩展性问题,因此 DNS 使用了大量的 DNS 服务器,它们的组织模式一般是层次方式,并且分布在全世界范围内。没有一台 DNS 服务器能够拥有因特网上所有主机的映射。相反,这些映射分布在所有的 DNS 服务器上。
大致来说有三种 DNS 服务器:根 DNS 服务器、 顶级域(Top-Level Domain, TLD) DNS 服务器 和 权威 DNS 服务器 。这些服务器的层次模型如下图所示:
假设现在一个 DNS 客户端想要知道 amazon.com 的 IP 地址,那么上面的域名服务器是如何解析的呢?首先,客户端会先根服务器之一进行关联,它将返回顶级域名 com
的 TLD 服务器的 IP 地址。该客户则与这些 TLD 服务器之一联系,它将为 amazon.com 返回权威服务器的 IP 地址。最后,该客户与 amazom.com 权威服务器之一联系,它为 www.amazom.com 返回其 IP 地址。 我们现在来讨论一下上面域名服务器的层次系统
-
根 DNS 服务器
,有 400 多个根域名服务器遍及全世界,这些根域名服务器由 13 个不同的组织管理。根域名服务器的清单和组织机构可以在 root-servers.org/ 中找到,根域名服务器提供 TLD 服务器的 IP 地址。 -
顶级域 DNS 服务器
,对于每个顶级域名比如 com、org、net、edu 和 gov 和所有的国家级域名 uk、fr、ca 和 jp 都有 TLD 服务器或服务器集群。所有的顶级域列表参见 tld-list.com/ 。TDL 服务器提供了权威 DNS 服务器的 IP 地址。 -
权威 DNS 服务器
,在因特网上具有公共可访问的主机,如 Web 服务器和邮件服务器,这些主机的组织机构必须提供可供访问的 DNS 记录,这些记录将这些主机的名字映射为 IP 地址。一个组织机构的权威 DNS 服务器收藏了这些 DNS 记录。一般域名服务器的层次结构主要是以上三种,除此之外,还有另一类重要的 DNS 服务器,它是
本地 DNS 服务器(local DNS server)
。严格来说,本地 DNS 服务器并不属于上述层次结构,但是本地 DNS 服务器又是至关重要的。每个 ISP(Internet Service Provider) 比如居民区的 ISP 或者一个机构的 ISP 都有一台本地 DNS 服务器。当主机和 ISP 进行连接时,该 ISP 会提供一台主机的 IP 地址,该主机会具有一台或多台其本地 DNS 服务器的 IP 地址。通过访问网络连接,用户能够容易的确定 DNS 服务器的 IP 地址。当主机发出 DNS 请求后,该请求被发往本地 DNS 服务器,它起着代理的作用,并将该请求转发到 DNS 服务器层次系统中。
DNS 的查询方式
- 主机向本地域名服务器的查询一般都是采用递归查询。如果主机所询问的本地域名服务器不知道被查询域名的 IP 地址,那么本地域名服务器就以 DNS 客户的身份,向其他根域名服务器继续发出查询请求报文。
- 本地域名服务器向根域名服务器的查询通常是采用迭代查询。 当根域名服务器收到本地域名服务器的迭代查询请求报文时,要么给出所要查询的 IP 地址,要么告诉本地域名服务器:“你下一步应当向哪一个域名服务器进行查询”。然后让本地域名服务器进行后续的查询。
DNS 缓存
DNS 缓存(DNS caching)
有时也叫做 DNS 解析器缓存,它是由操作系统维护的临时数据库,它包含有最近的网站和其他 Internet 域的访问记录。也就是说, DNS 缓存只是计算机为了满足快速的响应速度而把已加载过的资源缓存起来,再次访问时可以直接快速引用的一项技术和手段。那么 DNS 的缓存是如何工作的呢?
DNS 缓存的工作流程 在浏览器向外部发出请求之前,计算机会拦截每个请求并在 DNS 缓存数据库中查找域名,该数据库包含有最近的域名列表,以及 DNS 首次发出请求时 DNS 为它们计算的地址。
DNS 记录和报文
共同实现 DNS 分布式数据库的所有 DNS 服务器存储了资源记录(Resource Record, RR)
,RR 提供了主机名到 IP 地址的映射。每个 DNS 回答报文中会包含一条或多条资源记录。RR 记录用于回复客户端查询。 资源记录是一个包含了下列字段的 4 元组
(Name, Value, Type, TTL)
RR 会有不同的类型,下面是不同类型的 RR 汇总表:
DNS RR 类型解释 A 记录 IPv4 主机记录,用于将域名映射到 IPv4 地址 AAAA 记录 IPv6 主机记录,用于将域名映射到 IPv6 地址 CNAME 记录别名记录,用于映射 DNS 域名的别名 MX 记录邮件交换器,用于将 DNS 域名映射到邮件服务器 PTR 记录指针,用于反向查找(IP 地址到域名解析)SRV 记录 SRV 记录,用于映射可用服务。
DNS 报文:
DNS 有两种报文,一种是查询报文,一种是响应报文,并且这两种报文有着相同的格式,下面是 DNS 的报文格式:
下面对报文格式进行解释
- 前 12 个报文是
首部区域
,也就是说首部区域有 12 个字节,第一个字段(标识符)是一个 16 比特的数,用于标示该查询。这个标识符会被复制到对查询的回答报文中,以便让客户用它来匹配发送的请求和接受到的回答。 标志字段含有若干标志,标志字段表示为 1 比特,它用于指出报文是 0-查询报文还是 1-响应报文。 问题区域
包含着正在进行的查询信息。这个区域包括:1) 名字字段,包含正在被查询的主机名字;2) 类型字段,指出有关该名字的正被询问的问题类型,例如主机地址是与一个名字相关联(类型 A)还是与某个名字的邮件服务器相关联(类型 MX)。- 在来自 DNS 服务器的回答中,回答区域包含了对最初请求的名字的资源记录。上面说过 DNS RR 记录是个四元组,而且元组中的 Type 会有不同的类型。在回答报文的回答区域中可以包含多条 RR,因此一个主机名能够有多个 IP 地址。
权威区域
包含了其他权威服务器的记录附加区域
包含了其他有帮助的记录。
邮件协议
电子邮件
从图中我们可以看到它有三个主要组成部分:用户代理(user agent)
、邮件服务器(mail server)
、和简单邮件传输协议(Simple Mail Transfer Protocol,SMTP)
。下面我们就来描述一下邮件收发的过程。
用户代理允许用户阅读、回复、转发、保存和撰写报文。微软的 Outlook
和 Apple Mail
是电子邮件用户代理的例子。当用户编写完邮件时,他的用户代理向邮件服务器发送邮件,此时用户发送的邮件会放在邮件服务器的外出消息队列(Outgoing message queue)
中,当接收方用户想要阅读邮件时,他的用户代理直接从外出消息队列中去取得该报文。
邮件服务器构成了整个邮件系统的核心。每个接收方在其中的邮件服务器上会有一个邮箱(mailbox)
存在。用户的邮箱管理和维护发送给他的报文。一个典型的邮件发送过程是:从发送方的用户代理开始,传输到发送方的邮件服务器,再传输到接收方的邮件服务器,然后在这里被分发到接收方的邮箱中。用接收方的用户想要从邮箱中读取邮件时,他的邮件服务器会对用户进行认证。如果发送方发送的邮件无法正确交付给接收方的服务器,那么发送方的用户代理会把邮件存储在一个报文队列(message queue)
中,并在以后尝试再次发送,通常每 30 分钟发送一次,如果一段时间后还发送不成功,服务器就会删除报文队列中的邮件并以电子邮件的方式通知发送方。
SMTP
是因特网电子邮件中的主要的应用层协议。SMTP 也使用 TCP 作为运输层协议,保证数据传输的可靠性。
SMTP 协议传输过程
为了描述 SMTP 的基本操作,我们观察一下下面这种常见的情景。
我们假设 Alice 想给 Bob 发送一封简单的 ASCII 报文
- Alice 调用她的邮件代理程序并提供 Bob 的邮件地址 (例如 bob@someschool.edu),编写邮件报文,然后指示用户代理发送该报文
- Alice 的用户代理把报文发送给她的邮件服务器,在那里该报文被放在消息队列中。
- 运行在 Alice 的邮件服务器上的 SMTP 客户端发现了报文队列中的邮件,它就创建一个到运行在 Bob 邮件服务器上的 SMTP 服务器的 TCP 连接
- 在经过一些初始化 SMTP 握手后,SMTP 客户端通过该 TCP 连接发送 Alice 的邮件。
- 在 Bob 的邮件服务器上,SMTP 的服务端接收该邮件,Bob 的邮件服务器将邮件放在 Bob 的邮箱中
- 在 Bob 想要看邮件时,他会调用用户代理阅读该邮件 上面说的邮件其实就是报文,指的就是一系列 ASCII 码,SMTP 传输邮件之前,需要将二进制多媒体数据编码为 ASCII 码进行传输。
SMTP 一般不使用中间邮件服务器发送邮件,即使这两个邮件服务器位于地球的两端也是这样的。TCP 连接通常直接连接 Alice 的邮件服务器和 Bob 的邮件服务器。
现在你知道了两台邮件服务器邮件发送的大体过程,那么,SMTP 是如何将邮件从 Alice 邮件服务器发送到 Bob 的邮件服务器的呢?主要分为下面三个阶段:
建立连接
:在这一阶段,SMTP 客户请求与服务器的 25 端口建立一个 TCP 连接。一旦连接建立,SMTP 服务器和客户就开始相互通告自己的域名,同时确认对方的域名。邮件传送
:一旦连接建立后,就开始邮件传输。SMTP 依靠 TCP 能够将邮件准确无误地传输到接收方的邮件服务器中。SMTP 客户将邮件的源地址、目的地址和邮件的具体内容传递给 SMTP 服务器,SMTP 服务器进行相应的响应并接收邮件。连接释放
:SMTP 客户发出退出命令,服务器在处理命令后进行响应,随后关闭 TCP 连接。
下面我们分析一个实际的 SMTP 邮件发送过程,以下统称为SMTP客户(C)
和 SMTP服务器(S)
。客户的主机名为 crepes.fr
,服务器的主机名为 hamburger.edu
。以 C: 开头的 ASCII 码文本就是客户交给 TCP 套接字的那些行,以 S: 开头的 ASCII 码则是服务器发送给其 TCP 套接字的那些行。一旦创建了连接,就开始了如下过程:
S: 220 hamburger.edu
C: HELO crepes.fr
S: 250 Hello crepes.fr, pleased to meet you
C: MAIL FROM: <alice@crepes.fr>
S: 250 alice@crepes.fr ... Sender ok
C: RCPT TO: <bob@hamburger.edu>
S: 250 bob@hamburder.edu ... Recipient ok
C: DATA
S: 354 Enter mail, end with "." on a line by itself
C: Do you like ketchup?
C: How about pickles?
C: .
S: 250 Message accepted for delivery
C: QUIT
S: 221 hamburger.edu closing connection
在上述例子中,客户从邮件服务器 crepes.fr 向邮件服务器 hamburger.edu 发送了一个报文 (" Do you like ketchup? How about pickles? “) 。作为对话的一部分,该客户发送了 5 条命令: HELO(是 HELLO 的缩写)
、 MAMIL FROM
、RCPT TO
、DATA
以及 QUIT
。这些命令都是自解释的。 什么是自解释,就是不需要再进行解释了,命令自己就能解释自己所要表述的功能。
上面是一个简单的 SMTP 交换过程,包括了连接建立、邮件传送和连接释放三个具体过程。
- 首先建立 TCP 连接、SMTP 调用 TCP 协议的 25 号端口监听连接请求,然后客户端发送 HELO 指令用来表明自己是发送方的身份,然后服务端作出响应。
- 然后,客户端发送 MAIL FROM 命令,表明客户端的邮件地址是
<alice@crepes.fr>
,服务器以 OK 作为响应,表明准备接收。 - 客户端发送 RCPT TO 表明接收方的电子邮件地址,可以有多个 RCPT 行,即一份邮件可以同时发送给多个收件人。服务器端则表示是否愿意为收件人接收邮件。
- 协商结束后,客户端用 DATA 命令发送信息,结束标志是
CRLF.CRLF
,也就是 回车换行.回车换行。 - 最后,控制交互的任一端可选择终止会话,为此它发出一个 QUIT 命令,另一端用命令 221 响应,表示同意终止连接,双方将关闭连接。
上述过程中会涉及几个类似 HTTP 的状态码。250 就表示 OK ,类似 HTTP 的 200。在命令成功时,服务器返回代码 250,如果失败则返回代码 550(命令无法识别)、451(处理时出错)、452(存储空间不够)、421(服务器不可用)等,354 则表示开始信息输入。
SMTP 的报文会有局限性,SMTP 的局限性表现在只能发送 ASCII 码格式的报文,不支持中文、法文、德文等,它也不支持语音、视频的数据。通过 MIME协议
,对 SMTP 补充。MIME 使用网络虚拟终端(NVT)标准,允许非 ASCII 码数据通过 SMTP 传输。
SMTP 与 HTTP 的对比
这两个协议都用于从一台主机向另一台主机传送文件:HTTP 从 Web 服务器向 Web 客户端(通常是浏览器)传送文件,SMTP 是从一个邮件服务器向另一个邮件服务器传送文件(即电子邮件报文)。 这两个协议也会有几个重要的区别
- 首先,HTTP 是一个
拉协议(pull protocol)
,客户端发送请求,请求获取服务端的资源,然后服务端进行响应,把需要下载的文件传输给客户端;而 SMTP 是一个推协议(push protocol)
,SMTP 的客户端会主动把邮件推送给 SMTP 的服务端。 - 第二个区别是,SMTP 要求每个报文都采用 7 比特的 ASCII 码格式,如果某报文包含了非 7 比特的 ASCII 自负或二进制数据,则该报文必须按照 7 比特 ASCII 码进行编码。HTTP 数据则不受这种限制。
- 第三个区别是如何处理一个既包含文本又包含图形的文档,HTTP 把每个对象封装到它自己的 HTTP 响应报文中,而 SMTP 则把所有报文对象放在一个报文之中。
邮件访问协议
在上述分析中,有一个疏漏的环节,那就是在 Alice 向 Bob 发送邮件的过程中,Bob 是如何通过运行在他本地 PC 上的用户代理,获得位于某 ISP 的邮件服务器上的他的邮件呢?注意到 Bob 的用户代理不能使用 SMTP 来取回邮件,因为取邮件时一个拉操作,而 SMTP 是一个推协议。因此我们要引入邮件访问协议,包括第三版的邮局协议(POP3)、因特网邮件访问协议(IMAP)以及 HTTP。 下图总结了应用于因特网电子邮件的一些协议:SMTP 用来将邮件从发送发的邮件服务器传输到接收方的邮件服务器。如 POP3 这样的邮件访问协议用来将邮件从接收方的邮件服务器传送到接收方的用户代理。
1)POP3
- POP3 是 Post Office Protocol 3 的简称,即邮局协议的第 3 个版本,是 TCP/IP 协议族中的一员(默认端口是 110)。
- 它被用户代理用来邮件服务器取得邮件。POP3 采用的也是 C/S 通信模型,对应的 RFC 文档为 RFC1939。
- POP3 支持电子邮件客户端下载服务器上的邮件,但是在客户端的操作(如移动邮件、标记已读等),不会反馈到服务器上,比如通过客户端收取了邮箱中的 3 封邮件并移动到其他文件夹,邮箱服务器上的这些邮件是没有同时被移动的 。
- POP3 使用明文传输密码, 不对密码加密
- POP3 建立在 TCP 连接上, 使用的是有连接的可靠数据传输服务
- IMAP
- IMAP 全称是 Internet Mail Access Protocol,即互联网邮件访问协议,是一个应用层协议(端口是 143)。用来从本地邮件客户端(Outlook Express、Foxmail、Mozilla Thunderbird 等)访问远程服务器上的邮件。
- 开启了 IMAP 后,您在电子邮件客户端收取的邮件仍然保留在服务器上,同时在客户端上的操作都会反馈到服务器上,如:删除邮件,标记已读等,服务器上的邮件也会做相应的动作。所以无论从浏览器登录邮箱或者客户端软件登录邮箱,看到的邮件以及状态都是一致的。
- 基于 Web 的电子邮件 当用户用 Web 浏览器使用电子邮件时,用户和他远程邮箱之间的通信则通过 HTTP;然而,用户的邮件服务器在与其他的邮件服务器之间发送和接收邮件时,仍然使用的是 SMTP。
CDN 内容分发
网络视频需要消耗大量的网络带宽,很多网络视频公司会选择 CDN (Content Distribution Network)服务,来优化用户的体验。 一个 CDN 网络管理很多分布在世界各地的服务器,在每个服务器上复制了视频和其它资源文件的副本,用户请求 CDN,然后 CDN 提供一个离用户客户端距离较近的服务器同响应客户端请求,从而给用户更快更好的网络体验。CDN 的实现是利用了 DNS 拦截和重定向请求功能。
不使用 CDN 可能会出现的问题 每个客户端都请求同一个地区的服务器(数据中心),服务器的带宽是一定的,请求太多造成客户端得到的资源吞吐量下降,会导致视频卡顿。 一个流行的视频会在同一个通信链路上多次传输,浪费网络带宽。 一个数据中心容易出现单点故障,导致整个服务不可用。
CDN 使用的过程
- 用户访问一个视频的链接,如 http://video.netcinema.com/6Y7B23V 。
- 浏览器查询客户端本地缓存是否存在该域名的 IP 地址。如果没有,继续下一步查询。
- 浏览器请求本地 DNS 服务器,查询 video.netcinema.com 域名的 IP 地址。本地 DNS 服务器检查本地缓存是否存在该域名,不存在,则请求权威 DNS 服务器,查询 video.netcinema.com 的 IP 地址。权威 DNS 服务器发现是 video 开头的域名,则返回 CDN 提供商的权威域名如 a105.kingcdn.com。
- 本地 DNS 服务器请求权威域名服务器,查询 a105.kingcdn.com 的 IP 地址,CDN 提供商根据客户端的地理位置,最终返回 CDN 系统中的一个 web 服务器 IP 地址。
- 本地 DNS 服务器把 IP 地址返回给浏览器。
- 浏览器通过 IP 地址与服务器建立 TCP 连接,发送视频访问请求。web 服务器返回视频内容给浏览器。
CDN 是如何让客户端访问离自己最近的一个服务器 方法一:使用 DNS 服务器响应一个离用户最近的服务器的 IP 地址。DNS 服务器通过查询 IP 位置数据库,获取客户端所在的城市。根据客户端所在的城市选一个最近的一个服务器的 IP 地址返回给客户端。 方法二:使用任播(Anycast)路由选择一个最近的服务器。CDN 分布世界各地的所有 Web 服务器使用同一个 IP 地址。路由器根据最少花费(Lowest Cost)的路由规则,选择一个离客户端最近的服务器。
FTP
简介
文件传送协议 FTP (File Transfer Protocol) 是互联网上使用得最广泛的文件传送协议。 FTP 提供交互式的访问,允许客户指明文件的类型与格式,并允许文件具有存取权限 网络环境下复制文件的复杂性:
- 计算机存储数据的格式不同。
- 文件的目录结构和文件命名的规定不同。
- 对于相同的文件存取功能,操作系统使用的命令不同。
- 访问控制方法不同。
正是因为网络环境下复制文件的复杂性,因此就需要用到了 FTP 协议了。
过程
- 打开熟知端口(端口号为 21),使客户进程能够连接上。
- 等待客户进程发出连接请求。
- 启动从属进程来处理客户进程发来的请求。从属进程对客户进程的请求处理完毕后即终止,但从属进程在运行期间根据需要还可能创建其他一些子进程。
- 回到等待状态,继续接受其他客户进程发来的请求。主进程与从属进程的处理是并发地进行。
- 当客户进程向服务器进程发出建立连接请求时,要寻找连接服务器进程的熟知端口 (21),同时还要告诉服务器进程自己的另一个端口号码,用于建立数据传送连接。
- 接着,服务器进程用自己传送数据的熟知端口 (20) 与客户进程所提供的端口号码建立数据传送连接。
- 由于 FTP 使用了两个不同的端口号,所以数据连接与控制连接不会发生混乱。
FTP 是使用了两个 TCP 连接的。好处:
- 使协议更加简单和更容易实现。
- 在传输文件时还可以利用控制连接(例如,客户发送请求终止传输)。
P2P
我们上面探讨的协议 HTTP、SMTP、DNS 都采用了客户-服务器
模式,这种模式会极大依赖总是打开的基础设施服务器。而 P2P
是客户端与客户端模式,对总是打开的基础设施服务器有最小的依赖。
P2P 的全称是 Peer-to-peer, P2P
,是一种分布式体系结构的计算机网络。在 P2P 体系中,所有的计算机和设备都被称为对等体,他们互相交换工作。对等网络中的每个对等方都等于其他对等方。网络中没有特权对等体,也没有主管理员设备。
从某种意义上说,对等网络是计算机世界中最平等的网络。每个对等方都相等,并且每个对等方具有与其他对等方相同的权利和义务。对等体同时是客户端和服务器。
实际上,对等网络中可用的每个资源都是在对等之间共享的,而无需任何中央服务器。P2P 网络中的共享资源可以是诸如处理器使用率,磁盘存储容量或网络带宽等。
P2P 用来做什么
P2P 的主要目标是共享资源并帮助计算机和设备协同工作,提供特定服务或执行特定任务。如前面说到的,P2P 用于共享各种计算资源,例如网络带宽或磁盘存储空间。 但是,对等网络最常见的例子是 Internet 上的文件共享。 对等网络非常适合文件共享,因为它们允许连接到它们计算机等同时接收文件和发送文件。 BitTorrent
是 P2P 使用的主要协议。
P2P 网络的作用
P2P 网络具有一些使它们有用的特征
- 很难完全掉线,即使其中的一个对等方掉线,其他对等方仍在运行并进行通信。 为了使 P2P(对等)网络停止工作,你必须关闭所有对等网络。对等网络具有很强的可扩展性。 添加新的对等节点很容易,因为你无需在中央服务器上进行任何中央配置。
- 当涉及到文件共享时,对等网络越大,速度越快。 在 P2P 网络中的许多对等点上存储相同的文件意味着当某人需要下载文件时,该文件会同时从多个位置下载。
传输层
传输层概述
传输层提供了进程间的逻辑通信,传输层向高层用户屏蔽了下面网络层的核心细节,使应用程序看起来像是在两个传输层实体之间有一条端到端的逻辑通信信道。
传输层两大重要的功能:复用 和 分用。
- 复用:在发送端,多个应用进程公用一个传输层;
- 分用:在接收端,传输层会根据端口号将数据分派给不同的应用进程。
和网络层的区别:
- 网络层为不同主机提供通信服务,而传输层为不同主机的不同应用提供通信服务。
- 网络层只对报文头部进行差错检测,而传输层对整个报文进行差错检测。
可靠传输的原理
理想的传输条件有以下两个特点:
- 传输信道不产生差错。
- 不管发送方以多快的速度发送数据,接收方总是来得及处理收到的数据。
然而实际的网络都不具备以上两个理想条件。必须使用一些可靠传输协议,在不可靠的传输信道实现可靠传输。
UDP 和 TCP 的特点
UDP
UDP 概述
UDP 只在 IP 的数据报服务之上增加了很少一点的功能:
- 复用和分用
- 差错检测
UDP 特性:
- 提供无连接服务。
- 在传送数据之前不需要先建立连接。
- 传送的数据单位协议是 UDP 报文或用户数据报。
- 对方的运输层在收到 UDP 报文后,不需要给出任何确认。
- 虽然 UDP 不提供可靠交付,但在某些情况下 UDP 是一种最有效的工作方式。
- UDP 支持一对一、一对多、多对一和多对多的交互通信。
- UDP 的首部开销小,只有 8 个字节,比 TCP 的 20 个字节的首部要短
还要注意的是:
- IP 数据报要经过互连网中许多路由器的存储转发。
- UDP 用户数据报是在运输层的端到端抽象的逻辑信道中传送的。
UDP 对应用层交下来的报文,既不合并,也不拆分,而是保留这些报文的边界。应用层交给 UDP 多长的报文,UDP 就照样发送,即一次发送一个报文。
UDP 首部格式
首部字段只有 8 个字节,包括源端口、目的端口、长度、检验和。12 字节的伪首部是为了计算检验和临时添加的。源端口号可有可无。
长度字段:UDP 数据报的整个长度,首部+数据字段。
UDP 检验和:用于差错校验,非必须,如果不使用校验和就将校验和字段置为全 0,如果校验和字段恰巧全为 0,就将校验和置为全 1。
分用时,找不到目的端口号,就丢弃报文,并且发送一个 ICMP,端口不可达的差错报文。
伪首部:也被称为伪 IP 首部,只在计算校验和的时候出现,既不向下传送也不向上递交。
伪首部的第三个字段固定全零。
伪首部第四个字段 17:封装 UDO 报文的 IP 数据报首部协议字段是 17。 UDP 长度:UDP 首部 8B+数据部分的长度(不包括伪首部)。
UDP 校验和计算
将一行看作一个整体,当作 4 个字节。 发送端:
- 填上伪首部
- 全 0 填充校验和字段
- 全 0 填充数据部分(UDP 数据报要看着许多 4B 的字串拼接起来)
- 用伪首部+首部+数据部分采用二进制反码求和
- 把和求反码填入校验和字段
- 去掉伪首部,发送。
接收端:
- 填上伪首部
- 伪首部+首部+数据部分采用二进制反码求和
- 结果全为 1 则无差错,否则丢弃数据报、交给应用层上出差错的警告。
TCP
TCP 概述
面向字节流
- TCP 中的“流”(stream)指的是流入或流出进程的字节序列。
- “面向字节流”的含义是:虽然应用程序和 TCP 的交互是一次一个数据块,但 TCP 把应用程序交下来的数据看成仅仅是一连串无结构的字节流。
- 接收方应用程序收到的字节流必须和发送方应用程序发出的字节流完全一样。
- 提供面向连接的服务。
- 传送的数据单位协议是 TCP 报文段 (segment)。
- TCP 不提供广播或多播服务。
- 由于 TCP 要提供可靠的、面向连接的运输服务,因此不可避免地增加了许多的开销。这不仅使协议数据单元的首部增大很多,还要占用许多的处理机资源。
TCP 报文段是在运输层抽象的端到端逻辑信道中传送,这种信道是可靠的全双工信道。但这样的信道却不知道究竟经过了哪些路由器,而这些路由器也根本不知道上面的运输层是否建立了 TCP 连接。
值得注意的:
- TCP 连接是一条虚连接而不是一条真正的物理连接。
- TCP 对应用进程一次把多长的报文发送到 TCP 的缓存中是不关心的。
- TCP 根据对方给出的窗口值和当前网络拥塞的程度来决定一个报文段应包含多少个字节(UDP 发送的报文长度是应用进程给出的)
面向套接字接口: 端口号拼接到 (contatenated with) IP 地址即构成了套接字。
TCP 报文
- 序号 :用于对字节流进行编号,例如序号为 301,表示第一个字节的编号为 301,如果携带的数据长度为 100 字节,那么下一个报文段的序号应为 401。
- 确认号 :期望收到的下一个报文段的序号。例如 B 正确收到 A 发送来的一个报文段,序号为 501,携带的数据长度为 200 字节,因此 B 期望下一个报文段的序号为 701,B 发送给 A 的确认报文段中确认号就为 701。
- 数据偏移 :指的是数据部分距离报文段起始处的偏移量,实际上指的是首部的长度。
- 确认 ACK :当 ACK=1 时确认号字段有效,否则无效。TCP 规定,在连接建立后所有传送的报文段都必须把 ACK 置 1。
- 同步 SYN :在连接建立时用来同步序号。当 SYN=1,ACK=0 时表示这是一个连接请求报文段。若对方同意建立连接,则响应报文中 SYN=1,ACK=1。
- 终止 FIN :用来释放一个连接,当 FIN=1 时,表示此报文段的发送方的数据已发送完毕,并要求释放连接。
- 窗口 :窗口值作为接收方让发送方设置其发送窗口的依据。之所以要有这个限制,是因为接收方的数据缓存空间是有限的。
TCP 报文段首部的前 20 个字节是固定的,后面有 4n 字节是根据需要而增加的选项 (n 是整数)。因此 TCP 首部的最小长度是 20 字节。首部的最大长度是 40 字节。
TCP 连接管理
TCP 的三次握手
假设 A 为客户端,B 为服务器端。
- 首先 B 处于 LISTEN(监听)状态,等待客户的连接请求。
- A 向 B 发送连接请求报文,SYN=1,ACK=0,选择一个初始的序号 x。
- B 收到连接请求报文,如果同意建立连接,则向 A 发送连接确认报文,SYN=1,ACK=1,确认号为 x+1,同时也选择一个初始的序号 y。
- A 收到 B 的连接确认报文后,还要向 B 发出确认,确认号为 y+1,序号为 x+1。
- B 收到 A 的确认后,连接建立。
三次握手的原因 第三次握手是为了防止失效的连接请求到达服务器,让服务器错误打开连接。 客户端发送的连接请求如果在网络中滞留,那么就会隔很长一段时间才能收到服务器端发回的连接确认。客户端等待一个超时重传时间之后,就会重新请求连接。但是这个滞留的连接请求最后还是会到达服务器,如果不进行三次握手,那么服务器就会打开两个连接。如果有第三次握手,客户端会忽略服务器之后发送的对滞留连接请求的连接确认,不进行第三次握手,因此就不会再次打开连接。
TCP 的四次挥手
以下描述不讨论序号和确认号,因为序号和确认号的规则比较简单。并且不讨论 ACK,因为 ACK 在连接建立之后都为 1。
- A 发送连接释放报文,FIN=1。
- B 收到之后发出确认,此时 TCP 属于半关闭状态,B 能向 A 发送数据但是 A 不能向 B 发送数据。
- 当 B 不再需要连接时,发送连接释放报文,FIN=1。
- A 收到后发出确认,进入 TIME-WAIT 状态,等待 2 MSL(最大报文存活时间)后释放连接。
- B 收到 A 的确认后释放连接。
四次挥手的原因 客户端发送了 FIN 连接释放报文之后,服务器收到了这个报文,就进入了 CLOSE-WAIT 状态。这个状态是为了让服务器端发送还未传送完毕的数据,传送完毕之后,服务器会发送 FIN 连接释放报文。 客户端接收到服务器端的 FIN 报文后进入 TIME_WAIT 状态,此时并不是直接进入 CLOSED 状态,还需要等待一个时间计时器设置的时间 2MSL。这么做有两个理由:
- 确保最后一个确认报文能够到达。如果 B 没收到 A 发送来的确认报文,那么就会重新发送连接释放请求报文,A 等待一段时间就是为了处理这种情况的发生。
- 等待一段时间是为了让本连接持续时间内所产生的所有报文都从网络中消失,使得下一个新的连接不会出现旧的连接请求报文。
TCP 流量控制
流量控制是为了控制发送方发送速率,保证接收方来得及接收。 接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。
TCP 使用滑动窗口机制来实现流量控制。 窗口是缓存的一部分,用来暂时存放字节流。发送方和接收方各有一个窗口,接收方通过 TCP 报文段中的窗口字段告诉发送方自己的窗口大小,发送方根据这个值和其它信息设置自己的窗口大小。 发送窗口内的字节都允许被发送,接收窗口内的字节都允许被接收。如果发送窗口左部的字节已经发送并且收到了确认,那么就将发送窗口向右滑动一定距离,直到左部第一个字节不是已发送并且已确认的状态;接收窗口的滑动类似,接收窗口左部字节已经发送确认并交付主机,就向右滑动接收窗口。 接收窗口只会对窗口内最后一个按序到达的字节进行确认,例如接收窗口已经收到的字节为 {31, 34, 35},其中 {31} 按序到达,而 {34, 35} 就不是,因此只对字节 31 进行确认。发送方得到一个字节的确认之后,就知道这个字节之前的所有字节都已经被接收。
TCP 拥塞控制
如果网络出现拥塞,分组将会丢失,此时发送方会继续重传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制发送方的速率。这一点和流量控制很像,但是出发点不同。流量控制是为了让接收方能来得及接收,而拥塞控制是为了降低整个网络的拥塞程度。
TCP 主要通过四个算法来进行拥塞控制:慢开始、拥塞避免、快重传、快恢复。 发送方需要维护一个叫做拥塞窗口(cwnd)的状态变量,注意拥塞窗口与发送方窗口的区别:拥塞窗口只是一个状态变量,实际决定发送方能发送多少数据的是发送方窗口。 为了便于讨论,做如下假设:
- 接收方有足够大的接收缓存,因此不会发生流量控制;
- 虽然 TCP 的窗口基于字节,但是这里设窗口的大小单位为报文段。
慢开始与拥塞避免
发送的最初执行慢开始,令 cwnd = 1,发送方只能发送 1 个报文段;当收到确认后,将 cwnd 加倍,因此之后发送方能够发送的报文段数量为:2、4、8 … 注意到慢开始每个轮次都将 cwnd 加倍,这样会让 cwnd 增长速度非常快,从而使得发送方发送的速度增长速度过快,网络拥塞的可能性也就更高。设置一个慢开始门限 ssthresh,当 cwnd >= ssthresh 时,进入拥塞避免,每个轮次只将 cwnd 加 1。 如果出现了超时,则令 ssthresh = cwnd / 2,然后重新执行慢开始。
快重传与快恢复
快重传是一种判断报文是否丢失的方法。而快恢复是一种确认窗口大小的方法,两者一般同时使用。
快重传的算法思路是:
- 要求 接收方 每收到一个时序的报文段后就立即发出重复确认,而不是等待发送数据时才进行捎带确认
- 发送方 只要一连收到三个重复确认,就应当立即重传对方尚未收到的报文段,而不必等待超时之后再重传
什么时候触发快重传算法? 发送方 只要一连收到三个重复确认,就应当立即重传对方尚未收到的报文段,而不必等待超时之后再重传
快恢复的算法思路是:
- 当 发送方 连续收到三个重复确认时,就知道现在只是丢失了部分报文,于是不执行慢开始算法,执行“乘法减小”算法,把慢开始 阀值 ssthresh 减半 , 窗口大小变为 ssthresh。
- 接着不执行慢开始,而是从新阀值 ssthresh 开始执行拥塞避免算法 (加法增大)
拥塞控制总结
Tcp Reno 算法