【java程序员理解HTTP】【1】HTTP相关知识

参考网页

http://android.jobbole.com/85218/php

Http和Tcp/Ip

TCP/IP协议簇是一组不一样层次上的多个协议的组合,一般被认为是一个四层协议系统,与OSI的七层模型相对应

HTTP协议就是基于TCP/IP协议模型来传输信息的。html

(1). 链路层android

也称做数据链路层或网络接口层(在第一个图中为网络接口层和硬件层),一般包括操做系统中的设备驱动程序和计算机中对应的网络接口卡。它们一块儿处理与电缆(或其余任何传输媒介)的物理接口细节。ARP(地址解析协议)和RARP(逆地址解析协议)是某些网络接口(如以太网和令牌环 网)使用的特殊协议,用来转换IP层和网络接口层使用的地址。nginx

(2). 网络层web

也称做互联网层(在第一个图中为网际层),处理分组在网络中的活动,例如分组的选路。在TCP/IP协议族中,网络层协议包括IP协议(网际协议),ICMP协议(Internet互联网控制报文协议),以及IGMP协议(Internet组管理协议)。chrome

IP是一种网络层协议,提供的是一种不可靠的服务,它只是尽量快地把分组从源结点送到目的结点,可是并不提供任何可靠性保证。同时被TCP和UDP使用。TCP和UDP的每组数据都经过端系统和每一个中间路由器中的IP层在互联网中进行传输。json

ICMP是IP协议的附属协议。IP层用它来与其余主机或路由器交换错误报文和其余重要信息。浏览器

IGMP是Internet组管理协议。它用来把一个UDP数据报多播到多个主机。缓存

(3). 传输层tomcat

主要为两台主机上的应用程序提供端到端的通讯。在TCP/IP协议族中,有两个互不相同的传输协议:TCP(传输控制协议)和UDP(用户数据报协议)。

TCP为两台主机提供高可靠性的数据通讯。它所作的工做包括把应用程序交给它的数据分红合适的小块交给下面的网络层,确认接收到的 分组,设置发送最后确认分组的超时时钟等。因为运输层提供了高可靠性的端到端的通讯,所以应用层能够忽略全部这些细节。为了提供可靠的服务,TCP采用了 超时重传、发送和接收端到端的确认分组等机制。

UDP则为应用层提供一种很是简单的服务。它只是把称做数据报的分组从一台主机发送到另外一台主机,但并不保证该数据报能到达另外一 端。一个数据报是指从发送方传输到接收方的一个信息单元(例如,发送方指定的必定字节数的信息)。UDP协议任何须需的可靠性必须由应用层来提供。

(4). 应用层

应用层决定了向用户提供应用服务时通讯的活动。TCP/IP 协议族内预存了各种通用的应用服务。包括 HTTP,FTP(File Transfer Protocol,文件传输协议),DNS(Domain Name System,域名系统)服务。

★小结

TCP/IP协议簇是一组不一样层次上的多个协议的组合,一般被认为是一个四层协议系统,与OSI的七层模型相对应。上层到下层依次为:

应用层

运输层

网络层

链路层(这里已是物理层,涉及到硬件了)

HTTP、FTP、DNS(Domain Name System,域名系统)属于应用层,TCP属于运输层,IP属于网络层,以太网属于链路层。

★封装-数据进入协议栈时的封装过程

当应用程序用TCP传送数据时,数据被送入协议栈中,而后逐个经过每一层直到被看成一串比特流送入网络。其中每一层对收到的数据都要增长一些首部信息(有时还要增长尾部信息),该过程如图所示。

★分用-以太网数据帧的分用过程

当目的主机收到一个以太网数据帧时,数据就开始从协议栈中由底向上升,同时去掉各层协议加上的报文首部。每层协议盒都要去检查报文首部中的协议标识,以肯定接收数据的上层协议。这个过程称做分用(Demultiplexing)。协议是经过目的端口号、源IP地址和源端口号进行解包的。

★封装和分用:经过【数据进入协议栈时的封装过程】和【以太网数据帧的分用过程】从TCP/IP模型的角度来理解了一次HTTP请求与响应的过程,更清晰的图以下

为何HTTP协议要基于TCP来实现?--HTTP协议属于应用层协议,其须要基于运输层的协议。TCP属于运输层协议,且可靠性强。因此HTTP协议选择了TCP协议

目前在Internet中全部的传输都是经过TCP/IP进行的,HTTP协议做为TCP/IP模型中应用层的协议也不例外,TCP是一个端到端的可靠的面向链接的协议,因此HTTP基于传输层TCP协议不用担忧数据的传输的各类问题。

★★Http和Tcp/Ip总结

Tcp/Ip是一个协议族,是工程实践中提炼出来的协议组合,能够认为是一个四层协议系统

四层从高到低:应用层(Http、Ftp、DNS)、运输层(TCP)、网络层(IP)、链路层(以太网)。

