计算机网络自顶向下:第二章-应用层

应用层

两个终端应用如何交流?

本章就是为了解决这个问题

网络应用原则

什么是终端应用体系结构?

网络上终端之间的不同的交流方式

两种应用体系结构

什么是CS应用体系?特征是什么?

网络终端上的主机分为服务器和客服端,
客户端上的应用一般是人为交互操作,向服务端发送请求。
服务器上有固定,已知的IP,一直在线,服务器上的应用接受来自客服端的请求并处理响应。
两个客户端之间不会沟通。

一个服务器主机够用吗?

一个服务器处理所有请求是不够用的,所以需要一个能容纳很多服务器的“数据中心”。
更多的时候需要更多个数据中心。
需要服务器的成本和宽带成本。

什么是P2P应用体系结构?特征是什么?

两个终端应用直接交互数据的体系,没有服务器。
成本比较低。

两个不同主机上的程序如何交流?

对于操作系统而言,实际上是进程在交流。
我们把两个终端上的进程分为客户进程和服务进程。
无论是哪种体系结构:我们定义,发起会话的进程是客户进程,等待联系开始会话的进程是服务进程。

进程如何从到网络发送/接受数据?

通过“套接字(socket)”。

什么是套接字?

进程好比房子,套接字好比一个门。门之间存在消息传输的设备。
套接字是应用层和传输层之间的接口。应用程序的开发者拥有套接字应有层的所有控制和传输层的少数控制。
套接字中开发者仅有的传输层控制(以后会详细讨论)是:

  1. 传输层协议选择(比如TCP)
  2. 能设定几个传输层协议的参数
    以后会具体讨论套接字。

套接字

出了门的消息该去往何处?

为了确定消息的地址,需要两个数据:

  1. IP:确定哪个主机。
  2. PORT:确定主机上的哪个进程。
    以后会具体讨论端口号。

套接字如何选择传输层协议?

套接字的另一边是传输层,因此传输层有责任将消息传递出去,传输层有多个不同的协议可供选择,这就和选择坐放飞机还是火车一样。每种协议都有各自的特性。

那么传输层协议具有哪些不同的服务?

  1. 可靠的数据传输:确保数据成功的从网络上的一端到达另一端,没有出现丢包的现象。依然存在可承受不可靠传输的网络应用,比如视频聊天/语音聊天等多媒体应用可以承受。
  2. 稳定的吞吐量:确保应用之间的数据传输吞吐量不受其他问题的影响。上诉的多媒体应用(带宽敏感应用)就对稳定的吞吐量有一定的需求。
  3. 时效性:控制数据传输的时效性,这才交互式的实时应用中比较重要,比如游戏等,必然要求延迟不能太高。
  4. 安全性:加密和解密。

传输层特性

TCP/IP网络能提供的传输层服务:TCP和UDP

TCP协议具有哪些特性?

  1. 面向连接:为了实现网络通信的可靠性,使用了复杂的拥塞控制算法,建立了繁琐的握手过程以及重传策略。
  2. 可靠传输:不会丢失数据,也不会出现数据乱序。

TCP和UDP都不具有加密的功能,应用层的SSL服务是TCP的一种增强,可以实现安全传输。如今的网络并没有提供可以保证吞吐量和时效性的协议,虽然可以从其他的手段去提供令人满意的服务。

TCP协议具有哪些特性?

  1. 能够对握手过程进行精简,减少网络通信往返次数;
  2. 能够对TLS加解密过程进行优化;
  3. 收发快速,无阻塞。

常见的网络应用和所采用的实现协议

应用层协议处理哪些问题?

“消息”的结构是怎样的?什么时候发送消息?如何建立连接?等等。
应用层主要定义了:

  1. 消息的类型:请求消息还是响应消息
  2. 不同类型消息的语法:定义消息中的字段
  3. 字段的语法:字段信息的含义
  4. 进程何时以及如何处理消息

以下主要讨论5种应用和相关协议:Web(HTTP)、file transfer(FTP)、electronic mail(SMTP)、directory service、P2P application

Web和HTTP(超文本传输协议)

什么是web和http?

