文章目录
大三上学期学过计算机网络,只记得三次握手,四次握手…概念都忘完了,在复习一遍吧为找工作打好基础。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
主要特点
1、简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
2、灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
3.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
4.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
5、支持B/S及C/S模式。
URL
URL,全称是UniformResourceLocator, 中文叫统一资源定位符,是互联网上用来标识某一处资源的地址。以下面这个URL为例,介绍下普通URL的各部分组成:
http://www.aspxfans.com:8080/news/index.asp?boardID=5&ID=24618&page=1#name
http:/ https: | 协议部分,代表网页使用的是HTTP协议。在Internet中可以使用多种协议,如HTTP,FTP,GIT等等本例中使用的是HTTP协议。在"HTTP"后面的“//”为分隔符 |
---|---|
// | 在"HTTP"后面的“//”为分隔符 |
www.aspxfans.com | 域名部分,一个URL中,也可以使用IP地址作为域名使用 |
: | 域名和端口之间使用“:”作为分隔符 |
8080 | 端口部分,端口不是一个URL必须的部分,如果省略端口部分,将采用默认端口 |
/news/ | 虚拟目录部分,从域名后的第一个“/”开始到最后一个“/”为止 |
index.asp | 文件名部分,从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。文件名部分也不是一个URL必须的部分,如果省略该部分,则使用默认的文件名 |
? | 分隔符,代表后面是参数 |
boardID=5&ID=24618&page=1 | 参数部分 |
#name | 锚部分,从“#”开始到最后,都是锚部分,本例中的锚部分是“name”。锚部分也不是一个URL必须的部分 |
请求-响应模型
HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型。HTTP是一个无状态的协议。
跨域
当一个请求url的协议、域名、端口三者之间任意一与当前页面地址不同即为跨域。
HTTP 缓存Cache-Control头域
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消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。
Cache-Control: no-cache:这个很容易让人产生误解,使人误以为是响应不被缓存。实际上Cache-Control:no-cache是会被缓存的,只不过每次在向客户端(浏览器)提供响应数据时,缓存都要向服务器评估缓存响应的有效性。
Cache-Control: no-store:这个才是响应不被缓存的意思
HTTP 缓存 ETAG 和 Last-Modified 资源验证
缓存是如何操作的:
浏览器创建了一个请求,首先到达的地方是本地缓存(这个是前提是你开启 Cache-Control 缓存), 如果命中,就直接返回给浏览器,如果没有命中 就会往互联网进行发送,在发送过程中有可能进入代理缓存,如果命中 经过本地缓存返回给浏览器,如果没有命中才会真正到源服务器,这个就是从浏览器发出一个请求到查找缓存的一个过程。
本地缓存文件通常是有过期时间(Http协议头中的expire字段)的,一旦过期,需要从新向服务端发起请求,此时通常会有两种情况:
- 服务器的文件或者内容没有更新,可以继续使用浏览器本地缓存
- 服务器的文件或者内容已经更新,需要重新请求,通过网络传输新的文件或者内容
如何判断文件的内容是否过期,可以通过HTTP协议来控制。请求服务器时,比对Last-Modified或Etag来判断内容是否发生变化,它们都是上一次请求是服务端生成并返回给浏览器的,缓存过期后再次请求时,会把它们包含在HTTP请求中和服务端进行比对,如果比对一致,说明内容没有变更,服务器会返回 304 Not Modified,否则重新发起资源请求,这样的话,就不需要每次访问服务器都通过网络传输一个比较大的文件或者数据包,只要简单的http应答就可以达到相同的请求文件效
什么是Last-Modified
在浏览器第一次请求某一个URL时,服务器端的返回状态会是200,内容是你请求的资源,同时有一个Last-Modified的属性标记此文件在服务期端最后被修改的时间,格式类似这样:
Last-Modified: Fri, 12 May 2006 18:53:33 GMT
客户端第二次请求此URL时,根据 HTTP 协议的规定,浏览器会向服务器传送 If-Modified-Since 报头,询问该时间之后文件是否有被修改过:
If-Modified-Since: Fri, 12 May 2006 18:53:33 GMT
如果服务器端的资源没有变化,则自动返回 HTTP 304 (Not Changed.)状态码,内容为空,这样就节省了传输数据量。 当服务器端代码发生改变或者重启服务器时,则重新发出资源,返回和第一次请求时类似。从而保证不向客户端重复发出资源,也保证当服务器有变化时,客户端能 够得到最新的资源。
Last-Modified和Etags如何帮助提高性能?
聪明的开发者会把Last-Modified 和ETags请求的http报头一起使用,这样可利用客户端(例如浏览器)的缓存。因为服 务器首先产生 Last-Modified/Etag标记,服务器可在稍后使用它来判断页面是否已经被修改。本质上,客户端通过将该记号传回服务器要求服 务器验证其(客户端)缓存。
-
客户端请求一个页面(A)。 服务器返回页面A,并在给A加上一个Last-Modified/ETag。
-
客户端展现该页面,并将页面连同Last-Modified/ETag一起缓存。
-
客户再次请求页面A,并将上次请求时服务器返回的Last-Modified/ETag一起传递给服务器。
-
服务器检查该Last-Modified或ETag,并判断出该页面自上次客户端请求之后还未被修改,直接返回响应304和一个空的响应体。
HTTPS
HTTP协议传输的数据都是未加密的,也就是明文的,因此使用HTTP协议传输隐私信息非常不安全
HTTPS是以安全为目标的HTTP通道,简单讲是HTTP的安全版,即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
HTTP之响应消息Response
一般情况下,服务器接收并处理客户端发过来的请求后会返回一个HTTP的响应消息。
HTTP响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
第一部分:状态行,由HTTP协议版本号, 状态码, 状态消息 三部分组成。
第一行为状态行,(HTTP/1.1)表明HTTP版本为1.1版本,状态码为200,状态消息为(ok)
第二部分:消息报头,用来说明客户端要使用的一些附加信息
第二行和第三行为消息报头,
Date:生成响应的日期和时间;Content-Type:指定了MIME类型的HTML(text/html),编码类型是UTF-8
第三部分:空行,消息报头后面的空行是必须的
第四部分:响应正文,服务器返回给客户端的文本信息。
空行后面的html部分为响应正文。
HTTP之状态码
- 200 OK //客户端请求成功
- 400 Bad Request //客户端请求有语法错误,不能被服务器所理解
- 401 Unauthorized
//请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 - 403 Forbidden //服务器收到请求,但是拒绝提供服务
- 404 Not Found //请求资源不存在,eg:输入了错误的URL
- 500 Internal Server Error //服务器发生不可预期的错误
- 503 Server Unavailable //服务器当前不能处理客户端的请求,一段时间后可能恢复正常
更多参考
https://www.runoob.com/http/http-status-codes.html
HTTP请求方法
根据HTTP标准,HTTP请求可以使用多种请求方法。
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
GET
请求指定的页面信息,并返回实体主体。 HEAD 类似于get请求,只不过返回的响应中没有具体的内容,用于获取报头
POST
向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。
POST
请求可能会导致新的资源的建立和/或已有资源的修改。
PUT
从客户端向服务器传送的数据取代指定的文档的内容。 DELETE
请求服务器删除指定的页面。
CONNECT
HTTP/1.1协议中预留给能够将连接改为管道方式的代理服务器。
OPTIONS
允许客户端查看服务器的性能。 TRACE
回显服务器收到的请求,主要用于测试或诊断。
GET和POST请求的区别
- GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456.
POST方法是把提交的数据放在HTTP包的Body中. - GET提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制.
- GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
- GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码.
参考文章
一篇比较全的HTTP协议详解
做为前端开发者,你应该要懂的 http协议
URL详解
关于 HTTP 协议,一篇就够了
面试官问到三次握手,我甩出这张脑图,他服了!