计算机网络自顶向下(二)——应用层
应用层
提纲
目标:原理&实例&编程
- 应用层协议原理
- Web and HTTP
- FTP*
- Email
(1)SMTP(2)POP3(3)IMAP - DNS
- P2P应用
- CDN
- TCP套接字(Soclet)编程
- UDP套接字编程
应用层原理
网络应用的例子:E-mail,Web,文本消息,远程登录,P2P文件共享,即时通信,多用户网络游戏,流媒体(YouTube,Netflix),Internet电话,实时电视会议,社交网络,搜索……
网络应用得到体系结构:客户-服务器模式(C/S),对等模式(P2P),混合体
- 客户-服务器(C/S)体系结构
服务器:一直运行;固定的IP地址和周知的端口号(约定);扩展性差;可靠性差(服务器会宕机)。
客户端:主动与服务器通信;与互联网有间歇性的连接;可能是动态IP地址;不直接与其它客户端通信。 - 对等体(P2P)体系结构
(几乎)没有一直运行的服务器;
任意端系统之间可以进行通信;
每一个节点即是客户端又是服务器,自扩展性;
参与的主机间歇性连接且可以改变IP地址(难以管理)。
e.g.迅雷 C/S和P2P混合体
(1)e.g.Napster《Napster》是一个真实的案例,是一家音乐分享平台的。它以其革命性的P2P(点对点)文件共享技术引发了音乐行业的巨大变革,但最终因未能应对法律和商业压力而走向失败。如今Napster以经营付费服务为主,而免费的Napster的流行和回响使其在电脑界和娱乐业里成为一个传奇的象征。
文件搜索:集中
文件传输:P2P
(2)即时通信- 进程通信
进程:在主机上运行的应用程序
客户端进程:发起通信的进程
服务器进程:等待连接的进程
在同一个主机内,使用进程间通信机制通信(由操作系统定义)。
不同主机,通过交换报文(message)来通信(使用OS提供的通信服务;借助传输层的服务,按照应用协议交换报文)。
P2P架构也有客户端进程和服务器进程之分。 - 分布式应用进程需要解决的问题
(1)进程标识和寻址问题(服务用户)
(2)传输层-应用层怎样提供服务(位置:层间界面的SAP;形式:应用程序接口API)
(3)如何使用传输层提供的服务,实现应用进程间的报文交换,实现应用(用户使用服务)(定义应用层协议,编制程序)
(1)-> 对进程进行编址(addressing)
进程为了接收报文,必须有一个标识,即SAP(发送也需要标识):
①每台主机有唯一的32位IP地址,但IP地址无法唯一标识一个进程。
②采用的传输层协议:TCP or UDP
③端口号(Port Numbers)
约定默认端口号:
FTP:21
Telnet:23
HTTP:TCP:80
MAIL:TCP:25
ftp:TCP:2
一个进程:IP+port标示端节点
本质上,一对主机进程之间的通信由2个端节点构成。
TCP和UDP使用端口的方式不同。
(2)-> 传输层提供的服务-需要穿过层间的信息
层间接口必须要携带的信息:
①要传输的报文(本层SDU)
②谁传的:对方的应用进程标示:IP+TCP(UDP)端口
③传给谁:对方的应用进程标示:对方的IP+TCP(UDP)端口号
传输层实体(TCP or UDP实体)根据这些信息进程TCP报文段(UDP数据报)的封装。
如果Socket API每次传输报文,都携带这么多信息(IP+TCP/UDP端口),易出错,不易管理。
TCP Socket :TCP服务,两个进程通信之前需要建立连接(持续一段时间)。
可以用一个整数表示两个实体之间的通信关系(本地标示);穿过层间的信息量最小。
TCP Socket是本地IP、本地TCP端口、对方IP、对方TCP端口以及连接状态的一个本地标识,是一个整数。(会话关系的本地标识)
Socket是TCP之上的套接字。4元组,唯一指定一个会话。简单,便于管理。
TCP是传数据报和Socket这两样东西。
UDP Socket :UDP服务,两个进程通信前无需建立连接。
每条报文独立传输;前后报文可能给不同的分布式进程。因此只能用一个整数表示本应用实体的标示。穿过层间接口的信息量最小。
UDP Socket是本地IP、本地端口号的标识。2元组。传输报文时需要提供对方IP、对方端口;接收报文时需要上传对方IP、对方端口。
UDP是传数据报、Socket、对方IP、对方端口号这四样东西。
套接字Socket像是门(饥荒小木牌)。进程向套接字发送报文或从套接字接收报文。
(3.1)-> 如何使用传输层提供的服务实现应用
定义应用层协议:报文格式、解释、时序等。
编制程序:通过API调用网络基础设施提供通信服务传报文、解析报文、实现应用时序等。
应用层协议 定义了运行在不同端系统上的应用进程如何交换报文,规范了报文类型、语法、语义、规则。
应用协议是应用的一个组成成分。
公开协议:HTTP,SMTP等。由RFC文档定义。
私有协议:Skype等。
(3.2)-> 应用层需要传输层提供什么样的服务
要素:数据丢失率,延迟,吞吐,安全性。 - 安全TCP
(1)TCP&UDP
(2)SSL(Security Socket Layer):基于TCP提供加密的TCP连接,位于应用层。
网站http开头:跑在TCP之上;https开头:跑在SSL over TCP之上。
Web and HTTP
Web网页:由一些对象组成(e.g.HTML文件、图片、Java小程序、mp3文件等)。
Web页含有一个基本的HTML文件,该文件包含若干对象的引用(链接)。
通过URL对每个对象进行引用,URL包含访问协议,用户名,口令字,端口号等。
- HTTP概况
HTTP:超文本传输协议。Web的应用层协议。
客户/服务器模式:
(1)客户:请求、接收和显示Web对象的浏览器。
(2)服务器:对请求进行响应,发送对象的Web服务器。
HTTP跑在TCP之上:PC/mobile browser->HTTP request HTTP response<-Web server
(1)客户发起与服务器的TCP连接(建立套接字);
(2)服务器接收客户的TCP连接;
(3)在浏览器与Web服务器交换HTTP报文;
(4)关闭TCP连接。
HTTP是无状态的,服务器不维护。
服务器刚刚建立的时候,守候在默认的80端口,套接字为Socket1(S1);一个连接建立起来后得到S2,又一个连接建立后得到S3,原来的S1等待着其它Web浏览器的并发建立连接请求。(S1是waiting socket,特殊socket)
非持久HTTP
最多只有一个对象在TCP连接上发送;
下载多个对象需要多个TCP连接;
HTTP/1.0使用非持久连接。
三次握手:[连接请求,连接确认,http request],http response,关闭连接。(上传10个文件就重复操作这五步10次)
缺点:每个对象要两个RTT;操作系统必须为每个TCP连接分配资源;浏览器通常打开并行TCP连接以获取引用对象。
持久HTTP
多个对象可以在一个TCP上传输;
HTTP/1.1默认使用持久连接。
三次握手基础上不关闭连接。
优点:保持连接;反复请求,使用相同连接传送;引用对象可以尽快发送。
(1)非流水方式的持久HTTP:客户端收到一个响应才能发送新的请求;每个引用对象花费一个RTT。(串行)
(2)流水方式的持久HTTP:HTTP/1.1默认模式;客户端遇到一个引用对象就立刻产生一个请求;有可能所有引用对象只花费一个RTT。(并行,多线程)
响应时间模型
往返时间RTT:一次往返传播的时间(传播是两主机的距离要有时间,传输是把数据打到电线上要的时间。这里传输时间不计)
响应时间:一个RTT用来发起TCP连接,一个RTT用来发送HTTP请求并等待HTTP响应。
文件传输时间:2RTT+1个对象传输时间 - HTTP请求报文
两种类型:请求,响应
格式:ASCII,可读
HTTP请求报文:请求行(get,post,head命令) + 首部行(host,user-agent,connection等信息) + 换行回车符(表示结束)
提交表单输入:post方式(网页通常包括表单输入,包含在实体主体中的输入被提交到服务器),url方式(通过请求行额度url字段上载)www.123.com/test?monkeys&banana
- HTTP响应报文
状态行(协议版本,状态码,状态信息) + 首部行 + 数据(e.g.请求的HTML文件)
HTTP响应状态码(待补充) - 用户-服务器状态:cookies
四个组成部分:。。。(刷到题再记) - Web缓存 代理服务器(proxy server)
不访问原始服务器,就满足客户请求。一类是Gib Mib Kib,代表的是1024进制的计数单位,一类是gb mb kb,代表的是1000进制的计数单位无特殊标注。
大部分简写都表示1024进制换算单位,u盘厂商一般是按1000进制换算的,这也是u盘插电脑上显示的内存都会比标注的少的原因。
速率按1000,大小按1024。
b是bit,B是字节。MBps和Mbps不一样。 - 条件get
FTP 文件传输协议
功能:上传&下载->文件共享
默认端口:21(waiting port)
明文传输
控制连接(port21,带外传送)&数据连接(port20,带内)
FTP特点:控制命令和数据传输分别在两个不同TCP连接上。而HTTP的控制和响应数据在一个连接上。
HTTP本身无状态,通过cookies变成有状态协议;FTP是有状态协议。
协议组成部分:用户代理,邮件服务器,简单邮件传输协议SMTP
用户代理:又名“邮件阅读器”,e.g.Foxmail、QQ邮箱,输入和输出邮件保存在服务器。
三跳:用户代理发给邮件服务器 -> 邮件服务器发给目标邮件服务器 -> 用户代理POP3存取协议从邮件服务器拉取邮件。(前两跳是推,最后一跳是拉)
SMTP协议:使用TCP在客户端和服务器之间传送报文,默认端口号25。传输的三个阶段(握手,传输报文,关闭)。
MINE:multimedia mail extension 多媒体邮件扩展。编码和解码。
原始的SMTP协议只能传输ASCII字符的邮件,引入MINE扩展后可以传输更多内容。
POP3协议:邮件的存取协议。拉邮件。用户确认阶段,事务处理阶段。无状态。本地管理文件夹。
IMAP:保留用户状态。远程管理文件夹。
DNS(Domain Name System) 域名解析系统
不是直接给人用的,是为其它应用服务的,其它应用最终是给人用的。
服务:域名(应用层)和IP地址(传输层)的转换。用于Web,ftp等。
必要性:IP地址不便记忆,便于通过域名寻址。
需要解决的三个问题:分层命名,分布式解析,增加和删除域名(命名,解析,维护)
历史:ARPANET解决方案,存在一个维护站,主机数量太大时难以分配
DNS的思想:分层命名,分布式数据库(树状关系),运行在UDP之上,核心的Internet功能但以应用层协议实现。
核心部分:互连的路由器,网络的网络,为边缘部分提供服务(连通性和数据交换),核心功能是路由(决定分组采用的到目标的路径)和转发(将分组从路由的输入链路转到输出链路)。互联网很多核心内容在建立在互联网边缘的端系统的应用之上实现的。(应该是核心部分简单稳定却强大,把复杂易错的精细活交给边缘设备)
DNS其它目的:别名转换为规范名字;负载均衡。
DNS域名结构:层次树状结构(每个树叶代表主机,用dot区分层次)。Internet根被划分为几百个顶级域名,分为通用的(.com, .edu, .gov…)和国家的(.cn, .us…);顶级域可以分为若干个二级域……
全球共13个根名字服务器,可靠。(10个在美国、1个在英国、1个在瑞典、1个在荷兰)
域的划分是逻辑的,不是物理的。
DNS:保存资源记录(RR)的分布式数据库,RR格式(name,value,type,ttl)。(TTL:生存时间,决定该资源记录从缓存中删除的时间,默认2天)
DNS大致工作过程:应用调用解析器;解析器作为客户向Name Server发出查询报文;Name Server返回响应报文。
一台设备上网必须具备四个信息:ip地址,子网掩码,默认网关default gateway,local name server(DNS)。(得到Name和IP的对应关系)
P2P应用
(P2P与C/S模式并列)
纯P2P架构:几乎没有一直运行的服务器;任意端系统可以直接通信;利用peer的服务能力,peer节点间歇上网,每次IP地址可能有变化。(e.g.Skype, BitTorrent, KanKan)
采用C/S方法将一个F大小的文件分发给N个客户端耗时(下限):
所有用户都从服务器下载。u是服务器上载速率,d是客户端下载速率。总时间与N呈线性增加关系。
采用P2P方法讲一个F大小文件分发给N个客户端耗时:
所有peer节点(客户端)都可以上载。N越大,时间越长,但相比C/S节省的时间也越多。(斜率变小)
随着N的数量增加,请求资源的节点数量在增加,提供服务的节点数量也在增加,可扩充用户数量比C/S多得多。可扩展性好,但难以维护。
P2P资源共享的两大问题:如何定位所需资源,如何处理对等方的加入与离开;可能的方案:集中,分散,半分散。
非结构化P2P
peer与peer构成了一个覆盖网,构成一条边,是随机的。
非结构化P2P:集中式目录,完全分布式,混合体。
集中式目录存在的问题:单点故障,性能瓶颈,侵犯版权。(文件传输是分散的,而定位内容是高度集中的)
完全分布式例子:查询洪泛:Gnutella:没有中心服务器,许多Gnutella客户端,覆盖网络(图)。(去中心化)
Gnutella:对等方加入。X试图与可用对等方列表上的对等方建立TCP连接,X向Y发送一个Ping报文,收到Ping报文的对等方以Pong报文响应,然后它能建立TCP连接。
混合体例子:利用不匀称性:KaZaA
每个对等方是组长或属于一个组长,对等方与组长间或组长之间存在TCP连接。
每个文件有唯一hash值(散列标识码)作为id,一个描述字段用于查询
KaZaA实例:BigTorrent:请求,发送文件块。新的Peer节点加入洪流(bitmap),成为吸血鬼,开始白嫖,先下载稀缺块(稀缺优先策略),并且优先向那些为我提供最好服务的节点提供服务,巧妙地将集体利益和个人利益结合在一起。
结构化(DHT)P2P
peer与peer构成一个有序的overlay,构成一个环/树。
结构化P2P维护一个树状或环状有序拓扑,每个节点用ip对应的16字节hash值作为唯一标识。文件也有对应的hash,节点ID与文件是重叠的 文件在哪些节点之上是约定好的,通过有序的节点与节点之间的拓扑,能很快找到内容所在的位置,实现快速内容分发。
CDN
视频流化服务:视频流量占据着互联网的大部分带宽。挑战:规模性,异构性。解决方案:分布式的、应用层面的基础设施。
视频:固定速度显示的图像序列。
CBR:constant bit rate 以固定速率编码。
VBR:variable bit rate 视频编码速率随时间的变化而变化。
(画面变化更多的视频比几乎不变的视频丢失帧率更多)
AVS:高级视频编码。
存储视频的流化服务:缓冲
DASH协议:动态自适应流化,基于HTTP。服务器将视频分割成多个块,每个块独立存储,编码于不同码率,告示文件(manifest file)提供不同块的url。客户端先获取告示文件,周期性地测量服务器到客户端的带宽,查询告示文件,一个时刻请求一个块,HTTP头部指定字节范围。(客户端根据带宽、网络能力、播放需求等一边播放一遍决定后续请求哪些块 -> B站)
CDN:Content Distribution Networks
挑战:服务器如何通过网络向上百万用户同时流化视频内容。
方案1:单个大的超级服务中心(缺点:瓶颈链路带宽小导致停顿,单点故障,视频拷贝多效率低,周边网络拥塞)(评价:简单,但不可扩展)
方案2:CDN,全网部署缓存节点,存储服务内容,就近为用户提供服务。
(1)enter deep:将CDN服务器深入到许多接入网(优点:距离近,数量多,速度快)(缺点:管理困难)e.g.Akamai
(2)bring home:部署在少数(10个左右)关键位置,采用租用线路将服务器簇连接起来。e.g.Limelight
在CDN节点中存储内容的多个拷贝,用户从CDN中请求内容。
位于应用层,靠主机与主机之间的配合提供服务。
Netflix网飞案例:网飞制作内容,上传至亚马逊云端(Amazon Cloud),卖给多个运营商,包括Akamai CDN, Limelight CDN, Level-3 CDN,来加速内部访问。网飞自己维护认证服务器,完成认证后访问网页,网页也在云端,用户可以自己选也可以自动选择最近的运营商缓存节点,从而得到服务。
TCP套接字编程
作用:通信
Socket编程:socket是传输报文应用层和传输层的门,socket api是创建socket的函数。
两种传输层服务的socket类型:TCP可靠,UDP不可靠。
套接字:应用进程与端到端传输协议(TCP或UDP)之间的门户。
TCP服务:从一个进程向另一个进程可靠地传输字节流。
TCP套接字编程步骤:
(1)服务器首先运行,等待连接建立。创建欢迎socket,和本地端口捆绑,在欢迎socket上阻塞式等待接收用户的连接。
(2)客户端主动和服务器建立连接。创建客户端本地套接字(隐式捆绑到本地port),指定服务器进程的IP地址和端口号,与服务器进程连接。
(3)当与客户连接请求到来时,服务器接受来自用户端的请求,解除阻塞式等待,返回一个新的socket,与客户端通信。允许服务器与多个客户端通信,使用源IP和源端口来区分不同的客户。
(4)连接API调用有效时,客户端P与服务器建立了TCP连接。建立
(原来的welcome socket和本地端口捆绑,connect socket和客户端IP捆绑;
连接后,connect socket关闭,welcome socket仍然守候。)
从应用进程角度:TCP在客户端和服务器进程之间提供了可靠的字节流(管道)服务。
数据结构 socketaddr_in | IP地址与port跳转关系的数据结构(标识进程的端节点) |
---|---|
sin_family | 地址簇,常量,代表用的TCP/IP协议还是IPX协议 |
sin_port | 端口号port |
sin_addr | IP地址 |
sin_zero[8] | 对齐 |
数据结构 hostent | |
---|---|
*h_name | 主机域名 |
**h_aliases | 多个域名别名 |
h_length | |
**h_addr_list[i] | 多个IP地址(放到socketaddr_in/sin_addr) |
UDP套接字编程
UDP socket
客户端与服务器之间没有连接,没有握手。
包括信息:我的socket值(本地IP和UDP端口),发送内容,发给谁(对方IP对方端口)。
收报文时的两件事:对方发送的内容,对方的端节点。
传送的数据可能丢失。
小结
- 应用程序体系结构:C/S,PSP,混合。
- 应用程序需要的服务器品质描述:可靠性,带宽,延时,安全。
- Internet传输层服务模式:TCP(可靠的、面向连接的服务),UDP(不可靠的数据报)。
- 流行的应用层协议:HTTP,FTP,SMTP,POP,IMAP,DNS。
- Socket编程。
- 应用层协议报文类型:请求/响应报文:客户端请求信息或服务;服务器以数据、状态码进行响应。
- 报文格式:首部(关于数据信息的字段),数据(被交换的信息)。
- 一个协议定义了在两个或多个通信实体之间交换报文的格式和次序,以及一条报文传输和接收或其它事件采取的动作。