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

    xiaoxiao2025-04-27  26

    1.应用程序体系结构:

    客户端-服务器体系结构

    P2P体系结构

    2.进程通信:

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

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

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

    3.进程寻址

    IP+端口号

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

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

     

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

    应用程序服务要求:

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

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

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

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

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

    4.TCP

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

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

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

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

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

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

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

    5.UDP

    6.运输层提供的服务

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

    7.一些应用使用的协议

    因特网电话:一般是使用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.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()

     

    最新回复(0)