当前位置: 首页 > news >正文

【计算机网络】应用层

应用层协议原理

  • 客户-服务器体系结构:
    特点:客户之间不能直接通信;服务器具有周知的,固定的地址,该地址称为IP地址。
    配备大量主机的数据中心常被用于创建强大的虚拟服务器;
  • P2P体系结构:
    特点:对位于数据中心的专用服务器有最小(或者没有)依赖
    P2P最引人入胜的特征之一是它具自扩展性:尽管每个对等方都由于请求文件产生工作负荷,但是每个对等方通过向其他对等方发送文件也为系统增加服务能力。
  • 进程通信:
    套接字是同一台主机内应用层与运输层之间的接口,也被称为应用程序和网络之间的应用程序编程接口(API)。
  • 进程寻址:
    在因特网中,主机由其IP地址标识,而目的主机中到底是哪个应用程序?它由端口号表示。
  • 可供应用程序使用的运输服务:
    1. 可靠数据传输:
      应用程序的一端发送的数据正确,完全地交付给该应用程序的另一端,如果一个协议提供了这样的确保数据交付服务,我们就认为提供了可靠数据传输服务。
    2. 吞吐量
    3. 定时
    4. 安全性
  • 因特网提供的运输服务:
    1. TCP服务:
      TCP服务模型包括面向连接服务和可靠数据传输服务。除此之外,TCP还提供拥塞控制机制。
      SSL:安全套接字层
    2. UDP服务:
      UDP是一种不提供不必要服务轻量级运输协议。

Web和HTTP

Web的应用层协议是HTTP(超文本传输协议)协议,它是Web的核心。
HTTP使用TCP作为它的支撑运输协议
HTTP是一个无状态协议。
HTTP在默认情况下使用持续连接。

1.HTTP报文格式

  1. HTTP请求报文:

    GET /somedir/page.html HTTP/1.1
    Host:www.someschool.edu
    Connection:close
    Uset-agent:Mozilla/5.0
    Accept-language:fr
    

    HTTP请求报文的第一行被称作请求行,其后继的行叫做首部行。
    请求行有三个字段:方法字段,URL字段和HTTP版本字段。
    在方法字段中是,可以包括GET,POST,HEAD,PUT和DELETE,绝大部分的HTTP请求报文都使用GET方法。
    URL字段中包含了请求对象的标识。
    版本字段是自解释的。
    首部行Host:www.someschool.edu指明了对象所在的主机。
    通过包含Connection:close首部行,告诉服务器不必要使用持续链接,在发送完被请求的对象之后就关闭连接。
    User-agent:向服务器指明用户代理,即浏览器类型,以便于服务器发送对象的不同版本(如果有的话)。
    Accept-language:告诉浏览器用户想得到的对象的语法版本(如果有的话)。
    HTTP请求报文

  • 其中,使用POST方法的时候才使用实体体,例如,用户向搜索引擎搜索关键词时,实体体中就是用户在表单字段输入的值。
    用表单生成的请求报文不是必须使用POST方法!,例如www.somesite.com/animalsearch?monkes&bananas这时用户输入的内容就是moknkey和banana。

  • HEAD方法类似与GET方法,但是服务器不返回请求对象,应用程序开发者通常使用HEAD方法进行调试跟踪。

  • PUT方法通常与web发行工具联合使用,它允许用户上传对象到指定的Web服务器上的指定路径(目录)。

  • PUT也常被那些需要向Web服务器上传对象的一个用程序使用。

  • DELETE方法允许用户或者应用程序伤处Web服务器上的对象。

  • HTTP响应报文

    HTTP/1.1 OK
    Connection:close
    Date:Tue,18 Aug 2015 15:11:33 GMT
    Sever:Apache/2.2.3 (CentOS)
    Last-Modified:Tue,18 Aug 2015 15:11:03 GTM
    Content-Length:6821
    Contect-Type:text/html
    (data data data data ... )
    

    我们来看看这个响应报文:它有三个部分:状态行,首部行和实体体,这是上面那个请求报文的响应报文。
    我们来看看首部行:

    • Connection close:服务器用这个首部行告诉客户:发送完报文后,我将关闭TCP连接
    • Dtae:指示服务器产生并且发送该报文的日期和时间
    • Sercer:服务器的版本,这里指示该服务器时Apache Web服务器
    • Last-Modified:所请求的对象创建或者最后修改的时间
    • Content-Length:指示了被发送对象中的字节数
    • Content-Type:指示了实体体中的对象是什么类型,对象类型应该正式地由该首部行指示,而不是根据文件扩展名来展示
    • 响应报文格式:
      在这里插入图片描述

