2.1 应用层协议原理

2.1.1 网络应用程序体系结构

研发网络应用的程序的核心是写出能够运行在不同的端系统和通过网络彼此通信程序

例如:

  1. Web应用程序

    • 客户:浏览器程序(进程)

    • 服务:Web服务器程序(进程)

  2. P2P文件共享

    • 每个主机的程序(进程)都是类似的

2.1.2 进程通信

进程与网络之间的接口

进程通过套接字(socket)向网络发送和接收报文,套接字是同一台主机内应用层运输层之间的接口。

进程寻址

  1. 目标主机的地址(IP地址)
  2. 目标主机中进程(接收套接字)的标识符(端口号)
    • web服务器:80
    • 邮件(SMTP)服务器:25

2.1.3 可供程序选择的运输层(协议)服务

可靠数据传输

发送进程只需要将数据传进套接字就可以,完全相信数据能无差错的送到目的地。

吞吐量

进程间传输数据的比特率

因为其他会话将共享沿着该网络路径的带宽,并且因为这些会话将到达和离开,该吞吐量会随时间波动。这导致了另一个传输层的服务:传输层协议保证以特定的速率提供可用的吞吐量

定时

例如:发送套接字发送的数据到达接受套接字不迟于100ms

安全性

是否对传输的数据加密

2.1.4 因特网提供的运输服务

TCP 服务

面向连接服务

在应用层数据流动之前,TCP让客户和服务器相互交换传输层信息。这个所谓握手的过程提醒服务器和客户,让他们为大量分组到来做好准备。握手之后,一个TCP连接就在两个套接字之间建立了。应用程序结束发报之后,必须拆除连接

可靠的数据传输服务

进程能够依靠TCP无差错的传输数据

UDP服务

它是一种轻量级传输协议,只提供必要的服务,UDP是无连接的,因此在通信之前没有握手的过程。UDP不保证数据完整,有序的到达。

安全性

安全套接字层(Secure Sockets Layer, SSL), SSL不是与TCP和UDP在同一层次的第三种运输协议, 他是在应用层实现的,如果一个应用程序要使用SSL,它需要在客户端和服务端包括SSL代码。 SSL有自己的套接字API。就是传输之前将数据加密一下,再传给运输层,接收需要SSL解密。

2.1.5 应用层协议

2.2 Web与HTTP

Web是一个应用,HTTP是他的应用层协议

2.2.1 HTTP概况

  • Web页面:一个HTML基本文件以及几个引用对象,比如一个页面通过URL引用5个图片。
  • Web浏览器:IE,Chrome
  • Web服务器:Tomcat

HTTP是一个无状态协议,同一个用户连续请求同一个页面,服务器会老老实实的发送两次,不会因为客户短时间访问过就不再发送

2.2.2 非持续连接和持续连接

非持续连接

我们看看在非持续连接情况下,从服务器向客户传送一个Web页面的步骤。假设该页面含有一个HTML基本文件和10个JPEG图形

  1. HTTP客户进程在端口号80发起一个到服务器的TCP连接
  2. HTTP客户经套接字向该服务器发送一个HTTP请求报文
  3. HTTP服务器接收该请求报文,从其存储器中检索出对象在一个 HTTP 响应报文中封装对象,并通过其套接字向客户发送响应报文
  4. HTTP服务器进程通知TCP断开该TCP连接
  5. HTTP客户接收响应报文,TCP连接关闭。该报文指出封装的对象是一个HTML文件,客户从响应报文中提取出该文件,检查该HTML文件,得到对10个JPEG图形的引用
  6. 对每个引用的JPEG图形对象重复前4个步骤。

这个过程一共发起了11次TCP连接,比较浪费时间,

持续连接

在采用HTTP 1.1持续连接的情况下,服务器在发送响应后保持该TCP连接打开。在相同的客户与服务器之间,后续的请求和响应报文能够通过相同的连接进行传送。特别是,一个完整的Web页面(上例中的HTML基本文件加上10个图形)可以用单个持续TCP连接进行传送。更有甚者,位于同一台服务器的多个Web页面在从该服务器发送给同一个客户时,可以在单个持续TCP连接上进行。对对象的这些请求可以一个接一个地发出,而不必等待对未决请求(流水线)的回答。一般来说,如果一条连接经过一定时间间隔(一个可配置的超时间隔)仍未被使用,HTTP服务器就关闭该连接。

2.2.3 HTTP报文格式

HTTP 请求报文

