2.1应用层协议原理
2.1.1网络应用程序体系结构
客户-服务器体系结构:最常见的是web应用程序、FTP、Telnet和电子邮件,其有两个特点:一是客户相互之间不直接通信。二是服务器具有固定的、周知的地址,即IP地址。对客户-服务器体系结构来说,配备大量主机的数据中心常被用于创建强大的虚拟服务器。
P2P体系结构:应用程序在间断连接的主机对之间使用直接通信。目前许多流行的、流量密集型应用都是P2P的体系结构,包括文件共享(BitTorrent)、对等方协助下载加速器(迅雷)、因特网电话、IPTV。他的特征之一是自扩展性。即在请求文件产生工作量的同时,对其他对等方发送文件也增加了服务能力。
未来P2P面临的三个挑战:
- ISP友好:DSL和电缆ISP受限于”非对称“带宽应用,给相应的ISP带来了压力
- 安全性:由于高度分布和开放所带来的挑战
- 激励:能否说服用户自愿向应用提供带宽、存储和计算资源
2.1.2进程通信
1.客户和服务器进程
较好理解,如web服务中,浏览器进程称为客户进程,而web服务器进程称为服务器进程,在P2P中,一个进程既能是客户,又能服务器
2.进程与计算机网络之间的接口
进程通过一个称为套接字(socket)的软件接口向网络发送报文和从网络接受报文。套接字是同一台主机内应用层和运输层之间的接口(API)。开发者可以控制套接字在应用层端的一切,但对运输层的控制仅限于选择运输层协议、设定运输层参数
3.进程寻址
为标识接收进程,需要定义两种信息。一、主机的地址,二、主机中的接收进程的标识符(也就是端口号)
2.1.3供应用程序使用的运输层协议所提供的服务
1.可靠数据传输
发送进程只要将数据传递进套接字,就可以完全相信该数据能够无差错地到达接收进程。即不会发生丢包
2.吞吐量
发送方进程能够向接收进程交付比特的速率。该服务即为运输层协议能够以某种特定的速率来提供可用的吞吐量。对吞吐量有要求的应用程序一般称为带宽敏感的应用
3.定时
运输层协议也能提供定时保证
4.安全性
运输协议加密所有数据,在数据交付给进程之前解密这些数据
2.1.4因特网提供的运输服务
因特网为应用程序提供两个运输层协议,UDP和TCP
UDP和TCP都没有提供任何的加密机制,所以研制了TCP的加强版本,称为安全套接字层( Secure Sockets Layer SSL)这种强化在应用层实现,即需要应用程序的服务器端和客户端包括SSL代码(利用现有的高度优化的库和类)
- TCP服务
- 面向连接的服务:数据报文流动之前,须让客户和服务器相互交换运输层控制信息
-
可靠的数据传送服务:控制其没有字节的丢失和冗余
2.UDP服务
UDP是无连接的,因此两个进程通信前没有握手过程,也没有拥塞控制机制
3.传输协议不提供的服务
运输协议不提供吞吐量和定时保证,但可以通过好的设计来得到满意的结果。因此,当前的因特网能够为时间敏感应用提供满意的服务,但并不提供任何定时或者带宽的保证。
2.1.5应用层协议
应用层协议定义了:
- 交换的报文类型,例如请求报文和响应报文
- 各种报文类型的语法,如报文中各个字段以及这些字段如何描述
- 字段的含义
- 一个进程何时以及如何发送报文,对报文进行响应的规则
2.2Web和HTTP
2.2.1HTTP概述
Web的应用层协议是超文本传输协议(HTTP)。
HTTP客户首先发起一个与服务器的TCP连接,一旦连接建立,该浏览器和服务器进程就可以通过套接字接口访问TCP。因为HTTP并不保存关于客户的任何信息,所以HTTP是一种无状态协议
2.2.2非持续连接和持续连接
1.非持续连接
即每个TCP连接在服务器发送一个对象后关闭,该连接并不会为其他的对象而持续下来。每个TCP连接只传输一个请求报文和一个响应报文,所有有多少对象就需要产生多少个TCP连接。默认情况下,大部分浏览器可以打开5~10个并行的TCP连接。
在这样的前提下,我们来计算往返时间(RTT),由于三次握手的过程,前两次握手所耗费的时间占用了一个RTT,后面的请求和相应消耗了一个RTT,所以总的相应时间就是两个RTT加上服务器传输HTML文件的时间
2.持续连接
在持续连接的情况下,服务器在发送相应后保持该TCP连接打开。一般来说,如果一条连接经过一个时间间隔仍未被使用,HTTP服务器就会关闭这个连接。
2.2.3HTTP报文格式
1.HTTP请求报文
HTTP请求报文的第一行叫做请求行,后继的行都叫做首部行。
请求行有三个字段:方法字段、URL字段和HTTP版本字段,其中方法字段有GET、POST、HEAD、PUT和DELETE。
首部行中,Host指明了对象所在的主机。是Web代理高速缓存所要求的
Connection为close意味者不希望服务器使用持续连接
User-agent指明用户代理,即向服务器发送请求的浏览器的类型
Accept-language是众多内容协商首部之一
请求报文的通用格式如下
与上述不同的是多出了一个实体主体,当使用get方法的时候实体主体为空,使用POST方法的时候才可以使用该实体体。该实体主体中包含的就是用户在表单字段中的输入值。
- Tips 用表单生成的请求报文不是必须使用POST方法
2.HTTP响应报文
HTTP/1.1 200 OK
Connection: close
Date: Tue,09 Aug 2011 15:44:04 GMT
Server: Appche/2.2.3(CentOS)
Last-Modified: Tue,09 Aug 2011 15:11:03 GMT
Content-Length:6821
Content-Type: text/html
(data data data data data......)
状态行:三个字段,分别是协议版本字段、状态码字段和相应状态信息
首部行:Connection与上述类似,Date指服务器产生并发送响应报文的时间,Server表述了服务器,Last-Modified对对象缓存来说很重要。Content-Length发送对象的字节数。Content-Type即为对象类型
实体体:包含请求对象本身
2.2.4Cookie
为了让web站点能够识别用户,HTTP使用了cookie技术,该技术有4个组件
- HTTP响应报文中有一个cookie首部行
- HTTP请求报文中有一个cookie首部行
- 用户端系统保留了一个cookie文件,由浏览器管理
-
web站点有一个后端数据库
因为客户端浏览器存有响应的cookie文件,所以服务器能跟踪用户在站点的活动。当然,其在带来简化的同时也存在隐私争议
2.2.5Web缓存
Web缓存器(Web cache)也叫做代理服务器(proxy server),能代表初始服务器来满足HTTP的请求,具有自己的磁盘存储空间。一般由ISP购买并安装,如校园网。该方法可以用较低的成本来降低因特网时延
2.2.6条件GET方法
基于以上的方法,引入新的问题,即缓存器中的对象副本是否陈旧,为此,HTTP协议有一种条件GET方法来保证缓存器的对象都是最新的。
如果请求的报文用GET方法而且报文中包含"If-Modified-Since"的首部行,也就会调用条件GET来请求报文
缓存器发送
GET /fruit/kiwi.gif HTTP/1.1
HOST: www.exotiquecuisine.com
If-Modified-Since: Wed, 7 Sep 2011 09:32:62
上述的If-Modified-Since就是上次服务器发送到缓存器的时间,如果没有修改,web服务器向该缓存器发送一个响应报文
HTTP/1.1 304 Not Modified
Date: Sat,15 Oct 201115:21:20
Server:Apache/1.1.0(Unix)
(empty)
2.3文件传输协议:FTP
与HTTP类似,FTP也运行在TCP上。但FTP使用了两个并行的TCP来传输文件,一个是控制连接,一个是数据连接。
控制连接:传输控制信息,如用户标识、口令、改变远程目录的命令以及”存放“和”获取“文件的命令。正因为如此,所以称FTP的控制信息是带外传送的,相反,HTTP就是带内传送控制信息
数据连接:实际发送文件使用
在传输文件时,控制连接贯穿了整个用户会话期间,但是对话中的每一次文件传输都需要建立一个新的数据连接
-
命令和回答
客户到服务器以及服务器到客户的命令都是以7比特ASCII 格式在控制连接上传送的,常见的如下: - USER :用户标识
- PASS :用户口令
- LIST :服务器回送当前远程目录中的文件列表,该列表经一个(新建但非持续连接)数据连接传从,而非控制TCP连接
- RETR:用于索引远程主机当前目录下的文件,该命令使远程主机发送一个数据连接,并经该连接传送请求的文件
- STOR:用于在远程主机的当前目录下存放文件
回答部分是3位数字,后跟一个可选信息
- 331 用户名OK,需要口令
- 125数据连接打开,开始传送
- 425 无法打开数据连接
- 452写文件差错
2.4电子邮件
电子邮件的总体情况是三个主要组成部分:用户代理、邮件服务器和简单邮件传输协议(SMTP)。大体的过程是从发送发的用户代理开始,传输到发送方的邮件服务器,在传输到接收方的邮件服务器,最后发到接收方的邮箱中。
2.4.1 SMTP
SMTP用于从发送方的邮件服务器发送报文到接收方的邮件服务器。虽然其出现最早,但存在一些陈旧的技术。如他要求邮件报文的体部分只能采用简单的7比特ASCII表示。所以在传输多媒体数据时,需要先将二进制多媒体数据编码成ASCII码然后传输。
2.4.2与HTTP对比
两者都使用持续链接,但也有一些重要的区别
1、HTTP主要是一个拉协议,而SMTP基本上是一个推协议
2、SMTP要求每个报文使用7比特ASCII码
3、如何处理一个既包含文本又包含图形的文档,HTTP是将每个对象封装到HTTP响应报文中,而SMTP将所有的报文对象放在一个报文之中
2.4.3邮件访问协议
通常,发送方代理通过SMTP将报文发送到他自己的邮件服务器,然后他自己的邮件服务器在通过SMTP发送到目标用户的邮件服务器,最终,通过一些流行的邮件访问协议(而非SMTP协议)进行传输,如第三方的邮局协议(POP3)、因特网邮件访问协议(IMAP)以及HTTP
(为什么会由不一样,主要就是因为取报文是一个拉操作,而SMTP是一个推协议)
1.POP3
用户代理打开一个到邮件服务器端口上的TCP后,POP3开始工作,主要由三个阶段:特许、事务处理以及更新
特许:用户代理发送用户名和口令来鉴别身份(明文)
事务处理:用户代理取回报文、对报文做删除标记、取消报文删除标记以及获取邮件的统计信息
更新:出现在客户发送quit命令之后,结束该pop3会话(判断是否删除报文信息)
2.IMAP
POP3只提供留存和删除报文的操作,会给移动用户带来问题。
IMAP服务器把每个报文与一个文件夹连接起来。IMAP为用户提供了创建文件夹、移动文件夹、维护用户状态信息的各种指令。
3.基于web的电子邮件
也就是用HTTP协议来从目的服务器向目的用户代理发送报文
2.5DNS
域名系统DNS
1、是一个由分层的DNS服务器实现的分布式数据库
2、是一个使得主机能够查询分布式数据库的应用层协议
DNS服务器通常是运行BIND软件的UNIX机器,而DNS协议运行在UDP之上,使用53号端口
DNS除了提供了服务包括了主机名和IP地址的转换,还有:
- 主机别名。一个主机可能有多个容易记的别名,DNS也提供这项功能的识别
- 邮件服务器别名。
- 负载分配。一个IP集合对应一个规范主机名。DNS可以对这些冗余的Web服务器之间分配负载。
2.5.2DNS工作机理
1.分布式、层次数据库
- 根DNS服务器 有13个根DNS服务器
- 顶级域DNS服务器(Top-Level-Domain TLD) 负责顶级域名如com、org、net、edu、gov以及国家的顶级域名如uk、ca、jp等等
- 权威DNS服务器 收藏具体的DNS记录
-
本地DNS服务器 严格来说不属于该服务器的层次结构,但很重要,起着代理的作用
上述的常规流程中,从主机到本地DNS服务器是递归的,其余的查询是迭代的。
2.DNS缓存
将映射缓存在本地存储器中,且在一段时间后(通常设置为两天)将丢弃缓存的信息。
2.5.3DNS记录和报文
DNS服务器存储的资源记录(Resource Record)是一个包含了下列字段的4元组
(Name、Value、Type、TTL)
TTL:记录的生存时间
Name和Value取决于Type
- Type=A,name是主机名,value是对应的IP地址
- Type=NS,name是个域(foo.com)Value是知道如何获得该域中IP地址的权威DNS的主机名,例如(foo.com,dns.foo.com,A)
- Type=CNAME,Value是别名为Name的主机对应的规范主机名
- Type=MX,Value是别名为Name的邮件服务器的规范主机名
1.DNS报文
- 前12字节中,第一个标识符是一个16比特的数,用来匹配发送的请求和接收到的回答。标志字段有若干标志,后面四个字段指出了首部后四类数据区域出现的数量
- 问题区域 表示正在查询的信息,包括了名字字段和类型字段
- 回答 即包含了Name、Value、Type、TTL。可以包含多条RR
- 权威区域 包含其他权威服务器的记录
- 附加信息
nslookup可用发送DNS查询
2.在DNS数据库中插入记录
首先向注册登记机构申请,需提供基本和辅助权威DNS服务器的名字和IP地址,然后登记机构将一个类型NS和类型A的记录输入到TLD服务器。
-
Tips DNS的安全性
攻击类型
1.分布式拒绝服务(DDoS)带宽洪范攻击,如利用僵尸网络向13个DNS根服务器发送大批量的报文。但因为效果一般。潜在的更加有效的方法是向顶级域名服务器发送大量的DNS请求。
2.截获分组重定向web站点攻击
3.利用DNS基础设施来对主机发送DDoS攻击。要求响应比请求字节大得多,就可以淹没目标主机
2.6 P2P应用
2.6.1P2P文件分发
1.P2P体系结构的扩展性
由于P2P体系结构的设计,分发时间上随着对等方数量的增加,其最小分发时间如图
2.BitTorrent
参与一个特定文件分发的所有对等方的集合称为一个洪流(Torrent),对等方彼此下载等长的文件块。每个洪流 都具有一个基础设施结点,称为追踪器,追踪器会跟踪洪流中的对等方,并向新加入的对等方发送对等方的列表。
因为机制,用户知道他的邻近对等方有哪些块。因此,他需要两个决定,其一、她向邻居请求哪些块。其二、他向哪些请求的邻居发送。在这个问题上,一般使用稀缺优先的技术,即首先向邻居请求副本最少的块。
用户对能够以最高速率向自己提供数据的邻居给出传输的优先权,一般是选择传输速率最快的四个邻居,称为疏通,每过10秒重新计算速率进行选择,每过30秒,随机选择一个邻居发送。这样的效果是对等方能趋于找到彼此的协调上载速度
2.6.2分布式散列表(Distributed Hash Table DHT)
为了设计一个精确有效的方法,我们为每个对等方分配一个[0,2^n-1]范围内的整数标识符,键也是同一范围内的整数
当插入键值对时,我们选择为其标识符最邻近该键的对等方上分配一个键值对。而一般最邻近的方法选择的是键的最邻近后继
用户为了快速确定所插入键值对的最邻近对等方,有以下的方法
1.环形DHT
2.对等方扰动
即一个对等方突然离开后的相关操作:更新离开的对等方之前的对等方信息
2.7TCP套接字编程
2.7.1 UDP套接字编程
发送进程为分组附上的目的地址包括主机IP和套接字端口号,源地址也包括主机IP和套接字端口号。源地址附上分组通常由底层操作系统自动完成,而非UDP应用程序代码
UDPClient.py
from socket import *
servername="128.138.32.126"
serverport=12000
clientSocket=socket(AF_INET,SOCK_DGRAM) #AF_INET表示底层网络使用IPv4 SOCK_DGRAM表示一个UDP套接字
message=input('input sentence')
clientSocket.sendto(message,(servername,serverport))
modifiedMessage,serverAddress=clientSocket.recvfrom(2048)
print( modifiedMessage)
clientSocket.close()
UDPServer.py
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.upper()
serverSocket.sendto(modifiedMessage,clientAddress)
2.7.2 TCP套接字编程
在三次握手前,服务器必须有一个特殊的套接字(欢迎套接字)。在三次握手期间,当服务器收到来自用户的请求时,会生成一个新的套接字(连接套接字)
1.TCPClient.py
from socket import *
serverName='servername'
serverPort=12000
clientSocket=socket(AF_INET,SOCK_STREAM)
clientSocket.connect((serverName,serverPort))
sentence=input("please input sentence")
clientSocket.send(sentence)
modifiedSentence=clientSocket.recvfrom(1024)
print(modifiedSentence)
clientSocket.close()
2.TCPServer.py
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 l:
connectionSocket,addr = serverSocket.accept()
sentence = connectionSocket.recv (1024)
capitalizedsentence =sentence.upper()
connectionSocket.send(capitalizedsentence)
connectionSocket.close()