- 1. 计算机网络与互联网
- 1.1 什么是互联网
- 1.2 网络边缘
- 1.2.1 接入网
- 1.2.2 物理媒体
- 双绞铜线
- 同轴电缆
- 光纤
- 陆地无线电通道
- 卫星无线电通道
- 1.3 网络核心
- 1.3.1 包的交换
- 1.3.2 电路交换
- 1.3.3 网络的网络
- 1.4 分组交换网中的时延、丢包和吞吐量
- 1.4.1 分组交换网中的时延概述
- 1.4.2 排队时延和丢包
- 1.4.3 端到端时延
- 1.4.4 计算机网络中的吞吐量
- 1.5协议层次及其服务模型
- 1.5.1分层的体系结构
- 1.5.2 封装
- 1.6 面对攻击的网络
- 1.7 计算机网络和因特网的历史
- 2.应用层
- 2.1应用层协议原理
- 2.1.1网络应用程序体系结构
- 2.1.2 进程通信
- 2.1.3 可供应用程序使用的运输服务
- 2.1.4 因特网提供的运输服务
- 2.1.5 运输层协议
- 2.1.6本书涉及的网络应用
- 2.2 Web和HTTP
- 2.2.1 HTTP概况
- 2.2.2 非持续连接和持续连接
- 2.2.3 HTTP报文格式
- 2.2.4 用户与服务器的交互:cookie
- 2.2.5 Web 缓存
- 2.2.6 条件GET方法
- 2.3 因特网中的电子邮件
- 2.3.1 SMTP
- 2.3.2 与HTTP 的对比
- 2.3.3 邮件报文格式
- 2.4.4 邮件访问协议
- 2.4 DNS:因特网的目录服务
- 2.4.1 DNS 提供的服务
- 2.4.2 DNS工作机理概述
- 2.4.3 DNS记录和报文
- 2.5 P2P 文件分发
- 2.5.1 P2P体系结构的扩展性
- 2.5.2 BitTorrent
- 2.5.3 DHT(Distributed Hash Table)分布散列表
- 2.6 视频流和内容分发网络
- 2.6.1 网络视频
- 2.6.2 HTTP Streaming and DASH
- 2.6.3 内容分布网络
- 2.7 TCP套接字编程
- 2.7.1 UDP套接字编程
- 2.7.2 TCP套接字编程
- 2.1应用层协议原理
1. 计算机网络与互联网
1.1 什么是互联网
- 终端系统通过通信连接(communication links)和包交换机(packet switches)连接在一起
- 包交换机的两种主要类型
- 路由器(routers)与链路层交换机(link-layer swtiches)
- 路由器应用于网络核心,链路层交换机用于接入层
- 包交换机的两种主要类型
- transmission rate
- packets = header bytes + data
- 通路
- 终端系统通过网络服务提供商(Internet Service Providers , ISPs)访问互联网
- 每个ISP自身都是包交换机和通信连接的网络
- 协议定义了两个或多个通信实体之间交换的消息的格式和顺序,以及在发送和/或接收消息或其他事件时所采取的操作。
1.2 网络边缘
1.2.1 接入网
-
end systems = hosts
- servers
- clients
-
互联网中最常见的家庭访问方式
-
数字用户线(Digital Subscriber Line, DSL),通常和电话线是一体的
- 数字用户线接入复用器(digital subscriber line access multiplexer, DSLAM)是人们进行数据交换的中心,位于运营商的本地中心局。
- DSL在不同频段上同时传输电话信号与网络信号
- 独占线路
-
电缆(cable)
- 电缆因特网接入(cable Internet access)利用了有线电视公司现有的有线电视基础设施。
- 光缆将电缆头端连接到地区枢纽,从这里使用传统的同轴电缆到达各家各户和公寓。
- 因为在这个系统中应用了光纤和同轴电缆,所以它经常被称为混合光纤同轴(Hybrid Fiber Coax, HFC)。
- 电缆调制解调器(cable modem)通常是一个外部设备,通过一个以太网端口连接到家庭PC。
- 在电缆头端,电缆调制解调器端接系统(Cable Modem Termination System, CMTS)起到如同DSL网络的DSLAM 类似的功能。
- 电缆因特网接入的一个重要特征是使用共享广播媒体(共享的上行与下行通道)
- 共享线路
-
光纤到户(Fiber to The Home, FTTH)
-
一对一直接入户
-
主动光纤网络(Active Optical Network, AON)
-
被动光纤网络(Passive Optical Network, PON)
- 每个家庭具有一个光纤网络端接器(Optical Network Terminator, ONT),它由专门的光纤连接到邻近的分配器(splitter)。在家庭中,用户将一台家庭路由器(通常是无线路由器)与 ONT 相连,并经过这台家庭路由器接入因特网。
- 分配器把一些家庭(通常少于100个) 集结到一根共享的光纤,该光纤再连接到本地电话和公司的中心局中的光纤线路端接器(Optical Line Terminator, OLT)。
- 所有从 OLT发送到分配器的包在分配器处复制。
- 共享线路
-
-
卫星链路
-
-
企业常用的互联网接入方式:以太网和WIFI
- 以太网
-
广域无限接入:4G和LTE
1.2.2 物理媒体
- 对于每一个“传输--接收”对,每一个比特的信息以电磁波的形式通过物理媒体来传输。
- 物理媒体分为导引型媒体和非导引型媒体
双绞铜线
- 双绞铜线由两根塑胶封装的铜线呈螺旋状绞成。
- 许多双绞铜线对被捆扎在一起形成电缆,每对双绞铜线都构成一条通信线路
- 无屏蔽双绞线(Unshielded Twisted Pair, UTP)常用在建筑物内的计算机网络中,即用于局域网(LAN)中。目前局域网中的双绞
- 电话线和拨号上网方式都是用双绞线。拨号调制解调器技术通过双绞线能以高达56 kbps 的速率接入。数字用户线(DSL)技术通过双绞线使住宅用户以超过数十 Mbps的速率接人因特网(当用户靠近ISP的调制解调器居住时)。
- 导引型独占媒体
同轴电缆
- 导引型共享媒体
- 电缆电视系统最近与电缆调制解调器结合起来,为住宅区用户提供数十Mbps速率的因特网接入
光纤
- 光纤是长途引导型传输媒体,特别是适合跨海链路。
- 极高的比特速率、低的信号衰减、难以被窃听
- 光线的相关设备成本高,如发射器、接收器以及交换机等
陆地无线电通道
- 无线电信道的特性极大地依赖于传播环境和传输信号的距离。
- 路径损耗和遮挡衰落:即当信号跨距离传播和绕过/通过阻碍物体时信号降低强度
- 多径衰落:由于干扰对象的信号反射
- 干扰:由于其他无线电信道或电磁信号
- 陆地无线电信道能够大致划分为三类
- 很短距离(如1米或2米),如无线头戴式耳机、键鼠、医疗设备等
- 另一类运行在局域,通常跨越数十到几百米,如无线LAN技术
- 第三类运行在广域,跨越数万米,如蜂窝接入技术
卫星无线电通道
- 同步卫星
- 36000 km的高度
- 280 ms 的延迟
- 用于提供 DSL 和 电缆无法覆盖的区域的物联网接入
- 近地轨道卫星
- 需要放置多个才能够实现连续的覆盖
1.3 网络核心
1.3.1 包的交换
-
信息(message)、包(packet)
-
存储转发传输(store-and-forward transmission)
-
包交换机必须完全接受一个包后才能向后传输它
-
相隔 N 条链路(或说 N-1 个包交换机)传递P个包的延迟
-
\[D_{end-to-end} = (N+P-1)\frac{L}{R} \]
-
-
-
排队延时与丢包
-
转发表与路由选择协议
- 每台路由器具有一个转发表(forwarding table),用于将目的地址(或目的地址的一部分)映射成为输出链路。
- 因特网具有一些特殊的路由选择协议(routing protocol),用于自动地设置这些转发表。
- 例如,一个路由选择协议可以决定从每台路由器到每个目的地的最短路径,并使用这些最短路径结果来配置路由器中的转发表。
1.3.2 电路交换
-
通过网络链路和交换机移动数据有两种基本方法:电路交换(circuit switching)和分组交换(packet switching)。
-
用餐馆作比喻,电路交换是严格的预定式餐馆,而包交换则是非预定式的。在电路交换中,每个运行中的连接都是实际存在,并由路径上的交换机维护的。
-
电路交换网络中的复用
- 频分复用
- 电话网络、无线电台
- 带宽(在电话网络中为4 kHz)
- 时分复用
- 帧
- 电路交换网络不像包交换网络的“存储转发传输”机制那样受到链路数量 N 的影响
- 分组交换与电路交换的对比
- 分组交换的批评者经常争辩说,分组交换不适合实时服务(例如,电话和视频会议),因为它的端到端时延是可变的和不可预测的(主要是因为排队时延的变动和不可预测所致)。
- 分组交换的支持者却争辩道:①它提供了比电路交换更好的带宽共享;②它比电路交换更简单,更有效,实现成本更低。
- 历史站在了分组交换这一边。今天许多电路交换电话网正在缓慢地向分组交换迁移。
- 频分复用
1.3.3 网络的网络
- ISP提供用户接入互联网的服务。ISP不必是电信公司,也可以是学校、公司等拥有服务器的机构。为了让数量庞大的服务器相连,接入ISP本身也必须互联,即所谓“网络的网络”。
- 网络结构1
- 一个全球ISP作为供应商与其他所有客户ISP连接
- 网络结构2
- 多个全球ISP
- 网络结构3
- 增加区域ISP,形成三层结构
- 网络结构4
- 增加入网点(Point of Presence, PoP)、对等、多宿(multi-home)、因特网交换点(Internet exchange point, IXP)
- 入网点:单个ISP提供多个接入其网络的路由器或链路。ISP可以将PoP安装在电信公司所有的租用空间内进行租赁
- 对等:同级别的客户ISP可以直接建立网络进行数据传输。这样的好处是,不经过上级ISP传输,节省了付费流量。
- 多宿:一个客户ISP可以同时连接多个高级ISP。这样可以增加稳定性。
- 因特网交换点:提供集中的对等连接
- 增加入网点(Point of Presence, PoP)、对等、多宿(multi-home)、因特网交换点(Internet exchange point, IXP)
- 网络结构5
- 增加了内容提供商网络(content provider network)
- 独立于公共因特网
- 增加了内容提供商网络(content provider network)
1.4 分组交换网中的时延、丢包和吞吐量
在本节中,我们将开始研究和量化计算机网络中的时延、丢包和吞吐量等问题。
1.4.1 分组交换网中的时延概述
-
total nodal delay = nodal processing delay + queuing delay + transmission delay + propagation delay
- transmission 传输
- propagation 传播
-
时延的类型
- 处理时延
- 检查分组首部和决定将该分组导向何处
- 其他因素,如检查比特级别的差错
- 在高速路由器中,此时延为微秒级别
- 排队时延
- 分组在链路上等待传输
- 排队时延是流量强度和性质(周期性或突变性)的函数
- 毫秒到微秒级别
- 传输时延
- 路由器将数据推向链路所需的时间
- L/R
- 毫秒到微秒级别
- 传播时延
- d/s
- s ≈ 光速
- 在广域网中,为毫秒级别
- d/s
- 传输时延与传播时延
- 前者与包长度和链路传输速度有关,类似于高速公路上的收费站处理速度(ETC快于人工收费)
- 后者主要与路由器之间的距离有关,类似于高速公路上的行驶速度
- 常常出现的情况是传播时延小于传输时延,所以对于一个有多个分组的数据而言,可能第一个分组已经过传播达到接收路由器了,但数据本身还未完成传输
- 处理时延
1.4.2 排队时延和丢包
-
流量强度
-
\[traffic \ \ intensity = \frac{aL}{R} \]
- a表示包达到队列的平均速率,L表示包的平均比特长度,R表示传输速率
-
流量强度一定不可以大于 1
-
当流量强度小于等于 1时
-
若包周期性达到,则不会排队
-
若包突变性到达,则可能排队,并且随着流量强度接近 1,队列的平均长度呈指数式增加
-
-
-
丢包
1.4.3 端到端时延
- traceroute
- Traceroute是一个简单的程序,它能够在任何因特网主机上运行。当用户指定一个目的主机名字时,源主机中的该程序朝着该目的地发送多个特殊的分组(拥有编号用于显示路径节点的顺序)。当这些分组向着目的地传送时,它们通过一系列路由器。当路由器接收到这些特殊分组之一时,它向源回送一个短报文。该报文包括该路由器名字和地址。
- 常常默认重复进行3次
- 端系统、应用程序和其他时延
- 协议中的有意延迟
- Voice-over IP
- 语音信号在被发送之前还需要额外的处理,会有延迟
1.4.4 计算机网络中的吞吐量
- 瞬时吞吐量、平均吞吐量
- 瓶颈链路
- 串联中的最小值时瓶颈
- 共享链路可能成为瓶颈
1.5协议层次及其服务模型
1.5.1分层的体系结构
-
协议分层
-
互联网协议栈
- 应用层
- 应用层是网络应用程序及它们的应用层协议存留的地方
- 应用层协议分布在多个端系统上,端系统之间使用协议交换信息的分组。我们把这种位于应用层的信息分组称为报文(message)
- 因特网的应用层包括许多协议
- HTTP——提供 Web文档的请求和传送
- SMTP——提供电子邮件报文的传输
- FTP——提供两个端系统之间的文件传送
- DNS——域名系统
- 运输层
- 运输层在应用程序端点之间传送应用层报文。
- 在因特网中,有两个运输协议,即TCP 和UDP。
- TCP 向它的应用程序提供了面向连接的服务。这种服务确保有效的传递和并进行流量控制(即发送方/接收方速率匹配)。
- TCP也将长报文划分为短报文,并提供拥塞控制机制,因此当网络拥塞时,源抑制其传输速率。
- UDP协议向它的应用程序提供无连接服务。这是一种不提供不必要服务的服务,没有可靠性,没有流量控制,也没有拥塞控制。
- 在本书中,我们把运输层分组称为报文段(segment)
- 网络层
- 网络层负责将数据报(datagram)从一台主机移动到另一台主机。
- 数据报是网络层包的名称
- 源主机通过运输层协议(TCP或 UDP) 向网络层递交运输层报文段和目的地址
- 网络层包括著名的IP协议,该协议定义了在数据报中的各个字段以及端系统和路由器如何作用于这些字段。
- 仅有一个IP协议,所有具有网络层的因特网组件必须运行IP协议。
- 因特网的网络层也包括决定路由的路由选择协议
- 因特网具有许多路由选择协议。网络管理者能够运行所希望的任何路由选择协议。
- 网络层通常被简单地称为IP层
- 这反映了IP是将因特网连接在一起的粘合剂。
- 网络层负责将数据报(datagram)从一台主机移动到另一台主机。
- 链路层
- 为了将分组从一个结点(主机或路由器)移动到路径上的下一个结点,网络层必须依靠该链路层的服务。
- 在每个结点,网络层将数据报下传给链路层,链路层沿着路径将数据报传递给下一个结点。在下个结点,链路层将数据报上传给网络层。
- 由链路层提供的服务取决于应用于该链路的特定链路层协议。
- 链路层的例子包括以太网、WiFi和电缆接入网的DOCSIS协议。
- 数据报从源到目的地传送通常需要经过几条链路,一个数据报可能被沿途不同链路上的不同链路层协议处理
- 例如,一个数据报可能被一段链路上的以太网和下一段链路上的PPP 所处理。网络层将受到来自每个不同的链路层协议的不同服务。
- 数据报从源到目的地传送通常需要经过几条链路,一个数据报可能被沿途不同链路上的不同链路层协议处理
- 链路层的例子包括以太网、WiFi和电缆接入网的DOCSIS协议。
- 在本书中,我们把链路层分组称为帧(frame)
- 为了将分组从一个结点(主机或路由器)移动到路径上的下一个结点,网络层必须依靠该链路层的服务。
- 物理层
- 物理层的任务是将该帧中的一个一个比特从一个结点移动到下一个结点。
- 这层中的协议进一步与该链路(例如,双绞铜线、单模光纤)的实际传输媒体相关。
- 例如,以太网具有许多物理层协议:一个是关于双绞铜线的,另一个是关于同轴电缆的,还有一个是关于光纤的,等等。
- 应用层
-
OSI(Open Systems Interconnection)协议栈
- 表示层
- 使通信的应用程序能够解释交换数据。
- 数据压缩和数据加密以及数据描述
- 数据压缩是自解释的
- 数据描述使得应用程序不必担心在各台计算机中表示/存储的内部格式不同的问题。
- 会话层
- 提供数据交换定界和同步功能,
- 建立检查点和恢复方案。
- 提供数据交换定界和同步功能,
- 当在互联网协议栈中需要这些功能时,应用程序开发员需要自己来加上
- 表示层
1.5.2 封装
每一层,一个分组具有两种类型的字段:首部字段和有效载荷字段(payload field)。有效载荷通常是来自上一层的分组。这样每一层都实现了对上一层字段的封装。
1.6 面对攻击的网络
- 坏家伙能够经因特网将有害程序放入你的计算机中
- 恶意软件(malware)包括病毒(virus)和蠕虫(worm)
- 恶意软件能在设备中做许多不正当的事情,如删除文件、手机用户信息等
- 病毒需要被用户接收被执行(比如邮件)
- 蠕虫不需要明显的用户交互就能进入设备(比如网络)
- 多个受控主机构成僵尸网络
- 恶意软件(malware)包括病毒(virus)和蠕虫(worm)
- 坏家伙能够攻击服务器和网络基础设施
- 拒绝服务攻击(denial-of-Service(DoS) attack)
- 弱点攻击
- 向易受攻击的服务器发送特殊的报文
- 宽带泛洪
- 向目标主机发送大量的报文
- 连接泛洪
- 创建大量半开和全开的TCP连接
- 分布式DoS,DDoS
- 利用僵尸网络来攻击服务器
- 弱点攻击
- 拒绝服务攻击(denial-of-Service(DoS) attack)
- 坏家伙能够嗅探分组
- 在无线传输设备的附近放置一台被动的接收机,该接收机就能得到传输的每个分组的副本!
- 记录每个流经的分组副本的被动接收机被称为分组嗅探器(packet sniffer)。
- 密码学时防御嗅探的重要方法
- 在无线传输设备的附近放置一台被动的接收机,该接收机就能得到传输的每个分组的副本!
- 坏家伙能够伪装成你信任的人
- IP哄骗(IP spoofing)
- 将具有虚假源地址的分组注入因特网
- 端点鉴别
- IP哄骗(IP spoofing)
- 网络安全的历史
- 因特网最初就是基于“一群相互信任的用户连接到一个透明的网络上”这样的模型进行设计的,在这样的模型中,安全性没有必要。
- 如今,在相互信任的用户之间的通信是一种例外而不是规则。
- 欢迎来到现代计算机网络世界!
1.7 计算机网络和因特网的历史
2.应用层
2.1应用层协议原理
将应用软件限制在端系统的方法(不需要考虑路由器、链路层交换机等),促进了大量的网络应用程序的迅速研发和部署。
2.1.1网络应用程序体系结构
应用程序体系结构(application architecture)规定了如何在各种端系统上组织该应用程序。在选择应用程序体系结构时,应用程序研发者很可能利用现代网络应用程序中所使用的两种主流体系结构之一:客户——服务器体系结构(client-service architecture)或对等(P2P)体系结构。
-
客户——服务器体系结构
- 在客户-服务器体系结构(client-server architecture)中,有一个总是打开的主机称为服务器,它服务于来自许多其他称为客户的主机的请求。
- 服务器拥有一个固定的IP地址
- 使用配备了大量主机的数据中心来支撑海量的数据收发
- 在客户-服务器体系结构(client-server architecture)中,有一个总是打开的主机称为服务器,它服务于来自许多其他称为客户的主机的请求。
-
P2P体系结构
- 多目前流行的、流量密集型应用都是P2P体系结构的。
- 文件共享(例如BitTorrent)
- 对等方协助下载加速器(例如迅雷)
- 因特网电话(例如Skype)
- IPTV(例如“迅雷看看”和 PPstream)
- P2P体系结构的最引人入胜的特性之一是它们的自扩展性(self- scalability)。
- 例如,在一个 P2P文件共享应用中,尽管每个对等方都由于请求文件产生工作量,但每个对等方通过向其他对等方分发文件也为系统增加服务能力。
- 每台主机同时是使用者和提供者,每台主机的加入同时增加服务能力和需求
- 挑战
- 增强ISP友好。因为许多家庭网络的上传与下载速率是“不对称”的
- 安全性。高度分布和开发特性,带来了安全隐患
- 激励。激励用户资源提供带宽、存储和计算资源
2.1.2 进程通信
-
客户和服务器进程
-
网络应用程序由成对的进程组成,这些进程通过网络相互发送报文。对每对通信进程,我们通常将这两个进程之一标识为客户(client),而另一个进程标识为服务器(server)。
在给定的一对进程之间的通信会话场景中,发起通信(即在该会话开始时发起与其他进程的联系)的进程被标识为客户,在会话开始时等待联系的进程是服务器。
-
-
进程与计算机网络之间的接口
- 进程通过一个称为套接字(socket)的软件接口向网络发送报文和从网络接收报文。
- 套接字是同一台主机内应用层与运输层之间的接口
- 由于该套接字是建立网络应用程序的可编程接口,因此套接字也称为应用程序和网络之间的应用程序编程接口(Application Programming Interface,API)。
-
进程寻址
- 为了标识接收进程,需要定义两种信息
- 主机的地址
- IP地址是一个32比特的量且它能够唯一地标识该主机
- 定义在目的主机中的接收进程的标识符
- 端口号用于制定进程。常用的应用程序拥有统一的端口号
- Web服务器——80
- 邮件服务进程——25
- 端口号用于制定进程。常用的应用程序拥有统一的端口号
- 主机的地址
- 为了标识接收进程,需要定义两种信息
- 多目前流行的、流量密集型应用都是P2P体系结构的。
2.1.3 可供应用程序使用的运输服务
一个运输层协议能够为调用它的应用程序提供什么样的服务呢?我们大体能够从四个方面对应用程序服务要求进行分类:可靠数据传输、吞吐量、定时和安全性。
- 可靠数据传输
- 保证一端应用程序发送的数据正确、完全地交付给另一端的应用程序——确保数据交付服务
- 容忍丢失的应用(loss-tolerant-application)
- 吞吐量
- 带宽敏感的应用(bandwidth-sensitive application)
- 弹性应用(elastic application)
- 定时
- 时延
- 安全性
- 机密性
- 数据完整性
- 端点鉴别
2.1.4 因特网提供的运输服务
- TCP服务
- 面向连接的服务
- 建立连接之前的准备
- 结束收发之后,连接将被拆除
- 可靠的数据传送服务
- 拥塞控制机制
- 当发送发和接收方之间的网络出现拥塞时,TCP会抑制发送方进程
- 有利于保护互联网网络
- 安全套接字层(Secure Socket Layer, SSL)是加强版的TCP,它存在应用层中。应用程序将明文数据传给SSL套接字,SSL将其加密后发送给TCP套接字
- 面向连接的服务
- UDP服务
- UDP是一种不提供不必要服务的轻量级运输协议,它仅提供最小服务。
- 无“握手过程”
- 非可靠数据传输服务
- 可能乱序
- 无拥塞控制机制,发送方可以用它选定的任何速率向下层注入数据
- UDP是一种不提供不必要服务的轻量级运输协议,它仅提供最小服务。
- 因特网运输协议所不提供的服务
- 今天的因特网通常能够为时间敏感应用提供满意的服务,但它不能提供任何定时或带宽保证。
- 电子邮件、远程终端访问、Web、文件传输都使用了 TCP
- 可靠数据传输
- 因特网电话应用选择 UDP + TCP
- UDP能够避开拥塞控制机制
- TCP能作为备用,在UDP被防火墙阻止时发挥作用
2.1.5 运输层协议
应用层协议(application-layer protocol)定义了运行在不同端系统上的应用程序进程如何相互传递报文。特别地,应用层协议定义了:
- 交换的报文类型,例如请求报文和响应报文。
- 各种报文类型的语法,如报文中的各个字段及这些字段是如何描述的。
- 字段的语义,即这些字段中包含的信息的含义。
- 一个进程何时以及如何发送报文,对报文进行响应的规则。
应用层协议有公共与专用之分,如 Skype 使用的就是专用网络
应用层协议是应用程序的一个重要部分
2.1.6本书涉及的网络应用
2.2 Web和HTTP
2.2.1 HTTP概况
- Web的应用层协议是超文本传输协议(HyperText Transfer Protocol, HTTP),它是Web的核心,在[RFC 1945]和[RFC 2616]中进行了定义。
- HTTP由两个程序实现:一个客户程序和一个服务器程序,通过交换HTTP报文进行会话。
- HTTP定义了这些报文的结构以及客户和服务器进行报文交换的方式。
- 一些Web术语
- Web页面 (Web page)
- 对象 (object)
- HTML文件
- 图片、Java程序、视频片段等
- 可以通过 URL 寻址
- URL = 服务器主机名 + 路径名
- Web 浏览器
- 也称为 客户端
- Web 服务器
- HTTP 使用 TCP 作为运输层协议
- HTTP是 无状态协议(stateless protocol)
- Web 使用客户-服务器程序体系结构
2.2.2 非持续连接和持续连接
-
采用非持续连接的HTTP
-
采用持续连接的HTTP
- HTTP的默认方式是带流水线的持续连接
- 同一个客户和服务器之间的报文都通过同一个连接进行传输
- 经过一定的时间间隔后,未被使用的连接会被断开
- HTTP的默认方式是带流水线的持续连接
2.2.3 HTTP报文格式
HTTP规范 [RFC 1945; RFC 2616; RFC 7540]包含了对HTTP 报文格式的定义。HTTP 报文有两种:请求报文和响应报文。
-
HTTP请求报文
GET /somedir/page.html HTTP/1.1 Host: www.someschool.edu Connection: close User-agent: Mozilla/5.0 Accept-language: fr
- 通用格式
-
常见的方法
-
GET
-
也可以将页面的输入送给服务器
-
www.somesite.com/animalsearch?monkeys&banana
-
-
-
POST
-
HEAD
-
PUT(HTTP 1.1)
- 在指定路径添加文件
-
DELETE(HTTP 1.1)
- 删除指定路径的文件
-
-
HTTP响应报文
-
HTTP/1.1 200 OK Connection: close Date: Tue, 18 Aug 2015 15:44:04 GMT Server: Apache/2.2.3 (CentOS) Last-Modified: Tue, 18 Aug 2015 15:11:03 GMT Content-Length: 6821 Content-Type: text/html (data data data data data ...)
-
通用格式
-
注意
Content-length
指的是发送对象的字节数 -
常见的状态码和短语
- 200 OK
- 301 Mover Permanently
- 400 Bad Request
- 404 Not Found
- 505 HTTP Version Not Supported
-
2.2.4 用户与服务器的交互:cookie
- Cookie技术由四部分组成
- 服务器响应报文中的cookie首部行
- 客户请求报文中的cookie首部行
- 用户端系统中由浏览器管理的cookie文件
- Web站点的后端数据库
- cookie识别码在用户第一次登陆站点时形成,在之后,识别码被包含在每份报文中来进行用户的身份识别和数据库的查询
2.2.5 Web 缓存
Web缓存器(Web cache)也叫代理服务器(proxy server),它是能够代表初始Web服务器来满足HTTP请求的网络实体。Web缓存器有自己的磁盘存储空间,并在存储空间中保存最近请求过的对象的副本。
- Web缓存既是服务器又是客户
- Web缓存以更小的代价实现了网络性能的提升
- ISP(公司、大学、家庭等)常会选择安装代理服务器
- 内容分发网络(Content Distribution Network, CDN)是存在于公共因特网的代理服务器
2.2.6 条件GET方法
-
为了避免Web缓存发送给客户的对象是陈旧未更新的,HTTP增加了条件GET方法
-
请求报文和响应报文分别是
-
GET /fruit/kiwi.gif HTTP/1.1 Host: www.exotiquecuisine.com If-modified-since: Wed, 9 Sep 2015 09:23:24
-
HTTP/1.1 304 Not Modified Date: Sat, 10 Oct 2015 15:39:29 Server: Apache/1.3.0 (Unix) (empty entity body)
-
当对象未修改时,响应报文只会包含一个空的对象
-
2.3 因特网中的电子邮件
SMTP(Simple Mail Transfer Protocol) 是因特网电子邮件中主要的应用层协议。它使用TCP可靠数据传输服务,从发送方的邮件服务器向接收方的邮件服务器发送邮件。像大多数应用层协议一样,SMTP 也有两个部分:运行在发送方邮件服务器的客户端和运行在接收方邮件服务器的服务器端。
2.3.1 SMTP
-
RFC 5321给出了 SMTP 的定义。 SMTP 是因特网电子邮件应用的核心。
-
SMTP一般不使用中间邮件服务器发送邮件,即使这两个邮件服务器位于地球的两端也是这样。
2.3.2 与HTTP 的对比
- HTTP是拉协议(pull prototype),SMTP是推协议(push prototype)
2.3.3 邮件报文格式
-
邮件报文由报文首部和报文体组成。一个典型的报文首部看起来如下:
From: [email protected] To: [email protected] Subject: Searching for the meaning of life.
2.4.4 邮件访问协议
-
SMTP是一个推协议,所以接收方用户需要从接收方服务器获得邮件报文时,必须借助其他的协议。
-
目前流行的邮件访问协议包括:第三版的邮局协议(Post Office Protocol—Version 3, POP3)、因特网邮件访问协议(Internet Mail Access Protocol, IMAP)以及 HTTP
-
POP3
-
POP3是一个极为简单的邮件访问协议,由 RFC 1939进行定义。
-
POP3有三个工作阶段
-
特许(authorization)
-
user
pass
-
-
事物处理
- 取回报文
- 标记要删除的报文
- 取消删除标记
-
更新
-
-
服务器有两种可能的回答
+OK
-ERR
-
两种基本模式
- 下载并删除
- 下载并保留
-
-
IMAP
- IMAP 由 RFC 3501 定义
- POP3协议没有给用户提供任何创建远程文件夹并为报文指派文件夹的方法。IMAP实现了这个功能
- IMAP 的另一个重要特性是它具有允许用户代理获取报文组件(而不是全部)的命令
-
基于 Web的电子邮件
- 只有邮件服务器之间使用 SMTP 协议,而在客户和服务器(发送方或接收方)之间使用 HTTP 协议
2.4 DNS:因特网的目录服务
主机的两种识别码:主机名(host name)和 IP 地址(IP address)
2.4.1 DNS 提供的服务
域名系统Domain Name System, DNS)的主要任务是实现主机名和 IP 地址的转换。
-
DNS 是:
- 一个由分层的DNS 服务器(DNS server) 实现的分布式数据库
- 一个使得主机能够查询分布式数据库的应用层协议。
-
DNS协议运行在 UDP 之上,使用53号端口。
-
HTTP协议使用DNS的基本流程
- 浏览器所在的主机运行着DNS应用的客户端
- 浏览器提取出请求的 URL 中的主机名
- 主机名通过 DNS 客户端被发送给 DNS服务器
- DNS 服务器将转换得到的 IP 地址发送给 DNS 客户端
- 浏览器从 DNS 响应报文中获得 IP 地址,并向该地址的 80 端口发起一个 TCP 连接
-
DNS 给使用它的因特网应用带来了额外的时延
- 大量分布的DNS服务器有利于减小此时延
-
DNS 提供的其他重要服务
- 主机别名(host aliasing)
- 有着复杂主机名的主机还能拥有一两个别名
- 别名通常更好记忆
- 邮件服务器别名(mail server aliasing)
- MX记录(参见后面)允许一个公司的邮件服务器和 Web服务器使用相同(别名化的)的主机名
- 负载分配(load distribution)
- DNS 也用于在冗余的服务器(如冗余的Web服务器等)之间进行负载分配。
- 这是通过让一个 IP 地址集合(冗余的服务器)与一个规范主机名(比如cnn.com)相联系实现的
- 主机别名(host aliasing)
DNS是通过客户-服务器模式提供的重要网络功能。
因特网体系结构的复杂性大多数位于网络的“边缘”。DNS 通过采用了位于网络边缘的客户和服务器,实现了关键的名字到地址转换功能,它还是这种设计原理的另一个范例。
2.4.2 DNS工作机理概述
- 事实上,DNS是一个在因特网上实现分布式数据库的精彩范例。
-
在这个分层数据库中主要有3个层次
- 根 DNS 服务器。
- IPv4下,有13“组”根 DNS 服务器
- 顶级域(Top-level Domain, TLD) DNS 服务器
- 顶级域名如com, net, org, edu 以及 jp, cn, fr等
- 权威 DNS 服务器
- 一个组织需要将自己的所有主机名-IP地址映射存放在一个权威 DNS 服务器中
- 或是自己组建,如许多大学与大公司
- 或是存储在某个 ISP 公司中
- 一个组织需要将自己的所有主机名-IP地址映射存放在一个权威 DNS 服务器中
- 根 DNS 服务器。
-
本地 DNS 服务器
- 本地 DNS 服务器是客户向 DNS 服务器发送请求的代理服务器
-
DNS 查询有递归和迭代两种方式
- 主机向本地 DNS 服务器的请求是递归的
- 向下到底,然后向上返回到顶
- 其他的请求都是迭代的
- 每次总是得到一个结果,然后向上返回结果
- 主机向本地 DNS 服务器的请求是递归的
-
DNS 缓存
2.4.3 DNS记录和报文
共同实现 DNS 分布式数据库的所有 DNS服务器存储了资源记录(Resource Record, RR), RR提供了主机名到 IP 地址的映射。每个 DNS 回答报文包含了一条或多条资源记录。
-
资源记录是一个包含了下列字段的4元组:
(Name, Value, Type, TTL)
-
TTL 是该记录的生存时间
-
Name
通常是主机域名,而value
的实际含义取决于Type
的值-
Type = A
, 则Value
是该主机名对应的 IP 地址 -
如果
Type =NS
,则Value
是个知道如何获得该域中主机IP地址的权威DNS 服务器的主机名。-
(foo.com, dns.foo.com, NS)
-
-
如果
Type = CNAME
,则Value
表示主机对应的规范主机名-
(foo. com, relayl.bar.foo.com, CNAME)
-
-
如果
Type = MX
,则Value
表示邮件服务器的规范主机名。-
(foo.com, mail.bar.foo.com, MX)
-
为了获得邮件服务器的规范主机名,DNS 客户应当请求一条
MX
记录;而为了获得其他服务器的规范主机名,DNS 客户应当请求CNAME
记录。
-
-
-
-
DNS 报文
- 标识符用于标识查询报文,同时将被复制到响应报文中。标志位用于查询报文与响应报文的匹配。
- 标志位包含了“查询/回答”、“是否未权威”、“是否希望递归”、“递归可用”等信息
- 其他的信息都是自解释的
-
在 DNS 数据库中插入记录
- 当你向某些注册登记机构注册域名时,需要向该机构提供你的基本和辅助权威 DNS 服务器的名字和IP地址
- 名字和 IP 地址信息分别一条
Type = A
记录 - 注册域名和权威 DNS 服务器的关系对应一条
Type NS
记录
- 名字和 IP 地址信息分别一条
- 被加入的信息还有注册域名的
Type = A
记录,以及 注册域名邮箱的Type = MX
记录 - DNS 数据库曾经只能静态配置,现在也可以动态配置了
- 博客搬家是动态配置的一个应用吗?
- 当你向某些注册登记机构注册域名时,需要向该机构提供你的基本和辅助权威 DNS 服务器的名字和IP地址
-
DNS具有惊人的健壮性,至今没有一种方法成功地击垮了 DNS 系统
2.5 P2P 文件分发
- P2P文件分发适合一个主机向一个主机集合发送大文件的场景
2.5.1 P2P体系结构的扩展性
-
P2P 与 客户-服务器模式的比较
-
客户-服务器模式
\[D_{cs}=max\{\frac{NF}{u_s}, \frac{F}{d_{min}}\} \]其中,\(u_S\)表示服务器的上传速度,\(d_{min}\)表示客户接入网络中的最小下载速度
- 可以看出,客户-服务器模式的分发时间将在 N 足够大时,取决于 N 的大小。
-
P2P 模式
\[D_{P2P}=max\{\frac{F}{u_s}, \frac{F}{d_{min}}, \frac{NF}{u_s+\sum_{i=1}^{N}u_i}\} \]其中,\(u_i\)表示每个客户端的上传速度。
- 可以看出,服务器作为最初唯一保存文件的主机,只需要将文件上传一次。虽然在整个网络上,文件依然被上传了N次,但该上传任务是由服务器和各个服务器共同完成的
-
C-S模式随着客户的增加而线性增加,因为在C-S模式中,上传速度是固定的,而需上传的文件大小却随着客户的加入而线性增加;P2P模式呈对数式缓慢增加,且存在一个边界,这是因为新增的用户在增加上传文件大小的同时也增强了系统中的上传速度。
-
2.5.2 BitTorrent
- BitTorrent 是一种流行的 P2P 协议。
- BitTorrent 较为复杂,本章考察其中的一项运行机制——也被称为“一报还一报”(tit-for-tat)
- 基本概念
- 洪流(torrent)
- 文件块(chunk)
- 追踪器(tracker)
- 临近对等方
- 临近对等方常会因为客户的离开而随着时间而变化
- 稀缺优先技术
- 每个客户会获得临近对等方的文件块列表。多个文件块列表形成一个文件块集合。在自己欠缺的诸多文件块中,它会优先请求在文件块集合中拥有最少副本的那一个。
- 这样的好处是能够平衡洪流中每个文件块的数量
- 一报还一报
- 在响应请求上,每个客户端遵从这样的一个机灵的原则:总是优先向以最高速率给自己提供文件块的客户发送文件。
- 通常会排出前4名。这4个对等方被称为“疏通(unchoked)”。
- 为了避免资源过于集中,BitTorrent还会使得客户每30s随机向一个客户发送文件块
- 传输速度前4的对等方和随机用户之外的用户被称为阻塞(choked),它们不能从该客户处获得任何文件块
- 优点
- 功利原则使得每个客户都能找到与自己的传输速度最匹配的对等方
- 随机机制使得新加入的客户能够参与交换,并获得交易的筹码
- 在响应请求上,每个客户端遵从这样的一个机灵的原则:总是优先向以最高速率给自己提供文件块的客户发送文件。
- 虽然 tit-for-tat 被证明不是必要的机制,但它成功地限制了搭便车的行为,使得 BitTorrent 获得源源不断的活力
- 未提到的有趣机制
- 片(小块)
- 流水线
- 随即优先选择
- 残局模型
- 反怠慢
2.5.3 DHT(Distributed Hash Table)分布散列表
2.6 视频流和内容分发网络
2.6.1 网络视频
- 网络视频由一系列连续的图片组成,它们以每秒24或30张的速度进行播放。图片中的每一个像素点所展示的亮度和颜色又被编码成比特。
- 压缩算法使得人们可以在比特率和视频质量之间进行权衡
2.6.2 HTTP Streaming and DASH
- 每个视频文件储存在 HTTP 服务器上,并拥有一个属于自己的 URL。HTTP 客户端通过
GET
来请求视频文件。 - 传输来的比特首先被存储在客户本地应用的缓存中。当客户接收的比特大小超出该缓存时,视频应用开始解码缓存中的比特,并将它显示在屏幕上。于是,文件接收、文件缓存、视频解码播放在同一时间进行。
- DASH(Dynamic Adaptive Streaming over HTTP)向客户提供了多个压缩程度的视频版本。
- HTTP 服务器还拥有一个清单文件(manifest file)。它显示了每个版本的 URL 和对应的比特率
- 客户可以自行选择,或者使用算法自动选择适合自己宽带和视频缓存容量的版本。
2.6.3 内容分布网络
- 使用朴素的客户-服务器结构有以下缺点
- 远距离传输将极大受限于链路中的瓶颈速率
- 一个流行的视频文件可能在同一条链路上传输多次,造成额外的花费
- 网络脆弱,一旦服务器或关键链路宕机,则相应的客户不能再请求到任何视频
- CDN管理了稀疏分布的服务器群。这些服务器群作为代理服务器,使得客户能从距离最近的服务器群处获得视频资源。
- Google 布置了专属自己的CDN
- CDN由两种基本模式
- 深入(Enter Deep)
- 将CDN服务器布置在接入网络中
- 提供了高吞吐量和低延迟
- 但安装和维护的费用较高
- 将CDN服务器布置在接入网络中
- Bring Home
- 将CDN服务器布置在 IXP 中,所在的网络层次更高
- 安装和维护的费用较低
- 相对低的吞吐量和相对高的延迟
- 将CDN服务器布置在 IXP 中,所在的网络层次更高
- 深入(Enter Deep)
- 大多数 CDN 不直接将视频推向服务器群,而是根据客户的请求进行发送。(即使用“拉”协议,而不是“推”协议)
Google的专属网络结构主要有3部分组成:
- 14个元数据中心,每个数据中心都由10万个左右的服务器组成
- 提供用户的搜索服务、文件处理等等
- 50个服务器群分布在 IXP 中,每个由100-500个服务器组成
- 通常存储着诸如 YouTube 等网站上的视频内容
- 几百个分布在 IXP 的 Deep-Enter 服务器群
- 通常存储着页面的一些静态内容
-
CDN的操作
-
案例分析
-
Netflix
- 网飞同时使用亚马逊云与专属CDN
- 亚马逊云负责一些复杂的或统筹的工作
- 内容接收
- 内容处理
- 创建同一个视频文件的多个版本以支持 DASH
- 内容分发
- 内容会被分发给各个 CDN
- 网飞的网络结构采取“推”模式,所有的视频内容都会被定期推向所有的CDN
- 网飞不需要借助 DNS 进行重定向,运行在亚马逊云的软件会直接确定最佳的CDN,并将其域名发送给客户端
-
YouTube
- YouTube(现已被Google收购),使用“拉”策略+DNS重定向,这两部分在前面已经介绍了
- 利用了 HTTP 的“字节范围请求”来避免流量的浪费
-
KanKan
- CDN-P2P混合,客户首先从CDN服务器请求影片的开头,然后寻找同级的主机。
- 不同于P2P的“传输速率”优先策略,视频播放中会优先选择“能提供持续传输”的主机作为伙伴
- 一旦当前的主机连接满足了视频播放的需求,客户就会断开与服务器的连接
- CDN-P2P混合,客户首先从CDN服务器请求影片的开头,然后寻找同级的主机。
-
2.7 TCP套接字编程
2.7.1 UDP套接字编程
-
发送进程为分组附上目的地址
- 目的地址 = IP 地址 + 端口号(port number)
- 将源地址附在分组上不是由发送进程完成的,而是由底层操作系统执行的
-
客户端创建基本步骤
- 配置
- 指定服务器地址和端口号
- 创建客户端套接字
- 发送
- 通过人机接口获得信息
- 编码
- 向服务器端发送信息,一定要附加地址信息
- 接收
- 通过套接字获得返回的信息
- 解码
- 显示返回的信息
-
代码
from socket import * serverName = 'hostname' serverPort = 12000 clientSocket = socket(AF_INET, SOCK_DGRAM) #create a socket, the parameter means the socket is based on IPv4 & UDP. message = input('Input lowercase sentence:') clientSocket.sendto(message.encode(),(serverName, serverPort)) modifiedMessage, serverAddress = clientSocket.recvfrom(2048) #takes the buffer size 2048 as input print(modifiedMessage.decode()) clientSocket.close()
- 配置
-
服务器端创建基本步骤
- 配置
- 服务器端口号
- 创建服务器套接字
- 将套接字绑定到服务器端口号进行监听
- 接收
- 通过套接字获得信息
- 解码
- 处理(视具体功能而不同)
- 发送
- 编码
- 通过套接字发送,一定要附加地址信息
-
代码
-
from socket import * serverPort = 12000 serverSocket = socket(AF_INET, SOCK_DGRAM) serverSocket.bind(('', serverPort)) # print("The server is ready to receive") while True: message, clientAddress = serverSocket.recvfrom(2048) modifiedMessage = message.decode().upper() serverSocket.sendto(modifiedMessage.encode(), clientAddress)
-
- 配置
2.7.2 TCP套接字编程
-
面向连接之“三次握手(Three-way handshake)”
-
客户端创建基本步骤
- 配置
- 指定服务器地址和端口号
- 创建客户端套接字
- 建立连接
clientSocket.connect((serverName, serverPort))
- 发送
- 通过人机接口获得信息
- 编码
- 向服务器端发送信息
- 接收
- 通过套接字获得返回的信息
- 解码
- 显示返回的信息
-
代码
-
from socket import * serverName = 'servername' serverPort = 12000 clientSocket = socket(AF_INET, SOCK_STREAM) clientSocket.connect((serverName, serverPort)) sentence = input('Input lowercase sentence:') clientSocket.send(sentence.encode()) modifiedSentence = clientSocket.recv(1024) print('From Server: ', modifiedSentence.decode()) clientSocket.close()
-
- 配置
-
服务器端创建基本步骤
- 配置
- 服务器端口号
- 创建服务器欢迎套接字(welcoming door)
- 将套接字绑定到服务器端口号进行监听
- 响应服务端的连接请求
- 生成一个连接套接字
connectionSocket, addr = serverSocket.accept()
- 生成一个连接套接字
- 接收
- 通过套接字获得信息
- 解码
- 处理(视具体功能而不同)
- 发送
- 编码
- 通过套接字发送
-
代码
-
from socket import * serverPort = 12000 serverSocket = socket(AF_INET, SOCK_STREAM) serverSocket.bind(('', serverPort)) serverSocket.listen(1) print('The server is ready to receive') while True: connectionSocket, addr = serverSocket.accept() sentence = connectionSocket.recv(1024).decode() capitalizedSentence = sentence.upper() connectionSocket.send(capitalizedSentence.encode()) connectionSocket.close()
-
- 配置