应用层

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代码(利用现有的高度优化的库和类)

  1. 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即为对象类型
实体体:包含请求对象本身

HTTP响应报文的通用格式

2.2.4Cookie

为了让web站点能够识别用户,HTTP使用了cookie技术,该技术有4个组件

  • HTTP响应报文中有一个cookie首部行
  • HTTP请求报文中有一个cookie首部行
  • 用户端系统保留了一个cookie文件,由浏览器管理
  • web站点有一个后端数据库


    cookie追踪用户状态

    因为客户端浏览器存有响应的cookie文件,所以服务器能跟踪用户在站点的活动。当然,其在带来简化的同时也存在隐私争议

2.2.5Web缓存

Web缓存器(Web cache)也叫做代理服务器(proxy server),能代表初始服务器来满足HTTP的请求,具有自己的磁盘存储空间。一般由ISP购买并安装,如校园网。该方法可以用较低的成本来降低因特网时延

web缓存器的示意图

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工作机理

DNS服务器的部分层次结构

1.分布式、层次数据库

  • 根DNS服务器 有13个根DNS服务器
  • 顶级域DNS服务器(Top-Level-Domain TLD) 负责顶级域名如com、org、net、edu、gov以及国家的顶级域名如uk、ca、jp等等
  • 权威DNS服务器 收藏具体的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报文


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()
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,588评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,456评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,146评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,387评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,481评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,510评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,522评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,296评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,745评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,039评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,202评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,901评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,538评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,165评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,415评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,081评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,085评论 2 352