IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> 计算机网络面试题(二) -> 正文阅读

[网络协议]计算机网络面试题(二)

11、为什么客户端的TIME-WAIT状态必须等待2MSL

主要有两个原因:
1、确保ACK报文能够到达服务端,从而使服务端正常关闭连接。
第四次挥手时,客户端第四次挥手的ACK报文不一定会到达服务端。服务端会超时重传FIN/ACK报文,此时如果客户端已经断开了连接,那么就无法响应服务端的二次请求,这样服务端迟迟收不到FIN/ACK报文的确认,就无法正常断开连接。
MSL是报文段在网络上存活的最长时间。客户端等待2MSL时间,即[客户端ACK报文1MSL超时+服务端FIN报文1MSL传输],就能收到服务端重传的FIN/ACK报文,然后客户端重传一次ACK报文,并重新启动2MSL计时器。如此保证服务端能够正常关闭。
如果服务端重发的FIN没有成功地在2MSL时间里传给客户端,服务端则会继续超时重试直至断开连接。
2、防止已失效地连接请求报文段出现在之后的连接中。
TCP要求在2MSL内不使用相同的序列号。客户端在发送完最后一个ACK报文段后,再经过时间2MSL,就可以保证本连接持续的时间内产生地所有报文段都从网络中消失。这样就可以使下一个连接中不会出现这种旧的连接请求报文段。或者即使收到这些过时的报文,也可以不处理他。

12、如果已经建立了连接,但是客户端出现故障了怎么办?(或者说三次握手或者四次挥手阶段的包丢失了怎么办?)

简而言之,通过(定时器+超时重试机制),尝试获取确认,直到最后会自动断开连接。
具体而言,TCP设有一个保活计时器,服务器每收到一个客户端的数据,都会重新复位这个计时器,时间通常是设置为2h,若2h还没收到客户端的任何数据,服务器就开始重试:每隔75min发送一个探测报文段,若一连发送10个探测报文客户端依然没有回应,那么服务器就认为连接已经断开了。

13、TIME-WAIT状态过多会产生什么后果?怎么处理?

从服务器来讲,短时间关闭了大量的Client连接,就会造成服务器上出现大量的TIME_WAIT连接,严重消耗服务器的资源,此时部分客户端就会显示连接不上。
从客户端来讲,客户端TIME_WAIT过多,就会导致端口资源被占用,因为端口就65536个,被占满就会导致无法创建新的连接。
解决办法:

  • 服务器可以设置SO_REUSEADDR套接字选项来避免TIME_WAIT状态,此套接字选项告诉内核,即使此端口正忙(处于TIME_WAIT状态),也请继续并重用它。
  • 调整系统内核参数,修改/etc/sysctl.conf文件,即修改net.ipv4.tcp_tw_reuse和tcp_timestamps,net.ipv4.tcp_tw_reuse=1表示开启重用,允许将TIME_WAIT sockets重新用于新的TCP连接,net.ipv4.tcp_tw_recycle=1表示开启TCP连接中TIME_WAIT sockets的快速回收。
  • 强制关闭,发送RST包越过TIME_WAIT状态,直接进入CLOSED状态。

14、TIME-WAIT是服务端状态还是客户端状态?

TIME-WAIT是主动断开连接的一方会进入的状态。一般情况下都是客户端所处的状态;服务器端一般设置不主动关闭连接。
TIME-WAIT需要等待2MSL,在大量短连接的情况下,TIME-WAIT会很多,这也会消耗很多系统资源。对于服务器来说,在HTTP协议指定KeepAlive(浏览器重用1个TCP连接来处理多个HTTP请求),由浏览器来主动断开连接,可以一定程度上减少服务器的这个问题。

15、TCP协议如何保证可靠性?

TCP主要提供了检验和、序列号/确认应答、超时重传、滑动窗口、拥塞控制和流量控制等方法实现了可靠性传输。

  • 检验和:通过检验和的方式,接收端可以检测出来数据是否有差错和异常,假如有差错就会直接丢弃TCP段,重新发送。
  • 序列号/确认应答:序列号的作用不仅仅是应答的作用,有了序列号能够将接收到的数据根据序列号排序,并且去掉重复序列号的数据。TCP传输过程中,每次接收方收到数据后,都会对传输方进行确认应答,即发送ACK报文,这个ACK报文中带有对应的确认序列号,告诉发送方,接收到了哪些数据,下一次的数据从哪里发送。
  • 超时重传:超时重传是指发送出去的数据包到接收到确认包之间的时间,如果超过了这个时间会被认为是丢包了,需要重传。最大超时时间是动态计算的。
  • 滑动窗口:滑动窗口既提高了报文传输效率,也避免了发送方发送过多的数据而导致接收方无法正常处理的异常。
  • 拥塞控制:在数据传输过程中,可能由于网络状态的问题,造成网络拥堵,此时引入拥塞控制机制,在保证TCP可靠性的同时,提高性能。
  • 流量控制:如果主机A一直向主机B发送数据,而不考虑主机B的接受能力,则可能导致主机B的接收缓冲区满了而无法在接受数据,从而会导致大量的数据丢包,引发重传机制。而在重传的过程中,若主机B的接收缓冲区情况仍未好转,则会将大量的时间浪费在重传数据上,降低传送数据的效率。所以引入流量控制机制,主机B通过告诉主机A自己接收缓冲区的大小,来使主机A控制发送的数据量。流量控制与TCP协议报头中的窗口大小有关。

