网络协议:透彻解析HTTP协议

本篇内容包括:HTTP 协议定义及其特点概述、关于 URL 定义及分类概述、Request 请求、Response 响应 以及 浏览器访问一个网站的全过程 等内容…

一、HTTP 协议概述

HTTP(HyperText Transfer Protocol) 即 超文本传输协议,它是一种用于分布式、协作式和超媒体信息系统的应用层协议。HTTP 是万维网(www)的数据通信的基础。

HTTP 作为一个应用层协议,它由请求和响应两部分构成,是一个标准的个客户端和服务器模型,它的主要特点:支持客户端/服务器模型、简单快速、灵活、无连接、无状态

1、简单快速

客户端向服务器发送服务请求时,只需传路径和请求方法。请求方法包括有 GET、POST、HEAD 等。每种方法规定了客户端与服务器联系的不同类型。由于 HTTP 协议简单,使得 HTTP 服务器的程序规模小,因而通信速度很快

2、灵活

HTTP 允许传输任意类型的数据对象,正在传输的类型由 Content-Type 加以标记,最常见的 4 种 Content-Type 的取值如下:

  • application/x-www-form-urlencoded(常见的 form 提交):最常见 POST 提交数据的方式。浏览器的原生 form 表单,如果不设置 enctype 属性,那么最终就会以此钟方式提交数据
  • multipart/form-data(文件提交):另一种非常常见的 POST 数据提交的方式。我们在使用表单上传文件时,必须让 form 的 enctyped 等于这个值
  • application/json(提交 json 格式的数据):现在越来越多的人把它作为请求头,用来告诉服务端消息主体是序列化后的 JSON 字符串。由于 JSON 规范的流行,除了低版本 IE 之外的各大浏览器都原生支持 JSON.stringify,服务端语言也都有处理 JSON 的函数,使用 JSON 不会遇上什么麻烦
  • text/xml(提交 xml 格式的数据) :XML-RPC(XML Remote Procedure Call)。它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范

3、无连接

无连接的含义是限制每次连接只处理一个请求,服务器处理完客户端的请求,然后响应,并收到应答之后,就断开连接,这种方式可以节省传输时间。

4、无状态

HTTP 协议是无状态协议,无状态是指协议对于事务处理没有记忆能力,这种方式的一个坏处就是,如果后续的处理需要用到之前的信息,则必须要重传,这样就导致了每次连接传输的数据量增大。好处就是,如果后续的连接不需要之前提供的信息,响应就会比较快。而为了解决 HTTP 的无状态特性,出现了 CookieSession 技术.


二、关于 URL

1、URL 概述

URL(Uniform Resource Locator),即 统一资源定位器,是因特网的万维网服务程序上用于指定信息位置的表示方法。在万维网(www)上,每一信息资源都有统一的且在网上唯一的地址,该地址就叫 URL,它是 www 的统一资源定位标志,就是指网络地址(就是我们俗称的网址)。

URL 是互联网上标准资源的地址,可以从互联网上得到的资源的位置和访问方法的一种简洁的表示。互联网上的每个文件都有一个唯一的URL,它包含的信息指出文件的位置以及浏览器应该怎么处理它。

2、URL 结构组成

URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。也可认为由4部分组成:协议、主机、端口、路径。

http://host[:port]/[a_path]
http://IP(主机名/域名):端口/访问的资源路径
  • http 表示要通过 HTTP 协议来定位网络资源;
  • host 表示合法的 Internet 主机域名或者IP地址;
  • port 指定一个端口号,端口号为空则使用缺省端口 80;
  • a_path 指定请求资源的 URl;如果 URL 中没有给出 a_path,那么当它作为请求 URl 时,必须以 “/” 的形式给出,通常这个工作浏览器自动帮我们完成。

三、Request 请求

Request 请求:

  • 作用:获取浏览器发送过来的数据,
  • 组成部分:请求行 请求头 请求体
  • 请求格式:请求方式 请求资源 协议/版本
  • 请求例子:GET /test/row?username=root&password=1234 HTTP/1.1

1、报文头的属性

下面是一个请求的报文:

image-20221108132247655

