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

1.应用程序体系结构:

客户端-服务器体系结构

P2P体系结构

2.进程通信:

当进程运行在相同的端系统上时,它们使用进程间通讯机制互相通讯。进程间通讯的规则由端系统上的操作系统确定。

当进程运行在不同的端系统上时,它们使用计算机网络交互报文而互相通信

进程通过套接字软件接口向网络发送报文和从网络接收报文。

3.进程寻址

IP+端口号

端口号作用:用于标识一个唯一的进程。

https://www.iana.org/   可以用于查看一些比较出名的特定端口号。 

 

运输层提供不止一种协议,当应用层要使用运输层时,必须指明使用哪个协议。

应用程序服务要求:

可靠数据传输(对应:容忍丢失),

吞吐量(带宽敏感应用,如多媒体应用。web应用,邮件应用属于弹性应用)

定时:如保证从发送到接受的时延不超过100ms,对于视频电话和游戏很重要。

安全性:如加密,数据完整性,端点鉴别等

计算机网络自顶向下方法--第二章 应用层_第1张图片

因特网为应用程序提供两个运输层协议:TCP和UDP

4.TCP

面向连接的服务: 通信前的三次握手。这个连接时全双工的(即连接双方的进程可以在此连接上同时进行报文收发)。应用程序结束报文发送时的,必须拆除该连接。

可靠数据传送服务:无差错,按适当顺序交付所有发送的数据,而没有字节的丢失和冗余。

拥塞控制机制:不一定能为通讯进程带来直接好处,但能为因特网带来整体好处。

安全性:无论TCP还是UDP都没有提供任何加密机制。

SSL(Secure Sockets Layer):安全套接字层注意:SSL不是运输层协议,它只是对TCP的一种增强,这种强化是在应用层上实现的。

如果一个应用要使用SSL,那么该应用的客户端和服务端都需要包括SSL的代码。

发送进程(明文) --------->SSL 套接字-----加密------>TCP套接字------------因特网----------------->TCP套接字--------->SSL 套接字-----解密----->接收进程(明文)

5.UDP

计算机网络自顶向下方法--第二章 应用层_第2张图片

6.运输层提供的服务

TCP可以提供可靠数据传输服务,TCP+SSL可以提供安全性服务。吞吐量定时服务是运输层没有提供的保证。

7.一些应用使用的协议

计算机网络自顶向下方法--第二章 应用层_第3张图片

因特网电话:一般是使用UDP进行通信,但使用UDP一般会被防火墙阻挡,所以当UDP通信失败时,TCP作为备用。

8.应用程序协议

定义了运行在不同端系统上的应用程序如何互相传递报文。

有些应用层协议是由RFC定义的,因此它被用在公共域中。如HTTP--->RFC 2616和RFC 1945

还有一些应用层协议是专用的,有意不被公共域使用。如:Skype

讲解顺序:HTTP---->FTP---->SMTP---->DNS---->P2P

web最具吸引力的地方:按需操作

二.HTTP

HTTP有两个程序实现,一个是客户端程序一个是服务器程序。

多数的web页面包含一个HTML基本文件,已经几个引用对象。

URL:由两部分组成,存放对象的服务器主机名对象的路径名

HTTP使用TCL作为它的支撑运输层协议。HTTP客户端首先发起一个与服务器的TCP连接,一旦连接建立该客户端和服务器进程就可以通过套接字接口访问TCP。

HTTP是一个无状态协议

2.非持续连接和持续连接

非持续连接:每个请求/响应对经一个单独的TCP连接发送。

持续连接:所有的请求/响应经相同的TCP连接发送。

3.HTTP报文格式

请求报文:                                  

计算机网络自顶向下方法--第二章 应用层_第4张图片

响应报文:

计算机网络自顶向下方法--第二章 应用层_第5张图片

4.cookie

cookie技术有4个组件:

a.响应报文中的Set-cookie首部行

b.请求报文中的Cookie首部行

c.浏览器中的cookie文件

d.web站点的后端数据库

可以使用cookie来实现购物车

5.web缓存器(又叫:代理服务器)

它能代表初始web服务器满足HTTP请求的网络实体。

web缓存器有自己的磁盘存储空间,它能存储最近请求过的对象副本。

web缓存器既是客户端又是服务器。

web缓存器通常由ISP购买并安装。

使用web缓存器的两个原因:

a.直接从web缓存器中拿到对象,可以提高响应速度

b.可以大大减少一个机构的接入链路到因特网的通信量(可以减少流量强度),从而可以不必要求增加带宽,降低了费用。

CDN(Content Distribution Network)内容分发网络:使大量流量实现本地化。

CND的缺点:缓存的信息可能已经过时。

解决方案:使用条件GET方法(HTTP协议有一种机制,允许缓存器证实它的对象是最新的)。

步骤(代理服务器):1.使用get方法。2.发送请求报文中的首部行包含:If-Modified-Since(该值等于初始服务器响应报文中的Last-Modified的值)。3.初始服务器返回的响应报文的状态行: 304 Not Modified说明没有被修改过。

三.邮件协议

1.电子邮件是一种异步通信媒介

