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
回车空行
回车空行

推荐阅读更多精彩内容

  • 本篇文章篇幅比较长,先来个思维导图预览一下。 一、概述 1.计算机网络体系结构分层 2.TCP/IP 通信传输流 ...
    涤生_Woo阅读 47,604评论 24 532
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 121,073评论 16 134
  • Http协议详解 标签(空格分隔): Linux 声明:本片文章非原创,内容来源于博客园作者MIN飞翔的HTTP协...
    Sivin阅读 4,413评论 3 83
  • 我喜欢看你吃东西的样子 你吃东西的样子很好看 你什么样子我都见过 你任性的时候 生气的时候 伤心的时候 最尴尬的时...
    Cedarldl阅读 150评论 0 0
  • PS选区的选择工具有很多种,每种工具都有各自的优缺点,虽然我们可以用一种工具选择不同特点的图片,但对于不同的图片选...
    云兮云兮阅读 1,356评论 0 7