2.cookie:

cookie技术含有四个组件:

  1. 在HTTP响应报文中的一个cookie首部行
  2. 在HTTP请求报文中的一个cookie首部行
  3. 在用户端系统中有一个cookie文件,并且由用户浏览器管理
  4. 位于Web站点的一个后端数据库

3.Web缓存:

Web缓存器也叫做代理服务器。简单来说,就是在客户端与服务器之间,安装一个Web缓存器,该缓存器靠近客户端,当客户访问一个Web页面时,HTTP请求报文被Web缓存服务器接收,如果该Web缓存服务器上有客户请求的对象,则直接返回给客户,如果没有的话,则由该Web缓存服务器向Web服务器发送HTTP请求,Web服务器返回的对象由该Web缓存服务器接受并保存,然后返回给客户,这样,当第二次访问或者被配置到该Web缓存服务器的客户访问该站点的时候,Web缓存服务器就能快速做出回应。
Web缓存服务器的优势:

  1. 大大减少客户请求响应的时间。
  2. 大大减少一个机构的介入链路到互联网的通信量。

4.条件GET方法:

回想我们上面讲过的Web缓存,你有没有发现一个问题?就是如果一个Web页面被Web缓存器保存了,如果说,Web服务器后来更新了该页面,那么不是会出现问题吗?
解决这个问题的方法就是条件GET方法:
当用户请求某个页面的时候(正好该Web缓存服务器上有缓存),那么该Web缓存服务器就向Web服务器发送一个条件GET报文:

GET /fruit/kiwi.gif HTTP/1.1
Host:www.exotiquecuisine.com
If-modified-since:Wed,9 Sep 2015 09:23:24

这里需要注意:这里的If-Modified_since首部行的值,就是该Web缓存服务器中,上一次接收到该对象的Last-Modified时间,也就是说,该Web缓存器告诉Web服务器:如果这个时间之后你们改变了对象,那么你就把新的给我发过来。
如果该对象没有被改变,则Web服务器发送响应报文:

HTTP/1l1 304 Not Modified
Date:Sat,10 Oct 2015 15:39:29
Server:Apache/1.3.0(Unix)
(empty extity body)

注意该响应报文中并没有包含对象,如果说,Web服务器上没有更新该对象的话,那么此报文中包含对象只会浪费带宽。

英特网中的电子邮件

邮箱系统的组成部分:用户代理,邮件服务器,简单邮件传输协议(STMP),信箱

  • STMP与HTTP的对比:
    1. HTTP是一个“拉协议”,而STMP是一个“推协议”
    2. STMP要求每个报文使用7字节ASCII码形式,而HTTP数据不受这个限制
  • 邮件访问协议:
    用户之间发送邮件的时候,邮件被保存在了我的邮箱代理中了,但是我怎么查看邮件?STMP是一个推协议,我不能拉回来呀,所以就出现了邮件访问协议,目前流行的邮件访问协议有:第三版的邮局协议(POP3),因特网邮件访问协议(IMAP)以及HTTP。

DNS(域名系统):英特网的目录服务

因特网上的主机像人一样,我们也希望标识,主机可以使用主机名和IP地址来标识,但是我们更倾向于记住它的主机名而不是IP地址,所以,需要在主机名和IP地址之间进行转化,DNS就承担了这项任务。
DNS是:①一个有分层的DNS服务器实现的分布式数据库,②一个使得主机能够查询分布式数据库的应用层协议。
DNS协议运行在UDP之上,使用53号端口
除了进行主机名到IP地址的转换之外,DNS还提供了一些重要的任务:

  • 主机别名
  • 邮件服务器别名
  • 负载分配
DNS工作机理概述:
  1. DNS一种简单的设计是在英特网上只用一个DNS服务器,该服务器包含所有的映射。
    但是这种设计肯定存在很多问题:
    • 单点故障:如果说这个服务器发生了故障,整个因特网将瘫痪!
    • 通信容量:这个服务器要处理来自因特网上所有的DNS查询。
    • 远距离的集中式数据库:有时候真的可能要跨越半个地球!这中间可能有低俗的拥塞链路,那将会特别慢!
    • 维护:如果说出现了一个新的主机,他就要维护。

