先来看看百度百科对HTTP的解释

http是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。请求和响应消息的头以ASCII码形式给出;而消息内容则具有一个类似MIME的格式。这个简单模型是早期Web成功的有功之臣,因为它使得开发和部署是那么的直截了当。

下面我会以逐步化简和细分流程图的形式告诉你HTTP的原理

当你访问这篇博客时,浏览器向服务器发出请求,服务器收到请求后,返回一个响应内容,浏览器渲染响应的内容后再展现给你。

graph LR
view(用户视图) --打开页面--> webbrowser(浏览器)
webbrowser --请求--> server(服务器)
server --响应--> engine(浏览器内核)
engine --渲染--> view

精简一下

graph LR
webbrowser(浏览器) --请求--> server(服务器)
server --响应--> webbrowser

深入一下请求和响应的过程

graph TD
webbrowser(浏览器) --> send-header(发送请求头)
send-header --> send-content(发送请求内容)
send-content --> server(服务器)
server --> res-header(发送响应头)
res-header --> res-content(发送响应内容)
res-content --> webbrowser

看到这里,你肯定会疑惑“请求头和响应头是什么?”

我们先来看看请求头的内容是什么

你可以用以下两种方式查看自己的请求头:

  1. (以chrome为例)打开开发者模式,前往任意一个网站,选择network,筛选为Doc, 点击一个html,在右侧栏中你会看到request headers。
  2. 前往http://httpbin.org/headers,它会返回你的请求头。

这里我们采用第2种,下面是返回的信息(为了方便理解,我添加了注释)

我们可以看到请求头采用了键值对的格式:

键:就是存的值的编号

值:就是要存放的数据

冒号前的就是键(编号),冒号后的就是值(数据)

ps:第1种和第2种方法查看的请求头格式可能不太一样,但是内容应该是一样的

{
"headers": {
//接受的文件格式
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
"Accept-Encoding": "gzip, deflate", //接受的编码方式
"Accept-Language": "zh-CN,zh;q=0.9", //接受的语言
"Cache-Control": "no-cache", // 缓存控制,告诉服务器不要使用缓存
"Host": "httpbin.org", //请求的域名
"Pragma": "no-cache", //这是为了兼容http/1.1之前的版本,现用Cache-Control
"Upgrade-Insecure-Requests": "1", //未知
//用户代理,也就是告诉服务器用户使用什么工具发起的请求,如果你用浏览器访问,得到的一般是浏览器内核
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36",
"X-Amzn-Trace-Id": "************************" //这是一个跟踪ID,暂时不知道有什么用,好像是负载均衡用的
}
}

观察上面的键值对和我写的注释,可以发现请求头告诉了服务器一些基本信息

那么响应头是什么呢?我们还是先看看它的内容。

响应头查看方式:

  1. (以chrome为例)打开开发者模式,前往任意一个网站,选择network,筛选为Doc, 点击一个html,在右侧栏中你会看到response headers。
HTTP/1.1 200 OK
Date: Sat, 06 Jun 2020 02:53:40 GMT
Content-Type: application/json
Content-Length: 580
Connection: keep-alive
Server: gunicorn/19.9.0
Access-Control-Allow-Origin: *
Access-Control-Allow-Credentials: true

我们来分析一下响应头

第1行:HTTP协议版本 状态码 状态码描述

第2到最后一行:键:值

你有没有发现什么相似之处?对了!请求头和响应头都是键值对格式。

在http中,这种键值对叫作字段,键就是字段名称,值就是字段值。

到这,我们可以整合出两张图(图源网络)

HTTP请求格式

HTTP响应格式

