【计算机网络】知识积累
时间 2021-03-13
标签
面经总结
java
TCP协议、IP协议、HTTP协议分别在哪一层?
网络七层模型和网络五层模型
TCP协议的三次握手:
- 建立连接时,客户端发送SYN包(syn=x)到服务器,进入SYN_SEN状态,等待服务器确认
- 服务器收到SYN包,必须确认客户的SYN(ack=x+1),同时自己也发送了一个SYN包(syn=y,即SYN+ACK包),进入SYN_RECV状态
- 服务端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),包发送完毕,客户端和服务器进入ESTABLISHED状态(TCP连接成功),完成三次握手。
TCP协议的四次握手:
- 由于TCP协议是全双工的,因此每个方向都必须单独进行关闭。
- 全双工(Full Duplex)通信允许数据在两个方向上同时传输。能力上相当于两个单工通信的结合。
- 半双工(Hals Duplex)数据传输指可以在一个信号载体的两个方向上传输,但是不能同时传输。[同一时间仅允许一个方向,实际上是一种切换方向的单工通信;同一时间只有一方接受或发送信息,如对讲机]
- 单独关闭的原则是当一方完成它的数据发送任务后就能发送一个FIN来终止这个方向的连接。收到一个FIN只意味着这一方向上没有数据流动,一个TCP连接在收到一个FIN后仍能发送数据。首先进行关闭的一方将执行主动关闭,而另一方执行被动关闭。
- TCP的连接的拆除需要发送四个包,因此称为四次握手(four-way handshake)。服务端或刘拉你端均可主动发起挥手动作,在sokert编程中,任何一方执行close()操作即可产生挥手操作。
- 四次握手过程:
- 客户端A发送一个FIN,用来关闭客户A到服务器B的数据传送
- 服务器B收到这个FIN,它发送一个ACK,确认序号为收到的序号加1。和SYN一样,一个FIN将占用一个序号。
- 服务器B关闭与客户端A的连接,发送一个FIN给客户端A
- 客户端A发送ACK报文确认,并将确认序号设置为收到序号加1。
TCP |
状态 |
SYN |
建立连接 |
FIN |
关闭连接 |
ACK |
响应 |
PSH |
有DATA数据传输 |
RST |
连接重置 |
- ACK可能是与SYN,FIN等同时使用的,如SYN和ACK,可能同时为1,他表示的就是建立之后的响应
- 如果只是单个SYN,表示的只是建立连接。
为什么连接时候三次握手,关闭的时候四次握手?
- 连接时,当Server端收到Client端的SYN请求后报文后,可以直接发送SYN+ACK报文。ACK报文是用来应答的,SYN报文是用来同步的。
- 关闭时,当Server端收到FIN报文时,很可能不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端。当Server端所有的报文都发送完后,才能发送FIN报文,因此不能一起发送,所以需要四次握手。
为什么TCP要建立连接?
TCP为什么可靠一些?
哪种应用场景会使用TCP协议,使用它的意义?
- 当对网络通信质量有要求时:整个数据都要准确无误的传输给对方,这往往用于一些可靠的应用。如HTTP、HTTPS、FTP等传输文件的协议,POP、SMTO等邮件传输的协议
TCP连接和释放过程,描述:
解释,http请求中304状态码的含义
- 304(未修改)自从上次请求后,请求的网页未修改过。服务器返回此响应时,不会返回网页内容。
- 如果网页自请求者上次请求后再也没有更改过,您应将服务器配置为返回此响应(称为if-Modified-Since HTTP标头)。服务器可以告诉Googlebot自从上次抓取网页没有变更,进而节省带宽和开销。
请你说明一下,SSL四次握手的过程
- 客户端发送请求
- 首先,客户端(通常是浏览器)先向服务器发送加密通信的请求,这叫做ClientHello请求
- 服务器回应
- 服务器收到客户端请求后,向客户端发出回应,这叫做ServerHello
- 客户端回应
- 客户端收到服务器回应以后,首先验证服务器证书,如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。
- 服务器的最后回应
- 服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所有的“会话秘钥”。然后,向客户端最后发送下面信息。
- 编码改变通知,表示随后的信息都将用双方商定的加密方法和秘钥发送。
- 服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验
至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用“会话秘钥”加密内容。
请你讲讲http1.1和1.0的区别
- 缓存处理:
- 在HTTP1.0中主要是用header里的if-Modified-Since,Expires作为缓存判断的标准。
- HTTP1.1则引入了更更多缓存控制策略例如Entity tag,If-Unmodified-Sine,If-Match, If-None-Match等更多可供选择的缓存头来控制缓存策略
- 带宽优化及网络连接的使用:
- HTTP1.0中,存在一些浪费带宽的现象,如客户端需要对象一部分,而服务器将整个对象送过来,并且不支持端点续传功能。
- HTTP1.1在请求头中引入了range头域,它允许只请求资源的某个部分,即返回码是206(Partial Content),方便开发者自由选择以便于充分利用带宽和连接。
- 错误的通知管理:
- 在HTTP1.1中新增了24个错误状态响应吗,409(Confilict)表示请求的资源与资源发生冲突,410(Gone)表示服务器上的某个资源被永久性删除。