那么解决方法有哪些?我们来看看:

  1. 分布式,层次数据库:
    其中包括:根DNS服务器,顶级域(DNS)服务器,权威DNS服务器,还包括本地DNS服务器,但是要注意本地DNS服务器不属于该服务器的层次结构!
    在实践中,通常从请求主机到本地DNS服务器的查询是递归查询,其他的查询都是迭代查询。
  2. DNS缓存
    因为有缓存机制的存在,除了少数DNS查询以外,跟服务器都被绕过了。

P2P文件分发

我们之前讲述的客户-服务器的体系结构,总是要求服务器是打开的,使用P2P体系结构,能够对总是打开的基础设置服务器有最小的(甚至没有)依赖。
对等方不仅是比特的消费者,还是它们的重新分发者

视频流和文件分发网

HTTP
经HTTP的动态适应性流(Dynamic Adaptive Streaming over HTTP)(DASH)

  • 内容分发网(CDN)
    专用CND和第三方CND

套接字编程

  • UDP套接字编程:
    UDPClient.py:

    from socket import *
    serverName = 'hostname'
    serverPort = 12000
    clientSocket = socket(AF_INET,SOCK_DGRAM)
    message = raw_input('Input lowercase sentencte:')
    clientSocket.sendto(message.encode(),(serverName,serverPort))
    modifiedMessage,serverAddress = clientSocket.recvfrom(2048)
    print(modifiedMessage.decode())
    clientSocket.close()
    

    UDPServer.py:

    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.decode().upper()serverSocket.sendto(modifiedMessage.encode(),clientAddress)
    
  • TCP套接字编程:
    TCPClient.py:

    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.encode())
    modifiedSentence = clientSocket.recv(1024)
    print('From Server: ',modifiedSentence.decode())
    clientSocket.close()
    

    TCPServer.py:

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

相关文章:

【计算机网络】应用层

应用层协议原理 客户-服务器体系结构: 特点:客户之间不能直接通信;服务器具有周知的,固定的地址,该地址称为IP地址。 配备大量主机的数据中心常被用于创建强大的虚拟服务器;P2P体系结构: 特点&…...

python 深度学习 解决遇到的报错问题9

本篇继python 深度学习 解决遇到的报错问题8-CSDN博客 目录 一、can only concatenate str (not "int") to str 二、cant convert np.ndarray of type numpy.object_. The only supported types are: float64, float32, float16, complex64, complex128, int64, in…...

能源管理系统为什么选择零代码开发平台?

市面上有很多能源管理系统,但是零代码开发能源管理系统却非常少。那为什么推荐选择零代码开发平台呢?因为很多企业缺少技术人员,但是却仍然需要数字化工具和流程推进业务和项目,解决能源管理技术人员不懂代码的矛盾问题&#xff0…...

【LeetCode】剑指 Offer Ⅱ 第8章:树(12道题) -- Java Version

题库链接:https://leetcode.cn/problem-list/e8X3pBZi/ 类型题目解决方案二叉树的深搜剑指 Offer II 047. 二叉树剪枝递归(深搜):二叉树的后序遍历 (⭐)剑指 Offer II 048. 序列化和反序列化二叉树递归&…...

利用maven的dependency插件将项目依赖从maven仓库中拷贝到一个指定的位置

https://maven.apache.org/plugins/maven-dependency-plugin/copy-dependencies-mojo.html 利用dependency:copy-dependencies可以将项目的依赖从maven仓库中拷贝到一个指定的位置。 使用默认配置拷贝依赖 如果直接执行mvn dependency:copy-dependencies,是将项目…...

在Flask中实现文件上传七牛云中并下载

在Flask中实现文件上传和七牛云集成 文件上传是Web应用中常见的功能之一,而七牛云则提供了强大的云存储服务,使得文件存储和管理变得更加便捷。在本篇博客中,我们将学习如何在Flask应用中实现文件上传,并将上传的文件保存到七牛云…...

【Linux】centOS7安装配置及Linux的常用命令---超详细

一,centOS 1.1 centOS的概念 CentOS(Community Enterprise Operating System)是一个由社区支持的企业级操作系统,它是以Red Hat Enterprise Linux(RHEL)源代码为基础构建的。CentOS提供了一个稳定、可靠且…...

【ES专题】ElasticSearch搜索进阶

目录 前言阅读导航前置知识特别提醒笔记正文一、分词器详解1.1 基本概念1.2 分词发生的时期1.3 分词器的组成1.3.1 切词器&#xff1a;Tokenizer1.3.2 词项过滤器&#xff1a;Token Filter1.3.3 字符过滤器&#xff1a;Character Filter 1.4 倒排索引的数据结构 <font color…...

