http协议简单解析

主要记录一下http协议的一些简单的知识,主要包括请求消息,响应消息的组成,以及get和post的‘对比’,对于更详细的信息可以看下http RFC。https也没有做说明。

http基于请求响应模式,无状态,应用层的协议,特点如下:

  • 支持C/S模式。
  • 无连接,每次连接只处理一个请求,服务器处理完请求,并返回给客户端之后,就会断开连接。
  • 无状态,指的是协议对于事务处理没有记忆能力,如果需要前面的信息,需要重传。

http请求消息(Request)

http请求由三部分组成:请求行,请求头,请求体。比如下面的例子:

GET / HTTP/1.1
Host: cxis.me
Connection: keep-alive
Pragma: no-cache
Cache-Control: no-cache
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: zh-CN,zh;q=0.8,en-US;q=0.6,en;q=0.4,zh-TW;q=0.2,nb;q=0.2,da;q=0.2

GET / HTTP/1.1是请求行,GET是请求方法,/是请求资源在服务器上的路径,HTTP/1.1是http协议版本号。

剩下的是请求头,格式为xxxx: value

这里是get方法,所有没有请求体,请求体是向服务器提交的数据,在请求头和请求体中间会有一行空行。

http响应消息(Response)

响应消息包括:响应行,响应头,响应体。一个响应消息如下:

HTTP/1.1 200 OK
Server: GitHub.com
Content-Type: text/html; charset=utf-8
Last-Modified: Wed, 03 May 2017 08:32:57 GMT
Access-Control-Allow-Origin: *
Expires: Wed, 03 May 2017 13:51:42 GMT
Cache-Control: max-age=600
Content-Encoding: gzip
X-GitHub-Request-Id: AACA:40A3:65A338:8EB391:5909DE15
Content-Length: 9905
Accept-Ranges: bytes
Date: Wed, 03 May 2017 14:41:45 GMT
Via: 1.1 varnish
Age: 0
Connection: keep-alive
X-Served-By: cache-nrt6130-NRT
X-Cache: HIT
X-Cache-Hits: 1
X-Timer: S1493822505.031176,VS0,VE181
Vary: Accept-Encoding
X-Fastly-Request-ID: bc385cef3dbff07f200175fa461c920cb6ca4b3f

HTTP/1.1 200 OK是响应行,HTTP/1.1是http协议版本号,200是状态码,OK是状态消息,和响应码对应。

剩下的是响应头,这里没有响应体。GET方法的响应体为空。

请求方法

  • GET,获取被Request-URI指定的信息。
  • POST,向服务器提交数据。
  • HEAD,获取响应消息报头。
  • PUT,请求服务器保存一个资源。
  • DELETE,请求服务器删除资源。
  • TRACE,请求服务器回应收到的请求消息。
  • OPTIONS,查询相关的资源和选项。
  • CONNECT,预留关键字,现在没有用。

GET和POST对比

GET和POST我觉得不应该硬拿来对比,他们是http规范定义的两种不同的方法,各有各的用处,为什么要对比呢?

关于定义

GET是获取资源,是幂等的;POST是提交资源,是非幂等的。它们是http协议里面定义的两个不同的方法。

关于缓存

GET请求的响应是可缓存的,但是需要响应满足HTTP缓存的要求。POST响应是不可缓存的,除非响应里面有Cache-Control或者Expires属性。

关于请求数据

GET方法会把请求的数据附加到URL之后,也就是放到请求行中;POST则是把提交的数据放到请求体中。因此在地址栏可以直接看到GET请求提交的参数,而看不到POST请求的参数。

关于安全

通常我们说的有关安全,只是相对的安全,比如说GET方法能直接在地址栏看到参数,而POST不能。这通常让人认为是安全和不安全的区别,其实如果抓包或者其他手段一样可以看到GET和POST提交的数据,两者并没有什么安全可言。

关于数据长度

http协议并没有对传输的数据大小做限制,也没有对URL长度做限制,所以从http协议本身来说并没有长度的限制。而我们通常说的URL或者数据的长度限制其实是浏览器或者服务器的限制。