Web:一种近代的网络应用,可以解析HTTP文本,以此实现全网交流。
HTTP:Web的核心协议,定义了两个网络终端程序交流的消息的结构。

HTTP底层使用TCP作为传输层协议,无需关心数据的丢失。
HTPP属于无状态协议,服务端不会保存客户端的状态信息。

http对象:可以理解为一个文件,如html文件,jpg文件,video文件等等,一个文件可以被一个url来定址。

HTTP请求的格式?

HTTP请求的格式

HTTP请求行有3个字段:请求类型+URL+HTTP版本

  • GET:用来获取http对象,URL指明对象的地址。
  • POST:依然是获取http对象,往往用来需要填写表单的位置,表单作为请求体的参数,根据参数来具体返回相应的对象。
  • HEAD:和GET一样,但是不会再返回中包含请求的http对象。
  • PUT:通常用于上传http对象
  • DELETE:通常用于删除http对象

HTTP响应的格式?

HTTP响应的格式

  • 200 OK:Request succeeded and the information is returned in the response.
  • 301 Moved Permanently:Requested object has been permanently moved;the new URL is specified inLocation:header of the response message. Theclient software will automatically retrieve the new URL.
  • 400 Bad Request:This is a generic error code indicating that the requestcould not be understood by the server.
  • 404 Not Found:The requested document does not exist on this server.
  • 505 HTTP Version Not Supported:The requested HTTP protocolversion is not supported by the server.

什么是持续连接和非持续连接?

  • 非持久连接:一个请求使用一个tcp连接
    缺点:1.每次建立tcp连接都需要消耗额外的cpu消耗和内存消耗。2.获取一个http对象就需要2个RTT时间

    RRT时间:一个小的包分组在客户端和服务端往返的时间

  • 持久连接:多个请求同一个tcp连接
    缺点:一直占用一个通道,一旦空闲、就会无端占用资源。

如何理解有状态和无状态?

  • 【无状态】:假设用户A向服务B发了一个请求1,再次发送一个请求2。 服务端本身完全不知道两个请求来自同一个用户,这在协议层次就是【无状态】的。

更通俗一点:

  • 【有状态】:消息不需要附带额外的认证消息
  • 【无状态】:每一个消息都需要附带额外的认证消息

无状态的影响?

无状态意味着,客户端不会记得每个请求的客户端和用户,比如购物网站,就需要记录每次请求用户的信息,那就意味着每个请求都需要携带重复的用户数据,这样处理的好处是减轻了服务器的负担,尽管请求会变得复杂,但是服务器也只是处理这些复杂的参数,而无需额外的消耗来维护各种状态。

优化请求信息的方式还有很多,最多的就是cookie和session

cookie的工作方式?

cookie:保存在客户端的数据
session:保存在服务器里的数据(表)

cookie

web缓存的工作方式和作用?

web缓存

Web缓存(也称为代理服务器)是代表原始Web服务器满足HTTP请求的网络实体。
最重要的是可以将请求的结果保存在代理服务器中,好处:

  1. 减少客户端的响应时间
  2. 减少访问internet的流量。

如何更新缓存?

conditional Get Request:一种特殊的请求,有两个特性:

  1. 使用get
  2. 在请求头中包含If-Modified-Since或If-None-Match字段

首次请求服务器,服务器返回的Response Headers中,指定过期时间,未指定默认为7天

除此之外包含Last-Modified字段或者ETag字段。Last-Modified 表示被请求资源在服务器端的上次修改时间,而ETag则是一个唯一文件标识符,每次文件修改后都会生成一个新的ETag。服务器通过向浏览器发送这两个字段,来告知浏览器其获得的资源的版本。

下次会在请求头中包含If-Modified-Since或If-None-Match字段。未更新则返回304状态吗。

conditional Get Request

FTP

什么是FTP

FTP

文件传输协议:

FTP和HTTP的区别

和HTTP大部分一样,底层使用TCP实现,区别在于FTP使用两个平行的TCP连接来传输一个文件:一个控制连接,一个数据连接。

FTP的消息结构

客服端建立控制连接,输入身份认证的命令和文件操作指令,服务端建立数据连接进行数据的传输。

使用下面的命令建立连接:
TELNET 127.0.0.1 21