HTTP协议浅析(一)的更多相关文章

  1. 计算机网络通信TCP/IP协议浅析 网络发展简介(二)

    本文对计算机网络通信的原理进行简单的介绍 首先从网络协议分层的概念进行介绍,然后对TCP.IP协议族进行了概念讲解,然后对操作系统关于通信抽象模型进行了简单介绍,最后简单描述了socket   分层的 ...

  2. Http协议浅析

    目录 Http协议浅析 http协议简介 http协议特性 http请求协议与响应协议 请求协议 响应协议 响应状态码 请求URI定位资源 HTTP方法 GET:获取资源 POST:传输实体主体 PU ...

  3. protobuf 协议浅析

    目录 Protobuf 协议浅析 1. Protobuf 介绍 1.1 Protobuf 基本概念 1.2 Protobuf 的优点 1.3 Protobuf, JSON, XML 的区别 2. Pr ...

  4. 【转载】远程桌面协议浅析(VNC/SPICE/RDP)

    远程桌面协议浅析(VNC/SPICE/RDP) 2016年05月14日 01:27:06 wait_for_that_day5 阅读数:18317 标签: VNCRDPSPICE 更多 个人分类: 工 ...

  5. 远程桌面协议浅析(VNC/SPICE/RDP)

    由于最近项目涉及到虚拟桌面,就花了点时间找了点资料看了一下,目前常用的协议有VNC/SPICE/RDP三种,就在这里做一个简单的介绍. 三种协议的对比 SPICE VNC RDP BIOS屏幕显示 能 ...

  6. CAN-FD协议浅析

    引言 随着电子.半导体.通讯等行业的快速发展,汽车电子智能化的诉求也越来越强,消费者希望驾驶动力性.舒适性.经济性以及娱乐性更强的汽车.汽车制造商为了提高产品竞争力,将越来越多的电子控制系统加入到汽车 ...

  7. UIApplicationDelegate 协议 浅析

    @protocol UIApplicationDelegate<NSObject> @optional - (void)applicationDidFinishLaunching:(UIA ...

  8. web开发微信文章目录

    Web开发微信文章目录 2015-12-13 Web开发 本文是Web开发微信的文章目录.通过目录查看文章编号,回复文章编号就能查看文章全文. 回复编号查看全文,搜索分类名可以获得该分类下的文章.   ...

  9. [转] 浅析HTTP协议

    浅析HTTP协议 来源:http://www.cnblogs.com/gpcuster/archive/2009/05/25/1488749.html HTTP协议是什么? 简单来说,就是一个基于应用 ...

随机推荐

  1. @vue/cli 4.0+express 前后端分离实践

    之前总结过一篇vue-cli 2.x+express+json-server实现前后端分离的帖子,@vue/cli3.0及4.0搭建的项目与vue-cli2.x的项目结构有很大的不同.这里对@vue/ ...

  2. Java线程的几种可用状态

    1. 新建( new ):新创建了一个线程对象. 2. 可运行( runnable ):线程对象创建后,其他线程(比如 main 线程)调用了该对象 的 start()方法.该状态的线程位于可运行线程 ...

  3. hdu5687 字典树

    hdu5687 #include <bits/stdc++.h> using namespace std; , n = ; struct node { ]; int cnt; void i ...

  4. 阿里云服务器 ECS Ubuntu系统下PHP,MYSQL,APACHE2的安装配置

    1.系统更新,必须更新,否则有些软件会找不到. apt-get update apt-get upgrade 2.安装mysql sudo apt-get install mysql-server 3 ...

  5. 计算程序运行时间(.net1.1 于.net2.0的区别)在.net2.0中提供了Stopwatch类,简单例子

    1. [代码].NET 2.0      using System.Diagnostics; private Stopwatch stw = new Stopwatch(); private void ...

  6. jQuery中prevAll得到的DOM元素顺序问题

    学习笔记,记录下学习中遇到的问题. 使用jQuery中的prevAll可以查找当前元素之前所有的同辈元素,但是却存在一个问题:得到的同辈元素的为正常顺序的反方向. 举个例子: <!doctype ...

  7. python脚本实现接口自动化轻松搞定上千条接口用例

    接口自动化目前是测试圈主流的一个话题,我也在网上搜索了很多关于自动化的关键词,大多数博主分享的python做接口自动化都是以开源的框架,比如:pytest.unittest+ddt(数据驱动) 最常见 ...

  8. 关于Vue data对象赋值的问题

    遇到这么一个问题: 把data中的某个对象赋值给一个变量,修改变量,会同时把data中的对象也一同修改,所以,这个赋值应该就是引用了地址,贴个代码 <script> export defa ...

  9. raw_input和input

    昨天在OJ上做CTF的题目,发现有道python的题目很有意思,让我知道了raw_input和input的区别,并且能干一些别的事情. 官方文档上说,input()相当于eval(raw_input( ...

  10. Chisel3 - model - connect

    https://mp.weixin.qq.com/s/w8NqM3GVlF0NydpsB65KPg   介绍创建模块顺序逻辑的connect命令.     0. 这里先简单对 "=" ...