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. easyexcel只通过表名来动态查询并动态导出数据

    EasyExcel动态表头即动态数据生成 1️⃣ 业务需求 需要将数据库中的所有表放在一个下拉框中,下拉框支持模糊查询到相关的表,然后通过这个表名查询到数据库的数据,切换不同的表查询出来相关表的列和数 ...

  2. P9933 [NFLSPC #6] 9.pop_book(); 题解

    题目链接: P9933 [NFLSPC #6] 9.pop_book(); 先考虑一个最基本的式子: \(x=v \times t\),很显然的一点是,除了 Alek岁,每个人的运动路程函数写出来都是 ...

  3. P9247 [集训队互测 2018] 完美的队列题解

    题目链接:[集训队互测 2018] 完美的队列 神仙数据结构题,看了很多题解才搞懂.在做此题之前,最好对分块很熟悉,对各类标记非常熟练.考虑题意说的种类是相对于全局的.我们可以考虑局部影响对全局影响. ...

  4. Navicat 15 for MySQL 破解【我亲测可用】

    1.去官网下载正版 https://www.navicat.com.cn/ 2.破解下载:https://files-cdn.cnblogs.com/files/del88/NavicatKeygen ...

  5. C++文件输入输出的简单实现(Debug)

    1.前言: 文件输入输出是个很有用的东西,有时比赛时要有:要求使用文件输入输出,还有时候-- 遇到这种时间限制非常恶心的题目:手动测试会有误差-- 文件输入输出是个很好的选择! 2.写法: C C语言 ...

  6. Python——检测Popen返回的stdOutMsg中是否是否包含指定字符,并提取指定位置的信息

    问题背景: Python 中经常会需要通过subprocess.PoPen函数下发Shell Command,与操作系统进行交互.一些情况下,还需要分析shell command的返回值,提取有用信息 ...

  7. Java并发编程实例--8.在线程中处理未检查异常

    java中有两类异常: 已检查异常:这类异常编译器要求开发者必须在代码中通过throws去处理. 例如:IOException和ClassNotFoundException. 未检查异常:不必显式的在 ...

  8. 《深入理解Java虚拟机》(二) GC 垃圾回收机制

    @ 目录 一.概述 二.判断对象是否需要被回收方式 1.引用计数法: 2.可达性分析法: 三.垃圾收集算法 1.分代收集理论基础 2.标记-清除算法 3.复制-收集算法 4.标记-压缩(整理)算法 5 ...

  9. 如何设置 vcpkg 依赖特定编译器

    最近项目要部署到 gitlab-ci 上,所以远程机器上也要安装好编译环境 在相关的环境安装完后,发现编译项目时提示找不到三方库的符号文件 看到这个错误的第一反应就是依赖库的版本不对,因为远程机器上不 ...

  10. day07---系统命令

    课程知识概述--系统命令 seq cat less more head tail grep tr alias 复习 1.echo -e 激活特殊的意义 \n 表示回车 \t tab键 [root@ol ...