Http协议详解

Http协议是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器端模型,是一个无状态的协议。
http协议通常承载于tcp协议之上,有时也承载于tls或ssl协议层之上,这就形成了https。http协议端口是80,https协议端口443.
Web服务器、浏览器、代理服务器:
  当我们输入url后,浏览器就会给web服务器发送一个Request,web服务器接收到Request后进行处理,生成相应的Response然后发送给浏览器,浏览器解析Response中的html,这样我们就看到了网页。
我们的Request也有可能经过了代理服务器,最后才到达web服务器。其主要功能如下:
(1)提高访问速度,大多的代理服务器都有缓存功能。
(2)突破限制,也就是翻墙了。
(3)隐藏身份。
URL详解:
URL地址用于描述一个网络上的资源,其格式如下:
schema://host[:port#]/path/.../[;url-params][?query-string][#anchor]
schema:指定低层使用的协议(例如http,https,ftp)
host:http服务器的ip地址或域名
port#:http服务器的默认端口是80,这种情况下端口号可以省略。如果使用了别的端口则必须指明。
path:访问资源的路径。
url-params:
query-string:发送给服务器的数据。
http协议是无状态的,同一客户端的这次请求和上次请求是没有对应关系的,对http服务器来说,它并不知道两个请求来自
同一个客户端。为了解决这个问题,web应用程序引入了cookie机制来维护状态。
消息结构:
Request:分为3部分。第一部分叫做请求行,第二部分叫做http header,第三部分是body,header和body之间有个空行。
METHOD/path-to-resource HTTP/Version-number
Header-Name-1:value
Header-Name-2:value

Optional request body

(1)METHOD表示请求方法,如“post”,“get”。
(2)path-to-resource表示请求的资源。
(3)HTTP/Version-number表示http协议的版本号。

Response:分为3部分,第一部分叫做request line,第二部分叫做request header,第三部分是body,header和body之间空行
HTTP/Version-number status code message
Header-Name-1:value
Header-Name-2:value

Optional request body

(1)http/version-number表示http协议的版本号
(2)status code状态码
(3)message状态信息

get和post的区别:
  1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中(所以get方式下body为空).
   2. GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
   3. GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
   4. GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.

状态码:
http1.1定义了5中状态码:
  1xx:提示信息,表示请求已被成功接收,继续处理。
  2xx:成功,表示请求已被成功接收,理解,接收。
  3xx:重定向,要完成请求必须更进一步的处理。重定向状态码用来告诉 浏览器客户端,他们访问的资源已被移动,web服务器会发送一个重定向状态码和一个可选的Location Header,告诉客户端新的资源地址在哪。浏览器客户端会自动用Location中提供的地址,重新发送新的Request。
  4xx:客户端错误,请求有语法错误或请求无法完成。
  5xx:服务器端错误,服务器未能实现合法的请求。
常见状态码:
  200 ok:表示该请求被成功的接受并完成,所请求的资源发回到客户端。
  302 Found:这里的移除是临时的,客户端会使用Location中给出的URL,重新发送新的http Request。
  304 Not Modified:表示上次请求的文档缓存是最新的,即请求的文档没有发生变化,直接使用客户端缓存。
  如果不想使用本地缓存,可使用Ctrl+F5强制刷新页面。
  400 Bad Request:发送的Request中的数据有错误(表单有错误,cookie错误)。客户端请求有语法错误,不能被服务器端所理解。
  403 Forbidden:服务器收到请求,但是拒绝提供服务。
  404 Not Found:请求的资源不存在。
  500 Internal Server Error:服务器发生了不可预期的错误,无法为请求提供服务。
  503 Service Unavailable:服务器目前无法为请求提供服务,但多一段时间就可以恢复。

http Request Header:
Cache头域:
  (1)If-Modified-Since:将浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间和服务器上实际文件的最后修改时间作比较,如果时间一致,那么返回304(Not Modified),客户端直接使用本地缓存文件。如果不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT 该时间回和Response Header中Entity中的Last-Modified: Web,Thu, 09 Feb 2012 09:07:57 GMT 作比较,相同时返回304,直接使用客户端缓存。
  (2)if-None-Match:if-None-Match和ETag一起工作,工作原理是在Http Response中添加ETag信息。当用户再次请求该资源时,将在Http Request中加入if-None-Match信息,服务器将会验证if-None-Match的值和ETag的值,并作比较,如果值一样,表示资源没有更新,则返回304,直接使用本地缓存资源。否则返回200和新的内容,并重新进行缓存。

  (3)Pragma:防止页面被缓存。
  (4)Cache-Control:用来指定请求和响应所遵循的缓存机制。Cache-Control:no-cache表示所有内容都不会被缓存。
Client头域:
  (1)Accept:浏览器可以接受的媒体类型。例如:Accept:text/html表示浏览器接收服务器发回的类型为text/html也就是我们常说的html文档。Accept:*/*表示浏览器可以处理所有类型(最常用)。
  (2)Accept-Encoding:浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩。例如:Accept-Encoding:gzip,deflate。
  (3)Accept-Language:浏览器申明自己接收的语言。例如:Accept-Language:en-us。
  (4)User-Agent:告诉http服务器,客户端使用的操作系统和浏览器的名称及版本号。
  (5)Accept-Charset:浏览器 申明自己接收的字符集,如gb2312,urf-8.
Cookie/Login头域:最重要的Header,将cookie的值发送给HTTP服务器。
Entity头域:
  (1)Content-length:发送给http服务器的数据长度。例如:Content-Length:38.
  (2)Content-type:
Transport头域:
  (1)Connection:Keep-Alive表示当一个网页打开完成后,客户端和服务器端的tcp连接不会关闭。当再次请求时就使用这个已建立的连接。
  (2)Host:请求报头域主要用于指定被请求资源的Internet主机和端口号。

http Response Header:
Cache头域:
  (1)Data:生成消息的具体日期和时间。
  (2)Expires:浏览器会在指定过期时间内使用本地缓存。
Cookie/Login头域:
  (1)P3P:用于跨域设置cookie,这样可以解决iframe跨域访问cookie的问题。
  (2)Set-Cookie:用于把cookie发送到客户端浏览器,每一个写入cookie都会生成一个set-cookie。

其它基本都和请求头没有区别。

HTTP Keep-Alive作用:
  Keep-Alive使得客户端到服务器端的连接持续有效,当出现对服务器端的后续请求时,Keep-Alive避免了重新建立连接,而直接使用已建立的连接。
  缺点:在处理暂停期间本来可以释放的资源仍然被占用。
  几个参数:Keep-Alive timeout=5,max=100
  timeout:过期时间为5秒。max:最多请求一百次后强制断开连接。
  http1.0:在http1.0中默认关闭Keep-Alive。如果客户端浏览器支持Keep-Alive,则在http请求头中加一个Conntion:Keep-Alive,当
  服务器收到带有Conntion:Keep-Alive的请求时,它会在响应头中加上Conntion:Keep-Alive,以使得客户端和服务器端的连接
  被保持。当客户端发送另外一个请求时,就是用已有的连接。
  http1.1:在http1.1中默认开启Keep-Alive,则所有连接都被保持,除非在请求头或响应头中指明要关闭:Connection:close。

好了,以上基本是看资料学习的总结。如果有什么不对的地方,欢迎指正。

本文系博主原创,转载请标明出处。

原文地址:https://www.cnblogs.com/WuNaiHuaLuo/p/5616067.html