计网自顶向下 学习笔记Chap2


“Stay hungry Stay young”


《计算机网络自顶向下》第二章笔记

第二章 应用层

2.1 应用层协议原理

2.1.1网络应用程序体系结构

网络应用程序的体系结构取决于应用程序的设计者,一般有两种,c/s模式或者p2p模式,

在c-s模式里,需要有一个一直打开的服务器来服务于其他主机的请求,为此可能需要大型的服务器(数据中心)

在p2p模式里,最大的优势就是它的字扩展行,虽然每个成员都为文件的请求产生了工作负载,每个成员通过对等发送文件为系统增加了服务能力。

2.1.2 进程通信

1.客户和服务器进程

通常进程会被表示为客户和服务器,p2p模式中,下载方表示为客户,上载方被标识为服务器,文件在进程之间进行传输

2.进程和计算机网络之间的接口

进程通过套接字(socket)的网路接口向网络发送报文和接受报文,套接字是应用层与运输层之间的接口,也就是API。

3.进程寻址

为了接受进程,需要主机的地址以及目的主机中指定接受进程的标识符

2.1.3 可供应用程序使用的运输服务

开发应用时,必须选择一种可用的运输层协议,而这种协议的选择取决于应用程序的要求,可以从四个方面进行分类:

1.可靠数据传输

只要发送套接字,就一定能让另一个进程收到,多媒体等应用可能不提供可靠数据传输,因为数据丢失是可以被容忍的

2.吞吐量

具有吞吐量限制的应用称之为带宽敏感的应用,当前的多媒体应用一般是带宽敏感的

3.定时

限定了套接字传输到的时间,对于游戏或虚拟互动环境中·,不及时地到达可能会影响游戏的真实性

4.安全性

两个进程中发送的数据能否被某种方式检测到

但是当今的因特网并不能为提供任何定时或者带宽保证

2.1.4 因特网提供的运输服务

TCP服务:包括面向连接服务以及可靠数据传输服务,两个进程是全双工通信,通信前有握手操作

UDP服务:是一种不提供不必要服务的轻量级运输协议,她仅提供最小服务,因此两个进程通信前并没有握手服务

因特网电话应用通常可以容忍部分数据的丢失,因此可采用UDP服务

2.1.5 应用层协议

应用层协议的内容:

  1. 交换的报文类型,例如请求报文和相应报文
  2. 各种报文类型的语法,如请求报文中的各个字段及这些字段你是如何描述的
  3. 字段的语义,即这些字段中的信息的含义
  4. 确定一个进程何时以及何时发送报文,对报文进行相应的规则

应用层协议是网络应用重要的一部分

2.2 Web和HTTP

2.2.1 HTTP概述

Web的应用层协议是超文本传输协议(HTTP),它是web的核心,它定义了web客户向web服务器请求web页面的方式。它还有一个特点就是无状态协议,即使服务器刚刚向客户发送被请求的文件,也不储存任何关乎该用户的状态信息。

2.2.2 非持续连接和持续连接

当客户与服务器通信在一个长时间的范围内通信时,根据这一系列请求是按照一个tcp连接发送还是建立多个连接发送,就分成了非持续连接以及持续连接

1.非持续连接

HTTP非持续连接的过程

img

当用户点击超连接时,会产生三次握手过程,客户向服务器发送一个小TCP报文段,服务器用一个小TCP报文段进行回应,最后客户向服务器返回确认,前两次握手占用一个RTT(往返时间),第三次握手时(确认),向该TCP连接发送一个完整的HTTP文件,因此总时间为两个RTT加上传输HTML文件的时间

2.采用持续连接的HTTP

非持续连接的HTTP存在两个问题:每次连接都需要分配TCP的缓冲区和保持TCP变量,为Web服务器带来了很大的负担;并且每个对象需要经受两倍的RTT交付时延,因此持续连接的HTTP也有必要。

服务器发送相应之后,将TCP连接打开,在相同的客户和服务器之间,后续的请求和相应报文可以通过该连接进行传送,特别是一个完整的Web界面可以通过单个持续的TCP连接进行传送

2.2.3 HTTP的报文格式

1.HTTP请求报文

第一行为请求行,有三个字段,方法字段,URL字段,HTTP版本字段,方法字段可以取不同的值,具体方法的不同可以自行查阅。

请求行之后的行为首部行,首部行包括对象所在的主机以及用户代理(火狐或者谷歌等等),还有返回的语言版本

2.HTTP响应报文

  • 初始状态行:不同的状态码有不同的含义,例如200 OK代表请求成功,信息在返回的报文中
  • 首部行:6个
  • 实体体

2.2.4 用户与服务器的交互:cookie

cookie技术存在的地方:

  1. HTTP响应报文的一个首部行
  2. HTTP请求报文的一个首部行
  3. 用户端系统里保存有一个cookie文件,对用户的浏览器进行管理
  4. 位于web站点的后端数据库

第一次连接时,可能需要提供一个用户标识,在后续的会话中,浏览器向服务器传递一个cookie首部,从而标识了用户。

