• 【计算机网络:自顶向下方法】(二)应用层


    tm
    计算机网络:自顶向下方法】(二)应用层

    学习推荐 : 中科大计算机网络自顶向下
    在这里插入图片描述

    应用层

    如何创建一个新的网络应用?

    • 编程
      • 在不同的端系统上运行 通过网络基础设施提供的服 务,应用进程彼此通信
      • 如Web: Web 服务器软件与浏览器软件 通信
    • 网络核心中没有应用层软件
      • 网络核心没有应用层功能
      • 网络应用只在端系统上存在 ,快速网络应用开发和部署

    2.1 应用层原理

    网络应用的体系结构

    在这里插入图片描述

    对等模式(P2P:Peer To Peer)

    在这里插入图片描述

    混合体:客户-服务器和对等体系结构

    在这里插入图片描述
    在这里插入图片描述

    进程通信

    在这里插入图片描述

    分布式进程通信需要解决的问题

    在这里插入图片描述

    问题1:进程标示和寻址问题(服务用户)
    • HTTP默认端口号 80 SMTP : 25
      在这里插入图片描述
    问题2:传输层提供的服务-层间信息的代表

    在这里插入图片描述

    TCP上的socket

    在这里插入图片描述

    在这里插入图片描述

    UDP上的socket

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    问题3:如何使用传输层提供的服务实现应用

    在这里插入图片描述

    应用层协议

    在这里插入图片描述

    • 应用需要传输层提供什么样的服务? 如何描述传输层的服务?
      在这里插入图片描述
    • 常见应用对传输服务的要求
      在这里插入图片描述
    Internet 传输层提供的服务

    在这里插入图片描述

    为什么要有UDP

    在这里插入图片描述
    在这里插入图片描述

    安全&TCP

    在这里插入图片描述

    2.2 Web and HTTP

    在这里插入图片描述

    HTTP

    • 超文本传输协议( HyperText Transfer Protocol) : 文本与文本之间任意指向的关系
      在这里插入图片描述
    • Web页面(也叫文档) : 由对象注册的,一个对象只是一个文件.
    • 多数Web页面含有一个基本的HTML文件
      在这里插入图片描述

    HTTP连接

    在这里插入图片描述

    • 非持久HTTP连接
      在这里插入图片描述
    • 响应时间模型
      在这里插入图片描述
    • 持久HTPP
      在这里插入图片描述

    HTTP请求报文

    在这里插入图片描述

    在这里插入图片描述

    • 提交表单输入
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    用户-服务器状态 : cookies

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    Web缓存 (代理(proxy server)服务器)

    在这里插入图片描述

    • 缓存既是客户端又是 服务器
    • 通常缓存是由ISP安 装 (大学、公司、居 民区ISP)
      为什么要使用Web缓存 ?
      降低客户端的请求响应时 间
      可以大大减少一个机构内 部网络与Internent接入 链路上的流量
      互联网大量采用了缓存: 可以使较弱的ICP也能够 有效提供内容
      在这里插入图片描述

    在这里插入图片描述
    在这里插入图片描述

    改进

    缓存例子:安装本地缓存
    在这里插入图片描述

    在这里插入图片描述

    • 总体延迟:  = 0.6 * (从原始服务器获取对象的 延迟) +0.4 * (从缓存获取对象的延 迟)
       = 0.6 (2.01) + 0.4 (~msecs)  = ~ 1.2 secs  比安装154Mbps链路还来得小 (而且 比较便宜!)

    条件GET方法

    在这里插入图片描述

    FTP: 文件传输协议

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    电子邮件(EMail)

    在这里插入图片描述

    • 邮件服务器
      •  邮箱中管理和维护发送给用户 的邮件
      • 输出报文队列保持待发送邮件 报文
      •  邮件服务器之间的SMTP协议 :发送email报文
        •  客户:发送方邮件服务器
        •  服务器:接收端邮件服务 器
    • 使用TCP在客户端和服务器之间传送报文,端口 号为25
    • 直接传输:从发送方服务器到接收方服务器
    • 传输的3个阶段 握手 传输报文 关闭
    • 命令/响应交互 命令:ASCII文本 响应:状态码和状态信息
    • 报文必须为7位ASCII码

    eg

    在这里插入图片描述

    简单的SMTP交互

    • telnet servername 25
    •  enter HELO, MAIL FROM, RCPT TO, DATA, QUIT commands

    小结

    • HTPP :拉协议 ,用户使用HTTP从服务器拉取这些信息
    • SMTP :推协议,发送邮件服务器把文件推向接受邮件服务器。
      在这里插入图片描述

    邮件报文格式

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    POP3

    在这里插入图片描述
    在这里插入图片描述

    DNS (53端口, 给应用程序应用的程序 )

    在这里插入图片描述
    在这里插入图片描述

    • 负载均衡 : DNS也用于冗余的服务器之间进行负载分配 , 繁忙的站点被冗余分布在多台服务器上,每台服务器均运行在不同的端系统上,每个都有不同的IP地址。

    DNS系统需要解决的问题

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    问题2:解析问题-名字服务器(NameServer)

    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    • Value : IP

    • T : type
      在这里插入图片描述

    • 区域名字服务器维护资源记录

    • 资源记录(resource records)

      • 作用:维护 域名-IP地址(其它)的映射关系
      • 位置:Name Server的分布式数据库中
    • RR格式: (domain_name, ttl, type,class,Value)

      • Domain_name: 域名
      • Ttl: time to live : 生存时间(权威,缓冲记录)
      • Class 类别 :对于Internet,值为IN
      • Value 值:可以是数字,域名或ASCII串
      • Type 类别:资源记录的类型—见下页

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    DNS协议、报文

    在这里插入图片描述
    在这里插入图片描述

    提高性能 – > 缓存

    一旦名字服务器学到了一个映射,就将该映射 缓存起来
     根服务器通常都在本地服务器中缓存着 使得根服务器不用经常被访问
    目的:提高效率 可能存在的问题:如果情况变化,缓存结果和 权威资源记录不一致
    解决方案:TTL(默认2天)

    问题3:维护问题:新增一个域

    在这里插入图片描述

    攻击DNS

    在这里插入图片描述

    P2P

    • 纯P2P架构 :  没有(或极少)一直运行的 服务器 任意端系统都可以直接通信  利用peer的服务能力  Peer节点间歇上网,每次IP 地址都有可能变化
    • 例子: 文件分发 (BitTorrent) 流媒体(KanKan)  VoIP (Skype)
    • 非结构化P2P : 集中化目录 , 完全分布式,混合
    • 结构化p2p :DHT(分布式散列表)维护环or树的有序拓扑结构( 不断深入的过程)

    在这里插入图片描述

    • 分布式命名
    • 哈希值对应唯一的ID

    文件分发

    • 问题: 从一台服务器分发文件(大小F)到N个peer 需要多少时间?
      在这里插入图片描述
    • CS模式
    • 在这里插入图片描述
      在这里插入图片描述
    • 当N足够的大的时候 ,取等号
    • P2P模式

    在这里插入图片描述
    在这里插入图片描述

    BitTorrent

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    p2p文件共享

    在这里插入图片描述

    • 两大问题: 如何定位所需资源 如何处理对等方的 加入与离开
    • 可能的方案 :集中 分散 半分散
    集中式目录

    在这里插入图片描述

    泛洪 (完全分布式)

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    利用不匀称性:KaZaA

    在这里插入图片描述

    • KaZaA:查询
      在这里插入图片描述
      在这里插入图片描述

    CDN

    视频流化服务和CDN:上下文

    • 流量大、用户多 、异构性  不同用户拥有不同的能力(例如:有线接入和移 动用户;带宽丰富和受限用户 . — > 解决方案: 分布式的,应用层面的基础设施

    • 在这里插入图片描述

    • 由于存储下载视频 是一对一的关系,则下载未免有些慢了,于是就有了存储视频的流化服务.

    • 多媒体流化服务:DASH
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    • 互联网络主机-主机之间的通信作为一种服务向用户提供
    • OTT 挑战: 在拥塞的互联网上复制内容 “over the top”
      在这里插入图片描述
      1 : 流量服务器
      2、向本地DNS服务器解析
      3、返回URL
      4、 告诉他离他最近的客户端的ip地址
      6、再由kingCDN 向客户提供流化服务

    Socket编程

    • 目标:建立客户机/服务器的应用中的通信运用socket
    • socket:相当于应用进程和点对点传输协议之间的一扇门
    • socket类型:对应TCP和UDP有两种socket
      在这里插入图片描述### TCP Socket
      在这里插入图片描述+ 过程
      在这里插入图片描述
      在这里插入图片描述
      主要!!
      在这里插入图片描述
      在这里插入图片描述
    • 重点理解堵塞 , 堵塞的时候 可以实现多进程 。。OS的内容
    • 服务器一个端口对应许多个客户端端口,每个都是独立的会话关系,对应不同的socket。老师说过要区分端口和socket的概念
    • TCP端口整数代表的是一个会话关系
    • TCP : 四元组 ! < 1, 2,3, 4>
    • 一个端口只能被一个服务器进程绑定,可以被多个进程共用。
    • 端口是可以共用的,而socket的整数值不一样的
      在这里插入图片描述
    • Welcome socket : 返回一个整数
    socket俩个重要的数据结构
    // IP地址和port捆绑关系的数据结构(标示进程的端节点)
    struct sockaddr_in { 
        short sin_family; //地址族
        u_short sin_port;// port端口
        struct in_addr ,sin_addr; //IP 地址
        char sin_zero[8]; // align  对齐
    };
    
    //数据结构 hostent 域名和IP地址的数据结构
    struct hostent { 
        char *h_name;//主机域名
        char **h_aliases; //数组存储 主机别名  
        int h_addrtype; 
        int h_length; /*地址长度*/
        char **h_addr_list; // 数组存储 IP地址
        #define h_addr h_addr_list[0];
    };
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    UDPsocket 编程

    UDP提供的是一种不可靠的数据流传输,传输过程中可能会丢包,接收的时候顺序也可能被打乱。

    UDP:客户机与服务器之间没有连接

    • 发送数据前不需要握手
    • 发送数据包附加IP地址+端口号
    • 接收方从数据包中提取处IP地址+端口号
      在这里插入图片描述UDP中的socket编程示例
    • 下面俩个程序的作用是 在用户端发送字符串给服务端, 然后服务端把字符串修改为大写在发送给客户端
    • 这里jupyter notebook中进行编程,安装好jupyter notebook后,在命令行执行 (我用的vscode)UDPServer.ipynb
    from socket import * #引入socket库
    
    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) #从服务器套接字中读取信息(发送的消息和客户机IP地址+端口号)
        modifiedMessage = message.decode().upper() #对消息进行处理(此处是改大写)
        
        serverSocket.sendto(modifiedMessage.encode(), clientAddress) #将处理后的消息发回给客户机
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    UDPClient.ipynb

    from socket import * #引入socket库
    
    serverName = gethostname() #由于没得服务器,服务器主机用本机来当
    serverPort = 12000 #服务器端口号
    clientSocket = socket(AF_INET, SOCK_DGRAM) #创建客户机套接字
    
    message = input('Input lowercase sentence:') #得到输入字符串
    clientSocket.sendto(message.encode(),(serverName, serverPort)) #发送数据到相应主机名+端口号的服务器进程
    
    modifiedMessage, serverAddress = clientSocket.recvfrom(2048) #接收服务器发回的消息
    print(modifiedMessage.decode()) #显示接收的字符串
    
    clientSocket.close() #关闭客户机socket
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    运行过程
    • 必须先运行服务器端

    在这里插入图片描述

    在这里插入图片描述

    TCPsocket 编程

    • 服务器的先行准备
      • 服务器必须先运行
      • 服务器需要创建socket来连接客户机
    • 客户机连接服务器
      • 客户机需要创建自己的socket,明确服务器进程的IP地址和端口号
      • 客户机创建socket时,客户机和服务器之间需建立TCP连接
    • 服务器接收客户机消息
      • 服务器需创建一个新的socket,为了服务器进程能够和客户机进行通信
        • 要运行服务器与多个客户机进行通信
        • 用源的端口号来区分不同的客户机

    TCP提供的是一种可靠的字节流(byte-stream)传输(pipe)。

    在这里插入图片描述

    TCP中的socket编程示例
    • TCP服务器代码
      TCPServer.ipynb
    from socket import * #引入socket库
    
    serverPort = 12000 #服务器端口号
    serverSocket = socket(AF_INET, SOCK_STREAM) #创建服务器套接字(前台)
    serverSocket.bind(('', serverPort)) #给套接字绑定端口号
    serverSocket.listen(1)
    print('The server is ready to receive.')
    
    while True: #服务器要一直在线等待,所以给一个死循环
        connectionSocket, addr = serverSocket.accept() #前台套接字接收到请求后,创建一个新的套接字(窗口)
        
        sentence = connectionSocket.recv(1024).decode() #窗口套接字读取信息
        capitalizedSentence = sentence.upper() #对消息进行处理(此处是改大写)
        
        connectionSocket.send(capitalizedSentence.encode()) #将处理后的信息发回给客户机
        
        connectionSocket.close() #关闭窗口套接字,前台套接字保持开放
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • TCP客户机代码
      TCPClient.ipynb
    from socket import * #引入socket库
    
    serverName = gethostname() #由于没得服务器,服务器主机用本机来当
    serverPort = 12000 #服务器端口号
    clientSocket = socket(AF_INET, SOCK_STREAM) #创建客户机套接字(类型为字节流SOCK_STREAM)
    clientSocket.connect((serverName, serverPort)) #TCP连接
    
    sentence = input('Input lowercase sentence:') #得到输入字符串
    clientSocket.send(sentence.encode()) #发送数据到服务器
    
    modifiedSentence = clientSocket.recv(1024) #接收服务器发回的消息
    print('From server:', modifiedSentence.decode()) #显示接收的字符串
    
    clientSocket.close() #关闭客户机socket
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 有BUG 待解决 !!

    • 待补充C++版本

    • py版本

    🌹感谢阅读🌹

  • 相关阅读:
    4进程地址空间
    JS类型判断与转换
    区块链技术:NFG元宇宙电商模式
    安卓 Android 终端接入阿里云 IoT 物联网平台
    MySQL日志 错误日志 二进制日志 查询日志 慢查询日志
    Java方法重载的本质
    Spring 的面向切面编程(AOP)的使用场景有哪些?
    java“贪吃蛇”小游戏
    uniapp进行条件编译的两种方法
    揭示隐藏的模式:秩和检验和单因素方差分析的实战指南【考题】
  • 原文地址:https://blog.csdn.net/weixin_49486457/article/details/127740622