FTP Commands:

  • USER username:Used to send the user identification to the server.
  • PASS password:Used to send the user password to the server.
  • LIST:Used to ask the server to send back a list of all the files in the currentremote directory. The list of files is sent over a (new and non-persistent) dataconnection rather than the control TCP connection.
  • RETR filename:Used to retrieve (that is, get) a file from the current direc-tory of the remote host.

replies:

  • 331 Username OK, password required
  • 125 Data connection already open; transfer starting
  • 425 Can’t open data connection
  • 452 Error writing file

SMTP

什么是SMTP?

SMTP

简单邮件传输协议

和HTTP的区别?

底层同样是采用TCP协议

  1. HTTP是“拉”协议,SMTP是“推”协议
  2. SMTP要求消息的必须是7位ASCII格式的,因此二进制文件必须比如转换成7位ASCII进行传输,比较麻烦。
  3. 一个HTTP响应包含一个消息对象,一个SMTP消息包含所有的消息对象。

SMPT消息格式:

SMTP消息

从服务器获取消息的方式?

STMP是“推”协议,因此无法用来读取邮件消息的操作。
常用的读取消息的协议:POP3(Post Office Protocol—Version 3),IMAP(Internet Mail Access Protocol),HTTP

获取消息

POP3协议:

简单的读取协议,采用TCP协议。

telnet mailServer 110
+OK POP3 server ready
user bob
+OK
pass hungry
+OK user successfully logged on

C: list
S: 1 498
S: 2 912
S: .
C: retr 1
S: (blah blah …
S: ……………..
S: ……….blah)
S: .
C: dele 1
C: retr 2
S: (blah blah …
S: ……………..
S: ……….blah)
S: .
C: dele 2
C: quit
S: +OK POP3 server signing off

IMAP协议:

优势:

  1. 维护可从任何计算机访问的远程服务器上的文件夹层次结构。每一个消息都和一个文件夹绑定。
  2. 可以获取消息的部分(可以通过邮件的标题,时间等等来决定是否下载附件)

基于HTTP:

交互更加友好

DNS(Domain Name System)

DNS协议有什么作用?

和人一样,每台主机都有唯一的主机名和别名
但是这个名字并不好被路由处理,因此使用IP作为唯一
DNS协议用UPD实现,占用53端口
功能:

  1. 将主机名转换成IP
  2. 给主机名(canonical hostname)起比较好记的别名,DNS可以通过别名获取主机名和IP。
  3. 负载均衡,可以为不同的IP和canonical hostname的主机取同一个别名,当访问的时候以某些策略分配负载。

DNS简单工作原理:

最简单的设计师只有一个DNS服务器处理所有的映射,问题是:

  1. 单点故障
  2. 流量太大
  3. 无妨满足全球范围
  4. 难以维护更新

如何解决一个DNS服务器的问题?

分布式继承结构:

  • root DNS服务器:根据域名最后一节com/edu/io等等获取TLD服务器IP地址
  • TLD DNS服务器:根据域名倒数第二节获取权威DNS服务器IP地址
  • authoritative DNS服务器:获取目标IP地址

一般而言是这三层,除此之外还有比较重要的两层是:

  • 中间服务器:因为TLD DNS服务器可能并不能直接获取authoritative DNS服务器IP
  • local DNS服务器:给其它的服务器发送请求

分布式多层DNS

递归DNS

每台DNS服务器都有缓存功能

这些映射关系是如何记录的?

存储在每一个DNS服务器数据库中,记录的格式是一个四元组:(Name, Value, Type, TTL)
TTL表示缓存的时间
Type表示记录的类型,有如下几种类型:

  1. Type=A:标准的映射记录,Name是主机名,Value是IP值。如(relay1.bar.foo.com, 145.37.93.126, A)
  2. Type=NS,Name是域名,Value是DNS服务器的主机名。如(foo.com, dns.foo.com, NS)
  3. Type=CNAME,Name是别名,Value是权威名。如(foo.com, relay1.bar.foo.com, CNAME)
  4. Type=MX,Name是权威名,Value是邮箱服务器的主机名。

DNS协议的消息格式?

DNS消息

记录如何插入到数据库中?