16、详细描述TCP的滑动窗口。

在进行数据传输时,如果传输的数据比较大,就需要拆分为多个数据包进行发送。TCP协议需要对数据进行确认后,才可以发送下一个数据包。这样一来,就会在等待确认应答包环节浪费时间。
为了避免这种情况,TCP引入了窗口概念。窗口大小指的是不需要等待应答确认包而可以继续发送数据包的最大值。
在这里插入图片描述
从上图可以看出,滑动窗口左边是已经发送并确认的分组,右边是还没轮到的分组。
滑动窗口里也分为两部分:一部分为已经发送但是未被确认的分组,一部分为窗口内要被立即发送的分组。随着已发送的部分被不断确认,窗口内等待发送的分组也会被不断发送。整个窗口就会往右移动,让还没轮到的分组进入窗口内。
可以看到滑动窗口起到了一个限流的作用,也就是说当前滑动窗口的大小决定了当前TCP发送包的速率,而滑动窗口的大小取决于拥塞控制窗口和流量控制窗口的两者间的最小值。

17、详细讲一下拥塞控制

TCP一共使用了四种算法来实现拥塞控制:

  • 慢开始(slow-start)
  • 拥塞避免(congestion avoidance)
  • 快速重传(fast retransmit)
  • 快速恢复(fast recovery)

发送方维持一个叫拥塞窗口的状态变量(cwnd-congestion window),当cwndssthresh时,改用拥塞避免算法。

**慢开始:**不要一开始就发送大量数据,由小到大逐渐增加拥塞窗口大小。

**拥塞避免:**拥塞避免算法让窗口缓慢增长,即每经过一个往返时间RTT就把发送方的拥塞窗口cwnd加1而不是加倍,这样拥塞窗口按线性规律缓慢增长。

**快重传:**我们可以剔除一些不必要的拥塞报文,提高网络吞吐量。比如接收方在收到一个失序的报文段后就立即发出重复确认,而不要等到自己发送数据时捎带确认。快重传规定:发送方只要一连收到3个重复确认就应当立即重传对方尚未收到的报文段,而不必继续等待设置的重传计时器时间到期。

**快恢复:**主要是为了配合快重传。当发送方连续收到三个重复确认时,就执行“乘法减小”算法,把ssthresh门限减半(为了预防网络发送拥塞),但并不执行慢开始算法,因为如果网络出现拥塞的话就不会收到好几个重复的确认,收到三个重复确认说明网络状况还可以。

18、HTTP常见的状态码有哪些?

常见状态码:

  • 200:服务器已成功处理了请求。通常,这表示服务器提供了请求的网页。
  • 301:(永久移动)请求的网页已永久移动到新位置。服务器返回此响应(对GET或HEAD请求的响应)时,会自动将请求者转到新位置。
  • 302:(临时移动)服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
  • 400:客户端请求有语法错误,不能被服务器所理解。
  • 403:服务器收到请求,但是拒绝提供服务。
  • 404:(未找到)服务器找不到请求的网页。
  • 500:(服务器内部错误)服务器遇到错误,无法完成请求。

状态码开头代表类型:

开头序号类别原因短语
1xxInformational(信息状态码)接收的请求正在处理
2xxSuccess(成功状态码)请求正常处理完毕
3xxRedirection(重定向状态码)需要进行附加操作以完成请求
4xxClient Error(客户端错误状态码)服务器无法处理请求
5xxServer Error(服务器错误状态码)服务器处理请求出错

19、状态码301和302的区别是什么?

共同点:301和302状态都表示重定向,就是说浏览器拿到服务器返回的这个状态码后会自动跳转到一个新的URL地址,这个地址可以从相应的Location首部中获取(用户看到的效果就是输入的地址A瞬间变成了另一个地址B)
不同点:301表示旧地址A的资源已经被永久移除了(这个资源不可访问),搜索引擎在抓取新内容的同时也将旧的网址交换为重定向之后的网址;302表示旧地址A的资源还在(仍然可以访问),这个重定向只是临时的从旧地址A跳转到地址B,搜索引擎会抓取新的内容而保存旧的地址。
补充:重定向原因:
1、网站调整(改变网页目录结构)
2、网页被移动到新地址
3、网页扩展名改变

20、HTTP常用的请求方式?

方法作用
GET获取资源
POST传输实体主体
PUT上传文件
DELETE删除文件
HEAD和GET方法类似,但只返回报文首部,不返回报文实体主体部分
PATCH对资源进行部分修改
OPTIONS查询指定的URL支持的方法
CONNECT要求用隧道协议连接代理
TRACE服务器会将通信路径返回给客户端

为了方便记忆,可以将PUT、DELETE、POST、GET、GET理解为客户端对服务端的增删改查。

  • PUT:上传文件,向服务器添加数据,可以看作增
  • DELETE:删除文件
  • POST:传输数据,向服务器提交数据,对服务器进行更新
  • GET:获取资源,查询服务器资源

参考链接:同上。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2021-09-08 11:06:18  更:2021-09-08 11:06:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:18:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码