2.邮件系统的三个组成部分:用户代理邮件服务器SMTP(简单邮件传输协议:Simple Mail Transfer Protocol)。其中邮件服务器是核心,邮箱也是在邮件服务器上。

3.邮件服务器具有重试机制

4.SMTP:使用的是TCP连接,而且SMTP不使用中间邮件服务器进行转发,而是直接的发送到对方的邮件服务器。

5.SMTP和HTTP的差别:

SMTP是推协议,HTTP是拉协议

6.邮件访问协议:POP3 , IMAP,HTTP(这三种协议都是拉协议)

四.DNS

1.主机的标识方法:主机名 , IP地址

2.DNS的作用:将主机名和IP地址进行映射

3.何为DNS服务器:运行BIND软件的UNIX/Linux服务器。DNS协议运行在UDP之上,一般使用53端口号。

4.DNS还可以提供的其他服务:

主机别名,邮件服务器别名,负载分配

5.DNS的工作机制

DNS采用了分布式的设计方案。没有一台DNS服务区上拥有所有的主机映射。DNS的层次结构分为三种服务器:根DNS服务器顶级域DNS服务器权威DNS服务器。还有本地DNS服务器,虽然本地DNS服务器不属于DNS的层次结构,但它的作用和重要。如访问www.amazon.com工作流程大体如下:

客户端--->本地DNS服务器--->根DNS服务器之一--->返回顶级域(com)DNS的ip

本地DNS服务器--->顶级域DNS服务器之一--->返回权威(amazon.com)DNS服务器的ip

本地DNS服务器--->权威DNS服务器之一--->返回最终的主机ip

本地DNS服务器--->把最终的ip地址放回给客户端

客户端--->最终的主机ip

6.DNS缓存

7.DNS的报文记录:

格式:(Name,Value,Type,TTL)

TTL:该记录的生存时间

Name和Value取决与Type,Type有四种类型分别为A,NS,CNAME,MX

五.P2P

网络体系结构除了客户端-服务器之外的另一种--->P2P

使用P2P体系结构,对总是打开的服务器有最小(或没有)依赖。成对间歇连接的主机(称为对等方)彼此直接通信。这些对等方不为服务提供商所有,而是受用户控制的计算机。

六.视频流(事先录制的流式视频)

1.对视频流最重要的性能度量是:平均端到端吞吐量。

2.DASH

DASH:(Dynamic Adaptive Streaming over HTTP)经HTTP的动态适应性流。该技术的出现是为了解决HTTP的缺陷:所有客户端接收到相同编码的视频。在DASH中,视频编码为几个不同的版本(有个告示文件),客户端可以依据自己当前的网络状况来动态的请求不同版本的视频。当网络好的时候请求比特率高的视频,网络不好的时候请求比特率低的视频。

七.CDN

内容分发网(Content Distribution Network,CDN)

解决的问题:

1.避免客户端要经过过多的链路才能访问的服务器上的内容

2.避免相同的内容重复经过相同的链路

3.避免单点故障

8.套接字编程

在写客户端-服务器代码时,开发者首先需要决定是使用TCP还是UDP。

1.UDP套接字编程

客户端

from socket import *

serverName = 'localhost'
serverPort = 12000

clientSocket = socket(AF_INET, SOCK_DGRAM)  # 第一个参数:指示了地址簇,AF_INET:表示使用IPv4,第二个参数:指示套接字类型为UDP;客户端端口操作系统自己会附上
message = input('Input lowercase sentence:')
clientSocket.sendto(message.encode("utf-8"), (serverName, serverPort))  # 发送分组
modifiedMessage, serverAddress = clientSocket.recvfrom(2048)  # 等待接收服务器的数据,缓存长度为2048
print(modifiedMessage.decode("utf-8"))
clientSocket.close()

服务端

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.TCP套接字编程

客户端

from socket import *

serverName = 'localhost'
serverPort = 13000

clientSocket = socket(AF_INET, SOCK_STREAM)  # SOCK_STREAM 指明是TCP套接字,端口号操作系统自动指定
clientSocket.connect((serverName, serverPort))  # 三次握手,建立TCP连接
sentence = input('Input lowercase sentence:')
clientSocket.send(sentence.encode('utf-8'))  # 不需要再附上目的地址(UDP这里是需要附上目的地址的)
modifiedSentence = clientSocket.recv(1024)
print('From Server:', modifiedSentence.decode('utf-8'))
clientSocket.close()  # 关闭TCP连接。它引起客户端的TCP向服务端的TCP发送一条TCP报文

服务端

from socket import *

serverPort = 13000

serverSocket = socket(AF_INET, SOCK_STREAM)  # 欢迎套接字
serverSocket.bind(('', serverPort))
serverSocket.listen(100)  # 等待敲门,参数定义了请求连接的最大数(至少为1)
print('The TCP server is ready to receive')
while True:
    # 使用TCP连接,从一侧发送的所有字节不仅确保到的另一侧,而且保证按序到达
    connectionSocket, address = serverSocket.accept()  # 连接套接字,由特定的客户端专用。
    sentence = connectionSocket.recv(1024)
    capitalizedSentence = sentence.upper()
    connectionSocket.send(capitalizedSentence)
    connectionSocket.close()

 

你可能感兴趣的:(计算机网络自顶向下方法)