Http协议是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器端模型,是一个无状态的协议。
http协议一般承载于tcp协议之上,有时也承载于tls或ssl协议层之上,这就造成了https。http协议端口是80,https协议端口443.
Web服务器、浏览器、代理服务器:
当咱们输入url后,浏览器就会给web服务器发送一个Request,web服务器接收到Request后进行处理,生成相应的Response而后发送给浏览器,浏览器解析Response中的html,这样咱们就看到了网页。
咱们的Request也有可能通过了代理服务器,最后才到达web服务器。其主要功能以下:
(1)提升访问速度,大多的代理服务器都有缓存功能。
(2)突破限制,也就是FQ了。
(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:valuehtml
Optional request bodyweb
(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。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。tcp
好了,以上基本是看资料学习的总结。若是有什么不对的地方,欢迎指正。
本文系博主原创,转载请标明出处。