计算机网络面试核心

一 OSI七层模型

1 OSI (开放式系统互联) 7层模型的小结

OSI定义了网络互连的七层框架(物理层、数据链路层、网络层、传输层、会话层、表示层、应用层),即ISO开放互连系统参考模型。每一层实现各自的功能和协议,并完成与相邻层的接口通信。OSI的服务定义详细说明了各层所提供的服务。某一层的服务就是该层及其下各层的一种能力,它通过接提供给更高一层。各层所提供的服务与这些服务是怎么实现的无关。
————————————————

<1> 应用层: OSI参考模型中最靠近用户的一层,是为计算机用户提供应用接口,也为用户直接提供各种网络服务。我们常见应用层的网络服务协议有:HTTP,HTTPS,FTP,POP3、SMTP等。

<2> 表示层: 表示层提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。如果必要,该层可提供一种标准表示形式,用于将计算机内部的多种数据格式转换成通信中采用的标准表示形式。数据压缩和加密也是表示层可提供的转换功能之一。

<3> 会话层:会话层就是负责建立、管理和终止表示层实体之间的通信会话。该层的通信由不同设备中的应用程序之间的服务请求和响应组成。

<4> 传输层:传输层建立了主机端到端的链接,传输层的作用是为上层协议提供端到端的可靠和透明的数据传输服务,包括处理差错控制和流量控制等问题。该层向高层屏蔽了下层数据通信的细节,使高层用户看到的只是在两个传输实体间的一条主机到主机的、可由用户控制和设定的、可靠的数据通路。我们通常说的**,TCP UDP就是在这一层。端口号既是这里的“端”。**

<5> 网络层: 本层通过IP寻址来建立两个节点之间的连接,为源端的运输层送来的分组,选择合适的路由和交换节点,正确无误地按照地址传送给目的端的运输层。就是通常说的IP层。这一层就是我们经常说的IP协议层。IP协议是Internet的基础。(路由器工作此层)

<6> 数据链路层 :将比特组合成字节,再将字节组合成帧,使用链路层地址 (以太网使用MAC地址)来访问介质,并进行差错检测。数据链路层又分为2个子层:逻辑链路控制子层(LLC)和媒体访问控制子层(MAC)。MAC子层处理CSMA/CD算法、数据出错校验、成帧等;LLC子层定义了一些字段使上次协议能共享数据链路层。 在实际使用中,LLC子层并非必需的。(交换机工作此层)

<7> 物理层 :实际最终信号的传输是通过物理层实现的。通过物理介质传输比特流。规定了电平、速度和电缆针脚。常用设备有(各种物理设备)集线器、中继器、调制解调器、网线、双绞线、同轴电缆。这些都是物理层的传输介质。

img

由于OSI是一个理想的模型,因此一般网络系统只涉及其中的几层,很少有系统能够具有所有的7层,并完全遵循它的规定。
在7层模型中,每一层都提供一个特殊的网络功能。从网络功能的角度观察:下面4层(物理层、数据链路层、网络层和传输层)主要提供数据传输和交换功能,即以节点到节点之间的通信为主;第4层作为上下两部分的桥梁,是整个网络体系结构中最关键的部分;而上3层(会话层、表示层和应用层)则以提供用户与应用程序之间的信息和数据处理功能为主。简言之,下4层主要完成通信子网的功能,上3层主要完成资源子网的功能。

二 TCP/IP

1 OSI七层和TCP/IP四层的关系

  1. OSI引进了服务、接口、协议、分层的概念,TCP/IP借鉴了OSI的这些概念建立TCP/IP模型。
  2. OSI先有模型,后有协议,先有标准,后进行实践;而TCP/IP则相反,先有协议和应用,再提出了模型,且是参照OSI模型。
  3. OSI是一种理论下的模型,而TCP/IP已经被广泛应用,称为网络互联实施上的标准。

TCP的FLAG位由6个bit组成,分别代表

ACK:确认序号标志,用于对收到的数据进行确认。

SYN:同步序号,用于建立连接过程

FIN:finish标志,用于释放连接

URG:紧急指针标志 PSH:push标志 RST:重置连接标志

2 TCP三次握手😊

这里写图片描述

假设A机器是客户端角***机器是服务端角色,后者需要前者发起连接请求时先打开某个端口等待数据传输,否则无法正常建立连接。

第一次握手:客户端A发送一个数据包并将SYN同步序号标志位置1,表明希望建立连接。初始序号X,保存在包头的序列号(Sequence Number)字段里。
第二次握手:服务器B收到客户端A的数据包后,通过SYN得知这是一个建立连接的请求,于是发送返回确认包(ACK)应答,并将
SYN标志位和ACK标志位均为1
。假设这个包中的序列号是y,而且确认序列号ack必须是x+1,表示收到了A发过来的SYN。
第三次握手:客户端A收到B响应包需进行确认, SYN标志位为0, ACK确认序号标志位为1.并且把服务器发来ACK的序号字段+1,即y+1,表示收到了来自服务端B的SYN同步序号。

