计算机网络的知识点我认为可以完全串成一个体系,以面试连环炮的形式进行学习记忆更加事半功倍。
你了解http的请求过程吗?(在浏览器输入url到显示主页过程)
- DNS解析(网站到ip地址)
- DNS缓存查找顺序:浏览器,若浏览器缓存未命中,会检查操作系统中对应的已经解析的结果,windows在C盘的host中,若没有就分级查询 :本地DNS服务器(它可能就在你城市的某个角落,一般到这一级就能解析出大部分的ip地址了),根域名服务器,顶级域名服务器,主域名服务器
- TCP连接(三次握手)
- 发送http请求
- 服务器处理请求并返回http报文
- 浏览器解析渲染页面
- 断开连接(四次挥手)
那既然提到了三次握手你简单介绍一下吧。
- 三次握手是由客户端发起的,当客户端想和服务端连接的时候客户端会向服务端发送一个
SYN=1, client_seq=x
的报文 - 服务端收到后知道客户端想与我建立连接,会回复给客户端一个ACK报文,报文中
SYN=1, ACK=1, server_seq=y, server_ack=x+1
- 这时已经完成了两次握手,这时候对于客户端来说它知道自己可以成功接收消息,也知道自己可以发送消息,但是对于服务端来说,它只知道自己可以接受消息,并不知道自己是否可以正确发送消息,此时还需要第三次握手,即客户端回传给服务端一个ACK报文报文中
ACK=1, client_ack=y+1, client_seq=x+1
那四次挥手呢?
- 四次挥手是由客户端发起的,当客户端想和服务端断开连接的时候客户端会向服务端发送一个
FIN=1, seq=u
报文 - 服务端收到报文后知道客户端想和我断开连接,然后立马回复给一个ACK报文,报文中
ACK=1, seq=v, ack=u+1
,告知客户端它收到了报文 - 过一会等服务端发送完数据之后,会给客户端发送一个FIN报文,报文中
FIN=1,ACK=1,seq=w,ack=u+1
- 客户端收到报文后,知道服务端消息也都完全发送完毕,想要断开连接,会回复给服务端一个ACK报文,报文中
ACK=1,seq=u+1,acl=w+1
那四次挥手完毕后是立马结束吗?
- 不是
- 最后要等两个时间周期,2MSL时间去向ACK消息最大存活时间(MSL) + 来向FIN消息的最大存活时间(MSL)。
- 客户端不知道服务端收没收到ack报文,所以要等2MSL是为了等待在2MSL这段时间中可能出现的服务端FIN超时重传,如果服务端真的需要超时重传,那么一定会在这段时间里进行,反之,若过了这段时间还没有重传,则可以确认ACK被服务端收到了。
那既然是基于TCP的,TCP的安全可靠是怎么保证的?
- 校验和:接收方和发送方进行数据的校验和比对,如果发送方和接收方的校验和不一致那传输有误
- 确认应答(ack)与序列号:TCP将每个字节的数据都进行了编号。保证数据的按序到达,提高效率。可实现多次发送,一次确认。去除重复数据。接收方对于按序到达的数据会进行确认(ack),发送方如果收到了已发送的数据的确认报文,则继续传输下一部分数据
- 超时重传:当报文发出后在一定的时间内未收到接收方的确认(ack),发送方就会进行重传
- 连接管理:三次握手,四次挥手
- 流量控制:TCP支持根据接收端的处理能力,来决定发送端的发送速度
- 拥塞控制:解决了两台主机之间因传送速率(网络拥堵)而可能引起的丢包问题。为此TCP引入慢启动机制,先发出少量数据,就像探路一样,先摸清当前的网络拥堵状态后,再决定按照多大的速度传送数据。
那我们现在视频面试的软件是基于什么协议?
- UDP
- UDP不需要建立连接,远程收到UDP报文后不需要给出任何确认,开销小,速度快
- 适用于直播,视频,语音
UDP与刚才聊得TCP有什么区别呢?
- TCP是面向连接的协议,提供可靠传输,在收发数据之前需要通过三次握手建立连接,并且通过校验、序号等机制保证传输数据的正确性;UDP是无连接的协议,提供尽最大努力交付,适合实时应用
- TCP提供流量控制和拥塞控制,而UDP没有
- TCP对系统资源要求较高,速度比UDP慢
- TCP数据报没有边界,可能出现粘包问题,而UDP是一个独立的数据报,不会出现粘包现象
- TCP提供点到点的通信,而UDP支持一对一、一对多、多对多的通信
HTTP1.0和HTTP1.1有什么区别?
- 连接:
- 1.0 短连接,每次请求建立一个连接,HTTP基于TCP/IP协议的,每次建立断开连接都要经历三次握手四次挥手,开销大。
- 1.1长链接,流水线方式:客户收到响应报文之前就可以发送下一次的请求报文,非流水线方式:收到响应后才能发送下一个请求
- 错误状态响应码:
- 1.1新增24个错误状态响应码,比如410表示服务器上某个资源被永久删除
- 缓存处理:
- 1.1引入了更多的缓存控制策略比如IF-Match,If-no-match等可供选择的缓存头来控制缓存策略
- 带宽优化和网络连接的使用:
- 1.0中存在浪费带宽的现象,比如客户端只想要某个对象的一部分,而服务器却把整个对象送过来了,而且不支持断点续传的功能。
- 1.1在请求头引入了range头域,允许只请求某个部分。
###HTTP中get和post有什么区别?
- get用于请求,post用于对表单的提交,相当于把信息交给服务器等待服务器作出响应
- get不安全(因为参数放在url中),post安全(请求体,对于用户不可见)
- get的url有长度限制,post放在请求体中没长度限制
- get请求会被浏览器主动缓存,post不会
- get会发一个TCP数据包,http header和data一起发送,服务器响应200。post发送两个TCP数据包,先发送header服务器响应100,在发送data,服务器响应200.
那刚刚聊完了http了,https请求过程或者说加解密流程又是啥呢?
- 浏览器发送https请求后,会使用443端口进行连接
- https需要使用一套CA数字证书,证书内有一个公钥和一个私钥,私钥服务器自己保存,服务器收到请求后,将包含公钥的证书返回给客户端
- 客户端收到证书,验证合法性,若不通过显示https警告,通过则继续
- 客户端生成一个用于对称加密的随机key并用证书里的公钥加密发送给服务端
- 服务端收到后使用私钥进行解密
- 服务端使用客户端发送过来的随机key对要传输的http数据进行对称加密,将密文返回客户端
- 客户端使用随机key对称解密密文,得到http明文
- 后续https请求使用之前交换好的随机key进行对称加解密
cookie和session区别?
- cookie数据存放在客户的浏览器上,session数据放在服务器上
- cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗;session安全
- session会在一定时间内保存在服务器上,当访问量增加时,会比较占用服务器的性能(session存到redis)。考虑到减轻服务器性能方面,应当使用cookie
- 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie;
token和session区别?
- 服务器不需要记录任何东西,每次都是一个无状态的请求,浏览器访问Web服务器后认证成功后生成Token并返回给客户端,客户端浏览器后续的请求都会把这个Token带到服务器端去解密验证,以此判定请求是否合法
- Session是存放在服务器端的
- Token是放在客户端存储
-token传递的方式也不限于cookie传递,session要依赖于cookie传输Jsessionid (如果浏览器禁用了cookie/不支持cookie,可以通过URL重写的方式发送到服务) - token 和 cookie 本质上没啥区别,只不过 token 只是一个字符串,访问的时候可以放在 url 的参数,请求头里等,不像 cookie 那么重量级
HTTP状态码有了解吗?
- 1xx 提示信息,代表当前是协议被处理的阶段,还需要后续操作
- 2xx 请求成功,请求报文已经收到并且被成功处理
- 200 ok 表明请求成功
- 3xx 重定向,资源位置发生了变动,需要客户端重新发送请求
- 301 Moved Permanently 永久重定向
- 302 Moved Temporarily 临时重定向
- 4xx 客户端错误,客户端发送的报文有误,服务器端无法处理
- 400 Bad Request 客户端请求有误
- 403 Forbidden 服务器禁止访问资源
- 404 Not Found 请求的资源不存在
- 5xx 服务器错误,服务器处理请求的时候内部出了错误
- 500 Interval Server Error 服务器端出现了错误
- 502 Bad Gateway 网关返回的错误码
参考
https://www.nowcoder.com/discuss/751824?source_id=profile_create_nctrack&channel=-1
https://github.com/Snailclimb/JavaGuide/blob/master/docs/cs-basics/network/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C.md