【深入HTTP协议】 -- 2019-08-08 20:39:57

目录

  • HTTP 请求
  • HTTP 响应

原文: http://106.13.73.98/__/80/

HTTP是(Hyper Text Transfer Protocol)超文本传输协议的缩写.

HTTP的发展是万维网协会(World Wide Web Consortium)和Internet工作小组IETF(Internet Engineering Task Force)合作的结果,(他们)最终发布了一系列的RFC.

RFC 1945定义了HTTP/1.0版本,其中最著名的就是RFC 2616,RFC 2616定义了今天普遍使用一个版本——HTTP 1.1

------->

HTTP协议(Hyper Text Transfer Protocol)超文本传输协议是用于从WWW服务器传输超文本到本地浏览器的传送协议.

它可以使浏览器更加高效,使网络传输减少。它不仅保证计算机正确快速地传输超文本文档,还确定传输文档中的哪一部分,以及哪部分内容首先显示(如文本先于图形)等.

@

HTTP响应模型
·
HTTP协议永远都是客户端发起请求,服务器回送响应,如下图:

这样就限制了使用HTTP协议,无法实现在客户端没有发起请求的时候,服务器将消息推送给客户端.

HTTP工作流程
·
一次HTTP操作称为一个事务,其工作过程可分为四步:

  1. 首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始.
  2. 建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号.
    后边是MIME(声明文本信息)信息包括请求修饰符、客户机信息和可能的内容.
  3. 服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码.
    后边是MIME信息包括服务器信息、实体信息和可能的内容.
  4. 客户端接收服务器所返回的信息并通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接.

·
如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,由显示屏输出.
对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了.
***

HTTP 请求

HTTP请求方式大全
序号 方法 描述
1 GET 请求指定的页面信息,并返回实体主体。
2 HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
3 POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的建立和/或已有资源的修改。
4 PUT 从客户端向服务器传送的数据取代指定的文档的内容。
5 DELETE 请求服务器删除指定的页面。
6 CONNECT HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
7 OPTIONS 允许客户端查看服务器的性能。
8 TRACE 回显服务器收到的请求,主要用于测试或诊断。
9 PATCH 实体中包含一个表,表中说明与该URI所表示的原内容的区别。
10 MOVE 请求服务器将指定的页面移至另一个网络地址。
11 COPY 请求服务器将指定的页面拷贝至另一个网络地址。
12 LINK 请求服务器建立链接关系。
13 UNLINK 断开链接关系。
14 WRAPPED 允许客户端发送经过封装的请求。
15 Extension-mothed 在不改动协议的前提下,可增加另外的方法。
HTTP请求包括的内容

·
客户端连上服务器后,向服务器请求某个Web资源,称之为客户端向服务器发送了一个HTTP请求.
·
一个完整的HTTP请求包括的内容:一个请求行、若干消息头、实体内容.
·
如下图:

HTTP请求细节——请求头

·
请求行中的GET称之为请求方式,请求方式有:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT,常用的有: GET、 POST
·
用户如果没有设置,默认情况下浏览器向服务器发送的都是GET请求,例如在浏览器直接输地址访问,点超链接访问等都是GET,用户如想把请求方式改为POST,可通过更改表单的提交方式实现.
·
不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上:如果请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,例如:GET /mail/1.html?name=abc&password=xyz HTTP/1.1
·
GET请求的特点:在URL地址后附带的参数是有限制的,其数据容量通常不能超过1K.
·
如果请求方式为POST方式,则可以在请求的实体内容中向服务器发送数据,Post方式的特点:传送的数据量无限制.

HTTP请求细节——消息头

·
Accept
声明浏览器支持的数据类型
·
Accept-Charset
声明浏览器支持的字符集
·
Accept-Encoding
声明浏览器支持的压缩格式
·
Accept-Language
声明浏览器的语言环境
·
Host
声明浏览器要访问那台主机
·
If-Modified-since
声明浏览器缓存数据的时间
·
Referer
声明客户机是哪个页面来的,用于防盗链
·
Connection
浏览器通过这个头告诉服务器,请求完后是断开链接还是保持链接
·
X-Requested-with: XMLHttpRequest
代表通过ajax方式进行访问
·
User-Agent
请求载体的身份标识,浏览器标识
·
以上为HTTP请求中的常用消息头,如下图:

