面试前不看后悔终生系列1——计算机网络

前言:我个人是不推崇面试之前背题的,我觉得很多面试问到的题目可能随便翻两本书就可以完全搞懂,但是似乎整个社会的面试风气已经如此,个人经常被面试官问一些刁钻、考记忆性的题目。既然无法改变,那就好好准备,本文会以题目的方式列出常见的知识点。
从面试题触发,掌握核心的技术知识。

文中大部分的内容都是参考《图解Http》《图解TCP协议》。

1. 说一下Http与Https的区别

http是运行在Tcp协议之上的,本身是明文传输的(可能被窃听),不验证通信双方的身份(遭遇伪装),无法检验报文本身的完整性(被修改);而Https则是通过和SSL(Secure Socket Layer 安全套接层)组合使用,而形成的的加密和验证通信方式。
两者不同点:

  1. 端口不同:Http采用的端口是80,Https是443;
  2. 资源消耗:和HTTP通信相比,Https通信会由于加减密处理消耗更多的CPU和内存资源;
  3. 开销:Https通信需要证书,而证书一般需要向认证机构购买;需要额外的缴费。

这样回答已经不错,面试官可能会追问

那你知道Https是如何加密的吗?

Http本身是采用共享密钥加密和公开密钥加密并用的混合加密机制。

那你了解对称加密和非对称加密的方式吗?

对称密钥加密是指加密和解密使用同一个密钥的方式,这种方式存在的最大问题就是密钥发送问题,即如何安全地将密钥发给对方;而非对称加密是指使用一对非对称密钥,即公钥和私钥,公钥可以随意发布,但私钥只有自己知道。发送密文的一方使用对方的公钥进行加密处理,对方接收到加密信息后,使用自己的私钥进行解密。

2. 你知道Http常见的请求和相应结构吗?

HTTP请求结构: 请求方式 + 请求URI + 协议及其版本

HTTP响应结构: 状态码 + 原因短语 + 协议及其版本

2.1 能简单介绍一下http的请求结构吗

主要包括,请求头、请求首部、请求内容
请求头包括:请求方法(get、post),请求资源(url)、请求协议版本(HTTP/1.1)
比如

GET /index.html   HTTP/1.1(请求头)
Host: hackr.jp      (请求首部)
......

请求首部包括:host、keep-alive、data等
请求内容包括:
在这里插入图片描述

2.2 在说一下请求响应的结构

  1. 协议版本 + 状态码 + 原因短语
  2. 响应首部字段
  3. 主体内容
    比如
HTTP/1.1 200 OK

2.3 说一下你用过的常见的状态码

1×× : 请求处理中,请求已被接受,正在处理
2×× : 请求成功,请求被成功处理 比如 200 表示ok
3×× : 重定向,要完成请求必须进行进一步处理
- 301 : 永久性转移
- 302 :暂时性转移
- 304 : 已缓存
4×× : 客户端错误,请求不合法
- 400:Bad Request,请求有语法问题
- 403:拒绝请求
- 404:客户端所访问的页面不存在
5×× : 服务器端错误,服务器不能处理合法请求
- 500 :服务器内部错误
- 503 : 服务不可用

2.4 为什么需要cookie呢?

这个需要从http的起源说起了,因为http为了提高性能,能够处理大量的事务,所以其本身是不保存状态的,也就是说http是无状态的协议,那有时候为了能够保留保存用户信息,不需要每次都要登录,所以采用了cookie记录用户的行为。

2.5 说说http1.1为了提高传输效率做了哪些优化吗?

http主要做的优化由两点:

  1. 持久连接。只要任意一端没有明确提出断开连接,则保持TCP连接状态。这主要是为了减少TCP连接的重复建立和断开锁消耗的系统开销。
  2. 管线化(pipeline)。客户端不需要等待请求的返回,就可以马上发起下一个请求,可以提高同时并行的发送多个请求。有点类似于redis中的pipeline

3. 说一下OSI的七层模型,谈谈每一层的作用

