一、OSI七层模型
- 应用层
- 表示层
- 会话层
- 传输层
- 网络层
- 数据链路层
- 物理层
tips:物 链 网 传 会 表 应
二、TCP/IP的四层模型
- 应用层
- 传输层
- 网络层
- 网络接口层(物理层+数据链路层)
三、应用层协议 HTTP/HTTPS
1、HTTP是什么?
HTTP是无状态的、应用层的超文本传输协议,从网络传输超文本内容到本地浏览器的协议,保证高效准确的传输文本内容
2、HTTPS是什么?
HTTPS(Hypertext Transfer Protocol Secure:超文本传输安全协议)是一种透过计算机网络进行安全通信的传输协议。HTTPS经由HTTP进行通信,但利用SSL/TLS来加密数据包。HTTPS开发的主要目的,是提供对网站服务器的身份认证,保护交换数据的隐私与完整性
3、HTTP和HTTPS的区别?
- HTTP明文传输,数据都是未加密的,安全性较差;HTTPS(SSL+HTTP)数据传输过程是加密的,安全性较好
- 使用HTTPS协议需要到CA申请证书
- HTTP和HTTPS使用的连接方式不同,运行端口也不同,HTTP端口是80,HTTPS端口是443
- HTTP页面响应速度比HTTPS快,主要因为HTTP使用TCP三次握手建立连接,客户端和服务器需要交换3个包,而HTTPS除了TCP的三个包,还要加上SSL握手需要的9个包,一共是12个包
- HTTPS就是建构在SSL/TLS之上的HTTP协议,所以HTTPS要比HTTP更耗费服务器资源
四、Session和Cookie、Token
由于HTTP协议是无状态的,对事务没有记忆能力,所以引入了Sesion、Cookie可以记录用户状态信息,解决无状态的问题
无状态就是向服务器发送请求后,服务器解析处理请求,然后返回相应,服务器负责完成这个过程,但这个过程是独立的,服务器不会记录前后状态的变化
1、session是什么?
客户端请求服务端,服务端会为这次请求开辟一块内存空间,这个对象便是session对象,session弥补了HTTP无状态特性,服务器可以利用session存储客户端在同一个会话期间的一些操作记录
2、cookie是什么?
3、token是什么?
token是服务端生成的一串字符串,用做客户端进行请求的一个令牌,第一次登录后,服务器生成一个token,将此token返回给客户端,以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码
token组成:
4、session和cookie的区别?
- 数据存放位置不同:
- 安全程序不同:
- 性能使用程序不同:
- 数据存储大小不同:
- 用户验证这种场合一般会用session,其他信息如果需要保留,可以放在cookie中
五、传输层协议TCP/网络层协议IP
TCP/IP是用于Internet的通信协议
1、TCP是什么?
TCP是传输层协议,用于应用程序之间的通信,TCP确保数据包以正确的次序到达,并且尝试确认数据包的内容没有改变
UDP和TCP很相似,但是更简单,同时可靠性低于TCP
2、UDP是什么?
3、TCP和UDP的区别?
4、IP是什么?
IP是无连接的通信协议,用于计算机之间的通信,通过IP,消息被分割为小的独立的包,并听过Internet在计算机之间传送,IP负责将每个包路由至它的目的地
5、TCP/IP是什么?
- TCP/IP意味着TCP和IP在一起协同工作
- TCP负责应用软件(比如浏览器)和网络软件之间的通信,IP负责计算机之间的通信
- TCP负责将数据分割并装入IP包,然后在它们到达的时候重新组合它们,IP负责将包发送至接受者
六、TCP三次握手/四次挥手
1、TCP三次握手流程
三次握手其实就是指建立一个TCP连接时,需要客户端和服务器总共发送三个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上其实就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息
标志位:
- SYN:同步序列号
- ACK:确认字符
- seq:序列号,代表本条消息的序列号(按序交付)
- ack:期待下一次收到的序列号,一般时seq+1
三次握手流程:
- 第一次握手:客户端向服务器发送连接请求报文段,询问服务器是否能收到客户端的请求。其首部中的同步位SYN=1 ,并且随机选择一个初始序号seq=x。TCP协议规定,SYN为1的报文段不能携带数据,但需要消耗一个序列号
- 第二次握手:服务端接收到客户端的连接请求报文后,如果同意连接,则发回连接同意报文,在确认报文段中SYN=1,ACK=1,确认号ack=x+1,初始序号seq=y
- 第三次握手:客户端收到服务端发来的连接同意应答后,向服务器确认已收到响应,确认报文段ACK=1,确认号ack=y+1,序列号seq=x+1(初始为x,第二个报文段所以要+1),ACK报文段可以携带数据,不携带数据则不消耗序号。开始建立连接,发送第一个SYN的一端将执行主动打开,接收这个SYN并发回下一个SYN的另一端执行被动打开
2、TCP为什么必须三次握手?
三次握手的目的是什么,能不能用两次握手或四次握手来达到相同的目的
第一次握手:客户端发送网络包,服务端收到了——服务端可以得出结论:客户端的发送能力、服务端的接收能力是正常的
第二次握手:服务端发包,客户端收到了——客户端可以得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的,不过服务器并不能确认客户端的接收能力是否正常
第三次握手:客户端发包,服务端收到了——服务端可以得出结论:客户端的接收、发送能力,服务端自己的接收、发送能力也是正常的
因此,需要三次握手才能确认双方的接收和发送能力是否都正常
如果是两次握手:客户端能发送请求给服务器,且确定服务器能收到请求,但是服务器不能确认客户端能不能收到发出去的响应
四次握手:服务器确认客户端已经收到响应后,客户端再次询问服务器能否收到请求,重复了第一次握手的动作,显得多余
3、TCP四次挥手流程
建立一个连接需要三次握手,而终止一个连接需要四次挥手。这由TCP的半关闭造成的,所谓的半关闭,其实就是TCP提供了连接的一端在结束它的发送后还能接收来自另一端数据的能力
TCP是基于全双工通信的,因此双方都可以主动释放连接
四次挥手流程:
FIN:标志位,请求关闭连接
第一次挥手:客户端向服务器发送断开连接的请求。即发出连接释放报文段(FIN=1,序号seq=u),并停止再发送数据,主动关闭TCP连接,进入终止等待1状态,等待服务端的确认
第二次挥手:服务器收到断开连接的请求只会回复客户端,表示已经收到断开请求,即服务端收到连接释放报文段后即发出确认报文段(ACK=1,确认号ack=u+1,序号seq=v),服务器进入关闭等待状态,此时的TCP处于半关闭状态,客户端到服务端的连接释放。客户端收到服务端的确认后,进入终止等待2状态,等待服务端发出的连接释放报文段
第三次挥手:服务器在确认断开前,会先确认所有传输到客户端的数据是否已经传输完毕,确认数据传输完毕后才进行断开。即服务端没有要向客户端发出的数据,服务端发出连接释放报文段(FIN=1,ACK=1,序号seq=w,确认号ack=u+1),服务端进入最后确认状态,等待客户端的确认
第四次挥手:客户端收到服务器发来的断开连接数据包后,回复服务器,表示收到了断开连接数据包。即客户端收到服务端的连接释放报文段后,对此发出确认报文段(ACK=1,seq=u+1,ack=w+1),客户端进入时间等待状态,此时TCP未释放掉,需要经过时间等待计时器设置的时间后,客户端才进入关闭状态
四次挥手的意义就在于,当客户端发送完最后一条数据之后,但可能服务端还有未发送给客户端的数据,所以客户端在发送完数据后可以请求释放连接,此时服务端返回给客户端响应,告诉客户端,我收到了你的释放连接请求,此时客户端还可以继续接收服务端发送的信息。在服务端确认传输到客户端的数据传输完毕后,也请求释放连接。客户端同意后就断开连接,这样可以保证数据正常可靠的交互
七、HTTP请求方法
1、常见的请求方法?
方法 | 描述 |
GET | 查询,请求指定的页面信息,并返回实体主体 |
POST | 新建,向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中,POST请求可能会导致新的资源的建立和已有资源的修改 |
PUT | 更新 |
DELETE | 删除,请求服务器删除指定的页面 |
PATCH | 更新,是对PUT方法的补充,用来对已知资源进行局部更新 |
2、GET和POST的区别?
比较点 | GET | POST |
后退按钮/刷新 | 无害 | 数据会被重新提交(浏览器应该告知用户数据会被重新提交) |
书签 | 可收藏为书签 | 不可收藏为书签 |
缓存 | 能被缓存 | 不能缓存 |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded or multipart/form-data。为二进制数据使用多重编码。 |
历史 | 参数保留在浏览器历史中 | 参数不会保存在浏览器历史中 |
对数据长度的限制 | 只允许ASCII字符 | 没有限制。也允许二进制数据 |
安全性 | 与POST相比,GET的安全性较差,因为所发送的数据是URL的一部分 | POST比GET更安全,因为参数不会被保存在浏览器历史或web服务器日志中 |
可见性 | 数据在URL中对所有人都是可见的 | 数据不会显示在URL中 |
- get和post请求本质上没有区别,都是http协议中发送请求的方法,底层都是tcp/ip协议,都是tcp连接
- 真正的区别是get请求只发送一个tcp数据包,而post请求发送两个tcp数据包
- 对于get请求,浏览器会把HTTP Header和请求data一起发送出去,等待服务器返回响应内容(只发送一次)
- 对于post请求,浏览器会先发送HTTP Header,等服务器响应100 continue之后,浏览器再发送data,等待服务器返回响应内容(共发送两次)
3、HTTP响应
响应状态码(Response Status Code)、响应头(Response Headers)、响应体(Response Body)
HTTP状态码: 1xx 表示客户端应该继续发送请求 2xx表示成功的请求 3xx表示重定向 4xx表示客户端错误- 401表示服务器无法理解请求的格式
- 402表示请求未授权
- 403表示禁止访问
- 404表示请求的资源不存在,一般是路径写错了
- 500表示最常见的服务器错误
- 503表示服务器暂时无法处理请求
4、一次完整的HTTP请求过程?
- 域名解析
- 发起TCP的3次握手,建立连接
- 建立TCP连接后发起HTTP请求
- 服务器响应HTTP请求,浏览器得到HTTP代码
- 浏览器解析HTTP代码,并请求html代码中的资源(如js、css、图片等)
- 浏览器对页面进行渲染呈现给用户
八、浏览器输入地址敲回车,到返回内容,这个过程发生了什么?