计算机网络(应用层)
网络应用的体系结构
客户机/服务器结构(C/S)
- 服务器
- 永久性访问地址/域名
- 不间断提供服务
- 利用大量服务器实现可扩展性
- 客户机
- 与服务器通信,使用服务器提供的功能
- 间歇性接入网络
- 可以使用动态IP
- 不会与其它客户机直接交互
点对点结构(P2P)
- 没有永久在线的服务器
- 任意端系统之间可以直接通讯
- 间歇性接入网络
- 节点可能改变IP地址
优点:高度可伸缩
缺点:难于管理
混合结构(Hybird)
Napster
- 文件传输用P2P结构
- 文件搜索采用C/S结构——集中式
网络应用进程通信
进程
同一主机上运行的进程之间:
- 进程舰通信机制
- 操作系统提供
不同主机上运行的进程舰通信:
- 消息交换
客户机进程:发起通信的进程
服务器进程:等待通信请求的进程
套接字
- 进程间利用socket发送/接收消息
- socket是传输基础设施向进程提供的API
如何寻址
不同主机上的进程舰通信,每个进程都必须有标识符
我们通过IP地址寻址主机,但同一主机上可能同时有多个进程需要通信,需要为主机上每个需要通信的进程分配一个端口号,通过IP地址+端口号作为进程的标识
域名解析系统DNS
概述
Domain Name System
- 多层命名服务器构成的分布式数据库
- 应用层协议:完成名字的解析
- 提供Internet核心功能,用应用层协议实现
- 网络边界复杂
解决Internet上主机/路由器的识别问题:互联网中的主机以IP地址为唯一标识符,IP本身是数字,不利于人使用,日常使用的是域名。DNS能够将域名解析为IP地址
DNS服务
- 域名向IP地址的翻译
- 主机别名
- 邮件服务器别名
- 负载均衡:Web服务器
负载均衡就是分摊到多个操作单元上进行执行
为什么不采用集中式的DNS
- 单点失败问题,如果采用集中式而DNS出现问题会使整个网络瘫痪
- 流量问题
- 距离问题
- 维护性问题
DNS采用分布式层次式数据库
客户端想要查询www.amazon.com的IP
- 客户端查询根服务器,找到com域名解析服务器
- 客户端查询con域名解析服务器,找到amazon.com域名解析服务器
- 客户端查询amazon.com域名解析服务器,获得www.amazon.com的IP地址
DNS域名服务器
根域名服务器
本地域名服务器无法解析域名时,访问根域名服务器,如果根域名服务器不知道映射,访问权威域名服务器获得映射,向本地域名服务器返回映射
顶级域名服务器(TLD)负责com,org,net,edu等顶级域名和国家级域名,例如cn,uk,fr等
- 由一些公司来维护
权威域名服务器:组织的域名解析服务器,提供组织内部服务器的解析服务
- 组织负责维护
- 服务提供商负责维护
本地域名解析服务器
- 不严格属于层次体系
- 每个ISP有一个本地域名服务器(默认域名解析服务器)
- 当主机进行DNS查询时,查询被发送到本地域名服务器,作为代理将查询转发给(层级式)域名解析服务器系统
迭代查询:
递归查询:
DNS记录缓存和更新
只要域名解析服务器获得域名—IP映射,即缓存这一映射,一段时间过后缓存条目失效(删除),本地域名服务器一般会缓存顶级域名服务器的映射,因此根域名服务器不经常被访问
DNS记录和消息格式
记录
资源记录(resource records)
- Type=A
- name:主机域名
- value:IP地址
- Type=NS
- name:域
- value:该域权威域名解析服务器的主机域名
- Type=CNAME
- name:某一真是域名的别名
- value:真实域名
- Type=MX
- value是与name相对应的邮件服务器
消息格式
DNS协议是查询和恢复协议,消息格式相同
- identification:16位查询编号,回复使用相同的编号
- flags
- 查询或恢复
- 期望递归
- 递归可用
- 权威回答
DNS占用53号端口,同时使用TCP和UDP协议。**DNS区域传输的时候使用TCP协议:辅域名服务器会定时(一般3小时)向主域名服务器进行查询以便了解数据是否有变动。如有变动,会执行一次区域传送,进行数据同步。区域传送使用TCP而不是UDP,因为数据同步传送的数据量比一个请求应答的数据量要多得多。域名解析时使用UDP协议**:客户端向DNS服务器查询域名,一般返回的内容都不超过512字节,用UDP传输即可。不用经过三次握手,这样DNS服务器负载更低,响应更快。理论上说,客户端也可以指定向DNS服务器查询时用TCP,但事实上,很多DNS服务器进行配置的时候,仅支持UDP查询包。
如何注册域名
应用层协议概述
简介
公开的协议
由RFC定义
允许互相操作
- HTTP,SMTP ······
私有的协议
- 多数P2P文件共享应用
内容
消息的类型
- 请求消息
- 响应消息
语法格式
语义
规则
对传输层服务的需求
数据丢失/可靠性
时间/延迟
- 带宽
Internet提供的传输服务
- TCP服务
- 面向连接
- 可靠传输
- 流量控制
- 拥塞控制
- 不提供时延服务、最小带宽保障
- UDP服务
- 无连接
- 不可靠数据传输
文件传送协议
FTP与TFTP都是复制整个文件类的协议,即若要存取一个文件,就必须先获得一个本地的文件副本。如果要修改文件,只能对文件的副本进行修改,然后再将修改后的文件副本传回到原节点。另一大类是联机访问,联机访问意味着允许多个程序同时对一个文件进行存取。和数据库系统的不同之处是用户不需要调用一个特殊的客户进程,而是由操作系统提供对远地共享文件进行访问的服务,就如同对本地文件的访问一样。这就使用户可以用远地文件作为输入和输出来运行任何应用程序,而操作系统中的文件系统则提供对共享文件的透明存取。
FTP协议
FTP基于TCP,主要功能是减少或消除在不同操作系统下的处理文件的不兼容性
FTP使用C/S,一个FTP服务器可同时为多个客户进程提供服务。FTP
的服务器进程由两大部分组成:一个主进程,负责接受新的请求;另外有若干个从属进程,负责处理单个请求。
主进程的工作步骤:
- 打开端口21,使客户进程能够连接上
- 等待客户进程发出连接请求
- 启动从属进程处理客户进程发来的请求。从属进程对客户进程的请求处理完毕后即终止,但从属进程在运行期间根据需要还可能创建其他一些子进程
- 回到等待状态,继续接受其他客户进程发来的请求。主进程与从属进程的处理是并发进行的
当客户进程向服务器进程发出建立连接请求时,要寻找连接服务器进程的熟知端口21,同时还要告诉服务器进程自己的另一个端口号码,用于建立数据传送连接。接着,服务器进程用自己传送数据的熟知端口20 与客户进程所提供的端口号建立数据传送连接
(为了简单起见,主进程没有画)
在进行文件传输时, FTP 的客户和服务器之间要建立两个并行的TCP 连接:“控制连接”和“数据连接"。控制连接在整个会话期间一直保持打开, FTP 客户所发出的传送请求,通过控制连接发送给服务器端的控制进程,但控制连接并不用来传送文件。实际用千传
输文件的是“数据连接"。服务器端的控制进程在接收到FTP 客户发送来的文件传输请求后就创建“数据传送进程”和“数据连接”,用来连接客户端和服务器端的数据传送进程。数据传送进程实际完成文件的传送,在传送完毕后关闭“数据传送连接”并结束运行。由于FTP 使用了一个分离的控制连接,因此FTP 的控制信息是带外(out of band)传送的
TFTP协议
TFTP也使用C/S模式,使用UDP。因此TFTP 需要有自己的差错改
正措施。TFTP 只支持文件传输而不支持交互。TFTP 没有一个庞大的命令集,没有列目录的功能,也不能对用户进行身份鉴别。
特点:
- 每次传送的数据报文中有512 字节的数据,但最后一次可不足512 字节。
- 数据报文按序编号,从1 开始。
- 支持ASCII 码或二进制传送。
- 可对文件进行读或写。
- 使用很简单的首部。
发送完一个文件块后就等待对方的确认,确认时应指明所确认的块编号。发完数据后在规定时间内收不到确认就要重发数据PDU 。发送确认PDU 的一方若在规定时间内收不到下一个文件块,也要重发确认PDU 。这样就可保证文件的传送不致因某一个数据报的丢失而告失败。
在一开始工作时。TFTP 客户进程发送一个读请求报文或写请求报文给TFTP 服务器进程,其熟知端口号码为69 。TFTP 服务器进程要选择一个新的端口和TFTP 客户进程进行通信。若文件长度恰好为512 字节的整数倍,则在文件传送完毕后,还必须在最后发送一个只
含首部而无数据的数据报文。若文件长度不是512 字节的整数倍,则最后传送数据报文中的数据字段一定不满512 字节,这正好可作为文件结束的标志。
TELNET协议
TELNET 也使用C/S方式。在本地系统运行TELNET 客户进程,而在远地主机则运行TELNET 服务器进程。
HTTP协议
HyperText Transfer Protocol
C/S结构
- 客户—Browser:请求、接收、展示Web对象
- 服务器—Web Server:响应客户的请求,发送对象
使用TCP传输服务
- 服务器在80端口等待客户的请求
- 浏览器发起到服务器的TCP连接(创建套接字Socket)
- 服务器接受来自浏览器的TCP连接
- 浏览器与Web服务器交换HTTP消息
- 关闭TCP连接
无状态
- 服务器不维护任何有关客户端过去所发送的请求的信息
有状态的协议更复杂:
- 需要维护状态
- 如果客户或服务器失效,会产生状态不一致,解决这种不一致代价高
HTTP连接的两种类型
非持久性连接(Nonpersistent HTTP)
HTTP/1.0使用
- 每个TCP连接最多允许传输一个对象
RTT(Round Trip Time)
从客户端发送一个很小的数据包到服务器并返回所经历的时间
简单分析响应时间:发送、建立TCP连接需要1个RTT,发送HTTP请求消息到HTTP响应消息的前几个字节到达需要1个RTT,还要加上响应消息中所含的文件传输时间
$Total = 2RTT + 文件发送时间$
非持久性连接每个对象需要2个RTT,操作系统需要为每个TCP连接开销资源(ooverhead),假如浏览器为提高效率打开多个并行的TCP连接以获取网页所需对象,又会给服务器带来很大的负担
持久性连接(Persistent HTTP)
HTTP/1.1使用(带有流水机制的持久性连接)
- 每个TCP连接允许传输多个对象
- 发送响应后,服务器保持TCP连接的打开,后续的HTTP消息可以通过这个连接发送
无流水的持久性连接
- 客户端只有收到前一个响应后才发送新的请求
- 每个被引用的对象耗时1个RTT
带有流水机制的持久性连接
- 客户端只要遇到一个应用对象就尽快发出请求
- 理想情况下,收到所有的应用对象只需要耗时约1个RTT
HTTP消息
请求消息
通用格式
上传输入的方法:
POST方法:在Entity Body中上传客户端的输入
URL方法:使用GET方法在request行的URL字段中上传,
https://www.bilibili.com/video/BV1Up411Z7hC?p=23&spm_id_from=pageDriver
中?后面的部分,以键值对的形式传输name=value
HTTP/1.0方法类型:
- GET
- POST
- HEAD:请Server不要将所请求的对象放入响应消息中
HTTP/1.1:
- GET、POST、HEAD
- PUT:将消息体中的文件上川岛URL字段所指定的路径
- DELETE:删除URL字段所指定的文件
响应消息
Date:Web服务器生成消息的时间
状态:
- 1xx 表示通知信息,如请求收到了或正在进行处理。
- 2xx 表示成功,如接受或知道了。
- 3xx 表示重定向,如要完成请求还必须采取进一步的行动。
- 4xx 表示客户的差错,如请求中有错误的语法或不能完成。
- 5xx 表示服务器的差错,如服务器失效无法完成请求。
Cookie技术
HTTP协议是无状态协议,但在许多情况下需要服务器掌握客户端的状态,需要引入Cookie技术
Cookie技术是某些网站为了辨别用户身份、进行session跟踪而储存在用户本地终端上的数据
Cookie组件
- HTTP响应消息的cookie头部行
- HTTP请求消息的cookie头部行
- 保存在客户端主机上的cookie文件,由浏览器管理
- Web服务器端的后台数据库
原理:
作用:
- 身份认证
- 购物车
- 推荐
- Web e-mail
Cookie技术存在隐私问题
Web缓存/代理服务器技术
在不访问服务器的前提下满足客户端的HTTP请求
优势:
- 缩短客户请求的响应时间
- 减少机构/组织的流量
- 在大范围内实现有效的内容分发(CDN)
用户设定浏览器通过缓存进行Web访问,浏览器向缓存/代理服务器发送所有的HTTP请求,如果所请求的对象在缓存中,缓存返回对象;否则,缓存服务器向原始服务器发送HTTP请求,获取对象,然后返回给客户端保存该对象。
缓存既充当客户端,也充当服务器,一般由ISP假设
示例:
互联网链路利用率过高
解决方案1:提高互联网接入宽带=10Mbps,但成本过高
解决方案2:(设计思想与cache类似)
使用条件性GET方法来确保缓存/代理服务器中保存的是最新的信息,在HTTP请求消息中声明所持有版本的日期(If-modified-since:<date>
),如果缓存的版本是最新的,则响应消息中不包含对象(HTTP/1.0 304 Not Modified
),此时只有一个空的响应,占用的带宽是很小的
Email应用
概述
构成组件
- 邮件客户端
- 读、写Email消息
- 与服务器交互,收,发消息
- Web客户端
- 邮件服务器(核心)
- SMTP协议(Simple Mail Transfer Protocol)
邮件服务器
- 邮箱:存储发给该用户的Email
- 消息队列:存储等待发送的Email
为什么要邮件服务器?
- 客户端不能时时刻刻在线
Email是一个典型的异步应用
SMTP协议
- 使用TCP进行可靠传输
端口25
命令/响应交互模式
- Email消息只能包含7位ASCII码
SMTP交互示例:
SMTP使用持久性连接,要求消息必须由7位ASCII码构成,SMTP服务器利用CRLF.CRLF确定消息的结束。
与HTTP相比,HTTP是拉式(pull),SMTP是退式(push);二者都使用命令/响应交互模式;命令和状态代码都是ASCII码;HTTP每个对象封装在独立的响应消息中,SMTP多个对象在由多个部分构成的消息中发送
Email消息格式
header:
- To
- From
- Subject
body:
- 消息本身
- 只能是ASCII字符
MIME:多媒体邮件扩展
通过在邮件头部增加额外的行以声明MIME的内容类型
邮件访问(读取)协议
邮件访问协议:从服务器获取邮件
- POP(邮局协议):Post Office Protocol
- 认证/授权(客户端<—>服务器)和下载
- IMAP:Internet Mail Access Protocol
- 更多功能
- 更加复杂
- 能够操纵服务器上的储存消息
- HTTP:163,QQMail等
POP3协议
认证过程
- 客户端命令
- User
- Pass:声明密码
- 服务器响应
- +OK
- -ERR
事务阶段
- List:列出消息数量
- Retr:用编号获取消息
- Dele:删除消息
- Quit
“下载并删除”模式:用户如果换了客户端软件,无法重读该邮件
“下载并保持”模式:不同客户端都可以保留消息的拷贝
POP3是无状态的
IMAP协议
所有消息统一保存在服务器上,允许用户利用文件夹组织消息
支持跨会话(Session)的用户状态
- 文件夹的名字
- 文件夹与消息ID之间的映射
P2P应用
文件分发:C/S 与 P2P
C/S:
P2P:
BitTorrent
文件划分为256KB的chunk,节点加入torrent,一开始没有chunk,但会逐渐积累,向tracker注册以获得节点清单,与厚些节点(“邻居”)建立连接。下载的同时,节点需要向其它节点上传chunk,节点可能加入或离开,一旦节点获得完整的文件,它可能(自私地)离开或(无私地)留下
获取chunk
- 给定任一时刻,不同的节点持有文件的不同chunk集合
- 节点定期查询每个邻居所持有的chunk列表
- 节点发送请求,请求获取礐石的chunk
- 稀缺优先,例如某些个缺失的chunk只有3个节点有,另一些缺失的有100个节点能提供,优先获取少的节点的那些chunk
发送chunk:tit-for-tat
- 某个节点向n个邻居发送chunk:正在向其发送chunk,速率最快的n个(每10秒重新评估)
- 每30秒随机选择一个其它节点,向其发送chunk,可能成为新的top n
索引
P2P系统的索引:信息到节点位置(IP地址+端口号)的映射
- 文件共享:利用索引动态跟踪节点所共享的文件的位置,节点需要告诉索引它拥有哪些文件,节点搜索索引,从而知道能够得到哪些文件
- 即时消息:索引负责将用户名映射到位置,当用户开启IM应用时,需要通知索引它的位置;节点检索索引,确定用户的IP地址
集中式索引
有一个中央目录服务器,任何节点加入时需要通知中央服务器自己的IP地址和内容;向中央服务器查找,找到地址后点对点传输
内容定位是高度集中式的,存在单点失效问题、性能瓶颈、版权问题
洪泛式查询
每个节点对它共享的文件进行索引,且只对它共享的文件进行索引
覆盖网络:节点X与Y之间如果有TCP连接,那么构成一个边,所有活动节点和边构成覆盖网络(节点一般邻居数少于10个)
被查询的节点继续向它的邻居发送查询消息,如果查询命中则利用反向路径返回查询节点。
层次式覆盖网络
介于集中式和洪泛式之间的查询方法
每个节点或是一个超级节点,或者被分配一个超级节点,节点和超级节点之间维持TCP,某些超级节点之间维持TCP连接,超级节点负责跟踪子节点的内容
- 例子:Skype
$DHCP$
如何获得$IP$地址
硬编码
- 通过静态配置完成
默认网关:当这个子网的$IP$数据报要离开这个子网的时候要送到哪个接口进行转发
动态主机配置协议($DHCP$)
- 从服务器动态获取$IP$地址、子网掩码、默认网关、$DNS$服务器名称与$IP$地址
- “即插即用”
- 允许地址重用(主机租用地址,关机后还回地址,允许再分配给其它主机)
- 支持在用地址续租
- 支持移动用户加入网络
工作过程
交换报文:
- 主机广播”$DHCP \space dicover$”(发现报文)
- $DHCP$服务器利用“$DHCP \space offer$”(提供报文)进行响应(广播)
- $DHCP \space request$,广播,通告其它$DHCP$服务器本机正在从某一个$DHCP$服务器申请$IP$,其它服务器可以收回预分配的$IP$
- 主机请求$IP$地址:“$DHCP \space ack$”(确认报文)
请求报文封装到$UDP$数据包中
$IP$广播
链路层广播
- $DHCP$服务器构造$ACK$报文