对于GET请求来说,提交的数据都会在URL中,各浏览器对URL的限制不太一样,所以没有什么标准可言;对于POST请求来说,数据存放在请求体中,并没有长度限制,但是服务器通常会有对POST提交数据的大小限制,因此也没有标准可言。

关于POST两次请求

对于GET请求,浏览器会把请求头和请求体一起发送;而对于POST请求,浏览器会先发送请求头,服务器响应100 continue之后,浏览器再发送请求体。

状态码

在响应消息的状态行中有一个状态码和状态消息,两者是对应的,状态码总共有五大类:

  • 1xx,做指示信息,表示请求被接收到,继续处理。
  • 2xx,成功,表示被成功接收,理解,接受。
  • 3xx,重定向,为了完成请求必须采取进一步的动作。
  • 4xx,客户端错误,请求有语法错误或者请求无法实现。
  • 5xx,服务端错误,服务器未能实现请求。

而具体的状态码有很多,不在这里一一列举,下面是一些常用到的:

  • 200 OK,表示请求成功
  • 400 Bad Request 客户端错误,有语法错误
  • 401 Unauthorized,请求未授权
  • 403 Forbidden,服务器拒绝服务
  • 404 Not Found,资源不存在
  • 405 Method Not Allowed,方法不被允许
  • 500 Internal Server Error,服务器内部错误
  • 502 Bad Gateway,网关错误
  • 503 Service Unavailable,服务不可用

消息报头

在请求消息的第二部分是请求头,在响应消息的第二部分是响应头,请求头和响应头又叫做消息报头,这是可选的。其实消息报头不只是包括请求头和响应头,一个消息报头包括:普通报头、请求报头、响应报头、实体报头。

下面列出了各种报头,含义没有一一列出,如有需要可以查看http RFC

普通报头

普通报头既适用于请求消息也适用于响应消息,这些头域不适用于实体传输,只适用于传输消息。

  • Cache-Control 控制缓存指令,缓存指令是单向,独立的。
  • Connection 允许发送指定连接的选项
  • Date 消息产生的日期和时间
  • Pragma
  • Trailer
  • Transfer-Encoding
  • Upgrade
  • Via
  • Waring

请求报头

  • Accept 指定客户端接受哪些类型的信息
  • Accept-Charset 指定客户端接受的字符集
  • Accept-Encoding 指定客户端可接受的内容编码
  • Accept-Language 指定客户端可接受的语言
  • Authorization 客户端有权限查看某个资源
  • Expect
  • From
  • Host 指定被请求资源的主机和端口号
  • If-Match
  • If-Modified-Since
  • If-None-Match
  • If-Range
  • If-Unmodified-Since
  • Max-Forwards
  • Proxy-Authorization
  • Range
  • Referer
  • TE
  • User-Agent

响应报头

  • Accept-Ranges
  • Age
  • ETag
  • Location
  • Proxy-Authenticate
  • Retry-After
  • Server
  • Vary
  • WWW-Authenticate

实体报头

  • Allow
  • Content-Encoding
  • Content-Language
  • Content-Length 指明实体正文的长度,以字节方式存储的十进制数字来表示
  • Content-Location
  • Content-MD5
  • Content-Range
  • Content-Type 指明发送给接收者的实体正文的媒体类型
  • Expires 响应过期的日期和时间
  • Last-Modified 用于指示资源的最后修改日期和时间
  • extension-header
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,594评论 18 139
  • 一、概念(载录于:http://www.cnblogs.com/EricaMIN1987_IT/p/3837436...
    yuantao123434阅读 8,328评论 6 152
  • Http协议详解 标签(空格分隔): Linux 声明:本片文章非原创,内容来源于博客园作者MIN飞翔的HTTP协...
    Sivin阅读 5,201评论 3 82
  • HTTP概述 超文本传输协议(HTTP,HyperText Transfer Protocol) 是互联网上应用最...
    曹渊说创业阅读 3,838评论 2 61
  • 蓬头稚子11阅读 147评论 0 0