计算机网络应用层之HTTP协议

2023-11-07

一、什么是HTTP协议
HTTP是HyperText Transfer Protocol即超文本传输协议的缩写,是Web应用层协议之一。
HTTP协议由两部分程序实现:一个客户机程序和一个服务器程序,它们运行在不同的端系统中,通过交换HTTP报文运行会话。HTTP定义了Web客户机是如何向Web服务器请求Web页面,以及服务器如何将Web页面传送给客户机的。
HTTP使用TCP作为它的支撑运输协议。HTTP客户机发起一个与服务器的TCP连接,一旦连接建立,浏览器(客户机)和服务器进程就可以通过套接字接口访问TCP。至于TCP是什么,在后面的文章中,会详细介绍,这里读者只需要知道,TCP是面向连接的,提供可靠的数据传输服务,可以无差错、按顺序地交付要发送的数据。即使用TCP作为其支撑的HTTP协议不用担心数据丢失,也不用担心TCP是如何从网络的数据丢失和乱序故障中恢复的,因为那是TCP以及协议栈底层协议的工作。
HTTP是一个无状态协议,所以服务器向客户机发送被请求的文件时,并不存储任何关于该客户机的状态信息。举个例子来说,就是假如某个特定的客户机在短短几秒内两次请求同一个对象,服务器并不会因为刚刚为该用户提供了该对象而不做出反应,而是重新发送该对象,就好像服务器已经完全忘记了之前所做的事一样。
最后补充一下,我们平时上网请求的Web页面是由对象组成的。对象,简单点来说就是文件,如HTML文件、jpg图片、视频等文件,这些文件可通过一个URL地址寻址。当我们请求一个页面时,我们通常会得到一个HTML文件和几个引用对象,然后再根据HTML文件中对象的URL地址来加载对象。
二、非持久连接和持久连接
当客户机/服务器的交互运行于TCP协议上时,应用程序的每个请求/响应对是经一个单独的TCP连接,则该应用程序使用非持久连接,而当应用程序的每个请求/响应对是经相同的TCP连接发送,则该应用程序使用持久连接。
1、首先,我们来研究一下非持久连接。
在非持久连接的情况下,服务器在发送响应后,关闭TCP连接。我们定义往返时间RTT为一个小分组从客户机到服务器再回到客户所花费的时间。所以RTT包括分组传播时延、排列时延以及分组处理时延。
我们知道HTTP协议基于TCP协议作为运输层,所以使用HTTP与服务器之间建立一个连接,则要发起一个到服务器的TCP连接,而TCP建立连接涉及一个“三次握手”的过程。关于“三次握手”在后面介绍TCP的文章中会详细介绍,这里我们只需要知道,它就是客户机向服务器发送一个小TCP报文段,服务器用一个小的报文段做出确认和响应,最后,客户机向服务器返回确认。注意,完成了三次握手的前两部分后,客户机将三次握手的第三部分(确认)与一个HTTP请求报文结合起来发送到该TCP连接。一旦请求报文到达服务器,服务器向该TCP连接发送HTML文件。从上面的描述,我们可以知道,对于一个非持久连接,请求一个HTTP请求/响应需要的总时间为两个RTT+服务器传输HTML文件的时间。
2、再来看看持久连接。
在持久连接的情况下,服务器在发送响应后,保持该TCP连接打开。在相同的客户机与服务器之间的后续请求和响应报文通过相同的连接进行传送。特别是一个完整的Web页面(包括多个对象)可以使用单个持久TCP连接进行传送。如果一个连接经过一定时间间隔仍未被使用,HTTP服务器就关闭该连接。
位于同一台服务器的多个Web页面在从该服务器发送给同一个客户机时,可以在单个持久TCP连接上进行,这睦对象请求可一个接一个地发出,而不必等待未决请求的回答,这种方式叫做流水线式的持久连接,它是HTTP默认使用的持久连接。
3、非持久连接的缺点
首先,非持久连接必须为每一个请求的对象建立和维护一个全新的连接。对于每个这样的连接,在客户机和服务器都要分配TCP的缓冲区和变量,从而给服务器带来了严重的负担。其次,每一个对象的传输时延为两个RTT,即一个RTT用于建立TCP,另一个RTT用于请求和接收一个对象。
三、HTTP报文格式
1、HTTP的请求报文格式
首先,来看看HTTP的请求报文的报文格式,如下图所示:
第一行是请求行,请求行有3个字段,方法字段、URL字段和HTTP版本字段。方法字段可以取值GET、POST、HEAD、PUT和DELETE等,绝大多数请求使用GET方法。其后继行叫做首部行。当使用GET方法时,实体主体通常为空,而当使用POST方法时,实体主体通常为需要POST给服务器的内容,例如,我们在网页上输入的数据。
下面,给出一个真正的HTTP请求报文,如下:
GET /xxx/page.html HTTP/1.1
Host: www.xxx.com
Connection: close
User-agent:Mozilla/4.0
Accept-language: fr
跟上图对应,这个报文第一行表示请求行,浏览器向服务器请求一个对象,使用了GET方法,它的地址在URL字段中,为/xxx/page.html,所使用的HTTP版本为1.1。
其余的行为首部行,冒号前的是首部字段名,后面是字段的值。
Host: www.xxx.com定义了目标所在的主机,首部行提供的信息是Web代理高速缓存所要求的。
Connection: close 它告诉服务器不希望使用持久连接,它要求服务器在发送完被请求的对象后就关闭连接。
User-agent:Mozilla/4.0 用来定义用户代理,即向服务器发送请求的浏览器类型,这里为Netscape浏览器。
Accept-language: fr 表示用户想得到该对象的法语版本。
2、HTTP响应报文格式
HTTP响应报文格式与HTTP请求报文有点不同,HTTP的响应报文格式如下图所示:
我们可以看到它同样由三部分组成,第一行为状态行,其后的为首部行,最后的为要发送的实体主体。实体主体部分是报文的主体,即它包含了所请求的对象本身。
下面来看看一个真实的HTTP响应报文,如下:
HTTP/1.1 200 OK
Connection: close
Data: Thu, 03, Jul, 2013 00:00:00 GMT
Server: Apache/1.3.0 (Unix)
Last-Modified: Sun, 6, May 2007 09:23:24 GMT
Content-Type: text/html
(data ... data ...)
首先看一看第一行,它对应上图中的状态行,在该报文中,状态行指示服务器使用的协议是HTTP/1.1,状态码为200,短语为OK,表示一切正常,信息包含在返回的响应报文中。
第2到5行为首部行,
Connection: close 告诉客户机在报文发送完后关闭该TCP连接。
Data 首部行指示服务器产生并发送该响应报文的日期和时间,它是服务器从它的文件系统中检索到该对象,插入到响应报文的时间。
Server 首部行表明该报文是由一个Apache Web服务器产生的,它类似于请求报文中的User-agent首部行。
Last-Modified 首部行指示了该对象创建或者最后修改的时间和日期。
Content-Type 首部行指示了实体主体中的对象的文件类型,对象类型应该正式地使用该首部行而不是用文件扩展名来指示,因为在某些系统(如Linux),文件的类型并不是用扩展名为区分的。
Content-Length 首部行表明了被发送对象的字节数。
3、常见的HTTP状态码和短语
200 OK:请求成功,信息包含在返回的响应报文中。
301 Moved Permanently:请求的对象已经被永久转移了,新的URL定义在响应报文的Location 首部行中指定。客户机可自动用新的URL获取该对象。
400 Bad Repuest:一个通用差错代码,指示该请求不能被服务器所理解。
404 Not Found:被请求的文档不在服务器上。
505 HTTP Version Not Supported:服务器不支持请求报文使用的HTTP协议版本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机网络应用层之HTTP协议 的相关文章

  • vue.config.js 配置的文件

    vue config js是一个可选的配置文件 用于配置Vue CLI构建的项目 如webpack的配置等 使用vue config js 可以在项目的根目录下创建一个JavaScript文件 并在该文件中进行配置 下面是一些在vue co
  • JAVA-JDK1.8介绍

    Java JDK 1 8 Java Development Kit的第8个主要版本 Java JDK 1 8是Java编程语言的一个重要版本 引入了一些新的功能和改进 同时也修复了几项bug 在本博客中 我将详细介绍Java JDK 1 8

