网络应用的体系结构

客户机/服务器结构

image.png

  • 搜索引擎
  • 因特网商务(亚马逊、e-bay和 阿里巴巴)
  • 基于Web的电子邮件
  • 社交网络(脸书、微信、推特、ins)

    纯P2P结构

    image.png

  • 流行的、流量密集型的应用

  • 文件共享(如BitTorrent)
  • 对等放协助下载加速器(如迅雷)
  • 因特网电话
  • 视频会议

    混合结构

    image.png

网络进程间通信

套接字: Socket

image.png

如何寻址进程?

image.png

应用层协议

image.png

应用层协议的内容

image.png

网络应用对传输服务的需求

image.png

Internet提供的传输服务

image.png

选择的网络应用的要求

image.png
image.png

练习

题1 网络概述

image.png

  • 答案为AC

    题2 应用层概述

    image.png

  • 答案为ACD


Web应用

Web与HTTP

image.png

HTTP协议

image.png

  • 使用TCP传输服务
    • 服务器在80端口等待客户的请求
    • 浏览器发起到服务器的TCP连接(创建套接字Socket)
    • 服务器接受来自浏览器的TCP连接
    • 浏览器(HTTP客户端)与Web服务器(HTTP服务器)交换HTTP消息
    • 关闭TCP连接
  • 无状态(stateless)

    • 服务器不维护任何有关客户端过去所发请求的信息

      非持久性连接

  • 每个TCP连接最多允许传输一个对象

  • HTTP 1.0版本使用非持久性连接

image.png
image.png

响应时间分析与建模

image.png

持久性HTTP

image.png

方法的类型

image.png
image.png

HTTP请求消息

image.png

HTTP响应消息

image.png

HTTP响应状态代码

image.png

Cookie技术

为什么需要Cookie?

image.png

Cookie技术

image.png

Cookie的组件

image.png

Cookie的作用

image.png

Web缓存/代理服务器技术

功能

image.png

为什么要发明这种技术?

image.png

Web缓存/代理服务器

image.png

Web缓存示例

image.png

  • 解决方案1

image.png

  • 解决方案2

image.png

条件性GET方法

image.png

练习

题1 Web应用

image.png

  • 答案ABD

    题2 HTTP协议

    image.png

  • 答案为CD;解析:一个网页嵌有10个图片,即对于非持续连接要产生10+1个TCP连接和请求,共11*2=22个RTT;对于无流水的持续连接,只需一次TCP连接,每个引用的对象耗时1个RTT,共2+10=12个RTT;对于有流水的持续连接,理想情况下收到所有的引用对象只需要耗时1个RTT,共2+1=3个RTT。

    题3 Cookie和Web缓存

    image.png

  • 答案:AD;解析:Web缓存服务器通常放在离客户端比较近的地方

    题4 关于WWW服务,以下哪种说法是错误的(D)

    A.WWW服务采用的主要传输协议是HTTP
    B.WWW服务以超文本方式组织网络多媒体信息
    C.用户访问Web服务器可以使用统一的图形用户界面
    D.用户访问Web服务器不需要知道服务器的URL地址
    HTTP是WWW客户机和WWW服务器之间的应用层传输协议;页面采用超文本方式对信息进行组织。用户可以使用统一的图形用户界面访问Web服务器,但用户访问Web服务器的时候需要知道服务器的URL地址。

    题5 根据你在应用层、运输层中所学的知识,请介绍在HTTP中,为了提高传输效率,可以采取哪些有效的措施?

    解:①并行连接:http允许客户端打开多条连接,并行地执行多个http的事务。②持久连接:建立一条持久化的连接,不需要每次都建立连接在中断。③管线化连接:允许在持久连接上可选地使用请求管道,即建立一个队列,将http事务请求放到队列中,一条一条发送而无需等待前面的响应结果。(流水线机制)

Email应用

Email应用的构成

image.png
image.png

SMTP协议

SMTP是因特网电子邮件的核心

image.png

SMTP交互示例

image.png

SMTP协议 vs HTTP协议?

image.png

Email消息格式

image.png

多媒体扩展

image.png

邮件访问协议

image.png

POP协议

image.png
image.png

IMAP协议

image.png

练习

题1 Email

image.png

  • 答案为AD;B可能是因为发送的是报文?

    题2 电子邮件系统由哪些部分构成?解释各部分的作用

  • 用户代理:

用户代理允许用户阅读、回复、转发、保存和撰写报文。邮箱代理向邮件服务器发送报文,当另一方需要阅读报文时,用户代理再在邮件服务器中取得报文。

  • 邮件服务器:

邮件服务器时电子邮件体系结构的核心,每个用户在某个邮件服务器上有一个邮箱。服务器运行相应的协议,完成用户邮件的转发、接收、存储邮件。用户也可通过服务器浏览相应的电子邮件。
网络中运行相应网络协议,负责发送和接收用户电子邮件的服务器。
a.邮件交换服务器:这个服务器运行SMTP协议,完成用户邮件的转发工作;
b.邮件接收服务器:这个服务器类型运行POP或IMAP协议,接收电子邮件并进行存储,用户通过这个服务器可以浏览相应的电子邮件.

  • 简单的邮件传输协议smtp:

smtp是因特网电子邮件中主要的应用层协议,使用tcp可靠数据传输服务,从发送方的邮件服务器向接收方的邮件服务器发送邮件,主要用于系统之间的邮件信息传递,并提供有关来信的通知。

DNS概述

DNS服务

image.png

分布式层次式数据库

image.png

DNS根域名服务器

image.png

DNS查询示例

迭代查询

image.png

递归查询

image.png

例题

image.png

DNS记录

image.png

DNS协议与消息

image.png
image.png

练习

题1 DNS

image.png

  • 答案AC

    题2 假设你在浏览某网页时点击了一个超链接,URL为“https://www.kicker.com.cn/index.html”,且该URL对应的IP地址在你的计算机上没有缓存;文件index.html引用了8个小图像。域名解析过程中,无等待的一次DNS解析请求与响应时间记为RTTd,HTTP请求传输Web对象过程的一次往返时间记为RTTh。请回答下列问题:

    1)你的浏览器解析到URL对应的IP地址的最短时间是多少?最长时间是多少?
    解:浏览器解析到URL对应的IP地址的最短时间是:在主机没有缓存的情况下,本地DNS服务器有该域名的IP地址缓存,则最短时间为 RTTd;在主机没有缓存,且使用递归查询的情况下,本地local DNS 服务器就会将该DNS请求发给Root DNS服务器,然后Root DNS服务器将DNS请求发给顶级域名服务器TLD,然后顶级域名服务器TLD将该DNS请求发给权威域名服务器,权威域名服务器找到DNS请求的IP地址后按原路一层一层返回请求,最长时间为 (4+1)RTTd = 5RTTd。
    2)若浏览器没有配置并行TCP连接,则基于HTTP1.0获取URL链接Web页完整内容(包括引用的图像,下同)需要多长时间(不包括域名解析时间,下同)?
    解:第一次建立TCP连接用掉一个RTTh,获取Html文件用掉一个RTTh;
      因为是非持久连接,所以每次传输文件都要重新打开TCP连接,用掉一个RTTh,后面还有8个小图像,就需要打开8次TCP连接,同时有8次传输小图像所用8个RTTh,综上,共计:1RTTh+1RTTh+8RTTh+8RTTh=18RTTh。
    3)若浏览器配置5个并行TCP连接,则基于HTTP1.0获取URL链接Web页完整内容需要多长时间?
    解:一开始建立TCP连接,获得index.html文件2个RTTh。然后由图像地址信息,在2轮并行处理下完成8个图像的加载工作。2
    2个RTTh。
    答: 2 + 4 = 6 RTTh。(两轮是指:因为每次5个并行TCP连接,一共有8个小图像,第一次传输5个,第二次传输剩余的3个,所以为2轮。而每轮都要打开一次TCP连接用了1个RTTh,又同时传输图像用了一个RTTh,所以为2轮*2个RTTh=4RTTh,)
    4)若浏览器没有配置并行TCP连接,则基于非流水模式的HTTP1.1获取URL链接Web页完整内容需要多长时间?基于流水模式的HTTP1.1获取URL链接Web页完整内容需要多长时间?
    答: 无流水: 1RTTh(TCP持久连接)+ 1RTTh(1次html内容获取)+ 8RTTh(8个图像传输时间) = 10RTTh。有流水: 1RTTh(TCP持久连接)+ 1RTTh (1次html内容获取)+ 1RTTh(8个图像传输时间)= 3RTTh。

    P2P应用:原理与文件分发

    客户机/服务器 vs. P2P

    从一个服务器向N个节点分发一个文件需要多长时间?

    image.png

    客户机/服务器

    image.png

  • 我们可以看到,对足够大的N。客户-服务器分发的时间由NF/us确定。

    P2P

    image.png

    客户机/服务器 vs. P2P: 例子

    image.png

    BitTorrent

    image.png
    image.png
    image.png

    集中式索引

    image.png

    集中式索引的问题

    image.png

    洪泛式查询: Query flooding

    image.png
    image.png

    层次式覆盖网络

    image.png

    练习

    题1 P2P

    image.png

  • 答案为ABC

    题2 考虑向N个对等方(用户)分发F=15Gb的一个文件。该服务器具有us=30Mbps的上传速率,每个对等方的下载速率di=2Mbps,上传速率为u。请分别针对客户-服务器分发模式和P2P分发模式两种情况,对于N=10、100和1000以及u=500kbps、1Mbps和2Mbps的每种组合,绘制最小分发时间图表。(注:k=10^3、M=10^6、G=10^9)

    image.png
    image.png
    image.png
    image.png

    SOCKET编程

    Socket API函数

    socket

    image.png

    Socket面向TCP/IP的服务类型

    image.png

    Closesocket

    image.png

    bind

    image.png

    listen

    image.png

    connect

    image.png

    accept

    image.png

    send, sendto

    image.png

    recv, recvfrom

    image.png

    setsockopt, getsockopt

    image.png

    Socket API函数小结

    image.png
    image.png

    关于网络字节顺序

    image.png

    Socket编程-客户端软件设计

    解析服务器IP地址

    image.png

    解析服务器(熟知)端口号

    image.png

    解析协议号

    image.png