【iOS免越狱】利用IOS自动化WebDriverAgent实现自动直播间自动输入

1.目标 由于看直播的时候主播叫我发 666&#xff0c;支持他&#xff0c;我肯定支持他呀&#xff0c;就一直发&#xff0c;可是后来发现太浪费时间了&#xff0c;能不能做一个直播间自动发 666 呢&#xff1f;于是就开始下面的操作。 2.操作环境 iPhone一台 WebDriverAgent …...

Python基础入门例程28-NP28 密码游戏(列表)

最近的博文&#xff1a; Python基础入门例程27-NP27 朋友们的喜好&#xff08;列表&#xff09;-CSDN博客 Python基础入门例程26-NP26 牛牛的反转列表&#xff08;列表&#xff09;-CSDN博客 Python基础入门例程25-NP25 有序的列表&#xff08;列表&#xff09;-CSDN博客 目录…...

乌班图 Linux 系统 Ubuntu 23.10.1 发布更新镜像

Ubuntu 团队在其官网上发布了Ubuntu 23.10.1 版本,这是目前较新的 Ubuntu 23.10(Focal Fossa)操作系统系列的第一个发行版,旨在为社区提供最新的安装媒体。Ubuntu 22.04 LTS(Focal Fossa)操作系统系列于 2022 年 4 月 21 日发布。 Ubuntu 23.10 LTS(长期支持版本)可用…...

Java金字塔、空心金字塔、空心菱形