不考虑缓存的话:
直接获取目标IP的A类型的记录被存在authoritative DNS服务器中。其余的记录在被保存的同时会附带一条A类型的数据,记录Value中服务器主机名的IP。

P2P(Peer-to-Peer Application)

之前的协议都是基于CS设施,而P2P可以不需要服务器,每一个计算机都可以充当服务器。

CS

P2P

P2P文件分享

一个最大的应用是文件的分享

优势是什么?

可以极大的提升文件分享的时间

CS系统:分享时间和文件的分享数呈线性关系
P2P系统:分享时间和文件的分享数呈现抛物线关系

DNS消息

基于BitTorrent简单的工作方式:

一个完整的文件被分成很多个片段(chunks)存放在不同的Peer中
存在一个tracker服务器记录所有peer
当一个新用户请求下载的时候,请求tracker获取拥有资源块的peer列表
与peer建立tcp连接,称为neighbor,之后进行文件的传输
存在的两个问题:

  1. 哪个片段应该优先从neighbor中获取
  2. 请求后的块应该发送给哪些neighbor

哪个片段应该优先从neighbor中获取?

最稀罕优先
优先获取在洪流(torrent)中出现较小的块
平衡块在洪流中的数量

请求后的块(chunks)应该发送给哪些neighbor?

对换算法
确定neighbor的优先级,从中选取4个最高速率的neighbor发送块(chunks)。
10s刷新这个速率
30s随机的向一个其他的neighbor发送块,从而防止“死锁”

对换算法解决了P2P中“搭免费车”(只下载,不上传)的问题。

DHT协议(Distributed Hash Table)

如何减少对于tracker服务器的依赖?

使用DHT协议(Distributed Hash Table)

简单的工作原理介绍

  1. 首先对每个Peer进行标记,其中每个标识符都是某个固定n的范围[0,2^n-1]中的整数。
  2. 对资源片段进行hash计算,hash值作为数据库键值对的key,value是拥有该资源片段的的计算机IP
  3. 根据key值定位最近(closest)的peer,何为最近?第一个大于key的peer。
  4. 请求该peer

上面第3步,需要每一个peer都知道其他所有的peer才能正确的判断,这是不实际的。

如何改进?

采用循环DHT——每一个peer都知道自己的前驱节点和后继节点
可是即便如此,平均也需要遍历N/2次
因此可以适当的调整每一个peer记录的节点数(称为shortcut)达到记录数和遍历数的一个平衡。

DHT

套接字编程:创建网络应用

UDP套接字编程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//client
from socket import *
serverName = ‘hostname’
serverPort = 12000
clientSocket = socket(socket.AF_INET, socket.SOCK_DGRAM)
message = raw_input(’Input lowercase sentence:’)
clientSocket.sendto(message,(serverName, serverPort))
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)
print modifiedMessageclientSocket.close()

//server
from socket import *
serverPort = 12000
serverSocket = socket(AF_INET, SOCK_DGRAM)
serverSocket.bind((’’, serverPort))
print”The server is ready to receive”
while 1:
message, clientAddress = serverSocket.recvfrom(2048)
modifiedMessage = message.upper()
serverSocket.sendto(modifiedMessage, clientAddress)

UDP

TCP套接字编程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//client
from socket import *
serverName = ’servername’
serverPort = 12000
clientSocket = socket(AF_INET, SOCK_STREAM)
clientSocket.connect((serverName,serverPort))
sentence = raw_input(‘Input lowercase sentence:’)
clientSocket.send(sentence)
modifiedSentence = clientSocket.recv(1024)
print ‘From Server:’, modifiedSentence
clientSocket.close()

//client
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 1:
connectionSocket, addr = serverSocket.accept()
sentence = connectionSocket.recv(1024)
capitalizedSentence = sentence.upper()
connectionSocket.send(capitalizedSentence)
connectionSocket.close()

TCP

TCP

本文标题:计算机网络自顶向下:第二章-应用层

文章作者:Sun

发布时间:2019年02月15日 - 11:02

最后更新:2019年03月15日 - 17:03

原始链接:https://sunyi720.github.io/2019/02/15/cmpNet/计算机网络自顶向下:第二章-应用层/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。