详解HTTP协议

2023-11-08

HTTP 协议,几乎是每个人上网用的第一个协议,同时也是很容易被人忽略的协议。

根据TCP/IP模型,网络分层分为四层,应用层、传输层、网络层、网络接口层(数据链路层,物理层)。HTTP协议属于应用层的一种协议。

http://www.baidu.com这个网址我相信大家都很熟悉,这是个URL,叫作统一资源定位符。之所以叫统一,是因为他格式是固定的,http协议标识,www.baidu.com是一个域名由于IP地址具有不方便记忆并且不能显示地址组织的名称和性质等缺点,人们设计出了域名,并通过网域名称系统(DNS,Domain Name System)来将域名和IP地址相互映射,使人更方便地访问互联网,而不用去记住能够被机器直接读取的IP地址数串),表示互联网中的某一个位置。正因为这个东西是统一的,所以当你在浏览器的输入框中输入这样一个字符串的时候,浏览器就知道如何处理。就像秦始皇统一中国后颁布了书同文、车同轨、统一度量衡,走到哪规格都是一样的,大家都认。

当我们输入网址按下Enter键后,接下来就是发送http请求吗?非也,上面说了域名仅仅只是为了能明确的显示地址的名称与性质,实际上在互联网中还是要把它解析成IP地址的,浏览器会将域名发送给DNS服务器,让它帮忙解析成IP地址,HTTP又是基于TCP协议的,所以发送请求前当然要先建立TCP连接了,经历三次握手后成功建立了TCP连接(关于TCP的三次握手有兴趣的同学可以去查找相关资料)。建立起连接后,浏览器就准备发送HTTP请求了。

目前HTTP协议常用的版本有俩个,HTTP1.1与HTTP2.0。

在1.1版本里面,默认开启Keep_Alive的,这样建立起来的TCP连接可以在多次请求中复用,为什么要保活呢,因为建立TCP连接还是挺费劲的,他要经历三次握手,断开TCP连接也挺费劲的,要经历四次挥手,要是好不容易建立起来的连接,干一丁点儿事情就断开了,岂不是很浪费资源。

构建HTTP请求

请求格式:

sp(空格)  cr(回车)  lf(换行)

 HTTP 的报文大概分为三大部分。第一部分是请求行,第二部分是请求的首部,第三部分才是请求的正文实体

第一部分:请求行

在请求行中,URL 就是 http://www.baidu.com ,版本为 HTTP 1.1。这里要说一下的,就是方法。方法有几种类型,GET、POST、PUT、DELETE。下面介绍比较常用的俩种,GET和POST。

GET:

对于访问网页来讲,最常用的类型就是 GET。顾名思义,GET 就是去服务器获取一些资源。对于访问网页来讲,要获取的资源往往是一个页面。其实也有很多其他的格式,比如说返回一个 JSON 字符串,到底要返回什么,是由服务器端的实现决定的。GET请求也可以传参,参数跟在URL后面,用"?"隔开,如http://www.baidu.com?param=1。

POST:

POST请求往往需要告诉服务器一些比较重要的信息,不想暴露在外面(GET请求的参数是跟在URL后面的),这些信息一般放在正文实体里面,格式多种多样,JSON是比较常见的格式。

第二部分:首部字段

首部是 key value,通过冒号分隔。这里面,往往保存了一些非常重要的字段。如字符集Accept-Charset,防止接收方出现乱码,还有正文格式Content-Type,如果是JSON格式,那这个值就设置成JSON,还可以设置一些关于缓存的东西。

第三部分:正文实体

正文实体就没什么好说的了,就是一些携带的数据。

到目前为止,我们就把HTTP报文格式拼凑起来了,接下来我们要把这个报文交给传输层。

HTTP 请求的发送

由于HTTP是基于TCP协议的,所以它是面向连接的请求,通过二进制流的方式传输。TCP会把二进制流换成一个个报文段的形式发送出去。在发送给每个报文段的时候,都需要对方有一个回应 ACK,来保证报文可靠地到达了对方。如果没有回应,那么 TCP 这一层会进行重新传输,直到可以到达。同一个包有可能被传了好多次,但是 HTTP 这一层不需要知道这一点,因为是 TCP 这一层在埋头苦干。