Java金字塔 public class TestDemo01 {public static void main(String[] args){//第一个for用于每行输出 从i1开始到i<5,总共5行for(int i1;i<5;i){//每行前缀空格&#xff0c;这个for用于表示每行输出*前面的空格//从上面规律可得,每行输出的空格数为总层数&#xff0c…...

前端 | (十四)canvas基本用法 | 尚硅谷前端HTML5教程(html5入门经典)

文章目录 &#x1f4da;canvas基本用法&#x1f407;什么是canvas(画布)&#x1f407;替换内容&#x1f407;canvas标签的两个属性&#x1f407;渲染上下文 &#x1f4da;绘制矩形&#x1f407;绘制矩形&#x1f407;strokeRect时&#xff0c;边框像素渲染问题&#x1f407;添加…...

206.反转链表

206.反转链表 力扣题目链接(opens new window) 题意&#xff1a;反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 双双指针法&#xff1a; 创建三个节点 pre(反转时的第一个节点)、cur(当前指向需要反转的节点…...

SpringBoot项目从resources目录读取文件

SpringBoot 从 resources 读取文件 使用 Spring 给我们提供的工具类来进行读取 File file org.springframework.util.ResourceUtils.getFile("classpath:人物模板.docx");可能读取失败&#xff0c;出现如下错误&#xff1a; java.io.FileNotFoundException: clas…...

SQL实现根据时间戳和增量标记IDU获取最新记录和脱IDU标记

需求说明&#xff1a;表中有 id, info, cnt 三个字段&#xff0c;对应的增量表多idu增量标记字段和时间戳字段ctimestamp。增量表中的 id 会有重复&#xff0c;其他字段 info、cnt 会不断更新&#xff0c;idu为增量标记字段&#xff0c;ctimestamp为IDU操作的时间戳。目的时要做…...

京东数据平台:2023年9月京东智能家居行业数据分析

鲸参谋监测的京东平台9月份智能家居市场销售数据已出炉&#xff01; 9月份&#xff0c;智能家居市场销售额有小幅上涨。根据鲸参谋电商数据分析平台的相关数据显示&#xff0c;今年9月&#xff0c;京东平台智能家居的销量为37万&#xff0c;销售额将近8300万&#xff0c;同比增…...

计算两个时间之间连续的日期(java)

背景介绍 给出两个时间&#xff0c;希望算出两者之间连续的日期&#xff0c;比如时间A:2023-10-01 00:00:00 时间B:2023-11-30 23:59:59,期望得到的连续日期为2023-10-01、2023-10-02、… 2023-11-30 Java版代码示例 import java.time.temporal.ChronoUnit; import java.tim…...

Kali Linux:网络与安全专家的终极武器

文章目录 一、Kali Linux 简介二、Kali Linux 的优势三、使用 Kali Linux 进行安全任务推荐阅读 ——《Kali Linux高级渗透测试》适读人群内容简介作者简介目录 Kali Linux&#xff1a;网络与安全专家的终极武器 Kali Linux&#xff0c;对于许多网络和安全专业人士来说&#x…...

Leetcode—101.对称二叉树【简单】

2023每日刷题&#xff08;十九&#xff09; Leetcode—101.对称二叉树 利用Leetcode101.对称二叉树的思想的实现代码 /*** Definition for a binary tree node.* struct TreeNode {* int val;* struct TreeNode *left;* struct TreeNode *right;* };*/ bool isSa…...

判断是否工作在docker环境

判断是否工作在docker环境 方式一&#xff1a;判断根目录下 .dockerenv 文件 docker环境下&#xff1a;ls -alh /.dockerenv , 非docker环境&#xff0c;没有这个.dockerenv文件的 注&#xff1a;定制化比较高的docker系统也可能没有这个文件 方式二&#xff1a;查询系统进程…...

文件上传学习笔记

笔记 文件上传 文件上传是指将本地图片&#xff0c;视频&#xff0c;音频等文件上传到服务器&#xff0c;供其它用户浏览或下载的过程 文件上传前端三要素 : file表单项 post方式 multipart/from-data 服务端接收文件 : 用spring中的API : MultipartFile 要想文件名唯一 …...

【GitLab CI/CD、SpringBoot、Docker】GitLab CI/CD 部署SpringBoot应用,部署方式Docker

介绍 本文件主要介绍如何将SpringBoot应用使用Docker方式部署&#xff0c;并用Gitlab CI/CD进行构建和部署。 环境准备 已安装Gitlab仓库已安装Gitlab Runner&#xff0c;并已注册到Gitlab和已实现基础的CI/CD使用创建Docker Hub仓库&#xff0c;教程中使用的是阿里云的Docker…...

GitLab(2)——Docker方式安装Gitlab

目录 一、前言 二、安装Gitlab 1. 搜索gitlab-ce镜像 2. 下载镜像 3. 查看镜像 4. 提前创建挂载数据卷 5. 运行镜像 三、配置Gitlab文件 1. 配置容器中的/etc/gitlab/gitlab.rb文件 2. 重启容器 3. 登录Gitalb ① 查看初始root用户的密码 ② 访问gitlab地址&#…...

[100天算法】-数组中的第 K 个最大元素(day 54)

题目描述 在未排序的数组中找到第 k 个最大的元素。请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。示例 1:输入: [3,2,1,5,6,4] 和 k 2 输出: 5 示例 2:输入: [3,2,3,1,2,4,5,5,6] 和 k 4 输出: 4 说明:你可以假设 k 总…...

每日一题411数组中两个数的最大异或值(哈希表、前缀树:实现前缀树)

数组中两个数的最大异或值(哈希表、前缀树&#xff1a;实现前缀树) LeetCode题目&#xff1a;https://leetcode.cn/problems/maximum-xor-of-two-numbers-in-an-array/ 哈希表解法 本题使用哈希表方法主要运用到一个定理&#xff1a;异或满足算法交换律。即如果a^b c&#x…...

机场运行关键指标计算规则

一、总体指标 1.放行正常率 机场放行航班&#xff1a;计划出港时间在当天的已出港航班&#xff0c;航班任务为正班、加班、旅包 放行正常航班&#xff1a;实际起飞时间≤MAX[实际落地时间10分钟&#xff08;计划出港时间-计划进港时间&#xff09;&#xff0c;计划出港时间]3…...

基于元学习神经网络的类人系统泛化

Nature 上介绍了一个关于AI在语言泛化方面的突破性研究。科学家们创建了一个具有人类般泛化能力的AI神经网络&#xff0c;它可以像人类一样将新学到的词汇融入现有词汇&#xff0c;并在新环境中使用它们。与ChatGPT 相比&#xff0c;该神经网络在系统性泛化测试中表现得更好。 …...

力扣第322题 零钱兑换 c++ java 动态规划

题目 322. 零钱兑换 中等 相关标签 广度优先搜索 数组 动态规划 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组…...

uniapp 子组件内使用定时器无法清除

涉及到的知识点&#xff1a;1.ref绑定在组建上获取组件实例。2.emit逆向传值&#xff0c;不需要点击触发&#xff0c;watch监听即可。 需求&#xff1a;在父页面的子组件定时发送请求&#xff0c;离开父页面就停止&#xff0c;再次进入就开启。 问题&#xff1a;在父页面的子…...