GET /somedir/page.html HTTP/1.1  请求行
Host: www.someschool•edu 首部行
Connection: close
User-agent: Mozilla/5.0
Accept-language: fr
  • 请求行

    • 方法
    • URL字段
    • HTTP版本字段
  • 首部行

    • Host:指明对象所在的主机
    • Connection:close : 不使用持续连接,要求服务器发送完请求的对象后就关闭连接
    • User-agent:指明用户代理,即浏览器类型(Mozilla/5.0 Firefox浏览器),服务器可以根据不同的浏览器发送对象的不同版本
    • Accept-language:表示用户想得到该对象的语法版本。

然而,你可能已经注意到了在首部行(和附加的回车和换行)后有一个“实体体” (entity body)。使用GET方法时实体体为空,而使用POST方法时才使用该实体体。当用户提交表单时,HTTP客户常常使用POST方法,例如当用户向搜索引擎提供搜索关键词时。使用POST报文时,用户仍可以向服务器请求一个Web页面,但Web页面的特定内容依赖于用户在表单字段中输入的内容。如果方法字段的值为POST时,则实体体中包含的就是用户在表单字段中的输入值。

HTTP响应报文

HTTP/1.1 200 OK
Connection: close
Date: Tue, 18 Aug 2015 15:44:04 GMT
Server: Apache/2.2.3 (CentOS)
Last-Modified: Tuer 18 Aug 2015 15:11:03 GMT
Content-Length: 6821
Content-Type: text/html
(data data data data data ..•)
  • 状态行

    • 协议版本
    • 状态码
    • 相应状态信息
  • 首部行

    • Connection:close : 同请求报文
    • Date:服务器发送响应报文的时间
    • Server:指明服务器类型(Apache),与请求报文的User-agent对应
    • Last-Modified:对象最后修改的时间
    • Content-Length:被发送对象的字节数
    • Content-Type:实体体的对象是HTML文本
  • 实体体

  • 补充:状态码

    • 200 0K:请求成功,信息在返回的响应报文中。
    • 301 Moved Permanently:请求的对象已经被永久转移了,新的URL定义在响应报文的Location:首部行中。客户软件将自动获取新的URL。
    • 400 Bad Request: 一个通用差错代码,指示该请求不能被服务器理解。
    • 404 Not Found:被请求的文档不在服务器上。
    • 505 HTTP Version Not Supported :服务器不支持请求报文使用的HTTP协议版本。

2.2.4 用户与服务器交互:cookie

这个过程描述的形象一点:你第一次去一个俱乐部(访问一个网站),这个俱乐部会在俱乐部会员名单里加上你的名字(后台数据库为你创建一个唯一的cookie),并给你一个带号码的胸章(cookie),这样,以后你每次去找个俱乐部,只要带上胸章,这个俱乐部就会为你提供会员才有的服务,比如个性化广告。

2.2.5 Web缓存(服务器)

  • Web缓存器:通常是ISP购买和安装,目的是减少一个机构(局域网)到因特网的通讯量,从而降低带宽,节省费用。
  • 原理:局域网中的用户想要访问Web初始服务器中的数据,用户可以设置访问缓存器,如果缓存器中有这些数据,则直接高速返回给用户,否则,由缓存器访问初始服务器,把得到的数据再返回给用户,同时,在缓存器上存一个备份,方便用户下次访问。

2.2.6 条件GET方法

用户向缓存器请求对象,正好缓存器中有这个对象,这时候,缓存器会向初始服务器发送一个条件GET方法

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

If-Imodified-since是表明该对象最后一次修改时间,初始服务器收到请求后,会检查对象是否在这个时间之后修改过,如果修改过,就正常返回这个对象,否则,返回

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