每一个TCP报文都需要加上自己的地址和目标地址,将这俩个信息放在IP头里,接下来就交给IP层发挥了。IP层首先看看目标地址是不是和自己在同一个局域网内,如果在,就用ARP协议获取目标地址的MAC地址,然后将自己的MAC地址和目标MAC地址放入MAC头里,发送出去就可以了;如果不在同一个局域网,这时候就要发送去网关,想要发送到网关,那么就要用ARP协议获取网关的MAC地址,然后将自己的MAC地址和网关的MAC地址放入MAC头里,就可以发送出去了。

网关收到包发现 MAC 符合,取出目标 IP 地址,根据路由协议找到下一跳的路由器,获取下一跳路由器的 MAC 地址,将包发给下一跳路由器。就这样一跳一跳的最终来到了目标地址的局域网,这个时候,最后一跳的路由器能够发现,目标地址就在自己的某一个出口的局域网上。于是,在这个局域网上发送 ARP,获得这个目标地址的 MAC 地址,将包发出去。目标的机器发现 MAC 地址符合,就将包收起来;发现 IP 地址符合,根据 IP 头中协议项,知道自己上一层是 TCP 协议,于是解析 TCP 的头,里面有序列号,需要看一看这个序列包是不是我要的,如果是就放入缓存中然后返回一个 ACK,如果不是就丢弃。

TCP 头里面还有端口号,HTTP 的服务器正在监听这个端口号。于是,目标机器自然知道是 HTTP 服务器这个进程想要这个包,于是将包发给 HTTP 服务器。HTTP 服务器的进程看到,原来这个请求是要访问一个网页,于是就把这个网页发给客户端。

到这里,请求的过程就结束了。

HTTP 返回的构建

看结构图会发现结构跟请求的结构差不多,请求行换成了状态行,状态码会反映 HTTP 请求的结果。“200”意味着大吉大利今晚吃鸡;而我们最不想见的,可能就是“404”,也就是“服务端无法响应这个请求”。然后,短语会大概说一下原因。

HTTP 2.0

当然 HTTP 协议也在不断的进化过程中,在 HTTP1.1 基础上便有了 HTTP 2.0。

HTTP 1.1 在应用层以纯文本的形式进行通信。每次通信都要带完整的 HTTP 的头,而且不考虑 pipeline 模式的话,每次的过程总是像上面描述的那样一去一回。这样在实时性、并发性上都存在问题。为了解决这些问题,HTTP 2.0 会对 HTTP 的头进行一定的压缩,将原来每次都要携带的大量 key value 在两端建立一个索引表,对相同的头只发送索引表中的索引。

另外,HTTP 2.0 协议将一个 TCP 的连接中,切分成多个流,每个流都有自己的 ID,而且流可以是客户端发往服务端,也可以是服务端发往客户端。它其实只是一个虚拟的通道。流是有优先级的。HTTP 2.0 还将所有的传输信息分割为更小的消息和帧,并对它们采用二进制格式编码。常见的帧有 Header 帧,用于传输 Header 内容,并且会开启一个新的流。再就是 Data 帧,用来传输正文实体。多个 Data 帧属于同一个流。通过这两种机制,HTTP 2.0 的客户端可以将多个请求分到不同的流中,然后将请求内容拆成帧,进行二进制传输。这些帧可以打散乱序发送, 然后根据每个帧首部的流标识符重新组装,并且可以根据优先级,决定优先处理哪个流的数据。

我们来举一个例子。假设我们的一个页面要发送三个独立的请求,一个获取 css,一个获取 js,一个获取图片 jpg。如果使用 HTTP 1.1 就是串行的,但是如果使用 HTTP 2.0,就可以在一个连接里,客户端和服务端都可以同时发送多个请求或回应,而且不用按照顺序一对一对应。

HTTP 2.0 其实是将三个请求变成三个流,将数据分成帧,乱序发送到一个 TCP 连接中。

