目录
今日语录: “不要着急,最好的总会在最不经意的时候出现”🌹
1、OSI七层模型分别是什么?每一层的功能?
- 应用层:负责为应用程序提供统一的接口。
- 表示层:负责把数据转化成另一个系统能识别的格式。
- 会话层:负责建立、管理、终止表示层之间的会话通信。
- 传输层:负责端到端的数据传输。
- 网络层:负责数据的路由、转发以及分片。
- 数据链路层:负责数据的封帧、差错检测以及MAC寻址。
- 物理层:负责在物理网络中传输数据帧
2、TCP三次握手的过程?⭐⭐⭐
三次握手的过程:
- 刚开始,客户端和服务端都处于close状态,先是服务端主动监听某个端口,处于listen状态。
- 客户端先随机生成一个序列号client_isn,并填入到TCP报文的“序列号”字段中,并将SYN标志位置为1,表示SYN报文,然后向服务端发送这个SYN报文,发送完之后处于SYN_SENT状态。
- 服务端收到客户端的SYN报文之后, 也随机生成一个序列号server_isn,填入到TCP首部的“序列号”中,并把“确认应答号”填入client_isn+1,把SYN和ACK标志位置为1,表示SYN+ACK报文,并把报文发送给客户端。发送完之后处于SYN_RCVD状态。
- 客户端收到服务端的报文之后,把“确认应答号”填入server_isn+1,然后把ACK标志位置为1,然后发送给服务端,发送完之后,处于ESTABLISHED状态。
- 服务端收到客户端的ACK报文之后也处于ESTABLISHED状态。
3、为什么是三次握手?不是两次?四次?⭐⭐⭐
三次握手的原因:
- 避免历史连接
- 保证双方的序列号能被可靠的同步
- 避免了资源的浪费
避免历史连接:
如果当客户端向服务端发送SYN报文之后,网络发生拥塞且客户端宕机了,客户端重启之后向服务端重新发送了新的报文,那么由于网络的原因,旧的报文先于新的报文到达服务端,服务端接收到旧报文就会回一个SYN+ACK报文,当客户端接收到服务端的报文之后发现并不是自己期望收到的确认应答号,就会回一个RST报文来断开连接;如果是两次握手的话,服务端收到SYN报文就会直接建立连接,没有一个中间状态来做缓冲。
保证双方的序列号能被可靠的同步:
刚开始建立连接的时候,客户端向服务端发送一个SYN报文,报文中有客户端随机生成的序列号,当服务端收到这个序列号时需要做一个回应,然后也先客户端发送自己的序列号,客户端收到服务端的序列号也回一个确认。这么一来一回,正好四次,第二次和第三次合并成一次,就成了三次握手。
避免了资源的浪费:
当客户端向服务端发送SYN报文时,如果此时网络发生了拥塞,客户端迟迟收不到服务端的ACK报文,就会重复发送SYN报文,那么如果是两次握手的话,服务端每收到一个SYN报文就会直接建立连接,就会造成建立多个冗余无效的连接的情况,造成资源的浪费。
4、TCP四次挥手的过程?⭐⭐⭐
- 客户端向服务端发送FIN报文,发送完之后处于FIN_WAIT_1状态
- 服务端收到客户端的FIN报文之后,回一个ACK报文,之后处于CLOSED_WAIT状态
- 客户端收到服务端的ACK报文之后,处于FIN_WAIT_2状态
- 服务端处理完数据之后向客户端发送FIN报文,发送完之后处于LAST_ACK状态
- 客户端收到服务端的FIN报文之后回传一个ACK,处于TIME_WAIT状态
- 服务端收到客户端的ACK之后处于CLOSE状态
- 客户端在等待两个MSL之后,处于CLOSE状态,至此双方的连接都关闭了
5、TCP和UDP有哪些区别?各自的应用场景是什么?
- 连接上,TCP建立通信前需要建立连接,UDP通信之前不需要建立连接
- 面向对象上,TCP只支持一对一的通信,UDP面向一对一、一对多、多对多的通信
- 拥塞控制上,TCP有拥塞控制机制和流量控制机制,UDP没有
- 发送方式,TCP是流式传输,没有边界;UDP一个包一个包的发送,有边界
- 首部开销,TCP首部是20个字节,UDP首部是8个字节
应用场景:
TCP主要用于HTTP、FTP;UDP主要用于视频音频等多媒体广播通信
6、HTTP1.0、1.1、2.0的区别?
HTTP1.0默认使用的是短链接,即客户端每向服务端发送一个请求就需要建立一个连接,服务端处理完请求之后立即关闭连接。
HTTP1.1引入了长连接。即在一个连接中可以处理多个请求并返回响应,减少了重复建立和断开连接的开销;在此之上,1.1还引入了管道化传输,即浏览器可以一次性的发送多个请求,不必等待收到响应,但是服务端必须按顺序处理请求,容易引发队头阻塞的问题。
HTTP2.0的新特性:
- 头部压缩:如果多个请求的报文头部是相似的,那么协议就会帮助消除重复的部分。
- 二进制格式:内容上全面采用二进制来进行传输
- 并发传输:引入stream流,解决了队头阻塞的问题,服务端可以并发处理多个请求
- 服务器推送资源:支持服务器主动向浏览器推送资源
7、POST和GET有哪些区别?
- GET的作用是从浏览器上获取指定的资源。GET方法是安全的,即不会破坏服务器上的资源;也是幂等的,即多次操作结果是一样的;且GET获取的资源是可以被浏览器缓存的
- POST的作用是传输实体主体;POST是不安全的,因为会修改服务器上的资源;不是幂等的;且POST请求一般不会被浏览器缓存
8、HTTP常用的状态码?
- 200:最常见的成功状态码
- 204:也是成功状态码,但是不带有body数据
- 206:返回服务器资源的一部分
- 301:永久重定向,请求的资源已经不在了
- 302:临时重定向,请求的资源还在,但暂时需要用另一个URL来访问
- 400:客户端请求的报文有误
- 403:服务器禁止访问资源
- 404:所请求的资源在服务器上未找到
- 500:服务器内部发生未知错误
- 501:客户端请求的功能还不支持
- 503:服务器当前很忙,暂时无法响应客户端
9、HTTP常见字段?
- host:服务器的域名
- content-length:服务器返回数据的长度
- content-type:服务器返回数据的格式
- content-encoding:服务器返回数据的压缩格式
10、HTTP如何实现长连接?
设置Connection:keep-alive
我们总该学着单枪匹马地去面对这世界。加油!