计网Top-Down 抄书笔记(二)——应用层

应用层协议原理

1、应用程序体系结构application architecture(如何组织端系统应用程序)

  客户-服务器 client-server:固定周知IP、数据中心

  P2P:流量密集型、自扩展型、高度非集中式

2、进程通信

  C/S:C 发起通信、下载;S 等待联系、上载

  应用程序接口/套接字(应用层和运输层之间的接口)可选择、制定一些参数

  寻址:IP、端口号 http://www.iana.org

3、运输服务

  可靠数据传输:确保数据交付

 

  吞吐量:发送进程向接收进程交付的比特率;以特定速率确保可用的吞吐量

  定时:为了有效性而要求数据交付有严格时间限制

  安全性:加密、端点鉴别、数据完整性

4、运输层协议

  TCP:面向连接;可靠数据传输;拥塞控制

  SSL:TCP加强版;加密、端点鉴别、数据完整性

  UDP:无连接;不提供不必要服务;任意速率注入数据

  运输协议不提供的服务:吞吐量、定时;防火墙阻挡UDP流量、TCP备份

5、应用层协议(公共域RFC文档、专用协议)

  报文类型;报文语法;字段语义;响应规则

 

Web和HTTP(RFC 2616)80端口

Web页面:HTML、JPEG、Java文件;HTTP:超文本传输协议 HyperText Transfer Protocol

Web浏览器(IE、Firefox)、Web服务器(Apache、MIIS)

无状态stateless协议:不保存客户的任何信息

1、持续/非持续连接

  HTTP默认持续连接,可配置非持续;浏览器默认打开5~10个并行的TCP连接,并行连接缩短响应时间

  持续persistent connection:请求响应对通过相同TCP连接;非持续non-persistent:单独TCP连接

  RTT:往返时间Round-Trip Time=传播时延+排队时延+处理时延;一般2*RTT+文件传输时间

  HTTP1.1:超时关闭连接;HTTP/2(RFC 7540):问答机制

2、HTTP报文格式

请求:

计网Top-Down 抄书笔记(二)——应用层_第1张图片

代码:

 //请求行
GET /somedir/page.html HTTP/1.1 //请求一个对象
//首部行
Host: www.someschool.edu  //主机,Web代理高速缓存要求
Connection: close
User-agent: Mozilla/5.0  //用户代理,浏览器类型
Accept-language: fr  //等等

  POST:表单生成的请求报文GET+扩展URL)

  HEAD:不返回请求对象的请求报文

  PUT:上传对象

  DELETE:删除对象

响应:

计网Top-Down 抄书笔记(二)——应用层_第2张图片

代码:

//状态行
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/htm l//对象类型
//实体体
(data data data data ...)//报文

   200 OK:请求成功

   301 Moved Permanently:对象已永久转移

   400 Bad Request:请求不能被服务器理解

   404 Not Found:文档不在服务器上

   505 HTTP Version Not Supported:HTTP协议版本不支持

 

利用telnet(RFC 854)程序可以登陆到Web服务器上:

telnet gaia.cs.umass.edu 80

GET /kurose_ross/interactive/index.php HTTP/1.1
Host: gaia.cs.umass.edu

(终端使用者可以在telnet程序中输入命令,这些命令会在服务器上运行,就像直接在服务器的控制台上输入一样。可以在本地就能控制服务器。要开始一个telnet会话,必须输入用户名和密码来登录服务器。Telnet是常用的远程控制Web服务器的方法。)

3、cookie (RFC 6265)

(HTTP无状态简化了服务器设计,利用cookie可以识别用户。)

  cookie技术组件:HTTP响应首部行;HTTP请求首部行;用户端系统cookie文件夹;Web站点数据库

4、Web缓存

(也叫代理服务器。)

  定义:能够代表初始Web服务器,满足HTTP请求的网络实体。Web缓存器一般由ISP购买安装。

  原因:迅速将对象交付给用户;减少机构接入英特网的通信量;

  CDN:内容分发网络

5、条件GET

(高速缓存副本更新问题)

//1.请求报文
GET /fruit/kiwi.gif HTTP/1.1
Host: www.exotiquecuisine.com
//响应报文
HTTP/1.1 200 OK
Date: Sat, 3 Oct 2015 15:39:29
Server: Apache/1.3.0 (Unix)
Last-Modified: Wed, 9 Sep 2015 09:23:24
Content-Type: image/gif
(data data data data ...)
//2."条件"请求报文
GET /fruit/kiwi.gif HTTP/1.1
Host: www.exotiquecuisine.com
If-modefied-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)

 

