09http初识_HTTP协议结构_关于HTTP请求GET和POST的区别_报文讲解_telnet命令

一、http初识
(一)HTTP协议简介
超文本传输协议(英文:Hyper Text Transfer Protocol,缩写:HTTP)是互联网上应用最为广泛的一种网络协议。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。通过HTTP协议请求的资源由统一资源标识符(Uniform Resource Identifiers,URI)来标识。

(二)HTTP协议的主要特点可概括如下:
简单:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、POST、PUT。每种方法规定了客户与服务器联系的不同类型。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
请求-响应模式:客户端每次向服务器发起一个请求时都建立一个连接, 服务器处理完客户端的请求即断开连接。

(三)HTTP工作流程
HTTP,是符合C/S模型的,总是Client端来发起请求。
1、客户机(浏览器)主动向服务器(web server)发出连接请求。
2、服务器接受连接请求并建立起连接。 (1,2步即TCP三次握手)
3、客户机通过此连接向服务器发出GET等http命令,(“HTTP请求报文”)。
4、服务器接到命令并根据命令向客户机传送相应的数据,(“HTTP响应报文”)。
5、客户机接收从服务器送过来的数据。
6、服务器发送完数据后,主动关闭此次连接。 (”TCP四次分手“)。
概况起来就是 客户/服务器传输过程可分为四个基本步骤:

  1. 浏览器与服务器建立连接; (TCP三次握手)
  2. 浏览器向服务器请求文档;
  3. 服务器响应浏览器请求;
  4. 断开连接。(”TCP四次分手“)

(四)HTTP协议的URL,URI介绍
HTTP协议中的URL(URL是一种特殊类型的URI(Uniform Resource Identifier),包含了用于查找某个资源的足够的信息)
主要是用于定位服务器端资源的位置。我们来看下它的语法定义:
http://host[:port][path]
http://localhost:8080/LoginAndRegister/login
其中:
http:// 表示我们要使用HTTP协议;
host 表示一个可用的域名或IP地址;
port 为可选,表示要请求的端口号,缺省情况下为80
path 为可选,表示要请求的资源所在的路径(也叫URI),缺省情况下为/ ,如果URL中没有给出path,那么当它作为请求URI时,必须以“/”的形式给出,比如浏览器中输入: www.abc.edu.cn 则浏览器自动换成 www.abc.edu.cn/

二、HTTP协议结构
(一)HTTP协议格式比较简单,格式如下:

由上图也可以看出来 HTTP 有两类报文:
请求报文——从客户向服务器发送请求报文。
响应报文——从服务器到客户的回答。

(二)HTTP 请求方法概述:
方法(操作) 意义
GET: 请求读取由URL所标识的信息 参数是放在URL里面的
POST: 给服务器发送数据 参数是放在请求体里面
HEAD: 请求读取由URL所有标识的信息的首部
PUT: 在指明的URL下存储一个文档
OPTION: 请求一些选项的信息
DELETE: 删除指明的URL所标识的资源
TRACE: 用来进行环回测试的请求报文
CONNECT: 用于代理服务器

(三)HTTP状态码
状态码都是三位数字,第一位表示状态类别,共分五种,如下:
1xx表示通知消息的,如请求收到了或正在进行处理
2xx表示成功,如接受或知道了
3xx表示重定向,表示要完成请求还必须采取进一步的行动
4xx表示客户端的差错,如请求中有错误的语法或不能完成
5xx表示服务器的差错,如服务器失效无法完成请求

