HTTP协议详解(超级详细)
目录
- 1. HTTP概述
- 2. HTTP特点
- 3. HTTP之URL
- 4. HTTP协议格式
- 4.1 HTTP请求
- 4.1.1 请求行
- 4.1.2 请求头(Header)
- 4.1.3 空行
- 4.1.4 请求体(Body)
- 4.2 HTTP响应
- 4.2.1 状态行
- 4.2.2 响应头(Header)
- 4.2.3 空行
- 4.2.4响应体(Body)
- 4.3 消息头(补充)
- 4.3.1 请求头
- 4.3.2 响应头
- 5. HTTP工作流程
1. HTTP概述
HTTP 协议(Hypertext Transfer Protocol,超文本传输协议),是一个客户端请求和响应的标准协议,这个协议详细规定了浏览器和万维网服务器之间互相通信的规则。用户输入地址和端口号之后就可以从服务器上取得所需要的网页信息。
HTML是分布式,协作式,超媒体系统应用之间的通信协议。是万维网(world wide web)交换信息的基础。
超文本传输协议中的超文本指的是HTTP除了能传输普通的文本内容之外,还可以传输图片、页面等信息。(实际上传输的还是不同格式的字符串)。
它允许将 超文本标记语言 (HTML) 文档从 Web 服务器传送到 Web 浏览器。HTML 是一种用于创建文档的标记语言,这些文档包含到相关信息的链接。您可以单击一个链接来访问其它文档、图像或多媒体对象,并获得关于链接项的附加信息。
HTTP工作在 TCP/IP协议体系中的TCP协议上。
客户机和服务器必须都支持 HTTP,才能在 万维网上发送和接收 HTML 文档并进行交互。
现在WWW中使用的是HTTP/1.1,它是由RFCs(Requests for comments)在1990年6月制定。目前交由IETF(Internet Engineering Task Force) 和W3C(World Wide Web)负责修改。但最终还是由RFCs对外发布。
客户机和服务器必须都支持 HTTP,才能在 万维网上发送和接收 HTML 文档并进行交互。
默认HTTP的端口号为80,HTTPS的端口号为443。
HTTP工作在 TCP/IP协议体系中的TCP协议上。
HTTP中最重要的就是HTTP协议格式,分为请求协议和响应协议。
通信规则规定了客户端发送给服务器的内容格式,也规定了服务器发送给客户端的内容格式。客户端发送给服务器的格式叫“请求协议(request)
”;服务器发送给客户端的格式叫“响应协议(response)
”。
2. HTTP特点
HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。
支持客户/服务器模式。
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
灵活:HTTP允许传输任意类型的数据对象。传输的类型由Content-Type加以标记。
无连接:无连接是表示每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
注意:
HTTP1.1版本后支持可持续连接。(我们当前就是HTTP/1.1)通过这种连接,就有可能在建立一个TCP连接后,发送请求并得到回应,然后发送更多的请求并得到更多的回应。通过把建立和释放TCP连接的开销分摊到多个请求上,则对于每个请求而言,由于TCP而造成的相对开销被大大地降低了。而且,还可以发送流水线请求,也就是说在发送请求1之后的回应到来之前就可以发送请求2.也可以认为,一次连接发送多个请求,由客户机确认是否关闭连接,而服务器会认为这些请求分别来自不同的客户端。无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
3. HTTP之URL
URL作用:HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
URL就是浏览器的书写格式。
基本URL包含模式(或称协议)、服务器名称(或IP地址)、路径和文件名,如“协议://授权/路径?查询”。
URL由三部分组成:资源类型、存放资源的主机域名、资源文件名。
也可认为由4部分组成:协议、主机、端口、路径。
由于篇幅原因,关于HTTP中比较重要的URL详细解释放在了我的上一篇博文中:HTTP之URL详解,一起食用效果更佳。
4. HTTP协议格式
4.1 HTTP请求
HTTP请求由三部分组成,分别是:请求行、请求头(请求报头)、请求正文(请求体)。
格式:
请求行
请求头1
请求头2
……
请求空行
请求体
4.1.1 请求行
请求行由三部分组成:请求方式(请求方法),请求路径,请求协议版本。
格式如下:Method空格Request-URI空格HTTP-Version CRLF
Method 表示请求方法;Request-URl是一个统一资源标识符;HTTP-Version.表示请求的 HTTP 协议版本;CRLF表示回车和换行;
例如:GET /images/logo.gif HTTP/1.1
HTTP协议中共定义了十种方法(有时也叫“动作”)来表明Request-URI指定的资源的不同操作方式:
HTTP请求方法中需要说明的是GET
和POST
方法(最常用的就是GET方法和POST方法)。
如果请求行中是
GET
方法,则没有请求体。用户在浏览器的地址栏中输入URL,回车发出的请求都是
GET
请求。方法名称是区分大小写的。当某个请求所针对的资源不支持对应的请求方法的时候,服务器应当返回状态码405(Method Not Allowed);当服务器不认识或者不支持对应的请求方法的时候,应当返回状态码501(Not Implemented)。
HTTP服务器至少应该实现GET和HEAD方法,其他方法都是可选的。当然,所有的方法支持的实现都应当符合下述的方法各自的语义定义。此外,除了上述方法,特定的HTTP服务器还能够扩展自定义的方法。
请求版本信息一般是
HTTP/1.1
或者HTTP/1.0
。请求行以换行(回车)作为请求行的结束。
请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本。
4.1.2 请求头(Header)
在HTTP/1.1协议中,所有的请求头,除
post
外,都是可选的。请求头是以
key: value
的形式现示的。每一个报头域(报头域包括请求头和响应头)都是由名字+”:”+空格+值组成,消息报头域的名字是大小写无关的。请求头里保存的是请求的属性, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示请求头部分结束。
HTTP常见的请求头(Header)
Content-Type: 数据类型(text/html等)
Content-Length: Body的长度
Host: 客户端告知服务器, 所请求的资源是在哪个主机的哪个端口上;
User-Agent: 声明用户的操作系统和浏览器版本信息;
referer: 当前页面是从哪个页面跳转过来的;
location: 搭配3xx状态码使用, 告诉客户端接下来要去哪里访问;
Cookie: 用于在客户端存储少量信息. 通常用于实现会话(session)的功能.
浏览器不是根据资源的后缀判断资源的类型,而是通过Content-Type
来判断资源的类型。(这是因为WEB服务器中有MIME配置)
4.1.3 空行
空行标志着请求头的结束,也标志着请求体的开始。
空行可以用\r\n
书写。
4.1.4 请求体(Body)
GET
方法没有请求体,因为GET
方法的请求参数都已经跟在了URL(地址栏)的后面。
空行后面的内容都是请求体 ,请求体允许为空字符串. 如果请求体存在, 则在请求头中会有一个Content-Length属性来标识Body的长度。
4.2 HTTP响应
在接收和解释请求消息后,服务器返回一个HTTP响应消息。
HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文。
格式
状态行
响应头1
响应头2
……
响应空行
响应体
4.2.1 状态行
状态行包括:协议版本,状态码,[状态码说明]。
格式:如下:HTTP-Version空格Status-Code空格Reason-Phrase CRLF
HTTP- Version表示HTTP版本,例如为HTTP/1.1。
Status- Code是结果代码,用三个数字表示。
Reason-Phrase是个简单的文本描述,解释Status-Code的具体原因。
Status-Code用于机器自动识别,Reason-Phrase用于人工理解。Status-Code可以省略。
Status-Code的第一个数字代表响应类别,可能取5个不同的值。
后两个数字没有分类作用。
Status-Code的第一个数字代表响应的类别,后续两位描述在该类响应下发生的具体状况。
例如:HTTP/1.1 200 OK
状态码概括以及状态码描述:
最常见的状态码, 比如 200(OK), 404(Not Found), 403(Forbidden), 302(Redirect, 重定向), 504(BadGateway)。
由于篇幅原因,关于HTTP中的状态码详细信息放在了我的下一篇博文中:HTTP状态码,一起食用效果更佳。
4.2.2 响应头(Header)
服务器需要传递许多附加信息,这些信息不能全放在状态行里。因此,需要另行定义响应头域,用来描述这些附加信息。响应头域主要描述服务器的信息和Request-URI的信息。
响应头是以
key: value
的形式现示的。每一个报头域(报头域包括请求头和响应头)都是由名字+”:”+空格+值组成,消息报头域的名字是大小写无关的。响应头里保存的是响应的附加信息, 冒号分割的键值对;每组属性之间使用\n分隔;遇到空行表示Header部分结束。
响应头里重要的Content-x是关于正文/资源内容部分的说明。
Content-Type说明了正文/资源内容的格式。
Content-Length说明了正文/资源内容的长度。(以字节为单位)
4.2.3 空行
空行标志着响应头的结束,也标志着响应体的开始。
空行可以用\r\n
书写。
4.2.4响应体(Body)
空行后面的内容都是Body。 Body允许为空字符串。 如果Body存在, 则在Header中会有一个Content-Length属性来标识Body的长度; 如果服务器返回了一个html页面, 那么html页面内容就是在body中。
4.3 消息头(补充)
补充说明HTTP协议中重要的消息头内容。
HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行),消息报头(可选),空行(只有CRLF的行),消息正文(可选)组成。
每一个报头域都是由名字+”:”+空格+值组成,消息报头域的名字是大小写无关的。(报头域包括请求头和响应头)
4.3.1 请求头
请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。
例如,请求头中的Referer
说明:
Referer
:该请求头指明请求从哪里来。
如果是地址栏中输入地址访问的都没有该请求头(因为这就是你的初始访问页面)。如果从初始访问页面点击进入下一个页面(不建立新的标签页的情况下),通过请求可以看到,此时多了一个Referer的请求头,并且后面的值为该请求从哪里(初始访问页面)发出。比如百度竞价,只能从百度来的才有效果,否则不算;通常用来做统计工作、防盗链。
4.3.2 响应头
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URl所标识的资源进行下一步访问的信息。
例如,请求头中的Location
说明:
Location
:Location响应报头域用于重定向接受者到一个新的位置。
Location响应报头域,常用在更换域名的时候。
如:response.sendRedirect("http://www.baidu.com");
Refresh
:自动跳转(单位是秒),可以在页面通过html中在标签里的meta标签实现,也可在后台实现。
如:<meta http-equiv="refresh"content="3;url="http://www.baidu.com">
//不写后面的url说明每三秒刷新自己的页面,加上,说明三秒后跳转到指定的url页面位置.
5. HTTP工作流程
一次HTTP操作称为一个事务,其工作过程可分为四步:
1)首先客户机与服务器需要建立连接。只要单击某个超级链接,HTTP的工作开始。
2)建立连接后,客户机发送一个请求给服务器,请求方式的格式为:统一资源标识符(URL)、协议版本号,后边是MIME信息包括请求修饰符、客户机信息和可能的内容。
3)服务器接到请求后,给予相应的响应信息,其格式为一个状态行,包括信息的协议版本号、一个成功或错误的代码,后边是MIME信息包括服务器信息、实体信息和可能的内容。
4)客户端接收服务器所返回的信息通过浏览器显示在用户的显示屏上,然后客户机与服务器断开连接。
如果在以上过程中的某一步出现错误,那么产生错误的信息将返回到客户端,有显示屏输出。对于用户来说,这些过程是由HTTP自己完成的,用户只要用鼠标点击,等待信息显示就可以了。
HTTP协议详解(超级详细)相关推荐
- HTTP 协议详解(超级经典)
协议是指计算机通信网络中两台计算机之间进行通信所必须共同遵守的规定或规则,超文本传输协议(HTTP)是一种通信协议,它允许将超文本标记语言(HTML)文档从Web服务器传送到客户端的浏览器 什么是HT ...
- Redis五种数据类型应用场景详解(超级详细版)
目录 NoSQL:一类新出现的数据库(not only sql) 特征 NoSQL和SQL数据库的比较: 电商场景解决方案 Redis简介 Redis特性 Redis 优势 Redis应用场景 官方文 ...
- kickstart详解(超级详细)
一.kickstart是什么 许多系统管理员宁愿使用自动化的安装方法来安装红帽企业 Linux.为了满足这种需要,红帽创建了kickstart安装方法.使用kickstart,系统管理员可以创建一 ...
- 树上分治详解 超级详细(附带例题 poj1741(给了题目))
例题大概意思就是有一颗有 n 个顶点的树,其中连接顶点 a_i 和 b_i 的边 i 的长度为 l ,然后统计最短距离不超过 k 的顶点的对数 (虽然篇幅比较长,但是看完会有收获的) 树上的分治,与其 ...
- 平面分治详解 超级详细(附带例题 最近点对问题(给了题目))(UVA10245,P1257,P1429)
最近点对问题,大概意思平面有n个点,求距离最近的两个点对的距离(可用平面分治解决绝大部分情况) 首先如果一个一个比较,那就是n的二次方复杂度,那很多情况都会超时 我们考虑使用分治法,大概思路就是将这个 ...
- 强连通分量分解详解 超级详细
(写的有点小多,慢慢看,会有收获的) (1) 首先我们得了解,什么是强连通? 如果在一个有向图顶点子集内,任取两个点 u 和 v ,都能找到一条路径从 u 到 v ,则称该子集为强连通 (2) 其次我 ...
- Spring AOP全面详解(超级详细)
如果说IOC 是 Spring 的核心,那么面向切面编程AOP就是 Spring 另外一个最为重要的核心@mikechen AOP的定义 AOP (Aspect Orient Programming) ...
- Java基本注解详解(超级详细)
原文链接: 今日头条 Java注解是一个很重要的知识点,用于对代码进行说明,可以对包.类.接口.字段.方法参数.局部变量等进行注解. 掌握好Java注解有利于学习框架底层实现.@mikechen Ja ...
- 最小路径覆盖详解 超级详细(附带例题 Stock Charts(给了题目))
最小路径覆盖定义:在图G中找出一些路径,每条路径从起点走到终点,使所有点均被覆盖,且只被覆盖一次,选出的这些路径组成路径覆盖.如果找出最少的路径成为一个路径覆盖,则称为最小路径覆盖. 对于不包含圈的有 ...
- WebSocket协议详解及应用
标签:websocket WebSocket协议详解及应用(七)-WebSocket协议关闭帧 本篇介绍WebSocket协议的关闭帧,包括客户端及服务器如何发送并处理关闭帧.关闭帧错误码及错误处理方 ...
最新文章
- 2021年春季学期-信号与系统-第十四次作业参考答案-第四小题参考答案
- Mybatis中的缓存
- JavaScript 运行机制详解
- 三轴联动c语言算法,(数控加工)虚拟轴数控机床的仿三轴控制.pdf
- 音视频技术开发周刊 | 197
- win32汇编指令汇总
- 爬虫python入门_python爬虫入门教程有哪些?适合的只有这三个
- 深度学习项目:歌词的自动生成
- 单片机如何在一数据包前加标识呢_单挑Google面试官,一上来就问我Chrome底层原理和HTTP协议(万字长文)...
- C++ Windows时间函数 QueryPerformanceCounter()与QueryPerformanceFrequency()
- java 删除zk节点_zookeeper 的节点删除不了?
- Javaweb技术的校运会报名及比赛管理系统
- mysql workbench 安全模式_MySQL Workbench解决安全模式
- 带顶点动画的护盾效果——UnityShader学习笔记
- php模拟苹果手机访问,php 使用curl模拟ip和来源进行访问的实现方法
- html画布直线代码,图文详解如何用html5 canvas画一条直线
- iphone刷机---iphone4s ios8降级ios7.1.1教程
- Java多线程—守护线程
- 三星U盘格式化后数据不见了?3个方法帮您找回珍贵文件
- 未转变者服务器买车指令,未转变者服务器指令大全
热门文章
- SQLServer触发器
- 《盛世财神》主题动漫
- 深入分析基于Micrometer和Prometheus实现度量和监控的方案
- 目前python主要应用于电子电器类_MicroPython技术及应用定义
- 在奔向5G的道路上 高通用了哪些洪荒之力
- Vue (用javaScript/JS)调用媒体摄像头拍照扫描银行卡
- 什么是线程死锁?如何避免死锁?
- 程序员专属游戏 Screeps:使用 JS/TS 代码控制自己的殖民地
- leetcode 分享巧克力 java_LeetCode 1231. 分享巧克力(极小极大化 二分查找)
- 两台计算机只换硬盘可以吗,两台电脑互换硬盘可以吗