在这里插入图片描述

3 为什么需要第三次握手?

主要有两个目的:信息对等和防止超时

信息对等角度:双方只有确认4类信息(自己收、发报能力、对方收、发报能力),才能建立连接。在第2次握手后,从服务端B视角看还有自己发送报文能力和对方收报能力无法确认。因此在第3次握手后,才确认自己的发报能力和对方的收报能力。

防止超时角度:连接三次握手也是防止出现请求超时导致脏连接。

SYN超时起因:

  1. Server服务端收到Client客户端的SYN,回复SYN-ACK的时候未收到ACK确认。

  2. Server服务端不断重试直至超时,Linux默认等待63秒才断开连接(默认重试5次1+2+4+8+16+32)。在第5次发出去之后,还需要等待32s才能被判定为超时。

建立连接后,Client出现故障怎么办?

Keep Alive保活机制:

  1. 向对方发送保活探测报文(心跳包)检查连接的健康度,如果未收到响应则继续发送。
  2. 尝试次数达到保活探测数仍未受到响应则中断。

4 TCP四次挥手😊

TCP是全双工通信,双方都能作为数据的发送方和接收方,但TCP连接也会有断开的时候。

  • 第一次挥手:主动关闭方发送一个FIN并进入FIN_WAIT1状态
  • 第二次挥手:被动关闭方接收到主动关闭方发送的FIN并发送ACK,确认序号为收到序号+1,此时被动关闭方进入CLOSE_WAIT状态;主动关闭方收到被动关闭方的ACK后,进入FIN_WAIT2状态
  • 第三次挥手:被动关闭方发送一个FIN并进入LAST_ACK状态
  • 第四次挥手:主动关闭方收到被动关闭方发送的FIN并发送ACK,确认序号为收到序号+1,此时主动关闭方进入TIME_WAIT状态,经过2MSL时间后关闭连接;被动关闭方收到主动关闭方的ACK后,关闭连接

通俗解释:

  1. A机器想要关闭连接,则 带本方数据发送完毕后,传递FIN信号给B机器,此时A机器进行FIN_WAIT1。

  2. B机器应答ACK,告诉A机器可以断开,但是需要等待B机器处理玩数据,再主动给A机器发送FIN信号,此时,A

    机器处于半关闭状态(FIN_WAIT2),无法在发送新的数据。

  3. B机器做好连接关闭前的准备工作后,发送FIN给A机器,此时B机器也进入半关闭状态(CLOSE_WAIT).

  4. A机器发送针对B机器FIN的ACK后,进入TIME_WAIT状态,经过2MSL(报文最大生存时间),没有收到B机器传来的报文,则确定B机器已经收到A机器最后发送的ACK指令,此时TCP连接正式释放。

为什么需要四次挥手才能断开连接?

因为是全双工,发送方和接收方都需要FIN报文和ACK报文。

服务器出现大量CLOSE_WAIT状态的原因?

对方关闭socket连接,我方忙于读或写,忙于及时关闭连接。

解决方法:1、检查代码,特别是释放资源的代码。2、检查配置,特别是处理请求的线程配置。

三 UDP(用户数据报协议)

UDP报头由4个域组成,其中每个域各占用2个字节,具体包括源端口号、目标端口号、数据报长度、校验值

  1. 面向非连接的,传输数据之前源端和终端不建立连接,当它想传送时就简单地去抓取来自应用程序的数据,并尽可能快地把它扔到网络上。在发送端,UDP传送数据的速度仅仅是受应用程序生成数据的速度、计算机的能力和传输带宽的限制;在接收端,UDP把每个消息段放在队列中,应用程序每次从队列中读一个消息段。
  2. 不维护连接状态,支持同时向多个客户端传输相同的消息。
  3. 数据包报头只有8个字节,相对于TCP的20个字节报头,额外开销较小。
  4. 吞吐量只受限于数据生成速率,传输速率以及机器性能。
  5. 尽最大努力交付,不保证可靠交付,不需要维持复杂的链接状态表。
  6. UDP是面向报文的。不对应用程序提交的报文信息进行拆分或者合并,发送方的UDP对应用程序交下来的报文,在添加首部后就向下交付给IP层。既不拆分,也不合并,而是保留这些报文的边界,因此,应用程序需要选择合适的报文大小。