其实常用的状态码并不多,我们把常见的列举在此: 200 OK:客户端请求成功了,客户端要的东西就在响应报文里了;
301 Moved Permanently:客户端啊,你要请求的资源已经永久的搬家了,我把他的新地址放到了Location头部域中了;
302 Moved Temporarily:客户端啊,你要请求的资源临时有事去别的地方了,我把他的位置放到了Location头部域中了,你可以先去那里找他,不过他应该是会回到他自己的家的;
304 Not Modified:客户端啊,你要请求的资源自从上次你请求之后,就再也没有改动过,我想你是应该早就有这个资源了,所以在响应报文的数据部分我也没有再放这个资源。
400 Bad Request:客户端发来的请求报文里有语法错误,服务器端实在看不懂了;
401 Unauthorized:客户端发来的请求不是合法来源的请求,也就是这个客户端是没有被授权的;
403 Forbidden:服务器端顺利收到了客户端的请求,但是因为某些理由,服务器端拒绝为他提供服务
404 Not Found:客户端要请求的资源不存在,八成是资源地址写错了;
500 Internal Server Error:很遗憾,服务器不能给你提供服务了,服务器内部出现了不可预知的问题了;
502 Bad Gateway:客户端你好,我是请求报文的代理服务器,持有资源的那个服务器在给我发送资源时出问题了;
503 Server Unavailable:服务器现在是太忙了,暂时不能给你这个客户端提供服务了,或许稍后会恢复。

三、关于HTTP请求GET和POST的区别

1.GET提交:请求的数据会附在URL之后(就是把数据放置在HTTP协议头<request-line>中),以?分割URL和传输数据,多个参数用&连接;例如:login.action?name=hyddd&password=idontknow&verify=%E4%BD%A0 %E5%A5%BD。如果数据是英文字母/数字,原样发送,如果是其他类型的则需要编码后发送

POST提交:把提交的数据放置在HTTP包的包体<request-body>中。上文示例中红色字体标明的就是实际的传输数据
因此,GET提交的数据会在地址栏中显示出来,而POST提交,地址栏不会显示出数据

2.传输数据的大小:
首先声明,HTTP协议没有对传输的数据大小进行限制,HTTP协议规范也没有对URL长度进行限制。 而在实际开发中存在的限制主要有:
GET:特定服务器对URL长度有限制,例如IE对URL长度的限制是2048字节。对于其他浏览器,如Netscape、FireFox等,理论上没有长度限制,其限制取决于操作系统以及服务器的支持。
因此对于GET提交时,传输数据就会受到URL长度的限制。
POST:由于不是通过URL传值,理论上数据不受限。但实际各个WEB服务器会规定对post提交数据大小进行限制,Apache、IIS6都有各自的配置。

3.安全性:
POST的安全性要比GET的安全性高。通过GET提交数据,用户名和密码将明文出现在URL上,
因为:(1)登录页面有可能被浏览器缓存,(2)其他人查看浏览器的历史纪录,那么别人就可以拿到你的账号和密码了。

四、报文讲解
(一)请求报文
请求报文 报文格式如下:

空白行用CR LF对表示。CRLF对是回车(Carriage Return,CR)和换行(Line Feed,LF)字符的ASCII码,它表示报头组件的结束。

为了深入理解HTTP 协议请求报文,下面直接来一个例子:

GET img.t.sinajs.cn/t5/style/css/module/base/home_frame.css?version=cc73de6cd25d6dbf HTTP/1.1
/* 第一行叫做请求行(request),其他的各行都叫做头部行(header)请求行包括三个字段:
方法字段、URI字段、HTTP版本字段 这个例子的请求行,是要做这样一件事:用HTTP协议
1.1版本,使用GET方法,向服务端申请/t5/style/css/module/base/home_frame.css?version=cc73de6cd25d6dbf资源 /
/
下面都属于头部行 /
Host: img.t.sinajs.cn
/
Host用来指定要请求的服务器端主机为img.t.sinajs.cn
User-Agent: Mozilla/5.0 (Windows NT 6.1; rv:26.0) Gecko/20100101 Firefox/26.0
/* User-agent域则是用来指定当前这个请求报文是由谁产生的,通常来说,一般这里设置的是用户所使用的浏览器类型。/
Accept: text/css,
/;q=0.1
Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3
/
Accept-language域,客户端所能识别的语言 如果没有 则 采取默认语言 /
Accept-Encoding: gzip, deflate
/
客户端所能识别的编码压缩格式 gzip*/
Referer: http://weibo.com/840450770/home=5&page=2&pre_page=1&end_id=3664048949921640&end_msign=-1
Connection: keep-alive

  1. /* 这里有一个空行,而且是必须有这个空行。这是HTTP协议的硬性规定。 */

