HTTP详解
一.一次简单HTTP 会话。
大家都知道HTTP 是基于TCP协议之上的,那么是不是HTTP一定得基于TCP呢?
不是,HTTP 要求的是建立在一个稳定的链接上,不管是TCP 还是UDP。
物理硬件将数据包以帧的形式发送
看图,我们一次请求的时候,会将请求封装成http数据包,然后封装成Tcp数据包,再封装成Ip数据包, 通过物理硬件(网卡芯片)发生到指定地点,收到方先发现收到的是个ip数据包,所以通过ip协议解析Ip数据包,然后又发现里面是tcp数据包,就通过tcp协议解析Tcp数据包,接着发现是http数据包通过http协议再解析http数据包得到数据。
那么这么一个过程,对整体的协议有了一个认识, 那么什么是http协议,tcp协议,ip协议 甚至是udp协议呢?
百科上面有解释: http协议是超文本传输协议,这个解释对于很少接触网络的人怎么理解呢?? 又是超文本 ,又是协议的,这些专业名称。 我不善言辞,但是我通过普通的方式去理解,但是我知道设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。说白了,它其实就是一种请求与响应协议,那么什么是请求,什么是响应?
(一).请求(Requset)
发出的请求信息包括以下几个(请求行,请求头标,空行,请求数据)
1.请求行:例如上图: POST /JS3/SERVICE_BACK…. HTTP/1.1 \r\n
请求行里面主要包括 请求方法, 请求url 已经http版本号
1).请求方法:
HTTP/1.1协议中共定义了八种方法(有时也叫“动作”)来表明Request-URI指定的资源的不同操作方式:
OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。
HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
GET:向特定的资源发出请求。
POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。
PUT:向指定资源位置上传其最新内容。
DELETE:请求服务器删除Request-URI所标识的资源。
TRACE:回显服务器收到的请求,主要用于测试或诊断。
CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
2.请求头标:由关键字/值对组成,每行一对,关键字和值用冒号(:)分隔。请求头标通知服务器有关于客户端的功能和标识,典型的请求头标有:
User-Agent 客户端厂家和版本
Accept 客户端可识别的内容类型列表
Content-Length 附加到请求的数据字节数
在HTTP/1.1协议中,所有的请求头,除Host外,都是可选的。
3.空行:最后一个请求头标之后是一个空行,发送回车符和退行,通知服务器以下不再有头标。
4.请求数据:使用POST传送数据,最常使用的是Content-Type和Content-Length头标。
(二).响应(Response)
一个响应信息主要包括 状态行,响应头标,空行,响应数据
1.响应行: http版本号,状态码
1).状态码:状态代码的第一个数字代表当前响应的类型:
1xx消息——请求已被服务器接收,继续处理
2xx成功——请求已成功被服务器接收、理解、并接受
3xx重定向——需要后续操作才能完成这一请求
4xx请求错误——请求含有词法错误或者无法被执行
5xx服务器错误——服务器在处理某个正确请求时发生错误
2.响应头标:像请求头标一样,它们指出服务器的功能,标识出响应数据的细节。
3.空行
4.响应数据:HTML文档和图像等,也就是HTML本身。如上图由Content-length 和Content-type标识
了解了 http之后,又需要了解一些http版本之间差异:
1. Http0.9:已过时。只接受GET一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持POST方法,因此客户端无法向服务器传递太多信息
2. HTTP/1.0:这是第一个在通讯中指定版本号的HTTP协议版本,至今仍被广泛采用,特别是在代理服务器中。
3. HTTP/1.1:当前版本。持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式在同时发送多个请求,以便降低线路负载,提高传输速度。
4. HTTP/1.1相较于HTTP/1.0协议的区别主要体现在:
缓存处理
带宽优化及网络连接的使用
错误通知的管理
消息在网络中的发送
互联网地址的维护
安全性及完整性
5. 这就是HTTP1.0和HTTP1.1的短链接和长连接图请求响应图。在Http1.0中 , 访问一个包含有许多图像的网页文件的整个过程包含了多次请求和响应,每次请求和响应都需要建立一个单独的连接,每次连接只是传输一个文档和图像,上一次和下一次请求完全分离,也就是说在性能方面都有很大的影响。
为了克服http1.0这种缺陷,HTTP 1.1支持持久连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独的网页文件的请求和应答仍然需要使用各自的连接。HTTP 1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间。
二.Session和Cookies
或许我们比较关心的是session和cookies,Session是服务器端的存储容器,Cookies是客户端存储数据容器,
Session 两种基本实现方式:
1.通过URL回显方式;
2.通过Cookies实现
如果浏览器的Cookies功能被禁止,那么就会使用URL回显方式, 及在每个url后面接jsessionid=...这样来找到服务器给客户端分配的Session来保证这是同一次会话。
服务器给每个Session分配一个唯一的JSESSIONID,并通过Cookie发送给客户端。
Cookies方式:在Cookie头中携带这个JSESSIONID。这样服务器能够找到这个客户端对应的Session。
三.缓存:
了解缓存之前先了解下刷新和输入网址后回车的区别
强制刷新(ctrl+F5):不理会缓存协商,全部重新获取.此时请求中的Cache-Control值为no-cache
刷新(F5)时:当点击浏览器上的刷新,客户端发送的请求中的Cache-Control均是max-age=0,表示validate操作,发送请求到服务器要求检查cache,再更新cache,一般得到的是304 Not Modified,表示没变动
输入网址直接回车时:如果Expired或Cache-Control还未过期,则不会返回304状态,因为浏览器已经不用向web服务器发出请求
Cache-Control 用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制),HTTP1.0使用的类似的报头域为Pragma。
Cache-Control:指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。
各个消息中的指令含义如下:
Public指示响应可被任何缓存区缓存。
Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
no-cache指示请求或响应消息不能缓存
no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
一些缓存机制:
response.setHeader('Cache-Control: max-age=8');
max-age=8表示最大生存期8秒,超过8秒浏览器必须去服务器重新读取,这个时间是以用户的读取页面开始计时的,而Expires是绝对时间。
Expires:缓存过期的绝对时间,如果过了它指定的那个时间点,浏览器就不认缓存了,要去服务器重新请求一份最新的。
Last-Modified:文档的最后修改时间,它的妙用就是:1
如果是静态文件,客户端会发上来它缓存里的时间,apache会来比对,如果发现没有修改就直接返回一个头,状态码是304,字节数非常少,(高级版本还会增加比较Etag来确定文件是否变化)
Last-modified/If-Modified-Since与Etag/If-None-Match区别
1.HTTP的Response中还会有另外一个Header叫Last-Modified,比如“Last-Modified: Thu, 06 Apr 2006 21:17:12 GMT”,浏览器访问一个URI得到这样的Resposne之后,就知道这个资源最后一次的修改时间,下次需要再次获得这个资源的时候,会发一个Request给Server,不过这个Request中有一条“If-Unmodified-Since: Thu, 06 Apr 2006 21:17:12 GMT”,如果在Server端在这个日期之后对这个资源进行了修改,就会照常返回这个资源给Client端,但是如果没有修改,就会返回一个304 (Not Modified) Response而不返回资源, 一个304 Response比一个静态资源通常小多了,这样就节省了网络带宽。
2.除了Last-Modified,HTTP Response中还可能有另外一个Header: ETag。在多台负载均衡的服务器环境下,同一个文件可能会有不同的etag或者文件修改日期,浏览器每次都会重新下载,这点要根据实际情况考虑设置。
3.比较一下Expires和Last-Modified这两个东西,似乎Last-Modified比不上Expires, 虽然它能够节省带宽,但是也需要发一个HTTP请求出去,而Expires却使得浏览器干脆连HTTP请求都不用发。不过当用户在IE或者Firefox里面按F5或者点击Refresh按钮的时候(不是在URL栏里重新输入一遍URL然后回车),就算对于有Expires的URI,一样也会发一个HTTP请求出去,所以,Last-Modified还是要用的(返回304),而且要和Expires一起用。
一.一次简单HTTP 会话。
大家都知道HTTP 是基于TCP协议之上的,那么是不是HTTP一定得基于TCP呢?
不是,HTTP 要求的是建立在一个稳定的链接上,不管是TCP 还是UDP。
![](https://i-blog.csdnimg.cn/blog_migrate/5d85dd8e63a044fe2f1b4317ac763547.jpeg)
物理硬件将数据包以帧的形式发送
看图,我们一次请求的时候,会将请求封装成http数据包,然后封装成Tcp数据包,再封装成Ip数据包, 通过物理硬件(网卡芯片)发生到指定地点,收到方先发现收到的是个ip数据包,所以通过ip协议解析Ip数据包,然后又发现里面是tcp数据包,就通过tcp协议解析Tcp数据包,接着发现是http数据包通过http协议再解析http数据包得到数据。
那么这么一个过程,对整体的协议有了一个认识, 那么什么是http协议,tcp协议,ip协议 甚至是udp协议呢?
百科上面有解释: http协议是超文本传输协议,这个解释对于很少接触网络的人怎么理解呢?? 又是超文本 ,又是协议的,这些专业名称。 我不善言辞,但是我通过普通的方式去理解,但是我知道设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。说白了,它其实就是一种请求与响应协议,那么什么是请求,什么是响应?
(一).请求(Requset)
发出的请求信息包括以下几个(请求行,请求头标,空行,请求数据)
![点击查看原始大小图片](https://i-blog.csdnimg.cn/blog_migrate/61953b9103ed30225826ebf743cf6147.jpeg)
1.请求行:例如上图: POST /JS3/SERVICE_BACK…. HTTP/1.1 \r\n
请求行里面主要包括 请求方法, 请求url 已经http版本号
1).请求方法:
HTTP/1.1协议中共定义了八种方法(有时也叫“动作”)来表明Request-URI指定的资源的不同操作方式:
OPTIONS:返回服务器针对特定资源所支持的HTTP请求方法。也可以利用向Web服务器发送'*'的请求来测试服务器的功能性。
HEAD:向服务器索要与GET请求相一致的响应,只不过响应体将不会被返回。这一方法可以在不必传输整个响应内容的情况下,就可以获取包含在响应消息头中的元信息。
GET:向特定的资源发出请求。
POST:向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST请求可能会导致新的资源的创建和/或已有资源的修改。
PUT:向指定资源位置上传其最新内容。
DELETE:请求服务器删除Request-URI所标识的资源。
TRACE:回显服务器收到的请求,主要用于测试或诊断。
CONNECT:HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
2.请求头标:由关键字/值对组成,每行一对,关键字和值用冒号(:)分隔。请求头标通知服务器有关于客户端的功能和标识,典型的请求头标有:
User-Agent 客户端厂家和版本
Accept 客户端可识别的内容类型列表
Content-Length 附加到请求的数据字节数
在HTTP/1.1协议中,所有的请求头,除Host外,都是可选的。
3.空行:最后一个请求头标之后是一个空行,发送回车符和退行,通知服务器以下不再有头标。
4.请求数据:使用POST传送数据,最常使用的是Content-Type和Content-Length头标。
(二).响应(Response)
一个响应信息主要包括 状态行,响应头标,空行,响应数据
1.响应行: http版本号,状态码
1).状态码:状态代码的第一个数字代表当前响应的类型:
1xx消息——请求已被服务器接收,继续处理
2xx成功——请求已成功被服务器接收、理解、并接受
3xx重定向——需要后续操作才能完成这一请求
4xx请求错误——请求含有词法错误或者无法被执行
5xx服务器错误——服务器在处理某个正确请求时发生错误
2.响应头标:像请求头标一样,它们指出服务器的功能,标识出响应数据的细节。
3.空行
4.响应数据:HTML文档和图像等,也就是HTML本身。如上图由Content-length 和Content-type标识
![](https://i-blog.csdnimg.cn/blog_migrate/86ccc5544c0c8a6a6f79f7be1ca62bc0.jpeg)
了解了 http之后,又需要了解一些http版本之间差异:
1. Http0.9:已过时。只接受GET一种请求方法,没有在通讯中指定版本号,且不支持请求头。由于该版本不支持POST方法,因此客户端无法向服务器传递太多信息
2. HTTP/1.0:这是第一个在通讯中指定版本号的HTTP协议版本,至今仍被广泛采用,特别是在代理服务器中。
3. HTTP/1.1:当前版本。持久连接被默认采用,并能很好地配合代理服务器工作。还支持以管道方式在同时发送多个请求,以便降低线路负载,提高传输速度。
4. HTTP/1.1相较于HTTP/1.0协议的区别主要体现在:
缓存处理
带宽优化及网络连接的使用
错误通知的管理
消息在网络中的发送
互联网地址的维护
安全性及完整性
![](https://i-blog.csdnimg.cn/blog_migrate/0f15beeeffbb51b02f395d6f2314b178.png)
5. 这就是HTTP1.0和HTTP1.1的短链接和长连接图请求响应图。在Http1.0中 , 访问一个包含有许多图像的网页文件的整个过程包含了多次请求和响应,每次请求和响应都需要建立一个单独的连接,每次连接只是传输一个文档和图像,上一次和下一次请求完全分离,也就是说在性能方面都有很大的影响。
为了克服http1.0这种缺陷,HTTP 1.1支持持久连接,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟。一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独的网页文件的请求和应答仍然需要使用各自的连接。HTTP 1.1还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间。
二.Session和Cookies
或许我们比较关心的是session和cookies,Session是服务器端的存储容器,Cookies是客户端存储数据容器,
Session 两种基本实现方式:
1.通过URL回显方式;
2.通过Cookies实现
如果浏览器的Cookies功能被禁止,那么就会使用URL回显方式, 及在每个url后面接jsessionid=...这样来找到服务器给客户端分配的Session来保证这是同一次会话。
服务器给每个Session分配一个唯一的JSESSIONID,并通过Cookie发送给客户端。
Cookies方式:在Cookie头中携带这个JSESSIONID。这样服务器能够找到这个客户端对应的Session。
三.缓存:
了解缓存之前先了解下刷新和输入网址后回车的区别
强制刷新(ctrl+F5):不理会缓存协商,全部重新获取.此时请求中的Cache-Control值为no-cache
刷新(F5)时:当点击浏览器上的刷新,客户端发送的请求中的Cache-Control均是max-age=0,表示validate操作,发送请求到服务器要求检查cache,再更新cache,一般得到的是304 Not Modified,表示没变动
输入网址直接回车时:如果Expired或Cache-Control还未过期,则不会返回304状态,因为浏览器已经不用向web服务器发出请求
Cache-Control 用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制),HTTP1.0使用的类似的报头域为Pragma。
Cache-Control:指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age。
各个消息中的指令含义如下:
Public指示响应可被任何缓存区缓存。
Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。
no-cache指示请求或响应消息不能缓存
no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。
min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
一些缓存机制:
response.setHeader('Cache-Control: max-age=8');
max-age=8表示最大生存期8秒,超过8秒浏览器必须去服务器重新读取,这个时间是以用户的读取页面开始计时的,而Expires是绝对时间。
Expires:缓存过期的绝对时间,如果过了它指定的那个时间点,浏览器就不认缓存了,要去服务器重新请求一份最新的。
Last-Modified:文档的最后修改时间,它的妙用就是:1
如果是静态文件,客户端会发上来它缓存里的时间,apache会来比对,如果发现没有修改就直接返回一个头,状态码是304,字节数非常少,(高级版本还会增加比较Etag来确定文件是否变化)
![点击查看原始大小图片](https://i-blog.csdnimg.cn/blog_migrate/fe3db360b7b29e79539a039048c55501.jpeg)
Last-modified/If-Modified-Since与Etag/If-None-Match区别
1.HTTP的Response中还会有另外一个Header叫Last-Modified,比如“Last-Modified: Thu, 06 Apr 2006 21:17:12 GMT”,浏览器访问一个URI得到这样的Resposne之后,就知道这个资源最后一次的修改时间,下次需要再次获得这个资源的时候,会发一个Request给Server,不过这个Request中有一条“If-Unmodified-Since: Thu, 06 Apr 2006 21:17:12 GMT”,如果在Server端在这个日期之后对这个资源进行了修改,就会照常返回这个资源给Client端,但是如果没有修改,就会返回一个304 (Not Modified) Response而不返回资源, 一个304 Response比一个静态资源通常小多了,这样就节省了网络带宽。
2.除了Last-Modified,HTTP Response中还可能有另外一个Header: ETag。在多台负载均衡的服务器环境下,同一个文件可能会有不同的etag或者文件修改日期,浏览器每次都会重新下载,这点要根据实际情况考虑设置。
3.比较一下Expires和Last-Modified这两个东西,似乎Last-Modified比不上Expires, 虽然它能够节省带宽,但是也需要发一个HTTP请求出去,而Expires却使得浏览器干脆连HTTP请求都不用发。不过当用户在IE或者Firefox里面按F5或者点击Refresh按钮的时候(不是在URL栏里重新输入一遍URL然后回车),就算对于有Expires的URI,一样也会发一个HTTP请求出去,所以,Last-Modified还是要用的(返回304),而且要和Expires一起用。