***

HTTP 响应

HTTP响应包括的内容

·
HTTP响应代表服务器向客户端回送的数据.
它包括:一个状态行、若干消息头、以及实体内容.

HTTP响应细节——状态行

·
状态行格式:
HTTP/1.1 200 OK HTTP版本号 状态码 原因叙述<CRLF>
·
状态码用于表示服务器对请求的处理结果.
状态码是一个三位的十进制数,响应状态码分为5类.

·
常见的HTTP状态码
·
100 客户端应继续发送请求
客户端应当继续发送请求,客户端应当继续发送请求的剩余部分.
或如果请求已经完成,忽略这个响应.
·
101 转换协议
在发送完这个响应的最后空行后,服务器将会切换到在Upgrade消息头中定义的那些协议.
只有在切换到新的协议更有好处的时候才应该采取类似的措施.
·
102 继续处理
由WebDAV(RFC 2518)扩展的状态码,代表请求将被继续执行.
·
200 请求成功
表示这条请求执行成功了.
处理方式:获得响应的内容,进行处理.
·
201 请求完成
表示这条请求执行完成了
结果是创建了新资源,新创建的资源的URL可在响应的实体中得到.
处理方式在爬虫中不会遇到.
·
202 请求被接受
请求被接受了,但处理尚未完成.
处理方式:阻塞等待.
·
204 服务器以实现请求
服务器已经实现了请求,但未返回新的信息.
如果客户端是用户代理,则无需为此更新自身的文档视图.
处理方式:丢弃.
·
300
该状态码不被HTTP/1.0的应用程序直接使用,只是作为3XX类型回应的默认解释,存在多个可用的被请求资源.
处理方式:若程序中能够处理,则进一步处理;若程序中不能够处理,则丢弃.
·
301 永久重定向
请求到的资源都会分配一个永久的URL,这样就可以在将来通过该URL来访问此资源.
处理方式:重定向到分配的URL,永久重定向.
·
302 临时重定向
请求到资源在一个不同的URL处临时保存.
处理方式:重定向到临时的URL,临时重定向.
·
304 请求的资源未更新
请求的资源未更新.
使用的是本地缓存文件(不会发送请求).
处理方式:丢弃.
·
400 非法请求
处理方式:丢弃.
·
401 未授权
处理方式:丢弃.
·
403 禁止
处理方式:丢弃.
·
404 没有找到
处理方式:丢弃.
·
500 服务器内部错误
服务器遇到了一个未曾预料的状况,导致它无法完成对请求的处理.
一般这个问题会在服务器端的源代码出现错误时出现.
即服务器问题,代码逻辑有问题.
·
501 服务器无法识别
服务器不支持当前请求需要的某个功能.
当服务器无法识别请求的方法时,将无法支持其对任何资源的请求.
·
502 错误网关
作为网关或代理工作的服务器尝试执行请求时,从上游服务器接收到无效的响应.

HTTP响应细节——常用响应头

·
Location
服务器通过这个头,来告诉浏览器跳到哪里
·
Server
声明服务器的型号
·
Content-Encoding
服务器通过这个头,告诉浏览器,数据的压缩格式
·
Content-Length
声明服务器回送的数据的长度
·
Content-Language
服务器通过这个头,告诉浏览器语言环境
·
Content-Type
声明服务器回送的数据的类型
·
Refresh
服务器通过这个头,告诉浏览器定时刷新
·
Content-Disposition
服务器通过这个头,告诉浏览器以下载方式打开数据
·
Transfer-Encoding
服务器通过这个头,告诉浏览器数据是以分块方式回送的
·
Expires: -1
控制浏览器不要缓存
·
Cache-Control: no-cache
·
Pragma: no-cache


更多:http://tools.jb51.net/table/http_header

原文: http://106.13.73.98/__/80/

原文地址:https://www.cnblogs.com/gqy02/p/11323686.html

时间: 2024-11-13 00:54:00

【深入HTTP协议】 -- 2019-08-08 20:39:57的相关文章

