操作系统面经1(较口语化)
为什么需要三次握手?两次不行?
因为要保证客户端和服务器双方的接收发送能力没问题,第一次握手客户端发送连接请求,服务器接收到,只能证明客户端发送能力没问题,服务器此时将回应同意连接报文发送给客户端,这个时候保证了服务器的收发能力没问题,如果只有两次只能证明客户端发以及服务端收发没问题,必须要第三次握手这样才能保证客户端的接收能力也没问题。
为什么需要四次挥手?三次不行?
因为除了保证客户端服务器双方接收发送能力没问题,也要保证数据顺利全部发送接收到,第二次和第三次挥手,都是服务器发送,原因是第二次服务器要及时回复客户端收到了关闭连接的报文,而不发送让客户端关闭的报文是因为这个时候服务器不一定发送完了数据,所以要等发送完了,才能发送第三次挥手报文告诉客户端可以关闭了,而第四次就是客户端发送给服务器告诉服务器知道可以关了。这个时候服务器收到报文就可以关了,但是客户端还是要等2wsl,两个最长报文生存时间,是因为保证服务器接收到报文了。
为什么是等2msl不是1msl?
因为要确认服务器收到了没有再发送第三次挥手报文给到客户端,而第四次报文和等到服务器再次发送的最长生存时间就是2msl,如果再等待长,也不是不行,但是浪费时间
TCP与UDP有哪些区别?各自应用场景?
TCP:连接的可靠的,UDP:无连接的不可靠的
TCP:以字节流的形式传输的,UDP:以报文形式传输的
TCP:一对一传输,UDP:一对多传输
TCP:传输效率总的比UDP慢
TCP:报文首部为20字节,UDP:报文首部为8字节
TCP常用于邮件传输,http1,http1.1,http2,ftp
UDP用于实时性的,不在乎那么多损失的,用于游戏,视频等,也在http3有使用到
HTTP1.0,1.1,2.0 的版本区别
http1.0短连接,就是每次访问请求数据都要tcp三次连接四次挥手
http1.1实现长连接,就是报文首部加多了个connection的字段,然后默认打开,就可以保持一定时间的连接,而不是每次都得请求访问,客户端和服务器发现对方太久没使用,就主动关闭。加入了管道,实现了一个连接里,客户端可以发起多次请求。
http2.0实现多路复用,更快了,在一个连接里,客户端和服务器都可以多次请求和回应,而且不用按顺序一一对应,因为它实现了二进制分帧,把传输的信息分割为更小的信息或帧,header压缩和服务端推送将一些信息放缓存
为什么http1.1不能多路复用?
因为http1.1没有二进制分帧,服务器读数据是读到分隔符才停止,所以无法确定每一段数据多大,那就没得预留空间,那么就很难实现多路复用了,必须按顺序。
谈下你对 HTTP 长连接和短连接的理解?分别应用于哪些场景?
在http1.1中实现了长连接,报文首部多了connection字段,值是keep-alive来显示是否长连接,长连接就不需要每次请求都进行tcp三次连接四次挥手,可以保持连接,mysql的启动连接也是用了长连接
在http1中则是短连接,就是每次发起HTTP请求都要经历tcp三次连接和四次挥手都需要
那长连接的时候什么时候超时?
开始长连接的时候可以设置超时时间,也可以自行断开,将connection字段close
Cookie 和 Session 有什么区别?
Cookie是存在客户端,session存在服务端,cookie比session不安全。
Session存在服务器中,如果访问增加,会占用性能,如果要快就用cookie。
Cookie过期的时间是开始设置的,session过期是服务器设置的
Session可以存取任意类型数据,但是cookie是字符串形式,如果是其他则需要编码
|