随机推荐

  • ESP8266常见问题汇总——转载自官网

    ESP8266 常见问题 本页面收集esp8266常见问题 概述 本文档主要介绍开发者在ESP8266开发中常见的一些问题 这些问题主要包括以下几大类 基本概念相关 ESP8266 相关 AiCloud 相关 固件编译调试相关 文档资料相关
  • leetcode 376 摆动序列

    动态规划 class Solution public int wiggleMaxLength int nums if nums length 1 return nums length 动态规划 dp i 0 表示当前数字的子序列长度 dp
  • rabbitmq Attempting to connect to: [localhost:5672] SocketExceptio:Socket Closed

    今天使用spring cloud stream for rabbitmq启动项目报错 2019 05 03 13 22 27 350 INFO file 18160 main o s a r c CachingConnectionFacto
  • FAPI专题-8:5G FAPI接口 - 中文规范-4- P7消息格式

    作者主页 文火冰糖的硅基工坊 文火冰糖 王文兵 的博客 文火冰糖的硅基工坊 CSDN博客 本文网址 https blog csdn net HiWangWenBing article details 120645757 目录 第3章 主要的
  • 若依管理系统RuoYi-Vue(二):权限系统设计详解

    本篇文章试图讲解若依Vue系统中的权限设计原理以及实战 为什么是 试图 因为这也是摸索着理解的 不一定准 若依Vue系统中的权限管理部分的功能都集中在了系统管理菜单模块中 如下图所示 其中权限部分主要涉及到了用户管理 角色管理 菜单管理 部
  • nginx中root与alias关键字的区别

    前言 近段时间秋招上岸了 于是每天疯狂补各种分布式基础 每天都在痛苦与快乐中度过 在学习 nginx 的时候 遇到配置上的问题 root 与 alias 的区别 卡了大概三个小时 记录下来警醒自己不要再犯了 正文 在使用 进行配置时 两者没
  • CentOS yum的详细使用方法

    yum 是什么yum Yellow dog Updater Modified主要功能是更方便的添加 删除 更新RPM包 它能自动解决包的倚赖性问题 它能便于管理大量系统的更新问题 yum特点可以同时配置多个资源库 Repository 简洁
  • DirectShow播放视频步骤

    DirectShow是MicrosoftWindows平台上的流媒体架构 可以用它来方便的进行视频捕获和回放 DirectShow是基于组件对象模型 COM 下面是DirectShow播放AVI视频的代码 include
  • java项目-谷粒商城(持续更新ing)

    使用docker安装nacos 我是直接在网上找的教程 17条消息 Docker下载安装Nacos并完成持久化配置 docker nacos 下载 虫链Java Library的博客 CSDN博客 在项目中导入依赖 在 common 项目中
  • [0x7FFE1E17E050] ANOMALY: meaningless REX prefix used

    今天要记录一下糟糕的事情 遇到一个很是 cao dan 的问题 再用git时 报错了 0x7FFE1E17E050 ANOMALY meaningless REX prefix used 在cmd窗口输入 也报这个错 idea中也报错 gi
  • 云原生——云平台操作

    作者介绍 奇妙的大歪 个人名言 但行前路 不负韶华 个人简介 云计算网络运维专业人员 前言 云 云是网络 互联网的一种比喻说法 平台 即操作系统 数据库和一些中间件都可称为软件平台 云计算 使用互联网接入存储或者运行在远程服务器端的应用 数
  • 3dsMax2016卡死的一种解决办法

    可能是升级win10版本的时候 win10自带的输入法也升级了 然后3dsMax2016就卡死了 设置一下输入法的兼容性
  • Vue基础知识总结 7:插槽slot与vue导入导出

    作者简介 哪吒 CSDN2021博客之星亚军 新星计划导师 博客专家 哪吒多年工作总结 Java学习路线总结 搬砖工逆袭Java架构师 关注公众号 哪吒编程 回复1024 获取Java学习路线思维导图 大厂面试真题 加入万粉计划交流群 一起
  • 基于matlab实现信号的线性卷积与循环卷积

    系列文章目录 数字信号处理 DSP Digital Signal Process 是电子通信领域非常重要的研究方向 博主汇总了数字信号处理 DSP 中常用的经典案例分析 主要基于算法分析 MATLAB程序实现 信号图像显示 对数字信号处理的
  • python flask框架下登录注册界面_基于Flask框架如何实现用户登录功能

    form hidden tag form username class form control input lg placeholder 用户名 form password class form control input lg plac
  • dubbo解析-@EnableDubbo注解详解

    本文基于dubbo 2 7 5版本代码 文章目录 一 EnableDubbo注解功能 二 详细介绍注解引入的三个类的作用 dubbo必须配置注解 EnableDubbo 一 EnableDubbo注解功能 EnableDubbo整合了三个注
  • MetaFormer/PoolFormer学习笔记及代码

    MetaFormer PoolFormer学习笔记及代码 MetaFormer Is Actually What Y ou Need for Vision code https github com sail sg poolformer A
  • RN仿微信朋友圈图片拖拽删除

    目录 前言 初始时 渲染时 开始拖拽 拖拽中 拖拽结束 拖拽删除 参考链接 前言 之前负责的一个需求 让在RN端做仿微信朋友圈的图片删除和排序 由于经验和时间限制 就跟PM协商改为点击删除 由此欠下一个技术栈 今天是来还债的 本文基于tra
  • STM32 电机教程 16 - PMSM电机磁场定向控制原理

    前言 磁场定向控制又称矢量控制 FOC 本质上为控制定子电流的幅度和相位 使之产生的磁场和转子的磁场正交 以产生最大的扭矩 1 PMSM 的磁场定向控制 磁场定向控制 Field Oriented Control FOC 表示这样一种方法
  • 计算机网络应用层之HTTP协议

    一 什么是HTTP协议 HTTP是HyperText Transfer Protocol即超文本传输协议的缩写 是Web应用层协议之一 HTTP协议由两部分程序实现 一个客户机程序和一个服务器程序 它们运行在不同的端系统中 通过交换HTTP