主要从底往顶分为七层

  1. 物理层:最底层的物理设备层
  2. 数据链路层:负责数据帧的开始和结束、透明传输、差错校验等功能
  3. 网络层:负责选择最佳路径及规划ip地址
  4. 传输层:实现可靠传输及流量控制,也可以实现不可靠传输。也就是TCP连接及传输
  5. 会话层:用户应用程序和网络之间的接口,负责在网络中的两节点之间建立、维持和终止通信
  6. 表示层:数据的编码,压缩和解压缩,数据的加密和解密
  7. 应用层:为用户的应用进程提供网络通信服务

在这里插入图片描述
ps:如果面试官再问五层模型,则主要分为

  1. 物理层
  2. 数据链路层
  3. 网络层
  4. 传输层
  5. 应用层

3 说说TCP/IP协议的分层

应用层
传输层
网络层
数据链路层

为什么要有分层,而且有了OSI分层模型之后还要新建TCP/IP模型?
分层主要是为了便于管理,某一部分需要修改时只需要修改对应的那一层即可,而不需要修改整体。
第二,因为osi分层模型不适用,民间自发起草了更加适用的分层模型。

4. 说一说传输层主要的作用吧

主要为客户端及服务器之间提供数据传输的连接及数据传输,该层主要又分为TCP和UDP协议,实现两种不同方式的数据传输。

5. 那你说一下TCP和UDP有什么区别?

TCP:传输控制协议。一个数据包分段传输,并且每段编号,服务器和客户端之间建立关联会话,并且可以做流量控制,可靠性传输,面向字节流传输
UDP:用户数据包协议。**一个数据包就可以完成数据通信,不需要建立会话,不需要流量控制,不可靠传输,UDP首部开销小,只有8个字节。**比如DNS解析ip地址,多播或者广播

可能接下来面试官可能会针对于TCP协议做一些更加深入的提问,一般如下

那你在工作中哪些地方用到了TCP协议呢?

答:比如mysql客户端和服务器之间的链接,redis客户端与服务器的链接等,都是利用到了TCP协议。

6. 说一下TCP请求的连接过程

记住,面试管这里想要你回答的一般都是TCP链接的三次握手过程,一般可以这么回答:

1、第一次客户端主动给服务器发送一个连接的请求。其中SYN = 1(表示是建立连接请求) ACK = 0(只有返回确认是才是1) seq = x(开始发送数据的序列号,x是一个代指)
2、服务器收到连接请求时,服务器给客户端返回确认结果,SYN = 1(表示是建立连接请求) ACK = 1 (服务器给客户端返回) seq = y(表示接受到的数据包的序号,因为传输层是分片段发送) ack = x + 1(服务器收到了x个字节,需要客户端下次发送x+1个字节)
3、客户端收到服务器的确认时,再次给服务器发送数据包。ACK = 1(表示客户端给服务器返回),seq = x+1(数据包的序号),ack = y+1,(告诉服务器下次该发y+1的序号)。

回答这里一般就足够了,但是不排除有一些面试官对计算机网络要求比较高,会更加深入的让你阐述每一个阶段客户端及服务器的状态情况。

三次握手时各个阶段的客户端和服务器的状态:
1、客户端发送连接请求是,状态会变成SYNSENT,服务器在接收到第一次握手的请求后,将状态由原来的LISTEN改成SYN-RCVD
2、服务器给客户端发送请求响应,客户端收到响应之后状态会变成ESTABLISHED,然后继续给服务器再次确认。
3、服务器再次受到确认答复之后,会将服务器状态由SYN-RCVD改成ESTABLISHED
4、三次握手完成之后,才开始进行数据传输。

为了便于理解,我提供了一个图形

在这里插入图片描述

你知道为什么需要三次握手而不是两次或者四次握手呢?

试想一下,客户端第一次请求时,如果网络出现异常或者波动,请求迟迟没有到达服务器;客户端重新发送了一次请求,这次服务器正常接收到,服务器给客户端返回了请求响应,然后继续传送数据;过段时间后,第一次请求姗姗来迟,服务器仍然给客户端返回的请求响应,客户端接收到该响应之后,不会继续处理,然后服务器会一直等待,这样就会影响服务器的资源。**但是三次握手就不存在这种情况了,会重复确认。**四次握手,则浪费资源,因为三次握手就可以很好的确认客户端和服务器的状态。