四 TCP和UDP的区别

  1. 面向连接vs无连接,tcp有三次握手建立连接,UDP更加适合消息的多播发布,从单个点向多个点传输消息。
  2. 可靠性 不同,tcp利用握手,确认,和重传机制提供了可靠性保证。UDP则可能会丢失,不知道是否被接收。
  3. 有序性,为TCP也保证了消息的有序性。该消息将以从服务器端发出的同样的顺序发送到客户端,尽管这些消息到网络的另一端时可能是无序的。TCP协议将会为你排好序。UDP不提供任何有序性或序列性的保证。数据包将以任何可能的顺序到达。
  4. 速度,TCP速度比较慢,而UDP速度比较快,因为TCP必须创建连接,以保证消息的可靠交付和有序性,他需要做比UDP多的多的事。这就是为什么UDP更适用于对速度比较敏感的应用,例如:在线视频媒体,电视广播和多人在线游戏。
  5. 重量级vs轻量级,体现在元数据的头的大小,TCP具有比UDP更大的头。一个TCP数据包报头的大小是20字节,UDP数据报报头是8个字节

五 TCP的滑动窗口

滑动窗口实现了TCP流控制。首先明确滑动窗口的范畴:TCP是双工的协议,会话的双方都可以同时接收和发送数据。TCP会话的双方都各自维护一个发送窗口和一个接收窗口。各自的接收窗口大小取决于应用、系统、硬件的限制(TCP传输速率不能大于应用的数据处理速率)。各自的发送窗口则要求取决于对端通告的接收窗口,要求相同。

滑动窗口解决的是流量控制的的问题,就是如果接收端和发送端对数据包的处理速度不同,如何让双方达成一致。接收端的缓存传输数据给应用层,但这个过程不一定是即时的,如果发送速度太快,会出现接收端数据overflow,流量控制解决的是这个问题。

窗口的概念

发送方的发送缓存内的数据都可以被分为4类:

  1. 已发送,已收到ACK
  2. 已发送,未收到ACK
  3. 未发送,但允许发送
  4. 未发送,但不允许发送

其中类型2和3都属于发送窗口。

接收方的缓存数据分为3类:

  1. 已接收
  2. 未接收但准备接收
  3. 未接收而且不准备接收

其中类型2属于接收窗口。

窗口大小代表了设备一次能从对端处理多少数据,之后再传给应用层。缓存传给应用层的数据不能是乱序的,窗口机制保证了这一点。现实中,应用层可能无法立刻从缓存中读取数据。

滑动机制

  1. 发送窗口只有收到发送窗口内字节的ACK确认,才会移动发送窗口的左边界。
  2. 接收窗口只有在前面所有的段都确认的情况下才会移动左边界。当在前面还有字节未接收但收到后面字节的情况下,窗口不会移动,并不对后续字节确认。以此确保对端会对这些数据重传。
  3. 遵循快速重传、累计确认、选择确认等规则。
  4. 发送方发的window size = 8192;就是接收端最多发送8192字节,这个8192一般就是发送方接收缓存的大小。

六 HTTP

HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网服务器传输超文本到本地浏览器的传送协议。。

HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等),默认端口是80

1 http主要特点:

  1. HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
  2. 简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快
  3. 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记
  4. 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。在http1.1时使用了Keep-Alive技术,在请求的包头加入一个Connection指数:Keep-Alive,默认TCP长连接,避免了重新建立连接。
  5. 无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快

2 HTTP请求结构

img

3 HTTP请求/响应的步骤

  1. 客户端连接到WB服务器,默认端口为80.
  2. 发送HTTP请求
  3. 服务器接收请求并返回HTTP响应
  4. 释放TCP连接
  5. 客户端浏览器解析HTML内容

