Day21笔记
一、HTTP超文本传输协议
- 超文本传输协议是一种通信协议,它允许将超文本标记语言(HTML)文档从WEB服务器传送到客户端的浏览器。
- HTTP是一个基于请求与响应模式的、无状态的、应用层的协议。
- HTTP使用的传输层协议为TCP协议,而网络层使用的是IP协议(当然还使用了很多其他协议),所以说HTTP是基于TCP/IP协议簇来传递数据。
二、HTTP协议的五大特点
- 支持客户/服务器模式
- 客户/服务器模式工作的方式是由客户端向服务器发出请求,服务器端响应请求,并进行相应服务。
- 简单快速
- 客户向服务器请求服务时, 只需传送请求方法和路径。
- 由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
- 灵活
- HТТР允许传输任意类型的数据对象。
- 正在传输的类型由
Content—Type
加以标记。
- 无连接
- 无连接的含义是限制每次连接只处理一个请求。
- 服务器处理完客户的请求,并收到客户的应答后,即断开连接。
- 采用这种方式可以节省传输时间。
- 无状态
- HTTP协议是无状态协议。
- 无状态指的是客户端向服务器发送请求之后,服务器仅传回响应,并不对请求做任何的保留和记忆。
- 无状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。
- 另一方面,在服务器不需要先前信息时它的应答就较快。
- 可以使用Cookie和Session机制辅助记忆。
三、URL统一资源定位符
http://www.baidu.com:80/path/index.html?key1=value1&key2=value2#SomeWhereInTheDocument
方案或协议 => http://
告诉浏览器使用何种协议,对于大部分WEB资源,通常使用HTTP协议或HTTPS协议。
Internet主机域名或IP地址 => www.baidu.com
通常我们访问一个网站,使用的是主机名或者域名来进行访问。因为相对于IP地址(一组纯数字),域名更容易让人记住。但TCP/IP协议使用的是IP地址进行访问的。DNS服务就是用来解决这个问题的,它提供域名到IP地址之间的解析服务。
端口 => :80
两个主机之间要发起 TCP 连接需要两个条件,主机 + 端口。它表示用于访问 Web 服务器上资源的入口。如果访问的该 Web 服务器使用HTTP协议的标准端口(HTTP为80,HTTPS为443)授予对其资源的访问权限,则通常省略此部分。否则端口就是 URI 必须的部分。
路径 => /path/index.html
是 WEB服务器上资源的路径。以端口后面的第一个 /
开始,到 ?
号之前结束,中间的 每一个/
都代表了层级(上下级)关系。这个 URL 的请求资源是一个 html 页面。
查询 => ?key1=value1&key2=value2
是提供给 Web 服务器的额外参数。如果是 GET 请求,一般带有请求 URL 参数,如果是 POST 请求,则不会在路径后面直接加参数。这些参数是用 & 符号分隔的键/值对
列表。key1 = value1 是第一对,key2 = value2 是第二对参数。
片段 => #SomeWhereInTheDocument
是资源本身的某一部分的一个锚点。锚点代表资源内的一种“书签”,它给予浏览器显示位于该“加书签”点的内容的指示。例如,在HTML文档上,浏览器将滚动到定义锚点的那个点上;在视频或音频文档上,浏览器将转到锚点代表的那个时间。值得注意的是 # 号后面的部分,也称为片段标识符,永远不会与请求一起发送到服务器。
四、HTTP的工作流程
- 和服务器建立链接。
- 给服务器发送请求。
- 服务器接收到请求后进行相应的处理并给出一个响应,由客户端接收响应。
- 断开与服务器的链接。
五、和服务器建立链接(三次握手)
- 三次握手其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。
- 进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常。
- 指定自己的初始化序列号为后面的可靠性传送做准备,实质上就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小的信息。
- 刚开始客户端处于Closed状态,服务器处于Listen状态。
第一次握手
客户端给服务器发送一个SYN报文,并指明客户端的初始化序列号ISN。此时客户端处于SYN_SENT状态。
第二次握手
服务器收到客户端的SYN报文后,会用自己的SYN报文作为应答,并且也指定了自己的初始化序列号ISN。同时会把客户端的ISN+1作为ACK的值,表示自己已经收到了SYN报文,此时服务器处于SYN_RCVD的状态。
第三次握手
客户端收到服务器的SYN报文后,一样会把服务器的ISN+1作为ACK的值发送给服务器,表示已经收到了服务端的SYN报文,此时客户端处于ESTABLISHED状态。
最后服务器收到ACK报文后,也会处于ESTABLISHED状态,这个时候,双方就建立起了连接。
六、给服务器发送一个请求
发送一个请求就是向目标服务器发送请求包(一串文本)。
HTTP请求包的结构
请求行
method请求方法 URL HTTP协议及版本
method请求方法
- GET
- 用来请求访问已被URI识别的资源。
- 指定的资源经服务器端解析后返回响应内容
- GET方法会将提交的数据显示在URL中,不安全。
- POST
- 提交的数据放在请求体中,没有直接放在请求头的URL中,较为安全。
- PUT
- 从客户端向服务器传送的数据取代指定的内容.
- PUT方法与POST方法最大的不同是: PUT是幂等的,而POST不是幂等的。
- 幂等表示取代同一个地方的内容,即更新数据,如更换头像。
- 非幂等如论坛发表评论,不会取代之前已发的内容。
- HEAD
- 一般用来测试某个地址是否可以连通。
- 类似于GET请求,只不过返回的响应中没有具体的内容,用于获取报头。
- DELETE
- 请求服务器删除指定的资源。
- OPTIONS
- 用来查询请求头的URL所指定的资源支持的请求方法。
- TRACE
- 回显服务器收到的请求,主要用于测试或诊断。
- CONNECT
- 开启一个客户端与所请求资源之间的双向沟通的通道,它可以用来创建隧道。
GET与POST请求的区别
-
参数大小的区别
=> GET参数大小受URL长度限制,POST理论上没有限制。
-
参数类型的区别
=> GET参数类型只能是string,而POST还可以传文件等其他类型的数据。
-
安全性区别
=> GET参数显示在URL种可见,POST参数不可见更安全。
请求头
报文头包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。
请求体
它将一个页面表单中的组件值通过param1=value1¶m2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。
七、接收服务器的一个响应
HTTP响应包的结构
响应行
HTTP报文协议及版本 状态码及状态描述
状态码
是用以表示网页服务器超文本传输协议响应状态的3位数字代码。
分类 | 分类描述 |
---|---|
1xx | 指示信息—表示请求已接收,继续处理 |
2xx | 成功—表示请求已被成功接收、理解 |
3xx | 重定向—要完成请求必须进行更进一步的操作,后续的请求地址(重定向目标)在本次响应的Location域中指明 |
4xx | 客户端错误—请求有语法错误或请求无法实现 |
5xx | 服务器错误—服务器在处理请求的过程中有错误或者异常状态发生 |
常见状态代码 | 状态描述 | 说明 |
---|---|---|
200 | OK | 客户端请求成功 |
202 | Accept | 已接受请求,但未处理完成 |
204 | No Conten | 表示客户端发送的请求得到了成功处理,但在返回的响应报文中不含实体的主体部分(没有资源可以返回) |
206 | Patial Content | 表示客户端进行了范围请求,并且服务器成功执行了这部分的GET请求,响应报文中包含由Content-Range指定范围的实体内容 |
301 | Moved Permanently | 永久性重定向,表示请求的资源被分配了新的URL,浏览器会自动定向到新的URL,之后的请求应使用更改的URL |
302 | Found | 临时性重定向,表示请求的资源被分配了新的URL,客户端应继续使用原有URL。301与302的区别:前者是永久移动,后者是临时移动 |
303 | See Other | 表示请求的资源被分配了新的URL,应使用GET方法定向获取请求的资源。 302与303的区别:后者明确表示客户端应当采用GET方式获取资源 |
304 | Not Modified | 表示客户端发送附带条件(是指采用GET方法的请求报文中包含if-Match、If-Modified-Since、If-None-Match、If-Range、If-Unmodified-Since中任一首部)的请求时,服务器端允许访问资源,但是请求为满足条件的情况下返回改状态码 |
307 | Temporary Redirect | 临时重定向,与303有着相同的含义,307会遵照浏览器标准不会从POST变成GET;(不同浏览器可能会出现不同的情况) |
400 | Bad Request | 表示请求报文中存在语法错误 |
401 | Unauthorized Required | 未经许可,需要通过HTTP认证 |
403 | Forbidden | 服务器理解客户端的请求,但服务器拒绝该次访问(访问权限出现问题) |
404 | Not Found | 表示服务器上无法找到请求的资源,除此之外,也可以在服务器拒绝请求但不想给拒绝原因时使用 |
500 | Inter Server Error | 表示服务器内部发生了错误,也有可能是web应用存在的bug或某些临时的错误时 |
502 | Bad Gateway | 充当网关或代理的服务器,从远端服务器接收到一个无效的请求 |
503 | Server Unavailable | 表示服务器暂时处于超负载或正在进行停机维护,无法处理请求 |
八、传输内容类型content-type
- 协议规定POST提交的数据,必须包含在消息主体中entity-body中,但是协议并没有规定数据使用什么编码方式,开发者可以自己决定消息主体的格式。
- 数据发送出去后,需要接收的服务器解析成功,一般服务器会根据content-type字段来获取参数是怎么编码的,然后对应去解码。
常见的三种content-type数据类型
-
application/x-www-form-urlencoded
在最开始的请求方式中,请求参数都是放在URL中,表单提交的时候,都是以键值对的方式写在URL后面,这也是浏览器表单提交的默认方式。
-
multipart/form-data
此种方式多用于文件上传,表单数据都保存在HTTP的正文部分,各个表单项之间用boundary分开。
-
application/json
现在越来越多的应用使用application/json用来告诉服务器消息主体是序列化的JSON字符串,由于JSON规范的流行,各大浏览器都开始支持JSON.stringify。