Email和SMTP(RFC 5321)25端口

(异步通信媒介)组成部分:用户代理 User Agent;邮件服务器 mail server;SMTP,Simple Mail Transfer Protocol 简单邮件传输协议;

HTTP 主要是拉协议(pull protocol):用户使用HTTP从服务器拉取信息;HTTP把每个对象封装到它自己的HTTP响应报文中;

SMTP 基本是推协议(push protocol):文件被推向接收邮件服务器;SMTP把所有报文对象放在一个报文之中;

1、SMTP

限制体部分为7比特ASCII表示,多媒体需编码解码。SMTP 一般不使用中间邮件服务器发送邮件。SMTP是持续连接。

SMTP握手协议:

S: 220 hamburger.edu
C: HELO crepes.fr
S: 250 Hello crepes.fr, pleased to meet you
C: MALL FROM: 
S: 250 [email protected] ... Sender ok
C: RCPT TO: 
S: 250 [email protected] ... 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

报文首部行:

From: [email protected]
To: [email protected]
Subject: Searching for the meaning of life.

Telnet程序:

telnet serverName 25

 

2、邮件访问协议

邮件访问使用C/S体系结构。

(Alice的用户代理,用SMTP将电子邮件推入她的邮件服务器,她的邮件服务器再用SMTP,将邮件中继到Bob的邮件服务器,Bob通过特殊邮件访问协议,拉取邮件。)

  POP3(RFC 1939)110端口,第三版的邮局协议

 工作构成:特许(鉴别用户);事务处理(取回报文,删除标记);更新(服务器删除被标记的报文);

特许:

telnet mailServer 110
+OK POP3 server ready
user bob
+OK
pass hungry
+OK user successfully logged on
//+OK 前面命令正常
//-ERR 前面命令错误

事务处理:

C: list
S: 1 498 //存储的报文长度
S: 2 912
S: .
C: retr 1
S: (...)
S: .
C: dele 1
C: retr 2
S: (...)
S: .
C: dele 2
C: quit
S: +OK POP3 server signing off

  IMAP(RFC 3501),因特网邮件访问协议

为用户创建远程服务器的层次文件夹。IMAP服务器维护IMAP会话的用户状态信息。允许用户代理只获取报文的某些部分。

  HTTP,基于Web的电子邮件

用户和他的远程邮箱通过HTTP通信。

 

DNS(RFC 1034/1035)53端口

域名系统 Domain Name System。DNS服务器通常是运行BIND软件的UNIX机器。使用UDP协议,C/S模式,端到端运输协议。

主机名 / IP地址:主机的一种标识方法

主机别名:复杂主机名的主机可以拥有多个别名,别名比规范主机名更容易记住

邮件服务器别名:MX记录允许一个公司的邮件服务器和Web服务器使用相同的主机别名

负载分配:IP地址集合与一个规范主机名相联系,冗余DNS服务器循环分配负载

1、DNS工作机理

  分布式层次数据库

没有一台DNS服务器拥有英特网上所有主机的映射。

根DNS服务器:根DNS服务器提供TLD服务器的IP地址,400多个根服务器由13个不同组织管理

顶级域TLD DNS服务器:TLD服务器提供权威DNS服务器的IP地址,每个顶级域(com、org、net、edu、gov)和所有国家顶级域(uk、fr、ca、jp)都有TLD服务器

权威DNS服务器:权威DNS服务器收录每个组织机构提供的可访问DNS记录,这些记录将主机名映射为IP地址

本地DNS服务器(LDNS):每个ISP都有一台本地DNS服务器,主机发出的DNS请求,由本地DNS服务器代理发往DNS服务器层次结构中

递归查询 / 迭代查询:请求从主机到本地DNS服务器是递归的,其余查询是迭代的

  注册登记机构

ICANN向各种注册登记机构授权。http://www.internic.net

DNS动态更新(RFC 2136 / 3007)。提供你的基本和辅助权威DNS服务器名字和IP地址,便可以注册域名到DNS系统中。

(networkutopia.com, dns1.networkutopia.com, NS)
(dns1.networkutopia.com, 212.212.212.1, A)

  DNS缓存

DNS caching 能将映射缓存在本地存储器中。由于映射不是永久的,DNS服务器在一段时间后(两天),丢弃缓存信息。所以本地DNS可以绕过TLD和根DNS服务器。一定程度上增加了DNS的健壮性。