2.2.5 Web缓存

又名代理服务器(proxy server),它有自己的存储空间,并在存储空间中保存自己请求过的对象的副本。

当用户有浏览器请求时,这个请求首先被定向到web缓存器,具体的过程为:

  1. 浏览器创建一个Web缓存器的TCP连接,并向Web缓存器的对象发送一个HTTP
  2. Web缓存器进行检查,查看是否存储了该对象副本,如果有,web浏览器就用响应报文返回此对象,如果没有,就打开一个与该对象的初始服务器的TCP连接,向初始服务器发送HTTP请求,然后初始服务器发送HTTP响应报文,然后将该对象储存一份副本,向客户的浏览器用HTTP响应报文发送该请求。

根据上述过程,可以看出web缓存器大大减少了通信量,减少了对客户请求的响应时间。

2.2.6 条件GET方法

为了允许缓存器证实它的对象是最新的,有这样一种方法叫做条件GET方法,如果:1.请求报文使用get方法 2,。请求报文中包含一个“if-Modified-Since"首部行,那么这个HTTP请求报文就是一个条件GET请求报文。

2.3 因特网中的电子邮件

发邮件的过程:两个邮件服务器之间进行传输。先由发送方的用户代理传输到发送方的邮件服务器,再由发送方的邮件服务器发送到接收方的邮件服务器,再由接收方的服务器传输到接受方的代理。

2.3.1 SMTP 的简介

这个协议是因特网电子邮件的核心,需要将多媒体文件转换成ASCII码传输。而HTTP则不用。

它的连接过程像是计算机在进行对话,是一种自解释过程,其中有多个字段,HELO,MAIL FROM,RCPT TO, DATA ,QUIT等,这里书中推荐去试一下编程作业3

2.3.2 SMTP与HTTP的对比

1.HTTP用于Web服务器向Web客户传送文件,SMTP用于邮件服务器向邮件服务器传送文件

2.HTTP是一个拉协议(pull protocol),由接收方提出TCP连接请求,SMTP是一个推协议(push protocol),即发送邮件服务器把文件推向接收邮件服务器

3.SMTP要求每个报文采用7比特ASCII码报文,HTTP不受这种限制

4.处理既包含文本又包含图形的文档时,HTTP把每个对象封装到自己的HTTP响应报文中,SMTP把所有报文对象放在一个报文中。

2.3.3 邮件报文格式

首部行包括from和to,也许也包含subject。

2.3.4 邮件访问协议

解决的问题是用户如何通过运行本地PC上的用户代理获得位于他的ISP的邮件服务器上的邮件,下面介绍一些常用的邮件访问协议

  1. POP3:是一种简单、可读性极强的协议。POP3协议按照三个阶段进行工作,特许(authorization,我觉得翻译为授权比较好一点),事务处理,更新。
  • 特许:用户代理发送用户名和口令来鉴别用户
  • 事务处理:用户代理取回报文,同时还可以对报文做删除标记,取消报文删除标记、获取邮件的统计信息
  • 更新:客户发出quit命令后结束POP3对话

特点:具有下载并删除和下载并保存两种模式,如果选取下载并删除模式,PC机接受了报文,那么他的手机将不能在收到这个邮件

2.IMAP:POP3协议需要把报文下载到本地,移动和操作都不方便,IMAP采用远程服务器储存这些报文,然后可以在任何地方进行操作,它的特性有:

  • 把报文和文件夹连接起来,用户移动报文时可以记录写下文件夹的名字以及与哪些文件夹相关联。
  • 它允许用户代理获取报文某些部分的命令:也就是说带宽不好时,用户可能并不想取回它邮箱中的所有邮件,尤其要避免可能包含音频或者视频片段的大邮件

3.基于Web的电子邮件(当下常用的邮件通信方式)

当前越来越多的人使用Web浏览器收发邮件,例如163,qq等,使用这种服务用户,用户代理就是普通的服务器,用户和远程邮箱之间的通信采用HTTP进行,即收件人想要查看邮件时,将从邮件服务器拉取报文,发送报文时,电子邮件报文从浏览器发送到邮件服务器,此时也使用HTTP协议,但是邮件在浏览器和浏览器之间进行传输时,仍使用SMTP协议。

2.4 DNS:互联网的目录服务

2.4.1 DNS提供的服务

首先需要知道的是,识别一台计算机有两种方式,主机名和IP地址,人们便于记忆主机名,而路由器便于记录IP地址,因为它有定长,有层次结构,为了折中,我们需要一个将主机名转换为IP地址的目录服务,也就是接下来要介绍的域名系统,DNS(Domain Name System),它的主要任务是:

  1. 由一个分布式的DNS服务器实现的分布式数据库
  2. 主机可以查询分布式数据库的应用层协议

DNS大概是以以下的步骤实现了获取IP地址的过程:

  1. 主机运行DNS应用的客户端
  2. 从要查询的URL中提取出主机名,将主机名传给运行DNS应用的客户端
  3. DNS客户向服务器发送一个包含主机名的请求
  4. DNS客户端会受到一份回答报文,为IP地址
  5. 浏览器接收到这个IP地址,向这个IP地址的HTTP服务器发送一个TCP连接请求