练习

题1 socket编程

image.png

  • 答案为ABD

    题2

    image.png

  • 答案为对

    题3

    image.png

  • 答案为BC

    题4 编写一个socket通信程序,客户端获取服务端的日期时间,提交两端(客户端和服务器端)代码

    echo_client.py: ```python

    -- coding: utf-8 --

    “”” Created on Mon Apr 6 22:37:47 2020

@author: wht990309 “”” ‘’’run echo_client.py —port=9090’’’ import socket import argparse

host=’localhost’

def echo_client(port):

  1. #Create a TCP/IP socket
  2. sock=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
  3. #Connect the socket to the server
  4. server_address=(host,port)
  5. print("Connecting to %s port % s" %server_address)
  6. sock.connect(server_address)
  7. #send data
  8. try:
  9. message="Test message.This will be echoed"
  10. print("Sending %s" % message)
  11. sock.sendall(message.encode())
  12. #Look for the response
  13. data=sock.recv(2048)
  14. print(data)
  15. server_time=sock.recv(2048)
  16. print(server_time)
  17. except socket.error as e:
  18. print("Socket error: %s" %str(e))
  19. except Exception as e:
  20. print("Other exception: %s" %str(e))
  21. finally:
  22. print("Closing connection to the server")
  23. sock.close()

if name==’main‘: parser=argparse.ArgumentParser(description=’Socket Server Example’) parser.add_argument(‘—port’,action=”store”,dest=”port”,type=int,required=True) given_args=parser.parse_args() port=given_args.port echo_client(port)

  1. echo_server.py:
  2. ```python
  3. # -*- coding: utf-8 -*-
  4. """
  5. Created on Fri Apr 3 11:49:36 2020
  6. @author: wht990309
  7. """
  8. '''编写一个简单的回显客户端/服务器应用'''
  9. '''run echo_server.py --port=9090'''
  10. import socket
  11. import argparse
  12. import time
  13. host='localhost'
  14. data_payload=2048
  15. backlog=5
  16. def echo_server(port):
  17. '''A simple echo server'''
  18. #Create a TCP socket
  19. sock=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  20. #Enable reuse address/port
  21. sock.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
  22. #Bind the socket to the port
  23. server_address=(host,port)
  24. print("Starting up echo server on %s port %s" %server_address)
  25. sock.bind(server_address)
  26. #Listen to clients, backlog argument specifies the max no.of queued connections
  27. sock.listen(backlog)
  28. while True:
  29. print("Waiting to receive message from client")
  30. '''accept()接受一个客户端的连接请求,并返回一个新的套接字'''
  31. client,address=sock.accept()
  32. data=client.recv(data_payload)
  33. if data:
  34. print("Data: %s" %data)
  35. client.send(data)
  36. print("sent %s bytes back to %s" %(data,address))
  37. '''格式化时间戳为标准格式'''
  38. '''%y 两位数的年份表示(00-99)
  39. %Y 四位数的年份表示(000-9999)
  40. %m 月份(01-12)
  41. %d 月内中的一天(0-31)
  42. %H 24小时制小时数(0-23)
  43. %I 12小时制小时数(01-12)
  44. %M 分钟数(00=59)
  45. %S 秒(00-59)'''
  46. server_time='Server time:'+time.strftime('%Y.%m.%d %H:%M:%S',time.localtime(time.time()))
  47. client.send(server_time.encode())
  48. print("sent %s to %s" %(server_time,address))
  49. #end connection
  50. client.close()
  51. if __name__=='__main__':
  52. parse=argparse.ArgumentParser(description='Socket Server Example')
  53. parse.add_argument('--port',action="store",dest="port",type=int,required=True)
  54. given_args=parse.parse_args()
  55. port=given_args.port
  56. echo_server(port)