其中:

  • ① 是请求方法,GET 和 POST 是最常见的 HTTP 方法,除此以外还包括 DELETE、HEAD、OPTIONS、PUT、TRACE。不过,当前的大多数浏览器只支持 GET 和 POST
  • ② 为请求对应的 URL 地址,它和报文头的Host属性组成完整的请求URL,
  • ③ 是协议名称及版本号。
  • ④ 是 HTTP 的报文头,报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。
  • ⑤ 是报文体,它将一个页面表单中的组件值通过 param1=value1&param2=value2 的键值对形式编码成一个格式化串,它承载多个请求参数的数据。不但报文体可以传递请求参数,请求 URL也可以通过类似于 /chapter15/user.html? param1=value1&param2=value2 的方式传递请求参数。

常见的报文头的属性:

字段说明示例
Accept可接收的响应内容类型Accept:text/plain (文本类型)
Accept-Charset可接收的字符集Accept-Charset: utf-8
Accept-Encoding可接受的响应内容的编码方式Accept-Encoding: gzip, deflate
Accept-Language可接受的响应内容语言列表Accept-Language: en-US
Accept-Datetime可接受的按照时间来表示的响应内容版本Accept-Datetime: Oct, 26 Oct 2022 13:31:00 GMT
AuthorizationHTTP协议中需要认证资源的认证信息Authorization: Basic OSdjJGRpbjpvcGVuIANlc2SdDE==
Cache-Control请求/回复中的,是否使用缓存机制Cache-Control: no-cache
Connection客户端想要优先使用的连接类型Connection: keep-alive Connection: Upgrade
Content-Length以8进制表示的请求体的长度Content-Length: 348
Content-Type请求体的MIME类型Content-Type: application/x-www-form-urlencoded
Date发送该消息的日期和时间Date: Oct, 26 Oct 2022 13:31:00 GMT
Expect表示客户端要求服务器做出特定的行为Expect: 100-continue
From发起此请求的用户的邮件地址From: user@qq.com
Host服务器域名和端口号,默认端口可省略Host: www.baidu.com:80 or www.baidu.com
If-Match主要用于PUT,实体匹配才可以操作If-Match: “9jd00cdj34pss9ejqiw39d82f20d0ikd”
If-Modified-Since资源未被修改的情况下返回304未修改If-Modified-Since: Dec, 26 Dec 2015 17:30:00 GMT
User-Agent浏览器的身份标识字符串User-Agent: Mozilla/

2、报文的方法

# GET

GET 请求是最常见的一种请求方式,当客户端要从服务器中读取文档时,当点击网页上的链接或者通过在浏览器的地址栏输入网址来浏览网页的,使用的都是GET方式。

GET方法要求服务器将URL定位的资源放在响应报文的数据部分,回送给客户端。GET方法请求参数和对应的值附加在URL后面,利用一个?代表URL的结尾以及附带参数的开始,参数用key=value键值对的方式书写,参数和参数之间用&符号隔开.一般GET请求的参数的大小受限,最大不超过1024.由于参数明文的显示在了URL上面,因此不太适合传递私密的数据.

# POST

对于上面提到的不适合使用 GET 方式的情况,可以考虑使用 POST 方式,因为使用 POST 方法可以允许客户端给服务器提供信息较多

POST 方法将请求参数封装在 HTT P请求数据中,以名称/值的形式出现,可以传输大量数据,这样 POST 方式对传送的数据大小没有限制,而且也不会显示在 URL 中

# GET和POST的区别

  • 在参数传递上,GET 请求的参数是直接拼接在地址栏URL的后面,而 POST 请求的参数是放到请求体里面的
  • 在长度限制上,GET 请求有具体的长度限制,即一般不超过1024KB,而 POST 理论上没有,界限取决于浏览器限制
  • 在安全角度上。GET 请求因为数据都是明文显示在 URL 上面的,所以 GET 安全和私密性不如 POST
  • 总的来说,GET 和 POST 都是 TCP 连接,并无实质的区别,但是由于 HTTP 浏览器的限定,导致它们在应用过程中体现出了一些不同,GET 产生一个数据包,POST 产生两个数据包
    • 对于 GET 请求,浏览器会把 header 和 data 一并发出去,服务器响应 200(返回数据).
    • 对于 POST 请求,浏览器先发送 header,服务器响应 100 continue,浏览器再发送 data,服务器响应 200 ok

# HEAD

HEAD 就像 GET,只不过服务端接受到 HEAD 请求后只返回响应头,而不会发送响应内容。当我们需要查看某个页面的状态的时候,使用 HEAD 是非常高效的,因为在传输的过程中省去了响应内容部分。

