Http、url
HTTP 简介
HTTP协议是Hyper Text Transfer Protocol(
超文本传输协议
)的缩写,是一个简单的请求-响应协议,它通常运行在TCP之上。它指定了客户端可能发送给服务器什么样的消息以及得到什么样的响应。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
工作原理
HTTP协议工作于客户端-服务端(CS)架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
Web服务器根据接收到的请求后,向客户端发送响应信息。
HTTP 状态码
分类 分类描述
1** 信息,服务器收到请求,需要请求者继续执行操作
2** 成功,操作被成功接收并处理
3** 重定向,需要进一步的操作以完成请求
4** 客户端错误,请求包含语法错误或无法完成请求
5** 服务器错误,服务器在处理请求的过程中发生了错误
信息响应(100–199),成功响应(200–299),重定向(300–399),客户端错误(400–499)和服务器错误 (500–599)
下面是常见的 HTTP 状态码:
-
200 - 请求成功
-
301 - 资源(网页等)被永久转移到其它URL
-
404 - 请求的资源(网页等)不存在
-
500 - 内部服务器错误
100 (继续)客户端应继续其请求
200 (请求成功)一般用于GET与POST请求
301 (永久移动)请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替
302 (临时移动)与301类似。但资源只是临时被移动。客户端应继续使用原有URI
400 (错误请求) 服务器不理解请求的语法。
401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
403 (禁止) 服务器拒绝请求。
404 (未找到) 服务器找不到请求的网页。
405 (方法禁用) 禁用请求中指定的方法。
406 (不接受) 无法使用请求的内容特性响应请求的网页。
407 (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
408 (请求超时) 服务器等候请求时发生超时。
409 (冲突) 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。
410 (已删除) 如果请求的资源已永久删除,服务器就会返回此响应。
411 (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。
412 (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。
413 (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
414 (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。
415 (不支持的媒体类型) 请求的格式不受请求页面的支持。
416 (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。
417 (未满足期望值) 服务器未满足”期望”请求标头字段的要求。
500 服务器内部错误,无法完成请求
502 (错误网关)作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应
503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。
HTTP三点注意事项:
-
HTTP是媒体独立的:这意味着,只要
客户端和服务器
-
在
HTTP/1.0
中,默认使用的是
短连接
。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。 -
但从
HTTP/1.1起
,默认使用
长连接
,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这行代码:Connection:keep-alive -
在使用长连接的情况下,
当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭
,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。
Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间
。实现长连接要客户端和服务端都支持长连接。
http1.1以后是长连接
目前是长连接的
在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,客户端再次访问这个服务器时,会继续使用这一条已经建立的连接
- 知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
HTTP 1.X是无状态的
- HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP 内容类型 content-type
较为常见的如下:
-
application/octet-stream
: 二进制流数据(如常见的文件下载) -
application/x-www-form-urlencoded
: 中默认的encType,form表单数据被编码为key/value格式发送到服务器(表单默认的提交数据的格式)
比如,name=java&age = 23
另外一种常见的媒体格式是上传文件之时使用的:
-
multipart/form-data
: 需要在表单中进行文件上传时,就需要使用该格式
multipart/form-data既可以上传文件,也可以上传键值对,它采用了键值对的方式,所以可以上传多个文件
-
application/json
: JSON数据格式
客户端请求消息
客户端发送一个HTTP请求到服务器的请求消息包括以下格式:
请求行(request line)、请求头部(header)、空行和请求数据
四个部分组成。
下图给出了请求报文的一般格式:
请求头部
Host:接受请求的服务器地址,IP或者域名
User-Agent:发送请求的应用名称
Connection:指定与连接相关的属性,如Keep_Alive,长连接
Accept-Charset:通知服务器端可以发送的字符集
Accept-Encoding:通知服务器端可以发送的编码方式
Accept-Language:通知服务器端可以发送的语言
服务器响应消息
HTTP响应也由四个部分组成,分别是:
状态行、消息报头、空行和响应正文
。
状态行由HTTP协议版本字段、状态码字段和状态码描述字段3个字段组成,用空格分开
响应头部
Server:服务器应用软件的名称和版本
Content-Type:响应正文的类型
Content-Length:响应正文的长度
Content-Charset:响应正文所使用的字符集
Content-Encoding:响应正文使用的数据编码格式
Content-Language:响应正文使用的语言
一个URL请求的过程是怎样的
https://baike.baidu.com/item/BS%E6%9E%B6%E6%9E%84/1297196?fr=aladdin
一个完整的URL包括:协议部分、域名部分、端口部分、虚拟目录部分、文件名部分、参数部分、锚部分
一级域名(顶级域名) www.qq.com
二级域名 sports.qq.com
三级域名 kbs.sports.qq.com
浏览器的缓存机制
这里将浏览器机制放在第一步是考虑如果浏览器中有了缓存数据,浏览器再次向目标URL发送请求时,在数据不过期的情况下,会直接使用浏览器缓存的数据,而不需要向服务端请求。
浏览器和服务器的通信方式是应答方式,即 浏览器发起HTTP请求 – 服务器响应该请求 。
- 当我们在浏览器地址栏上输入要访问的URL后,浏览器会分析出URL上面的域名,然后通过DNS服务器查询出域名映射的IP地址,浏览器根据查询到的IP地址与Web服务器进行通信,而通信的协议就是HTTP协议。浏览器第一次向服务器发起该请求后拿到请求结果,会根据响应报文中的HTTP头的缓存标识,决定是否缓存结果,是则将请求结果和缓存标识存入浏览器缓存中
DNS域名解析
我们知道互联网都是通过URL来发布和请求资源的,而URL中的域名需要解析成IP地址才能与远程主机建立连接,如何将域名解析成IP地址就属于DNS解析的工作范畴。
DNS(Domain Name System)是域名系统的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是将主机名和域名转换为IP地址的工作
DNS在区域传输的时候使用TCP协议,其他时候使用UDP协议。
TCP连接
在浏览器发送HTTP请求之前,需要在浏览器和服务器之间建立一条TCP/IP连接。每一条TCP连接唯一地被通信两端的两个端点(即两个套接字)所确定,TCP连接的端点叫做套接字(socket)。根据RFC 793的定义,端口号拼接到IP地址即构成了套接字。而一次TCP连接主要分为建立连接(三次握手),数据传输,断开连接(四次挥手)。
在编程中.一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。
Http请求方法
- GET 请求指定的页面信息,并返回实体主体。
- HEAD 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头
- POST 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。
- PUT 从客户端向服务器传送的数据取代指定的文档的内容。
- DELETE 请求服务器删除指定的页面。
- CONNECT HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。
- OPTIONS 允许客户端查看服务器的性能。
- TRACE 回显服务器收到的请求,主要用于测试或诊断。
- PATCH 是对 PUT 方法的补充,用来对已知资源进行局部更新 。
方法间的区别
-
POST是用来提交数据的。提交的数据会被放在HTTP请求的正文里,用于向服务器提交数据。
-
PUT操作是幂等的。
所谓幂等是指不管进行多少次操作,结果都一样
。
POST和PUT的区别
创建操作可以使用POST,也可以使用PUT,区别在于POST 是作用在一个集合资源之上的(/articles),而PUT操作是作用在一个具体资源之上的(/articles/123),再通俗点说,如果URL可以在客户端确定,那么就使用PUT,如果是在服务端确定,那么就使用POST,比如说很多资源使用数据库自增主键作为标识信息,而创建的资源的标识信息到底是什么只能由服务端提供,这个时候就必须使用POST。
GET和POST的区别:
1、GET参数通过URL传递,POST放在Request body中。
2、GET请求会被浏览器主动cache,而POST不会,除非手动设置。
3、GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
4、Get 请求中有非 ASCII 字符,会在请求之前进行转码,POST不用,因为POST在Request body中,通过 MIME,也就可以传输非 ASCII 字符。
5、 一般我们在浏览器输入一个网址访问网站都是GET请求
6、HTTP的底层是TCP/IP。HTTP只是个行为准则,而TCP才是GET和POST怎么实现的基本。GET/POST都是TCP链接。GET和POST能做的事情是一样一样的。但是请求的数据量太大对浏览器和服务器都是很大负担。所以业界有了不成文规定,(大多数)浏览器通常都会限制url长度在2K个字节,而(大多数)服务器最多处理64K大小的url。
这个限制是特定的浏览器及服务器对他的限制
7、GET产生一个TCP数据包;POST产生两个TCP数据包。对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。
8、在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。但并
不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次
。
Http与Https的区别
HTTP协议以明文方式发送内容,不提供任何方式的数据加密,HTTP协议不适合传输一些敏感信息
HTTPS在HTTP的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密
http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443
HTTPS协议握手阶段比较费时,会使页面的加载时间延长近50%,增加10%到20%的耗电;
HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响;