2014/08/08 – Backbonejs

[来自: Backbone.js 开发秘笈 第5章] Event API: (function ($) { //define ------------------------- var obj = {}; var obj2 = { commonEvent: function () { window.document.title = new Date().toString(); } }; //扩展对象包含事件 _.extend(obj, Backbone.Events); _.extend(obj

2019/09/08最新进展

今日完成的工作如下: 1.继续完善论文: 2.发现仿真数据出错了,原来是公式有个地方出错了... 修改后的公式为: (1)      当t1<=2.5s,v=v2 (2)      当2.7s > t1 >2.5s,v = v2 – ug(t^2)/0.4|t=t1-2.5 (3)      当t1>2.7s,  v’=v2-ug(0.2*0.2)-(v1/(ug)+0.1-2.7)*ug 3.根据公式进行仿真.写一个cpp: #include<bits/stdc++.h&g

2019.04.08打卡

1 #include <stdio.h> 2 #include <stdlib.h> 3 typedef int DataType; 4 typedef struct node{ 5 DataType data; 6 struct node *next; 7 }LinkNode,*LinkList; //LinkNode是JAVA中链表结点,此类可以存放int.long.float.double.byte.short.String.StringBuffer类型的数据 8 //定义单

2019.10.08考试报告

T1 用一个堆维护最小的是谁,每次加入一个值x时查询堆顶是否小于x,有则买top卖x,之后分为是不是反悔操作判断要不要把pop. 然而好像其他人都push两个来进行反悔操作. 1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<queue> 6 #define int long long 7 using namespace

PAT 甲级 A1019 (2019/02/08)

1 #include<cstdio> 2 bool Judge(int A[], int num){ 3 for(int i = 0; i < num; i++){ 4 if(A[i] == A[num-1-i]) 5 return true; 6 else 7 return false; 8 } 9 } 10 int main(){ 11 int N, b, A[40], num = 0; 12 scanf("%d %d", &N, &b); 13

PAT 甲级 A1027 (2019/02/08)

1 #include<cstdio> 2 int main(){ 3 char str[13] = {'0','1','2','3','4','5','6','7','8','9','A','B','C'}; 4 int a, b, c; 5 scanf("%d %d %d", &a, &b, &c); 6 printf("#"); 7 printf("%c%c",str[a/13], str[a%13]);

2019 08 08 字符编码,文件操作

字符编码 一.计算机基础 cpu: 控制程序的运行(从内存中取出文本编辑器的数据读入内存) 内存: 运行程序(经cpu操作后,内存中含有文本编辑器的数据) 硬盘: 存储数据(文本编辑器) 二.文本编辑器存取文件的原理 ? 计算机只认识 0和1 ? 文本编辑器的作用: 读写数据,保存数据 打开编辑器就打开了启动了一个进程,是在内存中的,所以,用编辑器编写的内容也都是存放与内存中的,断电后数据丢失. 要想永久保存,需要点击保存按钮:编辑器把内存的数据刷到了硬盘上. 在我们编写一个py文件(没有执行)

2019 08 08 文件高级应用和函数基础

文件的高级应用 可读.可写 r+t: 可读.可写 即可读又可写(尽量不要使用) # r+ 是在后面追加 w+t: 可写.可读 清空文件的功能是w提供的, w+更不要使用 a+t: 可追加.可读 a有追加的功能,a的指针在末尾,a+功能也没用 # wt with open('36w.txt', 'wt', encoding='utf-8') as fw: print(fw.readable()) print(fw.writable()) False True # w+t with open('36

原程序员的算法课(1)-算法概述2019年08月18日 17:58:49 十步杀一人_千里不留行 阅读数 11更多所属专栏: 程序员的算法课编辑

[算法之美]数据结构+算法=程序. 前言 数据结构只是静态的描述了数据元素之间的关系.高效的程序需要在数据结构的基础上设计和选择算法. 高效的程序=恰当的数据结构+合适的算法 算法(Algorithm)是指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制.也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出.如果一个算法有缺陷,或不适合于某个问题,执行这个算法将不会解决这个问题.不同的算法可能用不同的时间.空间或效率来完成同样的任务.一