Ps1:HTTP是无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,HTTP使用的不是UDP协议(无连接)

Ps2:从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接

Ps3:Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间


四、Response 响应

HTTP 协议定义了 web 客户端如何从 web 服务器请求页面,以及服务器如何把页面传送给客户端。

HTTP协议采用了 请求/响应 模型,即客户端向服务器发送一个请求报文(请求报文包括请求的方法、url、协议版本,请求头部和请求数据),服务器以一个响应状态行作为响应(响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据)

  • 作用:接收到请求之后,服务器向浏览器写回数据
  • 组成部分:响应行 响应头 空行 响应体
  • 响应行:协议/版本 状态码 状态码说明

1、HTTP 响应构成

HTTP 响应是由四部分构成: 响应行 响应头 空行 响应体

  1. 响应行(状态行):由 HTTP/1.1(协议版本) 200(状态码) OK(状态码的描述) 构成
  2. 响应头:由一些键值对构成,用来说明客户端要使用的一些附加信息
  3. 空行:响应头后面的空行时必须的
  4. 响应体(响应正文):服务器返回给客户端的文本信息

2、常见响应状态码

  • 1xx:已发送请求
  • 2xx:已完成响应:200:正常响应;
  • 3xx:还需浏览器进一步操作:302:重定向 配合响应头:location;304:读缓存
  • 4xx:用户操作错误:404:用户操作错误;405:访问的方法不存在
  • 5xx:服务器错误:500:内部异常

五、浏览器访问一个网站的全过程

当我们使用浏览器访问一个网站时,其实是基于 HTTP 协议,浏览器作为客户端向服务器端发送一次请求,而服务器端在接收到这次请求后,给浏览器反馈一个响应。下面是具体的过程:

  1. 当用户访问一个网站时,首先输入访问的 URL,先通过 DNS 进行域名解析,将域名解析成对应的 IP 地址
  2. 经过解析之后,浏览器会发起一个 TCP 的连接请求
  3. 服务器接受请求后,通过三次握手建立连接
  4. 客户端在确认建立连接成功后,向服务端发送 HTTP 请求格式的数据包
  5. 服务器端解析 HTTP 数据包,执行用户的这次请求并生成一个 HTTP 响应格式的数据包,发送给客户端
  6. 浏览器在收到服务器端的数据包之后再进行解析,再通过 HTML 格式呈现给用户
  7. 客户端再通过四次握手释放连接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535476.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Redis系列:Redis的概述与安装

