http协议之报文详解
一. 概述
www(或web)定义了3个重要的概念,它们分别是访问信息的手段与位置(URI,Uniform Resource Identifier),信息的表现形式(HTML,HyperText Markup Language)以及信息转发(HTTP,HyperText Transfer Protocol)等操作。URI比URL(Uiniform Resource Locator)更广泛,不局限于标识互联网资源,还可以标识所有资源。
HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送协议。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等),采用TCP协议而非UDP协议。
用于HTTP协议交互的信息被称为HTTP报文。请求端(客户端)的http报文叫做请求报文,响应端的叫做响应报文。
报文,是网络中交换和传输的数据单元,即站点一次性要发送的数据块。报文包含了将要发送的完整的数据信息,其长短很不一致,长度不限且可变。
HTTP报文是由一行一行简单的字符串组成的。HTTP报文都是纯文本,不是二进制代码,所以人们可以很方便地对其进行读写。如果说HTTP是因特网的信使,那么HTTP报文就是它用来搬东西的包裹了。
HTTP三点注意事项:
HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
http协议通讯流程:
二. 报文流动
报文会流入源端服务器,工作完成之后,会流会用户的Agent代理。
HTTP报文会像河水一样流动,不管是请求报文还是响应报文,所有报文都会向下游流动。所有报文的发送者都在接受者的上游。如下图所示,对请求报文来说,代理1位于代理3的上游,但对响应报文来说,它就位于代理3的下游。
HTTP默认使用80端口,工作机制是,首先客户端向服务器的80端口建立一个TCP连接,然后在这个TCP连接上进行请求和应答以及数据报文的发送。
web浏览器执行的程序为客户端程序,在服务器端执行的程序为服务器端程序。
javascript是一种嵌入在HTML中的编程语言,作为客户端程序可以运行于多个浏览器中。
cgi是web服务器调用外部程序时所使用的一种服务应用的规范。
cookie,web服务器用cookie在客户端保存信息(多为用户名和登录名,或网络购物中购物车商品信息)。从web服务器检查cookie可以确保是否为同一对端的通信,从而存放于购物车里的商品信息(网购场合)就不必要再保存到服务器上了。
三. 协议版本
HTTP协议有三个版本:1.0, 1.1和2,目前一般都是HTTP/2(2.0)。
http采用方案hypertext transfer protocol,https采用方案hypertext transfer protocol security。
各版本主要特点:
HTTP1.0:无状态,无连接。在http1.0中每一个命令和应答都会触发一次TCP连接的建立和断开。
HTTP1.1: 持久连接,请求管道化,增加缓存处理(新增字段如cache-control),增加Host字段支持断点传输等。HTTP/1.1版的头部信息是文本,数据体可以是二进制或文本。
HTTP/2:二进制分帧,多路复用,头部压缩,服务器推送。 HTTP/2的头信息和数据体都是二进制,并且统称为“帧”,头信息帧和数据帧。(HTTP/2单向认证加密报文如下图,数据加密不能抓取数据)
(HTTP/2协议握手分2种方式,一种叫h2,一种叫h2c。
h2要求必须使用TLS加密,在TLS握手期间会顺带完成HTTPS/2协议的协商,如果协商失败(比如客户端不支持或者服务端不支持),则会使用HTTPS/1继续后续通讯。
h2c不使用TLS,而是多了一次基于HTTP协议的握手往返来完成向HTTP/2协议的升级,一般不建议使用。)
四. 报文的组成
HTTP报文本身是由多行(用CR+LF作为换行符)数据构成的字符串文本。
HTTP报文是简单的格式化文本。如下图所示。每条报文都包含一条来自客户端的请求或者一条来自服务器的响应。它们由三部分组成:对报文进行描述的起始行、包含属性的首部块以及可选的、包含数据的主体部分。
首部与主体由最初出现的空行(CR+LF)来划分。通常,并不一定要有报文主体。
注:CR+LF:CR(Carriage Return,回车,16进制0x0d,\r)和LF(Line Feed,换行,16进制0x0a,\n)。
所有的HTTP报文都可以分为两类:请求报文和响应报文。请求报文会向Web服务器请求一个动作。响应报文会将请求的结果返回给客户端。请求报文和响应报文的基本报文结构相同。
1. 报文的语法
请求报文的格式
<method> <request-URL> <version>
<headers> <entity-body>
响应报文的格式
<version> <status> <reason-phrase>
<headers> <entity-body>
下面是对报文格式各部分的解释:
method(方法)
客户端希望服务器对资源执行的动作。是一个单独的词,如:GET、HEAD、POST。
request-URL(请求URL)
命名了所请求资源,或者URL路径组件的完整URL。
version(版本)
报文所使用的HTTP版本,其格式:HTTP/<major>.<minor>
其中major(主要版本号)和minor(次要版本号)都是整数。
status(状态码)
由三位数字组成,描述了请求过程中所发生的情况。
reason-phrase(原因短语)
上面数字状态码的可读版本包含行终止序列之前的所有文本。
headers(首部)
可以有零个或多个首部,每个首部都包含一个名字,后面跟着一个冒号(:),然后是一个可选的空格,接着是一个值,最后是一个CRLF。首部是由一个空行(CRLF)结束的,表示了首部列表的结束和实体主体部分的开始,
entity-body(实体的主体部分)
包含一个由任意数据组成的数据块。并不是所有的报文都包含实体的主体部分。有时,报文只是以一个CRLF结束。
2. 起始行
所有的HTTP报文都以一个起始行作为开始。请求报文的起始行说明了要做些什么。响应报文的起始行说明发生了什么。
请求行。请求报文请求服务器对资源进行一些操作。请求报文的起始行,称为请求行,包含 一个方法和一个请求URL,方法描述了服务器应该执行的操作,请求URL描述了要对哪个资源执行这个方法。请求行还包含HTTP的版本,用来告知服务器, 客户端使用的是哪种版本的HTTP。所有的这些字段都由空格符分隔。在HTTP/1.0之前,并不要求请求行中包含HTTP版本号。
响应行。响应报文承载了状态信息和操作产生的所有结果数据,将其返回给客户端。响应报文的起始行,称为响应行,包含了响应报文使用的HTTP版本、数字状态码,以及描述状态码的文本信息的原因短语。所有的这些字段都由空格符分隔。在HTTP/1.0之前,并不要求响应行中包含HTTP版本号。
方法。请求的起始行以方法作为开始,方法用来告知服务器要做些什么。
HTTP规范中定义了一组常用的请求方法。
注:并不是所有服务器都实现了上面列出的7种方法。而且,由于HTTP设计得易于扩展,所以除了这些方法以外,其他服务器可能还会是实现一些自己的请求方法,称为扩展方法。
状态码。用来告诉客户端,发生了什么事情。
客户端向一个HTTP服务器发送请求报文时,会发生很多事情。状态码是在每条响应报文的起始行中返回的。
下面是状态码的分类
200 - 请求成功
301 - 资源(网页等)被永久转移到其它URL
404 - 请求的资源(网页等)不存在
500 - 内部服务器错误
原因短语。是响应起始行中最后一个组件。为状态码提供了文本形式的解释。例:200 OK中,OK就是原因短语。
版本号。为HTTP应用程序提供了一种将自己所遵循的协议版本告知对方的方式。版本号 说明了应用程序支持的最高版本。版本好不会被当作小数来处理。版本的每个数字都回被当成一个单独的数字来处理。因此,每个数字都必须单独进行比较,以便确 定哪个版本更高。比如,HTTP/2.22就比HTTP/2.3的版本更高,因为22比3大。
3. 首部
首部字段向请求和响应报文中添加一些附加信息。从本质上来说,它们只是一些名/值对的列表。
首部分类
请求首部:提供更多有关请求的信息
响应首部:提供更多有关响应的信息
通用首部:既可以出现在请求报文中,也可以出现在响应报文中
实体首部:描述主体的长度和内容,或者资源自身
扩展首部:规范中没有定义的新首部
常见首部实例
Content-type:指定数据格式。1.0规定,头部信息必须是ASCII码,后面的数据可以是任何格式。常见的Content-type字段值:text/plain, text/html, text/css, image/jpeg, image/png, image/svg+xml, audio/mp4, video/mp4, application/javascript, application/pdf, application/zip, aplication/atom+xml。这些数据类型总称为MIME type,每个值包含一级类型和二级类型,之间用斜杠分割。除了预定义的类型,厂商也可自定义类型。MIME type还可以在尾部使用分号,添加参数,如:
Content-type: text/html; charset=utf-8
上述类型表明,发送的是网页,而且编码是UTF-8。
Accept:客户端申明可以接受的数据格式。如:Accept: */*可以接受任何数据格式。
Content-Encoding:指定数据的压缩方法,如:gzip,compress,deflate。
Accept-Encoding:客户端申明可以接受的压缩方法。
Connection:默认keep-alive(1.1之后),客户端可发送Connection: close明确要求服务器关闭TCP链接。目前,对于同一域名,大多数浏览器允许同时建立6个持久连接。
Content-length:声明本次响应的数据长度。
Transfer-Encoding:声明回应将有数量未定的数据块组成。Transfer-Encoding: chunked
Host:指定服务器的域名。
4. 实体的主体部分
HTTP报文的负荷。就是HTTP要传输的内容。
HTTP报文可以承载很多类型的数字数据:图片、视频、HTML文档、软件应用程序等。
参考:
1. 图解http
3. HTTP协议之报文详解
4. HTTP 协议详解 (增删减及标注) simba
6. HTTP1.0 HTTP1.1 HTTP2.0 主要特性对比
10. Cronet网络库系列(三):HTTPS/HTTP2/HTTP3/QUIC/WebSocket详解
http协议之报文详解的更多相关文章
- HTTP权威指南读书笔记(一)HTTP概述、URL和资源及报文详解
一.HTTP概述 1.WEB客户端和服务器. 2.资源:资源可以是各种格式的静态文件,也可以是应用程序. 3.媒体类型 4.URI:统一资源标识符 URL:统一资源定位符. URL的第一部分称为方案: ...
- HTTP/1.1报文详解
本文为<三万长文50+趣图带你领悟web编程的内功心法>第三个章节. 3.HTTP/1.1报文详解 在RFC2616中心详细的描述了HTTP/1.1[1]的报文,感兴趣的朋友也可以前往阅读 ...
- HTTP协议Keep-Alive模式详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp22 HTTP协议Keep-Alive模式详解 1.什么是Keep-Aliv ...
- HTTP协议状态码详解(HTTP Status Code)(转)
原文链接:HTTP协议状态码详解(HTTP Status Code) 使用ASP.NET/PHP/JSP 或者javascript都会用到http的不同状态,一些常见的状态码为: 200 – 服务器成 ...
- HTTP协议头域详解
HTTP协议头域详解 Requests部分 Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/html Accept-Charset 浏览器可以接受的字符编 ...
- HTTP协议状态码详解
HTTP状态码,我都是现查现用. 我以前记得几个常用的状态码,比如200,302,304,404, 503. 一般来说我也只需要了解这些常用的状态码就可以了. 如果是做AJAX,REST,网络爬虫, ...
- 网络基础知识-TCP/IP协议各层详解
TCP/IP简介 虽然大家现在对互联网很熟悉,但是计算机网络的出现比互联网要早很多. 计算机为了联网,就必须规定通信协议,早期的计算机网络,都是由各厂商自己规定一套协议,IBM.Apple和Micro ...
- TCP/IP协议簇分层详解---转
http://blog.csdn.net/hankscpp/article/details/8611229 一. TCP/IP 和 ISO/OSI ISO/OSI模型,即开放式通信系统互联参考模型(O ...
- 浏览器 HTTP 协议缓存机制详解
最近在准备优化日志请求时遇到了一些令人疑惑的问题,比如为什么响应头里出现了两个 cache control.为什么明明设置了 no cache 却还是发请求,为什么多次访问时有时请求里带了 etag, ...
随机推荐
- Windows Server 2012 R2如何编辑hosts文件
在我的Windows Server 2012 R2系统里编辑hosts文件则会出现没有无法保存的问题,原因是权限不足 错误信息:" Unable to save C:\Windows\Sys ...
- SQLServer2008备份时发生无法打开备份设备
如下图所示,在执行SQL一个简单的备份命令时发生下面的情况 问题分析: 1:可能是文件夹目录权限问题 2:可能是登录SQLServer服务器用户策略问题 于是就查看了E:\dw_backup的文件夹权 ...
- 想搞机器学习,不会特征工程?你TM逗我那!
原文:http://dataunion.org/20276.html 作者:JasonDing1354 引言 在之前学习机器学习技术中,很少关注特征工程(Feature Engineering),然而 ...
- 04-树4. Root of AVL Tree (25)
04-树4. Root of AVL Tree (25) 时间限制 100 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue An A ...
- angularjs中的$eval方法
在controller中定义了一个变量 $scope.a_1 = "abc"; 想在view里面动态输出,因为这个数字是动态的,这么输出肯定是不行的{{'a_' + '1'}},因 ...
- url: (6) Couldn’t resolve host ‘www.ttlsa.com’
http://www.ttlsa.com/linux/curl-6-couldnt-resolve-host/ 2. 解决问题 尝试解决方法: 修改dns # cat /etc/resolv.conf ...
- linux 挂载 ISO 文件
sudo sudo mount -o loop SUSE-Linux-10.1-GM-DVD-x86_64.iso /media/cdrom/ sudo umount /media/cdrom
- Linux系统中的信号量(semphore)与互斥体(mutex)
http://www.embexperts.com/viewthread.php?tid=31 两者最大区别:信号量可以允许多个线程进入临界区,而互斥体只允许一个线程进入临界区.本贴将描述信号量与互斥 ...
- Column count of mysql.user is wrong. Expected 43, found 42. Created with MySQL 50518, now running 50641. Please use mysql_upgrade to fix this error.
出现问题: Column count of mysql.user is wrong. Expected 43, found 42. Created with MySQL 50518, now runn ...
- Linux命令-权限管理命令:chgrp
groupadd shuaige 创建一个用户组名字叫shuaige ls -l /home/wangyunpeng/abcd 查看abcd文件的权限 chgrp shuaige /home/wang ...