请求报文段就是下面这样,细细琢磨吧。

GET /t5/style/css/module/base/home_frame.css?version=cc73de6cd25d6dbf HTTP/1.1Host: img.t.sinajs.cnUser-Agent: Mozilla/5.0 (Windows NT 6.1; rv:26.0) Gecko/20100101 Firefox/26.0Accept: text/css,/;q=0.1Accept-Language: zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3Accept-Encoding: gzip, deflateReferer: http://weibo.com/840450770/home?wvr=5&page=2&pre_page=1&end_id=3664048949921640&end_msign=-1Connection: keep-alive

(二)响应报文
响应报文格式如下:

一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。HTTP的响应消息也是由三个部分组成,
分别是:响应行/状态行、响应头、空行、响应数据。
举例:

/* 第一行是状态行,包括三个字段:版本字段、状态码字段、原因短语字段 /
HTTP/1.1 200 OK
/
本例中,HTTP协议的响应报文想表达的意思是服务器使用的是HTTP协议1.1版本,
而且找到了客户端所要的资源,且会将响应报文发给客户端,整个过程都很正常 /
Expires: Wed, 22 Jan 2014 02:51:09 GMT
/
给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中的内容
(再次访问曾访问过的页面时,直接从缓存中加载,缩短响应时间和降低服务器负载)
我们可以使用Expires指定页面过期的时间)/
Date: Tue, 07 Jan 2014 02:51:09 GMT
/
这里记录了这个响应报文被发送出去的时间点 /
Server: nginx/1.4.2 Apache 阿帕奇
/
Server域表明这个响应报文是nginx服务器发出的,且nginx的版本是1.4.2 /
Content-Type: text/css
/
指出所包含的数据是txt/css文本内容 /
Last-Modified: Mon, 06 Jan 2014 07:50:31 GMT
/
用于记录本响应报文中所存的数据的最后修改时间 /
Transfer-Encoding: chunked
/
服务端向客户端传输数据所采用的传输模式(仅在HTTP1.1中出现)/
Cache-Control: max-age=1296000
/
服务端要求中间代理及客户端如何缓存自己响应的数据/
Content-Encoding: gzip
/
用于记录文档的压缩方法 gzip/
Age: 1
X-Via: 1.1 whjyw137:3 (Cdn Cache Server V2.0)
Connection: keep-alive
/
服务器端会保持住这个连接*/

/* 看这里,还得看这里,和请求报文类似,这里也有一个空行 */

(实际数据 …………)

响应报文,原报文如下:

HTTP/1.1 200 OK Expires: Wed, 22 Jan 2014 02:51:09 GMTDate: Tue, 07 Jan 2014 02:51:09 GMTServer: nginx/1.4.2Content-Type: text/cssLast-Modified: Mon, 06 Jan 2014 07:50:31 GMTTransfer-Encoding: chunkedCache-Control: max-age=1296000Content-Encoding: gzipAge: 1X-Via: 1.1 whjyw137:3 (Cdn Cache Server V2.0)Connection: keep-alive
五、telnet命令
使用telnet命令 可以使本机与远程服务器构建一个连接
使用telnet命令模拟http请求报文 然后服务器返回响应报文
telnet www.baidu.com 80

GET /index.html HTTP/1.1
Host:www.baidu.com
Connection:close
回车空行
回车空行

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,907评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,546评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,705评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,624评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,940评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,371评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,672评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,396评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,069评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,350评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,876评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,243评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,847评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,004评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,755评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,378评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,266评论 2 259

推荐阅读更多精彩内容