上层协议要依赖于下层的实现。

http协议在经过网络传输数据的套路

应用(通常为web应用)使用http协议传输数据,数据要经过tcp、ip层到达网络(被看成一串比特流送入网络)。数据从http应用(经过tcp层、ip层)到达网络时变成一串比特流,中间经历了每一层协议的封装。经过网络达到目的机器,又会从协议栈的底层到高层:链路层(之外网)到网络层(ip层)到运输层(tcp层)到应用层(http、ftp、dns),在这个过程当中比特流在每一层都会被解析(分用),最终以http响应的格式到底http应用(多是客户端,好比浏览器、手机app应用,也多是服务器端,好比nginx服务器、tomcat服务器等)。

发送端发送时:层层封装。

接收端接收后:层层解析。

HTTP协议

Http是什么?

计算机经过网络进行通讯的规则,是一个基于请求与响应,无状态的,应用层的协议,常基于TCP/IP协议传输数据。目前任何终端(手机,笔记本电脑。。)之间进行任何一种通讯都必须按照Http协议进行,不然没法链接。

四个基于:请求响应、无状态、应用层、TCP/IP

请求与响应

客户端发送请求,服务器端响应数据。

无状态的

协议对于事务处理没有记忆能力,客户端第一次与服务器创建链接发送请求时须要进行一系列的安全认证匹配等,所以增长页面等待时间,当客户端向服务器端发送请求,服务器端响应完毕后,二者断开链接,也不保存链接状态,一刀两断!恩断义绝!今后路人!下一次客户端向一样的服务器发送请求时,因为他们以前已经遗忘了彼此,因此须要从新创建链接。

应用层

Http是属于应用层的协议,配合TCP/IP使用。

TCP/IP

Http使用TCP做为它的支撑运输协议。HTTP客户机发起一个与服务器的TCP链接,一旦链接创建,浏览器(客户机)和服务器进程就能够经过套接字接口访问TCP。

针对无状态的一些解决策略

有时须要对用户以前的HTTP通讯状态进行保存,好比执行一次登录操做,在30分钟内全部的请求都不须要再次登录。因而引入了Cookie技术。

HTTP/1.1想出了持久链接(HTTP keep-alive)方法。其特色是,只要任意一端没有明确提出断开链接,则保持TCP链接状态,在请求首部字段中的Connection: keep-alive即为代表使用了持久链接。

还有不少其余方案策略。

HTTP报文--HTTP报文是面向文本的,报文中的每个字段都是一些ASCII码串,各个字段的长度是不肯定的。HTTP有两类报文:请求报文和响应报文

Http请求报文

请求报文格式:请求命令(请求行)、请求头、空行、请求体

一个HTTP请求报文由请求行(request line)、请求头部(header)、空行和请求数据4个部分组成,下图给出了请求报文的通常格式。

请求行

请求行分为三个部分:请求方法、请求地址和协议版本。

请求方法

HTTP/1.1 定义的请求方法有8种:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS、TRACE。

最常的两种GET和POST,若是是RESTful接口的话通常会用到GET、POST、DELETE、PUT。

请求地址

URL:统一资源定位符,是一种自愿位置的抽象惟一识别方法。

组成:<协议>://<主机>:<端口>/<路径>

端口和路径有时能够省略(HTTP默认端口号是80)(路径能够省略是由于有时会有默认首页)

以下例:

有时会带参数,GET请求

协议版本

协议版本的格式为:HTTP/主版本号.次版本号,经常使用的有HTTP/1.0和HTTP/1.1

请求头部

请求头部为请求报文添加了一些附加信息,由“名/值”对组成,每行一对,名和值之间使用冒号分隔。

常见请求头以下:

User-Agent举例:各类浏览器、fiddler、网络爬虫等。

空行

请求头部的最后会有一个空行,表示请求头部结束,接下来为请求数据,这一行很是重要,必不可少。

请求数据

可选部分,好比GET请求就没有请求数据。

下面是一个POST方法的请求报文:

POST  /index.php HTTP/1.1    请求行
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2  请求头
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/
Content-Length:25
Content-Type:application/x-www-form-urlencoded
  空行
username=aa&password=1234  请求数据

Http响应报文

响应报文格式--状态行、响应头部、空行以及响应数据

HTTP响应报文主要由状态行、响应头部、空行以及响应数据组成。

状态行

由3部分组成,分别为:协议版本,状态码,状态码描述。

其中协议版本与请求报文一致,状态码描述是对状态码的简单描述,因此这里就只介绍状态码。

状态码

状态代码为3位数字。

1xx:指示信息--表示请求已接收,继续处理。

2xx:成功--表示请求已被成功接收、理解、接受。

3xx:重定向--要完成请求必须进行更进一步的操做。

4xx:客户端错误--请求有语法错误或请求没法实现。

5xx:服务器端错误--服务器未能实现合法的请求。

常见状态码举例

响应头部

与请求头部相似,为响应报文添加了一些附加信息