应用层01-HTTP的更多相关文章

  1. 深入浅出HTTP请求(转自http://www.cnblogs.com/yin-jingyu/archive/2011/08/01/2123548.html)

    HTTP(HyperText Transfer Protocol)是一套计算机通过网络进行通信的规则.计算机专家设计出HTTP,使HTTP客户(如Web浏览器)能够从HTTP服务器(Web服务 器)请 ...

  2. TCP/IP详解系列 --- 概念总结01

    UDP协议  .vs.  TCP协议:  原理上:(TCP报文段. vs . UDP用户数据报) TCP协议的特性: TCP是面向连接的运输层协议,应用程序在使用TCP协议之前,必须先建立TCP连接. ...

  3. 2、CC2541芯片中级教程-OSAL操作系统(进一步了解-OLED && 普通按键和5方向按键-中断!!!)这个系统驱动层和应用层不一样~

    本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...

  4. 应用层(一)HTTP服务访问基本流程和HTTP报文详解

    HTTP属于TCP/IP模型中一个面向文本的应用层协议,所使用的服务器端口号的TCP中的80端口,通信双方在这个基础上进行通信. 每个服务器都有一个应用进程,时刻监听着80端口的用户访问请求.当有用户 ...

  5. MySQL应用层传输协议分析

    001.在MySQL应用层传输协议中主要有如下三种类型的数据: 01.整数类型. 02.字符串类型. 03.描述数据包. 002.MySQL应用层传输协议中对整型的说明: 01.固定长度的整型---- ...

  6. Python网络01 原始Python服务器

    原文:Python网络01 原始Python服务器 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 之前我的Python教程中有人 ...

  7. 【Zigbee技术入门教程-01】Zigbee无线组网技术入门的学习路线

    [Zigbee技术入门教程-01]Zigbee无线组网技术入门的学习路线 广东职业技术学院  欧浩源 一.引言    在物联网技术应用的知识体系中,Zigbee无线组网技术是非常重要的一环,也是大家感 ...

  8. 【C++】 网络编程 01

    趁着计算机网络这门课布置了课程设计,学习下网络编程. 系统:Ubuntu 14.01... 1. 关于Socket(套接字) 1.1 套接字是存在于运输层和应用层间的抽象层,通过它来区分不同应用程序进 ...

  9. 构建基于TCP的应用层通信模型

    各层的关系如下图,表述的是两个应用或CS间通信的过程:   通常使用TCP构建应用时,需要考虑传输层的通信协议,以便应用层能够正确识别消息请求.比如,一个请求的内容很长(如传文件),那肯定要分多次发送 ...

  10. 第二次实验报告:使用Packet Tracer分析应用层协议

    个人信息:      •  姓名:李微微       •  班级:计算1811       •  学号:201821121001 一.摘要 本文描述使用Packet Tracer,正确配置网络参数,抓 ...

随机推荐

  1. STM32 HAL库 USART DMA驱动

    前言 本文是在使用 STM32L4 的串口 DMA 功能时,使用 HAL 库出现的一些问题,通过以下方式解决了 HAL 库中存在 DMA 发送和接收的一些问题. STM32L4 的 DMA 简介 DM ...

  2. 在Java中,对 byte 和 short 类型 进行位操作的时候,严重留意事项

    总结:在java中,对byte和short类型的 右移操作 必须先进行 & 0xff 后再右移,避免byte或short是负数的情况下,导致 右移操作前 自动升为int,前面补了很多1,此时右 ...

  3. Python Print 显示颜色

    1.顺序:显示方式,前景颜色,背景颜色 2.顺序非固定,但尽量按默认书写方式 3.也可以在input中输出使用 4.格式: print('\033[显示方式:前景颜色:背景颜色m .......... ...

  4. SpringCloud Alibaba Sentinel实现熔断与限流<2020-9>

    SpringCloud Alibaba Sentinel 1.Sentinel是什么? 1.1.前言说明: 作用:实现熔断与限流 (Hystrix断路器 升级版) 文档直达: 官网中文文档 1.2.S ...

  5. spring boot使用自带缓存

    项目地址:https://gitee.com/indexman/spring_boot_in_action 下面就介绍一下如何使用spring boot自带的缓存.按步骤来操作即可,不懂的可以去看项目 ...

  6. ghost方式批量安装win7

    1.   需求介绍: 最近工作中需要给几百台PC安装win7操作系统,同时需要安装系统驱动和一些办公软件.刚开始是使用U盘制作的win7启动盘安装,发现效率太低,因为中间需要人监控安装进度以待安装好系 ...

  7. vs 工程中替换 Qt 静态库

    上篇介绍了如何编译 Qt 静态库 编译 windows 上的 qt 静态库 这篇介绍如何替换已有的 Qt 静态库,比如 Qt5.15.0 有很多 bug,我们不得不提升 Qt 版本来避免 bug 导致 ...

  8. go经典知识及总结

    1.无论sync.Mutex还是其衍生品都会提示不能复制,但是能够编译运行 加锁后复制变量,会将锁的状态也复制,所以 mu1 其实是已经加锁状态,再加锁会死锁. 所以此题的答案是 fatal erro ...

  9. 【Android 逆向】【攻防世界】easy-so

    1. apk安装到手机,随便输入点内容,提示错误 2. jadx打开apk btn.setOnClickListener(new View.OnClickListener() { // from cl ...

  10. 【Azure 应用服务】查看App Service for Linux上部署PHP 7.4 和 8.0时,所使用的WEB服务器是什么?

    问题描述 如何查看PHP应用部署到App Service后,Azure上面使用的应用服务器是什么呢?因为App Service支持两种操作系统,Windows 和 Linux.在Windows中,使用 ...