Redis(Remote Dictionary Server) 是一个使用 C 语言编写的,开源的(BSD许可)高性能非关系型(NoSQL)的键值对数据库。 本篇内容包括:Redis 简介(为什么快?为什么单线程?优…

Redis系列:Redis持久化机制与Redis事务

Redis 是个基于内存的数据库。那服务一旦宕机,内存中数据必将全部丢失。所以丢失数据的恢复对于 Redis 是十分重要的,我们首先想到是可以从数据库中恢复,但是在由 Redis 宕机时(说明相关工作正在运行)且数据量很大情况…

TCP连接的建立与终止

TCP连接的建立与终止 1.三次握手 TCP是面向连接的,无论哪一方向另一方发送数据之前,都必须先在双方之间建立一条连接。在TCP/IP协议中,TCP协议提供可靠的连接服务,连接是通过三次握手进行初始化的。三次握手的目的是同步连接双方…

13 张图带你学懂 Kubernetes Service(转载)

在 Kubernetes 中 Service 主要有4种不同的类型,其中的 ClusterIP 是最基础的,如下图所示: 当我们创建一个 NodePort 的 Service 时,它也会创建一个 ClusterIP,而如果你创建一个 LoadBalancer,它就会创建一…

DOCKERFILE参数注解

Dockerfile由一行行命令语句组成,并且支持以#开头的注释行。 一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。 Dockerfile的指令是忽略大小写的,建议使用大写,使用 # 作为…

Zookeeper:分布式过程协同技术

Zookeeper 是一个高性能的分布式一致系统,在分布式系统中有着广泛的应用。基于它,可以实现诸如“分布式同步”、“配置管理”、“命名空间管理”等众多功能,是分布式系统中常见的基础系统。Zookeeper 主要用来解决分布式集群中应用系统的一致…

Linux namespace概述

操作系统通过虚拟内存技术,使得每个用户进程都认为自己拥有所有的物理内存,这是操作系统对内存的虚拟化。操作系统通过分时调度系统,每个进程都能被【公平地】调度执行,即每个进程都能获取到CPU,使得每个进程都认为自己…

Zookeeper:Zookeeper的主从选举机制

ZAB 协议,全称 Zookeeper Atomic Broadcast(Zookeeper 原子广播协议),是为分布式协调服务 ZooKeeper 专门设计的一种支持崩溃恢复的一致性协议。基于该协议,ZooKeeper 实现了一种主从模式的系统架构来保持集群中各个副…

Linux namespace之:uts namespace

理解uts namespace uts(UNIX Time-Sharing System) namespace可隔离hostname和NIS Domain name资源,使得一个宿主机可拥有多个主机名或Domain Name。换句话说,可让不同namespace中的进程看到不同的主机名。 例如,使用unshare命令(较新版本L…

Kubernetes 的原理

kubernetes 已经成为容器编排领域的王者,它是基于容器的集群编排引擎,具备扩展集群、滚动升级回滚、弹性伸缩、自动治愈、服务发现等多种特性能力。 本文将带着大家快速了解 kubernetes ,了解我们谈论 kubernetes 都是在谈论什么。 kuberne…

CPU 是如何执行任务的

前言 你清楚下面这几个问题吗? 有了内存,为什么还需要 CPU Cache? CPU 是怎么读写数据的? 如何让 CPU 能读取数据更快一些? CPU 伪共享是如何发生的?又该如何避免? CPU 是如何调度任务的&a…

Ansible 的自动化运维

1、Ansible 特点 Ansible 自 2012 年发布以来,很快在全球流行,其特点如下: Ansible 基于 Python 开发,运维工程师对其二次开发相对比较容易; Ansible 丰富的内置模块,几乎可以满足一切要求; …

图文并茂 VLAN 详解,让你看一遍就理解 VLAN

一、为什么需要VLAN 1.1、什么是VLAN? VLAN(Virtual LAN),翻译成中文是“虚拟局域网”。LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络。VLAN所指的LAN特指使用路由器分割的网络——也就是广播域。 在此让我们先复习…

认识VLAN,并学会VLAN的划分和网络配置实例

VLAN的划分和网络的配置实例 1、VLAN基础知识 VLAN(Virtual Local Area Network)的中文名为:“虚拟局域网”,注意和VPN(虚拟专用网)进行区分。 VLAN是一种将局域网设备从逻辑上划分(不是从物…

VLAN划分及配置注意事项

VLAN(Virtual Local Area Network)即虚拟局域网,是将一个物理的LAN在逻辑上划分成多个广播域的通信技术。VLAN内的主机间可以直接通信,而VLAN间不能直接通信,从而将广播报文限制在一个VLAN内。VLAN之间的通信是通过第3…

Docker原理剖析

一、简介 1、了解Docker的前生LXC LXC为Linux Container的简写。可以提供轻量级的虚拟化,以便隔离进程和资源,而且不需要提供指令解释机制以及全虚拟化的其他复杂性。相当于C中的NameSpace。容器有效地将由单个操作系统管理的资源划分到孤立的组中&#…

Docker容器网络解析

Docker 容器网络的发展历史 在 Dokcer 发布之初,Docker 是将网络、管理、安全等集成在一起的,其中网络模块可以为容器提供桥接网络、主机网络等简单的网络功能。 从 1.7 版本开始,Docker正是把网络和存储这两部分的功能都以插件化形式剥离出来…

Docker 数据管理介绍

默认容器的数据是保存在容器的可读写层,当容器被删除时其上的数据也会丢失,所以为了实现数据的持久性则需要选择一种数据持久技术来保存数据。官方提供了三种存储方式:Volumes、Bind mounts和tmpfs。前面还介绍了:Docker 服务终端…

Docker 数据持久化的三种方案

容器中的数据可以存储在容器层。但是将数据存放在容器层存在以下问题: 数据不是持久化。意思是如果容器删除了,这些数据也就没了 主机上的其它进程不方便访问这些数据 对这些数据的I/O会经过存储驱动,然后到达主机,引入了一层间…

Git 存储原理及相关实现

Git 是目前最流行的版本控制系统,从本地开发到生产部署,我们每天都在使用 Git 进行我们的版本控制,除了日常使用的命令之外,如果想要对 Git 有更深一步的了解,那么研究下 Git 的底层存储原理将会对理解 Git 及其使用非…