除此以外,DNS服务器还有以下重要的服务:

  • 主机别名,一个主机可以提供多个别名,其中有一个为规范主机名
  • 邮件服务器别名
  • 负载分配:DNS用于在冗余的服务器上进行负载分配,每台服务器均运行在不同的端系统上,每个都有不同的IP地址,DNS服务器中储存了这个IP地址集合,用户对地址集合发送请求时,DNS可以在这些冗余的服务器之间循环分配负载,这一操作也可用于邮件服务器

2.4.2 DNS的工作机理

1.分布式、层次式数据库:由于这些IP地址存在一个数据库里会产生很大的负载,且不容易更新,因此没有一台DNS服务器存储所有的数据,DNS采用层级结构,分为根DNS服务器、顶级域DNS服务器(com\org\edu)、权威DNS服务器三种,他们组成一个层次结构,另外,还有一种本地DNS服务器,由ISP运行,当主机与ISP连接时,ISP提供一台主机的IP地址。

查询时,首先是用户向他的本地DNS服务器发送查询某一网站的IP地址的请求,然后本地DNS服务器向根DNS服务器发送查询的主机名,然后依次向下查询到权威DNS服务器,,查到ip地址后传输给本地DNS服务器,然后传输给请求主机,这种为递归查询,也可以迭代查询。

2.DNS缓存:为了减少因特网上运行的DNS报文数量,DNS广泛使用了缓存技术,原理非常简单,每个DNS服务器将对查询过的一部分IP地址进行缓存,后续查询时,可能直接查到了ip地址,即便不是权威DNS服务器也没关系,但是这段缓存并不是永久存在,在一段时间后DNS服务器会丢弃缓存的信息。

2.4.3 DNS记录和报文

DNS服务器中存储了资源记录,是一个四元组(Name,Value,Type,TTL),其中TTL为生存时间,Name和Value的值取决于Type,

  • Type=A,Name为主机名,Value是主机名对应的IP地址,
  • Type=NS,Name是域,Value是知道如何获得该域中主机IP地址的权威DNS服务器的主机名
  • Type=CNAME,Value是别名为Name的主机对应的规范主机名
  • Type=MX,Value为个别名为Name的邮件服务器的规范主机名

权威服务器中包含某特定主机名的A记录,如果不是,包含NS记录。

DNS报文:DNS有查询和回答两种报文,且他们的格式相同

2.5 P2P文件分发

以上的所有应用都是c/s体系,极大地依赖于总是打开的基础设施服务器,本章研究了p2p的简单应用,一个服务器向大量主机分发一个大文件。

  1. p2p体系结构的扩展性:当对等方足够多时,明显优于cs模式,因为每个对等方既是比特的消费者又是他们的重新分发者

2.6 视频流和内容分发网

为了解决向分布于全世界的用户分发巨量视频数据的挑战,所有的公司都采用了内容分发网(CDN),CDN的管理分布在多个地理位置上的服务器,

CDN操作:

  • 当用户主机中的一个浏览器指令检索一个特定的视频时,CDN截获该请求,找到适合该用户的CDN服务器集群,LDNS向用户转发这个服务器的IP地址,一旦用户接收到了ip地址,用户就和具有该ip地址的服务器进行连接,并发出对视频文件的HTTP GET请求
  • 集群选择策略:即动态地将用户定向到CDN中的某个服务器集群或数据中心的机制,一种简单的策略是指派客户到地理上最为临近的集群,缺点是,地理上最近的集群可能并不是最近的集群,为了找到最好的集群,CDN能够对其集群和客户之间的时延和丢包性能进行实时测量

2.7 编程实践

本节主要讲了手写TCP和UDP两个连接程序

UDP协议:

客户端:

#导入套接字编程包
from socket import *
#设定主机名和端口号,作为两个连接时重要的参数
serverName='hostname'
serverPort=12000
#设定socket,第一个参数指出采用的网络协议为ipv4,第二个指出采用UDP连接
clientSocket=socket(AF_INET,SOCK_DGRAM)
#输入报文
message=input('Input lowercase sentence:')
clientSocket.sendto(message.encode(),(serverName,serverPort))
#获取分组信息以及地址
modoifiedMessage,serverAddress=clientSocket.recvfrom(2048)
#将信息转化为字符串
print(modoifiedMessage.decode())
#关闭进程
clientSocket.close()

服务器端:

from socket import *
serverPort=12000
serverSocket=socket(AF_INET,SOCK_DGRAM)
#将端口号与该套接字相连接
serverSocket.bind(('',serverPort))
print("已经准备接受")
while True:
    #收取报文
    message,clientAddress=serverSocket.recvfrom(2048)
    modifiedMessage=message.decode().upper()
    serverSocket.sendto(modifiedMessage.encode(),clientAddress)

TCP:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值