2、DNS记录和报文

 RR,资源记录Resourse Record:(Name,Value,Type,TTL)//TTL是记录生存时间

 Name和Value取决于Type:

  Type=A:(Name:主机名,Value:IP地址)标准主机名到IP地址的映射  //(relay1.bar.foo.com,145.37.93.126,A)

  Type=NS:(Name:域,Value:权威DNS服务器主机名)查询该域中IP地址所在的权威DNS服务器   // (foo.com,dns.foo.com,NS)

  Type=CNAME:(Name:规范主机名,Value:别名)查询规范主机名   //(foo.com,relay1.bar.foo.com,CNAME)

  Type=MX:(Name:规范主机名,Value:别名)邮件服务器与其他服务器有相同的别名   //(foo.com,mail.bar.foo.com,MX)

DNS查询和回答有着相同的报文:

计网Top-Down 抄书笔记(二)——应用层_第3张图片

 

 标识符:匹配请求和回答;标志:(查询,0)(回答,1)(权威的)(希望递归);

 利用nslookup程序,可以直接向某些DNS服务器发送DNS查询报文。

P2P文件分发

成对间歇连接的主机彼此直接通信。

1、扩展性

分发时间:所有N个对等方得到文件副本的时间,D_cs vs D_p2p

D_cs >= max{ NF/us,F/dmin }

  服务器:分发最短时间 NF(bit)/us(上载速率)

  对等方:获得文件最短时间 F/dmin(最小下载速率)

D_p2p >= max{ F/us,F/dmin,NF/(us+ui) }

  服务器:分发最短时间 F(bit)/us(上载速率)

  对等方:获得文件最短时间 F/dmin(最小下载速率)

  系统整体:最小分发时间 NF/(us+ui)(总上载能力)

计网Top-Down 抄书笔记(二)——应用层_第4张图片

 2、BitTorrent

洪流:参与一个特定文件分发的所有对等方集合

块:对等方彼此交换的文件(一般256KB),下载同时也上载

追踪器:洪流中的基础设施节点,注册并周期性检查对等方

最稀缺优先:优先请求邻居中副本最少的块

疏通:(对换算法)周期性计算并调整对等方集合,优先提供数据给最高请求速率,其他对等方被阻塞(“一报还一报”)

 

视频流和内容分发网

DASH,经HTTP的动态适应性流 Dynamic Adaptive Streaming over HTTP:视频被编码为不同的版本,响应客户动态请求的视频段数据块。HTTP服务器里的告示文件为每个版本提供一个URL和比特率,客户通过速度决定算法来选择下次请求的块,DASH允许客户自由地切换不同的质量等级。

CDN,内容分发网 Content Distribution Network:CDN服务器存储副本,并将每个用户定向到最佳的CDN位置。

1、CDN

安置原则:

  深入:在接入ISP中部署服务器集群,改善时延和吞吐量,但维护和管理难

  邀请做客:少量IXP中建造大集群,低维护和管理开销,稍高时延稍低吞吐量

操作:利用DNS截获和重定向请求。

集群选择策略:略(主要是讲的太乱了。。。)

2、Netflix、YouTube、看看

 Netflix:直接告知客户使用一台特殊CDN服务器,使用DASH适应性流。Netflix CDN使用推高速缓存。

 YouTube:使用DNS重定向,使用HTTP流,集群选择策略平衡RTT和平均负载。谷歌CDN使用拉高速缓存。

看看:混合CDN-P2P流式系统。客户从CDN获得开头部分,当P2P总流量满足视频播放时,客户仅从对等方获得流。

 

套接字编程 py

1、UDP

计网Top-Down 抄书笔记(二)——应用层_第5张图片

客户:

from socket import *
serverName = 'hostname'
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_DGRAM)  //IPv4, UDP
message = raw_input('Input lowercase sentence :')
clientSocket.sendto(message.encode(), (serverName,serverPort))
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
print(modifiedMessage.decode())
clientSocket.close()

服务器:

from socket import *
serverPort = 12000
serverSocket = socket(AF_INET, SOCK_DGRAM)  //IPv4, UDP
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、TCP

 

计网Top-Down 抄书笔记(二)——应用层_第6张图片

客户:

from socket import *
serverName = 'servername'
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_STREAM)  //TCP
clientSocket.connect((serverName, serverPort))
sentence = raw_input('Input lowercase sentence :')
clientSocket.send(sentence.encode())
modifiedSentence = clientSocket.recv(1024)
print('From Server :', modifiedSentence.decode())
clientSocket.close()

服务器:

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()

 

你可能感兴趣的:(计网Top-Down 抄书笔记(二)——应用层)