HTTP笔记
#http-code
http协议(超文本传输协议)
是客户端和服务器端两者通信共同遵循的一些规则。主要内容是定义了客户端如何向服务器请求资源,服务器如何响应客户端请求。
请求中的POST
与GET
方法的区别
- get是从服务器上获取数据,post是向服务器传送数据。
- 在客户端,Get方式在通过URL提交数据,数据在URL中可以看到;POST方式,数据放置在HTML HEADER内提交。
- 对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据。
- GET方式提交的数据最多只能有1024字节,而POST则没有此限制。
- 安全性问题。正如在(1)中提到,使用 GET 的时候,参数会显示在地址栏上,而 Post 不会。所以,如果这些数据是中文数据而且是非敏感数据,那么使用 GET;如果用户输入的数据不是中文字符而且包含敏感数据,那么还是使用 post为好。
HTTP 1.0
HTTP 1.0
规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP
连接,服务器完成请求处理后立即断开TCP
连接
当一个网页文件中包含了很多图像的地址的时候,那就需要很多次的HTTP
请求和响应,每次请求和响应都需要一个单独的连接,每次连接只是传输一个文档和图像,上一次和下一次请求完全分离。即使图像文件都很小,但是客户端和服务器端每次建立和关闭连接却是一个相对比较费时的过程,并且会严重影响客户机和服务器的性能。当一个网页文件中包含JS
文件,CSS
文件等内容时,也会出现类似上述的情况。
HTTP 1.1
为了克服HTTP 1.0
的这个缺陷,HTTP 1.1
支持持久连接(HTTP/1.1
的默认模式使用带流水线的持久连接),在一个TCP
连接上可以传送多个HTTP
请求和响应,减少了建立和关闭连接的消耗和延迟。一个包含有许多图像的网页文件的多个请求和应答可以在一个连接中传输,但每个单独的网页文件的请求和应答仍然需要使用各自的连接。
HTTP 1.1
还允许客户端不用等待上一次请求结果返回,就可以发出下一次请求,但服务器端必须按照接收到客户端请求的先后顺序依次回送响应结果,以保证客户端能够区分出每次请求的响应内容,这样也显著地减少了整个下载过程所需要的时间。
在HTTP 1.1
,request
和response
头中都有可能出现一个connection
的头,此header
的含义是当client
和server
通信时对于长链接如何进行处理。
在HTTP 1.1
中,client
和server
都是默认对方支持长链接的, 如果client
使用HTTP 1.1
协议,但又不希望使用长链接,则需要在header
中指明connection
的值为close
;如果server
方也不想支持长链接,则在response
中也需要明确说明connection
的值为close
。不论request
还是response
的header
中包含了值为close
的connection
,都表明当前正在使用的tcp
链接在当天请求处理完毕后会被断掉。以后client
再进行新的请求时就必须创建新的tcp
链接了。
HTTP 1.1
在继承了HTTP 1.0
优点的基础上,也克服了HTTP 1.0
的性能问题。
HTTP 1.1
通过增加更多的请求头和响应头来改进和扩充HTTP 1.0
的功能。如,HTTP 1.0
不支持Host
请求头字段,浏览器无法使用主机头名来明确表示要访问服务器上的哪个WEB站点,这样就无法使用WEB服务器在同一个IP地址和端口号上配置多个虚拟WEB站点。在HTTP 1.1
中增加Host
请求头字段后,WEB浏览器可以使用主机头名来明确表示要访问服务器上的哪个WEB站点,这才实现了在一台WEB服务器上可以在同一个IP地址和端口号上使用不同的主机名来创建多个虚拟WEB站点。HTTP 1.1
的持续连接,也需要增加新的请求头来帮助实现,例如,Connection
请求头的值为Keep-Alive
时,客户端通知服务器返回本次请求结果后保持连接;Connection
请求头的值为close
时,客户端通知服务器返回本次请求结果后关闭连接。HTTP 1.1
还提供了与身份认证、状态管理和Cache
缓存等机制相关的请求头和响应头。HTTP 1.0
不支持文件断点续传,RANGE:bytes是HTTP 1.1
新增内容,HTTP 1.0
每次传送文件都是从文件头开始,即0字节处开始。RANGE:bytes=XXXX表示要求服务器从文件XXXX字节处开始传送,这就是我们平时所说的断点续传。
HTTP 1.1和HTTP 1.0协议的区别
- 缓存处理
- 带宽优化及网络连接的使用
- 错误通知的管理
- 消息在网络中的发送
- 互联网地址的维护
- 安全性及完整性
HTTP 1.x和HTTP 2协议的区别
- 二进制分帧:
HTTP 2
采用二进制格式传输数据,而非HTTP 1.x
的文本格式 - 头部压缩:头部表在
HTTP 2
的连接存续期内始终存在,由客户端和服务器共同渐进地更新。请求一发送了所有的头部字段,第二个请求则只需要发送差异数据,这样可以减少冗余数据,降低开销 - 多路复用:直白的说就是所有的请求都是通过一个
TCP
连接并发完成。HTTP 1.x
虽然通过pipeline
也能并发请求,但是多个请求之间的响应会被阻塞的,所以pipeline
至今也没有被普及应用,而HTTP 2
做到了真正的并发请求。同时,流还支持优先级和流量控制。 - 服务器推送:服务端能够更快的把资源推送给客户端。例如服务端可以主动把JS和CSS文件推送给客户端,而不需要客户端解析HTML再发送这些请求。当客户端需要的时候,它已经在客户端了。
HTTP 2
主要是HTTP 1.x
在底层传输机制上的完全重构,HTTP 2
是基本兼容HTTP 1.x
的语义。Content-Type
仍然是Content-Type
,只不过它不再是文本传输了。
HTTP和HTTPS协议的区别
HTTP
的URL
以http://
开头,而HTTPS的URL
以https://
开头HTTP
是不安全的,而HTTPS
是安全的HTTP
标准端口是80
,而HTTPS
的标准端口是443
- 在
OSI
网络模型中,HTTP
工作于应用层,而HTTPS
的安全传输机制工作在传输层 HTTP
无法加密,而HTTPS
对传输的数据进行加密HTTP
无需证书,而HTTPS
需要CA
机构颁发的SSL证书
常用的请求方式
- GET:请求获取Request-URI所标识的资源
- POST:在Request-URI所标识的资源后附加新的数据
- HEAD:请求获取由Request-URI所标识的资源的响应消息报头
- PUT:请求服务器存储一个资源,并用Request-URI作为其标识
- DELETE:请求服务器删除Request-URI所标识的资源
- TRACE:请求服务器回送收到的请求信息,主要用于测试或诊断
- CONNECT:保留将来使用
- OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和需求
GET方法:在浏览器的地址栏中输入网址的方式访问网页时,浏览器采用GET方法向服务器获取资源,POST方法要求被请求服务器接受附在请求后面的数据,常用于提交表单。GET是用于获取数据的,POST一般用于将数据发给服务器之用。
HTTP响应状态码
- 1XX:信息性状态码
- 2XX:成功状态码
- 3XX:重定向状态码
- 4XX:客户端错误状态码
- 5XX:服务端错误状态码
常见的状态码
2XX
- 200:表示从客户端发出的请求在服务端正常被处理且返回
- 204:表示服务器接收的请求已成功处理,但在返回的响应报文中不含实体的主体部分。比如,当从浏览器发出请求处理后,返回204响应,那么浏览器显示的页面不发生更新
- 206:该状态码表示客户端进行了范围请求,而服务器成功执行了这部分的GET请求
3XX
- 301:永久性重定向。该状态码表示请求的资源已经被分配了新的URI,以后应使用资源现在所指的URI。 当指定的资源路径的最后忘记添加斜杠"/",就会产生301状态码
- 302:临时性重定向。该状态码表示请求的资源已被分配了新的URI,希望用户(本次)能使用新的URI访问
- 303:该状态码表示由于请求对应的资源存在另外一个URI,应使用GET方法定向获取请求的资源。 303状态码和302状态码有着相同的功能,但303状态码明确表明客户端应当采用GET方法获取资源。 当301,302,303响应状态码返回时,几乎所有的浏览器都会把POST改成GET,并删除请求报文的主体,之后请求会自动再次发送。 301,302标准是禁止将POST方法改变成GET方法的,但实际上使用时大家都会这么做。
- 304:该状态码表示客户端发送附带条件的请求时,服务器端允许请求访问资源,但未满足条件的情况。304状态码返回时,不包含任何响应的主体部分。304虽然被划分在3XX类别中,但是和重定向没有关系
- 307:临时重定向。该状态码与302 Found有着相同的含义。307会遵照浏览器标准,不会从POST变成GET
4XX
- 400:该状态码表示请求报文中存在语法错误。当错误发生时,需要修改请求的内容后再次放松请求
- 401:该状态码表示发送的请求需要有通过HTTP认证的认证信息,另外若之前已进行过1此请求,则表示用户认证失败
- 403:该状态码表明对请求资源的访问被服务器拒绝了
- 404:该状态码表明服务器上无法找到请求的资源
5XX
- 500:该状态码表明服务器端在执行请求时发生了错误
- 503:该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求