我们都知道TCP属于一种可靠性的传输,在传输完数据之后,客户端和服务端会断开已经建立的连接,所以对于TCP断开连接的过程也是需要掌握的。

7. 连接释放的过程

在建立连接,发送完数据之后,客户端和服务器间需要断开连接,通过四次挥手的方式实现。
过程如下:
1、客户端将所有的数据全部传送给服务器之后,先向服务器发出连接释放报文段,并停止再发送数据,主动关闭TCP连接。FIN = 1(表示这是一次断开的请求)seq = u,(数据包的序号为u),等待 服务器确认。
2、服务器发送确认,ACK = 1(响应的请求), seq = v(数据包序号), ack= u + 1(数据包确认号),从 客户端到 服务器这个方向的连接就释放了,TCP 连接处于半关闭状态。服务器若发送数据,客户端仍要接收。(这种情况,客户端只接收,不发送
3、服务器开始告诉客户端,我要关闭了。FIN = 1(表示释放连接的), ACK = 1(表示响应的请求), seq = w(数据包序列号), ack= u + 1(数据包确认号)
4、客户端收到服务器的释放请求,开始给服务器响应结果。ACK = 1, seq = u + 1(本次数据包序列号), ack = w + 1(数据包确认号,表示已经收到w之前的数据)。

释放的时候,各个阶段的客户端和服务器的状态

释放时,各个阶段的状态如下:
下面用A表示客户端、B表示服务器。

1、A没有给B发送释放请求之前,A、B都是出于ESTABLISHEN,表示双方还是出于建立连接状态。
2、A给B发送释放请求时,A的状态会变成FIN-WAIT-1,在没有得到B的请求响应之前,状态都是FIN-WAIT-1,此时B还是ESTABLISHEN状态。
3、A收到B的相应之后,A的状态会由FIN-WAIT-1变成FIN-WAIT-2,此时B会变成CLOSE-WAIT,等待关闭。此时客户端 ——> 服务器已经关闭,服务器 ——> 客户端仍然处于连接状态。
4、B会开始断开与客户端的连接。B给A发送释放连接的请求,B状态会变成LAST-ACK(最后一次确认)。
5、A会处理本次释放请求,给B响应结果。发送之后,A不会立刻关闭,而是变成TIME-WAIT等待关闭。
6、等待一个时间段之后,B往A方向连接会正常关闭,客户端和服务器都会变成CLOSE状态。

这里有一点,刚才说,A在处理B发出的请求之后,给B返回响应结果,并不会马上关闭,而是等待一段时间,再去关闭,这个地方也容易被考察

TIME-WAIT阶段会等待2MSL时间段(MSL:一个请求的往返时间,默认为两分钟),为什么会等待该时间段呢?

因为担心A给B的释放请求响应的数据包丢失,过段时间后,B会再次发送释放请求,如果A即可关闭,则该请求不会再被处理,B会一直处于等待状态(资源浪费);等待2MSL之后,即使第一次丢包,下次请求仍然会正常处理,不会让B一直处于等待状态。

为了便于理解同样提供了一张图
在这里插入图片描述

8. 你刚才说到TCP是可靠性传输,你知道TCP协议是如何保证可靠性传输的吗?

对于可靠性,TCP通过以下方式进行保证:

数据包校验:目的是检测数据在传输过程中的任何变化,若校验出包有错,则丢弃报文段并且不给出响应,这时TCP发送数据端超时后会重发数据;

对失序数据包重排序:既然TCP报文段作为IP数据报来传输,而IP数据报的到达可能会失序,因此TCP报文段的到达也可能会失序。TCP将对失序数据进行重新排序,然后才交给应用层;

丢弃重复数据:对于重复数据,能够丢弃重复数据;

应答机制:当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒;

超时重发:当TCP发出一个段后,它启动一个定时器,等待目的端确认收到这个报文段。如果不能及时收到一个确认,将重发这个报文段;

流量控制:TCP连接的每一方都有固定大小的缓冲空间。TCP的接收端只允许另一端发送接收端缓冲区所能接纳的数据,这可以防止较快主机致使较慢主机的缓冲区溢出,这就是流量控制。TCP使用的流量控制协议是可变大小的滑动窗口协议。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值