HTTP 2.0 成功解决了 HTTP 1.1 的队首阻塞问题,同时,也不需要通过 HTTP 1.x 的 pipeline 机制用多条 TCP 连接来实现并行请求与响应;减少了 TCP 连接数对服务器性能的影响,同时将页面的多个数据 css、js、 jpg 等通过一个数据链接进行传输,能够加快页面组件的传输速度。

HTTP 3.0

HTTP3.0的核心是QUIC协议,Google在2015年提出,传统的HTTP协议是基于TCP进行传输的,而QUIC是基于UDP进行传输的。可以理解为HTTP3.0基于UDP的安全可靠的HTTP2.0协议。由于用的还不广泛,这里不作过多介绍,有兴趣的朋友可以自行查找相关资料进行了解。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

详解HTTP协议 的相关文章

  • 通过 HTTPS 包含 Twitter Widgets.js

    当我们包含以下内容时 我在我们网站上的 HTTPS 服务页面上的混合内容方面遇到了一个小问题http platform twitter com widgets js http platform twitter com widgets js
  • Express.js在控制器中获取http方法

    我正在构建一个注册表单 本地护照作为身份验证 表单作为表单助手 因为注册只知道 GET 和 POST 我想在一个函数中完成整个处理 换句话说 我正在寻找类似的东西 exports register function req res if r
  • 是否可以在ajax get请求中获取页面的一部分?

    我知道我们可以在向服务器发出 GET 请求时获取整个页面 但是如果我只对该页面上的一个特定 div 感兴趣 或者更准确地说对其内容感兴趣 该怎么办 这里唯一的选择是获取整个页面 例如使用 jquery find 从中获取 div 内容吗 或
  • 是否有用于通过 HTTP、HTTP 隧道发送二进制数据的 Java 库?

    我想通过 HTTP 以二进制格式发送相当大的数据块 也称为HTTP 隧道 http en wikipedia org wiki HTTP tunnel 我想通过 Java 将这种技术用于一些 Java Swing 应用程序 也可能是 And
  • Vertx HttpClient getNow 不工作

    我的 vertx HttpClient 有问题 下面的代码显示使用 vertx 和纯 java 测试 GET Vertx vertx Vertx vertx HttpClientOptions options new HttpClientO
  • 为什么使用HTTP协议时需要指定端口号?

    即使我们使用HTTP协议 为什么还需要用IP地址指定端口号 例如 http xyz 8080 这到底是什么意思 我们已经知道 在使用 HTTP 时 请求将在端口 80 上提供服务 那么为什么我们要显式指定端口呢 HTTP 的默认端口为 80
  • 除了 GET 和 POST 之外,如何从浏览器向 RESTful 应用程序发送任何内容?

    我没有得到 RESTful 的东西 是的 我知道如何从浏览器向我的应用程序发送 GET 请求 这是通过 URL 链接 a href user someone 并且还可以通过form方法发送POST请求 a
  • 在 Go 中跟踪 HTTP 请求时指定超时

    我知道通过执行以下操作来指定 HTTP 请求超时的常用方法 httpClient http Client Timeout time Duration 5 time Second 但是 我似乎不知道在跟踪 HTTP 请求时如何执行相同的操作
  • 如何确定服务器是否支持 Range 标头?

    我一直在尝试使用 Range 标头值从特定点流式传输音频 但我总是从一开始就得到歌曲 我正在通过程序执行此操作 因此不确定问题是否出在我的代码中或服务器上 如何确定服务器是否支持 Range 标头参数 Thanks 方式HTTP规范 htt
  • 如何解析 Content-Disposition 标头以检索文件名属性?

    使用 go 如何解析从 http HEAD 请求检索到的 Content Disposition 标头以获取文件的文件名 此外 如何从 http HEAD 响应中检索标头本身 这样的事情正确吗 resp err http Head http
  • 面向服务的架构 - AMQP 或 HTTP

    一点背景 非常大的整体 Django 应用程序 所有组件都使用相同的数据库 我们需要分离服务 以便我们可以独立升级系统的某些部分而不影响其余部分 我们使用 RabbitMQ 作为 Celery 的代理 现在我们有两个选择 使用 REST 接
  • python 2.7 中的 HTTP 2 请求

    在 python 中向 HTTP 1 和 HTTP 2 发出请求有什么区别吗 我可以像这样在 python 中进行 HTTP 1 x 调用 url http someURL values param1 key param2 key2 dat
  • 诸如用于测试 HTTP 请求的虚拟 REST 服务器之类的东西? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我一直在四处寻找 但找不到任何这样的网站 我想知道是否有一些虚拟服务器可以响应测试 GET 请求并返回
  • 如何转义角度 HttpParams?

    在 Angular 服务中 我使用 HttpParams 将字符串发送到服务 get phone string Observable
  • 如何在flutter项目中使用http拦截器?

    我必须向我的所有 Api 添加标头 有人告诉我为此使用 http 拦截器 但我无法理解如何做到这一点 因为我是颤振的新手 谁能帮我举个例子吗 您可以使用http 拦截器 https pub dev packages http interce
  • JS 库请求的常见 HTTP 标头是什么?

    使用JavaScript 框架原型 http www prototypejs org 我注意到 Ajax 请求通过一个名为X Requested With 其他 JavaScript 库 如 jQuery dojo 和 YUI 是否会向其
  • iOS WKWebView 处理文件下载

    我面临以下问题 在 Web 界面中 文件下载是通过锚标记触发的 如下所示 a href bla blabla a 虽然 Safari 浏览器可以处理此请求并打开一个对话框来处理文件 但 WKWebView 将此视为普通链接并且不对其执行任何
  • WCF WebHttp 混合身份验证(基本和匿名)

    所有这些都与 WebHttp 绑定有关 托管在自定义服务主机中 IIS 目前不是一个选项 我已经实现了自定义 UserNamePasswordValidator 和自定义 IAuthorizationPolicy 当我将端点的绑定配置为使用
  • 从 PCAP 嗅探重建数据

    我试图通过 libpcap 嗅探 HTTP 数据 并在处理 TCP 有效负载后获取所有 http 内容 标头 有效负载 根据我的讨论编写 http 嗅探器 或任何其他应用程序级嗅探器 https stackoverflow com ques
  • 使用 flash 或 java servlet 将麦克风数据从浏览器上传到服务器的教程? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 There was a question on how to get data from a microphone on a client