4 在浏览器地址栏键入URL,按下回车之后经历的流程?😊

  1. DNS解析(域名解析)将主机名 www.test.com 解析成其具体的 IP 地址 26.231.117.56

    这个解析的过程其实就是对 DNS 缓存的查询,查询的顺序如下

    浏览器缓存、操作系统缓存、路由器缓存、根域名服务器缓存、顶级域名服务器缓存
    在上述的 DNS 查询步骤中,在任意的一个位置找到了,就会立马返回,不再继续往下查了。

  2. TCP连接,根据上一步得来的服务器的 IP 地址,以及端口号,与服务器建立 TCP 连接(三次握手

  3. 发送HTTP请求

  4. 服务器处理请求并且返回HTTP报文

  5. 浏览器解析渲染页面

  6. 释放连接(tcp四次挥手)

5 HTTP状态码😊

五种可能的取值

1、1xx:指示信息——表示服务器收到请求,需要请求者继续执行操作。

2、2xx:成功——表示请求已被成功接收并处理

200 (成功) 服务器已成功处理了请求。

3、3xx:重定向——需要进一步以完成请求

301 (永久移动) 请求的网页已永久移动到新位置。

302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。

4、4xx:客户端错误,请求包含语法错误或者无法完成请求

400 (错误请求) 服务器不理解请求的语法。

401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。

403 (禁止) 服务器拒绝请求。

404 (未找到) 请求资源不存在,服务器找不到请求的网页

5、5xx:服务器错误,服务器在处理请求的过程中发生了错误。

500 (服务器内部错误) 服务器遇到错误,无法完成请求。

503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。

6 GET请求和POST请求的区别

从三个层面来解答:

  1. Http报文层面GET将请求信息放在URL,POST放在报文体

    get传输的数据量小,受URL长度的限,post传输数据量不受限制,可以传输大量数据

    ​ get的最大长度限制是因为浏览器和web服务器限制了URL的长度(IE 2K,Chrome 8K

  2. 数据库层面:HTTP GET 方法,用于获取资源,不管调用多少次接口,结果都不会改变,所以是幂等的。

    ​ HTTP POST 方法是一个非幂等方法,因为调用多次,都将产生新的资源。

    ​ 因此:post用于修改和写入数据,get一般用于搜索排序和筛选之类的操作

  3. 其他层面:GET可以被缓存、被存储,而POST不行

    ​ post请求相对于get请求更安全。因为get请求传递的参数会显示在url中,用户在访问的时候浏 览器会缓存网页,这样别人在查看浏览器浏览记录的时候会获取私人信息,post请求不会被用 户看到,所以安全性高。

7 Cookie和Session的区别

Cookie简介:

  1. 是有服务器发给客户端的特殊信息,以文本的形式存放在客户端。
  2. 客户端再次请求的时候,会把Cookie回发。
  3. 服务器接收到后,会解析Cookie生成与客户端相对应的内容。

Cookie设置以及发送过程:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1OUw7fat-1582209190164)(https://upload-images.jianshu.io/upload_images/12420747-bb2f2aeed07798f7.png?imageMogr2/auto-orient/strip|imageView2/2/w/1200/format/webp)]

  1. 客户端发送一个HTTP请求到服务端。
  2. 服务端发送一个HTTP响应到客户端,包括一个set-cookie的头部。
  3. 客户端发送一个HTTP请求到服务端,包括一个Cookie的头部。
  4. 服务器发送一个HTTP响应到客户端。

Session简介:

  1. 服务器端的机制,在服务器上保存信息;
  2. 解析客户端请求并操作session id,按需保存状态信息;

Session的实现方式:

  1. 使用Cookie来实现;
  2. 使用URL回写来实现;

Cookie和Session的区别

  1. Cookie数据存放在客户的浏览器上,Session数据放在服务器上;
  2. Session相当于Cookie更安全;
  3. 若考虑减轻服务器负担可以考虑使用Cookie;

8 HTTP和HTTPS的区别

SSL(Security Sockets Layer,安全套接层)

  1. 为网络通信提供安全及数据完整性的一种安全协议;
  2. 是操作系统对外的API;,SSL3.0厚更名为TLS(传输层安全协议);
  3. 采用身份验证和数据加密保证网络通信提供安全及数据完整性;

加密方式:

对称加密:加密和解密都使用的同一个密钥。如DES加密、AES加密。、

非对称加密:加密使用的密钥和解密使用的密钥是不相同的。如RSA加密

哈希算法:将任意传递的信息转换为固定长度的值,算法不可逆。如MD5加密算法

数字签名:证明某个消息或者文件时某人发出/认同的。

HTTPS数据传输流程:

  1. 浏览器将支持的加密算法信息发送给服务器;
  2. 服务器选择一套浏览器支持的加密算法,以证书的形式回发浏览器;
  3. 浏览器验证证书的合法性,并结合证书公钥加密信息发送给服务器;
  4. 服务器使用私钥解密信息,验证哈希加密响应信息回发浏览器;
  5. 浏览器解密响应信息,并对消息进行验证,之后进行加密交互数据;

HTTP和HTTPS的区别:

  1. HTTPS需要到CA申请证书,HTTP不需要;
  2. HTTPS密文传输,HTTP明文传输;
  3. 连接方式不同,HTTPS默认使用443端口,HTTP默认使用80端口;
  4. HTTPS = HTTP + 加密 + 认证 + 完整性保护,较HTTP安全;

HTTPS不一定安全

  1. 浏览器默认填充http://请求需要跳转有被劫持的风险;
  2. 可以使用HSTS优化;

七 Socket(套接层)

Socket是对TCP/IP协议的抽象,是操作系统对外开放的接口;

socket是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口供应用层调用已实现进程在网络中通信;

包含进行网络通信必须的五种信息:连接使用的协议本地主机的IP地址本地进程的协议端口远地主机的IP地址,远地进程的协议端口

img

img