常见响应头部以下

空行

空行告知客户端响应头结束,后面为响应数据。

响应数据

用于存放须要返回给客户端的数据信息。

下面是一个响应报文的实例

HTTP/1.1 200 OK  状态行
Date: Sun, 17 Mar 2013 08:12:54 GMT  响应头部
Server: Apache/2.2.8 (Win32) PHP/5.2.5
X-Powered-By: PHP/5.2.5
Set-Cookie: PHPSESSID=c0huq7pdkmm5gg6osoe3mgjmm3; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Content-Length: 4393
Keep-Alive: timeout=5, max=100
Connection: Keep-Alive
Content-Type: text/html; charset=utf-8
  空行

<html>  响应数据
<head>
<title>HTTP响应示例<title>
</head>
<body>
Hello HTTP!
</body>
</html>

http起始行中的请求方法

GET: 完整请求一个资源 (经常使用)

HEAD: 仅请求响应首部

POST:提交表单  (经常使用)

PUT: (webdav) 上传

DELETE:(webdav) 删除

OPTIONS:返回请求的资源所支持的方法的方法

TRACE: 追求一个资源请求中间所通过的代理

Spring框架的web包中的请求方法类--RequestMethod

public enum RequestMethod {

   GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE

}

http几种协议

http/0.9: stateless

http/1.0: MIME, keep-alive (保持链接), 缓存

http/1.1: 更多的请求方法,更精细的缓存控制,持久链接(persistent connection) 比较经常使用

什么是MIME?--互联网媒体类型

MIME(Multipurpose Internet Mail Extesions 多用途互联网邮件扩展)是一个互联网标准,它扩展了电子邮件标准,使其可以支持非ASCII字符、二进制格式附件等多种格式的邮件消息,这个标准被定义在 RFC 204五、RFC 204六、RFC 204七、RFC 204八、RFC 2049等RFC中。 由RFC 822转变而来的RFC 2822,规定电子邮件标准并不容许在邮件消息中使用7位ASCII字符集之外的字符。正因如此,一些非英语字符消息和二进制文件,图像,声音等非文字消息都不能在电子邮件中传输。MIME规定了用于表示各类各样的数据类型的符号化方法。此外,在万维网中使用的HTTP协议中也使用了MIME的框架,标准被扩展为互联网媒体类型

MIME 遵循如下格式:major/minor 主类型/次类型

例如:

image/jpg

image/gif

text/html

video/quicktime

appliation/x-httpd-php

appliation/json

HTTP协议有啥用?

技术上基于TCP/IP,是一套应用层面的网络传输协议。

基于HTTP协议,能够开发web服务器端,百度、阿里、360。

基于HTTP协议,能够开发PC和手机端浏览器,各类产品:chrome、ie、Firefox、uc等各类浏览器。

基于HTTP协议,能够开发各类PC客户端应用:优化大师等,如今几乎都是网络应用。

基于HTTP协议,能够开发各类手机app:同花顺、微信、支付宝。

因此基于HTTP协议,能够开发各类产品,只要产品符合HTTP协议便可。

=====================================================================

Chrome发起的http请求报文头部信息举例

字段含义说明

 

Accept  就是告诉服务器端,我接受那些MIME类型

Accept-Encoding  这个看起来是接受那些压缩方式的文件

Accept-Lanague   告诉服务器可以发送哪些语言

Connection       告诉服务器支持keep-alive特性

Cookie           每次请求时都会携带上Cookie以方便服务器端识别是不是同一个客户端

Host             用来标识请求服务器上的那个虚拟主机,好比Nginx里面能够定义不少个虚拟主机

                 那这里就是用来标识要访问那个虚拟主机。

User-Agent       用户代理,通常状况是浏览器,也有其余类型,如:wget curl 搜索引擎的蜘蛛等     

 

条件请求首部:If-Modified-Since 是浏览器向服务器端询问某个资源文件若是自从什么时间修改过,那么从新发给我,这样就保证服务器端资源

             文件更新时,浏览器再次去请求,而不是使用缓存中的文件

安全请求首部:

Authorization: 客户端提供给服务器的认证信息;

Chrome浏览器看到的响应头信息举例

字段含义说明

Connection            使用keep-alive特性

Content-Encoding      使用gzip方式对资源压缩

Content-type          MIME类型为html类型,字符集是 UTF-8

Date                  响应的日期

Server                使用的WEB服务器

Transfer-Encoding:chunked   分块传输编码 是http中的一种数据传输机制,容许HTTP由网页服务器发送给客户端应用(一般是网页浏览器)的数据能够分红多个部分,分块传输编码只在HTTP协议1.1版本(HTTP/1.1)中提供

Vary  这个能够参考(http://blog.csdn.net/tenfyguo/article/details/5939000)

X-Pingback  参考(http://blog.sina.com.cn/s/blog_bb80041c0101fmfz.html)

相关文章
相关标签/搜索