随机推荐

  • jmeter压测监控服务器

    安装步骤可参考 Windows https www cnblogs com zjn 20161215 p 8652623 html Linux https blog csdn net liuqiuxiu article details 10
  • springboot集成zipkin

    1 下载zipkin 的jar 后台启动 比如127 0 0 1 9411 2 所有的springboot项目 pom xml添加依赖
  • 笔记——输出信息

    Input sensor was set to Monocular Loading ORB Vocabulary This could take a while Vocabulary loaded Camera Parameters fx
  • SpringBoot启动时忽略某些自动配置类

    SpringBoot启动时忽略某些自动配置类 最近业务要求对接数据 需要连接第三方的数据库 但是他们的都是内网 只能通过前置机上部署我们的项目 由于 我们与第三方对接的处理都写在单独的服务里 如果来一个第三方 单独再写一个服务会很麻烦 不好
  • OpenGL 学习笔记(四) 基础纹理

    一 载入纹理 1 从磁盘中载入Targa 文件 GLbyte gltReadTGABits const szFileName GLint iWidth GLint iHeight GLint iComponents GLenum eForm
  • 实测—fft IP核使用(包括ifft的配置使用)

    Vivado xilinx fft9 0 使用笔记 注 仿真实测1024点的转换需要经过1148个时钟周期才能得到转换结果 模块配置信号含义请参考pg109文档手册 写的贼烂会看晕 不详细说明 一 查找fft IP核按如下几图配置可实现正确
  • Model checking Part I

    Model Checking 文章目录 Model Checking 序言 可靠系统开发过程中的主要挑战 设计验证问题 design validation 现有实践方法 模拟和测试 simulation and tesing 本书主题 取代
  • 想去BAT、美团、京东和字节面试?那你必须懂他们的面试套路!

    V xin ruyuanhadeng获得600 页原创精品文章汇总PDF 目录 面试官为啥要出这样一个开放式问题 生产消费模型及核心数据结构 支撑TB级数据写入的分布式架构 数据宕机场景下的高可用架构 支持数据不丢失的ack机制 最后的总结
  • 加密算法md5、AES、RSA、Base64的区别

    1 md5 不可逆的 即只能加密不能解密 只能加密字符串 var md5 require utils md5 js var sign md5 这是我要加密的内容 2 AES 与MD5类似 主要区别可逆 能加密也能解密 加密解密用同一把钥匙
  • ES模块化语法

    封装一个工具js文件 一 单个导出 定义utils js 方式 一 export function set console log set export function get console log get 方式 二 function
  • 双向BiGRU做多输入单输出预测模型,直接替换数据就可以用

    双向BiGRU做多输入单输出预测模型 直接替换数据就可以用 程序语言是matlab 需求最低版本为2020及以上 程序可以出真实值和预测值对比图 线性拟合图 可打印多种评价指标 PS 以下效果图为测试数据的效果图 主要目的是为了显示程序运行
  • Linking CXX shared library .....so FAILED

    Executing tasks clean smartcropperlib assembleDebug app assembleDebug clean UP TO DATE app clean smartcropperlib externa
  • 3ds Max 2019 Essential Training 3ds Max 2019基本培训 Lynda课程中文字幕

    3ds Max 2019 Essential Training 中文字幕 3ds Max 2019基本培训 中文字幕3ds Max 2019 Essential Training 3ds Max以其建模和渲染工具而闻名 这些优势在建筑 制造
  • 生成msf常用payload

    msf作为一款强大的漏洞检测工具 如何生成适用于msf的payload以及如何利用是使用msf的关键 今天就主要记录一下常用的payload以及如何使用 生成payload使用的工具是MSFVenom 下面看看他的帮助信息 在kali下可以
  • JAVA 8函数式编程(一) 高阶函数

    首先给大家分享一个巨牛巨牛的人工智能教程 是我无意中发现的 教程不仅零基础 通俗易懂 而且非常风趣幽默 还时不时有内涵段子 像看小说一样 哈哈 我正在学习中 觉得太牛了 所以分享给大家 点这里可以跳转到教程 函数式编程的核心在高阶函数与偏函
  • ​行业竞争格局已显,上市公司布局加速丨2021中国区块链产业发展报告

    目前 区块链作为数字经济革命中的重要支撑 正以新一代信息基础设施的姿态快速发展并渗透到我国经济的各个领域 对我国经济社会发展的支撑作用初步显现 但同时 我国区块链也面临核心技术亟待突破 融合应用尚不成熟 产业生态有待完善 监管治理仍待探索等
  • 一个非常完整的测试实习面试过程

    首先是投简历 我这次面试是在实习seng投的 有一点要注意 简历是为了拿到面试 可以稍加修饰 但切忽作假 这相当于给面试的你挖坑 我面试的公司首先是要进行在线笔试 有些公司有 有些公司没有 富途 下面是一些题目 我尽量把有印象的都写出来了
  • 微信小程序-图片宽高设置

    微信小程序中 有很做组件都是有默认宽高的 比如 image组件默认宽度320px 度240px 这些默认设置常常会对我们的页面布局造成影响
  • 【实验室学习】时钟分频器,2、3、4、8分频 verilog实现

    0引言 记录时钟分频器的Verilog代码编写 主要掌握分频器设计思路 1设计 2 3 4 8分频 2 4 8分频设计较为容易 2分频 设计一个1位的寄存器 当原时钟上升沿时取反即可 代码展示 timescale 1ns 1ps modul
  • 详解HTTP协议

    HTTP 协议 几乎是每个人上网用的第一个协议 同时也是很容易被人忽略的协议 根据TCP IP模型 网络分层分为四层 应用层 传输层 网络层 网络接口层 数据链路层 物理层 HTTP协议属于应用层的一种协议 http www baidu c