Web 网络协议
网络协议是计算机网络中进行数据交换而建立的规则、标准或约定的集合,可以用来拒绝错误和非法的数据包。
一、OSI七层协议
层级 | 应用 | |
---|---|---|
7 | 应用层 | 处理网络应用-->DNS,HTTP,邮件服务,文件传送服务等 |
6 | 表示层 | 数据表示-->编码,加密解密,压缩 |
5 | 会话层 | 主机间通信-->建立连接,保证数据传输不发生错误 |
4 | 传输层 | 进程间的连接【Segment】-->数据的整体传输和控制 |
3 | 网络层 | 寻址和最短路径【Package】-->路由器 动态分配IP |
2 | 数据链路层 | 介质访问(接入) 【Frame】-->解决同一网络内部寻址问题(通过唯一mac地址) |
1 | 物理层 | 二进制传输【Bit】-->通过网络寻址 |
OSI七层模型 分层的意义是什么?
七层的划分是为了使网络的不同功能模块(不同层次)分担期不同的职责,从而带来一下好处:
1)减轻问题的复杂程度,一旦发生网络故障,可迅速定位故障所处的层次,便于查找和纠错;
2)在各层分别定义标准接口,使具备相同对等层的不同网络设备能实现互操作,各层之间则相对独立,一种高层协议可放在多种底层协议上运行;
3)能有效刺激网络革新,因为每次更新都可以在小范围内进行,不许对整个网络懂大手术;
4)有利于研究和教学。
二、HTTP组成
1、请求报文
1.1、请求头
主要关注字段 | |
---|---|
Accept:/ | 用来告知客户端可以处理的内容类型 |
token:null | 鉴权,后端返回的token信息 |
Set-cookies | 前端缓存信息,session_id(鉴权)会放在这里 |
Content-Type:application/json;charset=utf-8 | 前端告诉后端请求参数编码的格式 |
2、响应报文
2.1、响应头关注字段
Content-Type:application/json; charset=utf-8:告诉前端后端支持的编码格式
Set-cookie:告诉前端如何设置缓存信息
主要关注字段 | |
---|---|
Content-Type:application/json; charset=utf-8 | 告诉前端后端支持的编码格式 |
Set-cookie | 告诉前端如何设置缓存信息 |
3、请求体
3.1、get请求
参数拼接在接口地址后面
3.2、post请求
参数放在请求体body里面
3.3、get与post区别
参数传递:get参数在url地址后面,post参数放在body里面
安全性:get相对不那么安全,post相对安全
请求参数长度限制(后端可修改):协议本身并没有做长度限制,是后端服务器做了限制 内存问题
幂等性:get请求都是幂等,post请求不幂等(后端要做幂等处理)
3.4、HTTP 请求方法
序号 | 方法 | 描述 |
---|---|---|
1 | GET | 请求指定的页面信息,并返回实体主体。 |
2 | HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
3 | POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
4 | PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
5 | DELETE | 请求服务器删除指定的页面。 |
6 | CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
7 | OPTIONS | 允许客户端查看服务器的性能。 |
8 | TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
9 | PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
4、响应体
get与post无区别,该怎么返回就怎么返回
5、响应状态码
【1】1xx:服务器已经收到了请求,需要客户端继续操作
(1)100:客户端应该继续请求
(2)101:切换到更高级的协议
【2】 2xx:HTTP成功状态码
(1)200:请求成功,一般用于get,和post
(2)201:请求已经成功,并创建了新的资源
(3)202:请求已经接受,但未处理完成
(4)204:服务器处理成功,但是并未返回内容
(5)206:服务器成功处理了部分请求,get请求,常用与资源下载
【3】3xx:资源重定向
(1)301:请求资源被永久移动到新的url,返回替代该资源的url,浏览器会自动重定向到新的url,后续资源的访问将使用新的替代
(2)302:临时移除,301是永久移除,资源只是临时移动到新的url,客户端继续使用原有的url
(3)303:查看该资源的其他地址
(4)304:请求的资源未修改,当服务器返回304,此时服务器不会返回任何资源,客户端将使用本地缓存资源。
(5)305:请求的资源必须通过代理访问
(6)307:临时重定向,与302类似
【4】4xx:客户端错误
(1)401:请求需要用户的身份认证
(2)402:保留状态码,并未使用
(3)403:服务器已经收到了客户端的请求,但是拒绝执行这个请求
(4)404:服务器无法找到客户端需要访问的资源
(5)407:请求需要代理进行身份认证,与401类似
(6)408:服务器等待客户端发送的请求时间过长,超时
【5】5xx:服务端错误
(1)500:服务器内部错误,无法完成请求
(2)501:服务器不支持请求的功能,无法完成请求
(3)502:网关或者是代理服务器执行请求的时候,收到了一个无效的响应
(4)503:服务器故障,暂时无法处理客户端的请求
(5)504:网关或者是服务器代理,无法从远处服务器获取请求
(5)505:服务器不支持请求的HTTP协议的版本,无法处理请求
三、TCP三次握手和四次挥手
1、TCP三次握手
第一次握手
-
1、【客户端】向【服务端】发送连接请求报文,标记 ACK=1, SYN=1,客户端序列号 seq=x,客户端进入等待状态
第二次握手
-
1、【服务端】收到请求报文,将收到的报文缓存起来,缓存客户端 seq=x
-
2、【服务端】向【客户端】发送确认报文,生成一个【服务端】seq=y,标记 ACK=1,SYN=1,【服务端】自己的序列号 seq=y,确认序列号 ACK_Number=x+1,发送给【客户端】
第三次握手
-
1、【客户端】收到服务端发送的确认报文,将收到的报文存起来,缓存【服务端】seq=y
-
2、【客户端】发送确认报文给【服务端】,标记 ACK=1,SYN=0,【客户端】自己的序列号 seq=x+1,确认序列号 ACK_Number=y+1
-
3、【客户端】、【服务端】都会进入 ESTABLISHED (连接已建立状态)
2、TCP四次挥手
第一次挥手
-
1、【客户端】向【服务端】发送释放连接报文,并停止发送数据,主动关闭 TCP 连接
-
2、标记 FIN=1,【客户端序列号】seq=x,该序号等于前面已经传送过去的数据的最后一个字节的序号加 1
-
3、这时,客户端 FIN—WAIT-1 (终止等待 1)状态,等待服务端确认
第二次挥手
-
1、【服务端】收到释放连接报文,将收到的报文缓存起来,缓存【客户端】seq=x
-
2、【服务端】向【客户端】发出确认释放报文,标记 ACK=1,【服务端序列号】seq=y,确认序列号 ACK_Number=a+1
-
3、此时【服务端】进入CLOSE—WAIT(关闭等待)状态
-
4、此时 TCP 服务器进程应该通知上层的应用进程,因为【客户端】到【服务端】这个方向的连接就释放了,这时 TCP 处于半关闭状态,即【客户端】已经没有数据要发了,但【服务端】若发送数据,【客户端】仍要接受,也就是说从【服务端】到【客户端】这个方向的连接并没有关闭,这个状态可能会持续一些时间。
第三次挥手
-
1、【客户端】收到【服务端】确认报文,并缓存起来
-
2、此时【客户端】进入 FIN—WAIT(终止等待 2)状态,等待【服务端】发起释放连接报文
-
3、如果【服务端】没有数据要发送给【客户端】了,【服务端】的应用进程就会通知 TCP 释放连接
-
4、此时【服务端】向【客户端】发送释放连接报文,标记 FIN=1,确认序列号ACK_Number=a+1(与第二次挥手的确认号一致),【服务端序号】seq=z+1(z为半关闭状态发送的数据的最后一个字节的序号)
-
5、此时【服务端】进入最后确认状态,等待【客户端】确认
第四次挥手
-
1、【客户端】收到【服务端】释放连接请求,必须发出确认
-
2、【客户端】向【服务端】发送确认报文,标记 ACK=1,确认号序列号ACK_Numbe=z+1+1,【客户端序号】seq=x+1(x 为第一次挥手的 seq)
-
3、此时【客户端】进入等待状态,必须经过时间等待计时器设置的时间 2 倍 MSL(报文最大生存时间)后,【客户端】才进入 CLOSED 状态,MSL 叫做最长报文寿命,RFC 建议设为 2 分钟,实际应用中是 30 秒。在这 2 倍 MSL 期间【客户端】进入 TIME—WAIT 状态后,要经过 4 分钟才能进入到 CLOSED 状态。
-
4、【服务端】只要收到了【客户端】的确认后,就进入了 CLOSED 状态
-
5、当【客户端】和【服务端】都进入 CLOSED 状态后,连接就完全释放了
3、为什么握手三次,挥手四次
1)TCP建立连接时之所以只需要"三次握手",是因为在第二次"握手"过程中,服务器端发送给客户端的TCP报文是以SYN与ACK作为标志位的。SYN是请求连接标志,表示服务器端同意建立连接;ACK是确认报文,表示告诉客户端,服务器端收到了它的请求报文。
2)TCP释放连接时之所以需要“四次挥手”,是因为FIN释放连接报文与ACK确认接收报文是分别由第二次和第三次"握手"传输的。
4、理解
- ACK:表示前面的确认号字段是否有效。ACK=1 时表示有效。只有当 ACK=1 时,前面的确认号字段才有效。TCP 规定,连接建立后,ACK 必须为 1
- FIN:标记数据是否发送完毕。如果 FIN=1,表示数据已经发送完成,可以释放连接。
- SYN:在建立连接时使用,用来同步序号。
-
当 SYN=1,ACK=0 时,表示这是一个请求建立连接的报文段;
-
当 SYN=1,ACK=1 时,表示对方同意建立连接。
-
SYN=1 时,说明这是一个请求建立连接或同意建立连接的报文。只有在前两次握手中 SYN 才为 1。