其他计算机网络面试题总结:
【计算机网络重要知识点总结一】
【计算机网络重要知识点总结三】
【计算机网络重要知识点总结四】
一、谈谈对滑动窗口的理解?
TCP 是每发送一个数据,都要进行一次确认应答。当上一个数据包收到了应答了, 再发送下一个。但是这样效率会很低。于是TCP中引入了窗口的概念。
窗口的实现实际上是操作系统开辟的一个缓存空间,发送方主机在等到确认应答返回之前,必须在缓冲区中保留已发送的数据。如果按期收到确认应答,此时数据就可以从缓存区清除。
有了窗口,发送方无需等待确认应答,也可以继续发送数据**。
窗口的大小通常由接收方的窗口大小决定。
由于一台主机既可以发送又可以接收,所以发送方和接收方各自会有一个发送窗口和接收窗口。
发送窗口
发送窗口中,通过两个绝对指针和**一个相对指针(偏移)**来跟踪四个传输类别。
SND.UNA
:绝对指针,它指向的是已发送但未收到确认的第一个字节的序列号。SND.NXT
:绝对指针,它指向未发送但可发送范围的第一个字节的序列号。- 指向 #4 的第一个字节是个相对指针,它需要
SND.UNA
指针加上SND.WND
大小的偏移量。
接收窗口
接收窗口中,通过一个绝对指针和一个相对指针来来跟踪三个传输类别。
RCV.NXT
:绝对指针,它指向期望从发送方发送来的下一个数据字节的序列号,也就是 #3 的第一个字节。- 指向 #4 的第一个字节是相对指针,它需要
RCV.NXT
指针加上RCV.WND
大小的偏移量。
接收窗口的大小是约等于发送窗口大小的(接收和发送速率可能不完全一致)。
二、谈谈TCP的流量控制?
TCP 利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。接收方发送的确认报文中的窗口(window)字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。
因为窗口实际是操作系统的一块缓存空间,所以当系统资源紧张时,可能会减少缓冲区的大小,如果应用程序没来得及读取数据,会导致数据包丢失的现象。
为避免这种情况,TCP 规定是不允许同时减少缓存又收缩窗口,而是采用先收缩窗口,过段时间再减少缓存。
窗口关闭状态
窗口大小为 0 时,就会阻止发送方给接收方传递数据,直到窗口变为非 0 为止,这就是窗口关闭。
当发生窗口关闭时,接收方处理完数据后,会向发送方通告一个窗口非 0 的 ACK 报文,如果这个通告窗口的 ACK 报文在网络中丢失了
,会导致发送方一直等待接收方的非 0 窗口通知,接收方也一直等待发送方的数据,如不采取措施,这种相互等待的过程,会造成了死锁的现象
。
解决方法:
TCP 为每个连接设有一个持续定时器,只要 TCP 连接一方收到对方的零窗口通知,就启动持续计时器。
如果持续计时器超时,就会发送窗口探测 ( Window probe ) 报文(一般是3次),而对方在确认这个探测报文时,给出自己现在的接收窗口大小。
- 如果接收窗口仍然为 0,那么收到这个报文的一方就会
重新启动持续计时器
。
关于小数据的传输
如果接收方的窗口比较小时,发送方不断发送数据,可能会导致资源的浪费。因为 TCP + IP
头有 40
个字节,而数据可能只有几个字节。这个问题一般从两方面解决,接收方不通告小窗口和发送方不发送小数据。
-
接收方不通告小窗口:当「窗口大小」小于 min( MSS,缓存空间/2 ) ,也就是小于 MSS 与 1/2 缓存大小中的最小值时,就会向发送方通告窗口为
0
,也就阻止了发送方再发数据过来。(MSS是TCP报文段中的数据字段的最大长度) -
发送方不发送小数据:使用 Nagle 算法,至少满足一下条件之一才发送。
(1)窗口大小 >=
MSS
或是 数据大小 >=MSS
。(2)收到之前发送数据的
ack
回包。
三、谈谈TCP的拥塞控制?用到了哪些算法?
首先要清楚拥塞控制和流量控制的不同:
流量控制是避免「发送方」的数据填满「接收方」的缓存,但是并不知道网络的中发生了什么。
但是计算机网络都处在一个共享的环境,因此也有可能会因为其他主机之间的通信使得网络拥堵。
在网络出现拥堵时,如果继续发送大量数据包,就会加重网络整体的负担,为了减轻全局网络的负荷,TCP会减少自己要发送的数据量。
什么是拥塞窗口?和发送窗口、接收窗口的关系?
拥塞窗口 cwnd是发送方
维护的一个的状态变量,它会根据网络的拥塞程度动态变化的,初始值为1。
拥塞窗口=min(发送窗口,接收窗口)
如果「发送方」没有在规定时间内接收到 ACK 应答报文,也就是**发生了超时重传,就会认为网络出现了拥塞。**此时拥塞窗口就会变小。
拥塞控制用到了哪些算法?
- 慢开始
意思就是一点一点的提高发送数据包的数量,当发送方每收到一个 ACK,拥塞窗口 cwnd 的大小就会加 1(每经过一个传播轮次,发送->接收,cwnd 加倍)。
在慢开始算法中,发包的个数是指数增长的。当cwnd>=慢启动门限(ssthresh)时,就会使用「拥塞避免算法」。
- 拥塞避免
每当收到一个 ACK 时,cwnd 增加 1/cwnd。这样使得原来的指数增长变为了线性增长。
当出现丢包的时候,会触发重传机制,也就进入了快重传和快恢复算法。
- 快重传和快恢复FRR
没有 FRR,如果数据包丢失了,TCP 将会使用定时器来要求传输暂停。在暂停的这段时间内,没有新的或复制的数据包被发送。有了FRR,当接收方发现丢了一个中间包的时候,发送三次前一个包的 ACK,于是发送端就会快速地重传,不必等待超时再重传。
当有单独的数据包丢失时,快速重传和快恢复(FRR)能最有效地工作。当有多个数据信息包在某一段很短的时间内丢失时,它则不能很有效地工作。
四、什么是粘包和拆包?
TCP是个“流”协议,没有界限的一串数据。TCP底层并不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。
- 服务端一次接收到了两个数据包,D1和D2粘合在一起,被称为TCP粘包;
- 服务端分两次读取到了两个数据包,第一次读取到了完整的D1包和D2包的部分内容,第二次读取到了D2包的剩余内容,这被称为TCP拆包;
五、TCP粘包/拆包是如何产生的?
- 发送方产生粘包
采用 TCP 协议传输数据的客户端与服务器经常是保持一个长连接的状态(一次连接发一次数据不存在粘包),双方在连接不断开的情况下,可以一直传输数据。但当发送的数据包过于的小时,那么 TCP 协议默认的会启用 Nagle 算法,将这些较小的数据包进行合并发送(缓冲区数据发送是一个堆压的过程);这个合并过程就是在发送缓冲区中进行的,也就是说数据发送出来它已经是粘包的状态了。
- 接收方产生粘包
接收方采用 TCP 协议接收数据时的过程是这样的:数据到接收方,从网络模型的下方传递至传输层,传输层的 TCP 协议处理是将其放置接收缓冲区,然后由应用层来主动获取(C 语言用 recv、read 等函数);这时会出现一个问题,就是我们在程序中调用的读取数据函数不能及时的把缓冲区中的数据拿出来,而下一个数据又到来并有一部分放入的缓冲区末尾,等我们读取数据时就是一个粘包。(放数据的速度 > 应用层拿数据速度)
- 要发送的数据大于TCP发送缓冲区剩余空间大小,将会发生拆包;
- 待发送数据大于MSS(最大报文长度),TCP在传输前将进行拆包。
六、如何解决粘包/拆包问题?
- 消息定长。发送端将每个数据包封装为固定长度(不够的可以通过补0填充),这样接收端每次接收缓冲区中读取固定长度的数据就自然而然的把每个数据包拆分开来。
- 设置消息边界。服务端从网络流中按消息边界分离出消息内容。在包尾增加回车换行符进行分割,例如FTP协议。
- 将消息分为消息头和消息体,消息头中**包含表示消息总长度(或者消息体长度)**的字段。
UDP 没有粘包问题,但是有丢包和乱序。不完整的包是不会有的,收到的都是完全正确的包。传送的数据单位协议是 UDP 报文或用户数据报,发送的时候既不合并,也不拆分。
七、TCP协议如何保证可靠传输的?
- 数据包校验:如果检验出报文段有错,则丢弃报文不予相应。
- 对失序的数据包重排序:TCP将收到的报文段排序后,再交给应用层。
- 丢弃重复数据
- 应答机制:当接收端收到数据后,会向发送端发送一个确认(不是立即发送)。
- 超时重发:发送端发送一个报文后,就会启动一个定时器。如果超过时间没有收到确认,就会重发报文。
- 流量控制
八、IP地址的分类?
网络号最前面的三位表示类别位。
九、IP地址和MAC地址有什么区别?各自的用处?
IP 地址主要用来网络寻址用的,就是大致定位你在哪里,而 MAC 地址,则是身份的唯一象征,通过 MAC 来唯一确认这人是不是就是你,MAC 地址不具备寻址的功能。
十、TCP最大连接数是多少?
1.如何唯一标识一个TCP连接?
通过四元组。即源ip地址、源端口、目的ip地址、目的端口。
client最大连接数
本地端口最多65536个,0号端口要保留,所以最多连接数为65535。
server最大连接数
最大tcp连接数约为2的32次方(ip数)×2的16次方(port数),约为2的48次方。
实际连接数
对server端,通过增加内存、修改最大文件描述符个数等参数,单机最大并发TCP连接数超过10万 是没问题的。