ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

计算机网络高频面试题-TCP/UDP

2022-04-14 12:03:11  阅读:135  来源: 互联网

标签:面试题 ACK 报文 UDP TCP 发送 服务端 客户端


一、TCP和UDP区别是什么

答:TCP 和 UDP协议都是运输层的

1、TCP面向连接的;UDP是无连接的,即发送数据之前不需要建立连接。

2、TCP提供可靠的服务,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序列达到达; 而UDP尽最大努力交付,不保证可靠交付。

3、TCP面向字节流,实际上是TCP吧数据看成一连串的无结构的字节流;UDP是面向报文的;UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低。(对实时通话等)

4、每一条TCP连接只能是点到点的;UDP一对一,一堆多,多对一和多堆多的交互通信。

5、TCP首部开销20字节,UDP首部开销更小,只有8个字节。

 

TCP头部

 

 

TCP是如何保证可靠传输

1.应用数据被分割成TCP认为最适合的数据库

2.TCP给发送的每一个包进行编号,接受方对数据包进行排序,把有序数据传送给应用层。

3.校验和:TCP将保持它的首部和数据的校验和。这是一个端到端的校验和,目的是检测数据在传输过程中发送的任何变化。

如果收到端的校验有差错,TCP将丢弃这个报文段和不确认收到此报文段。

4.TCP的接受端会丢弃重复的数据

5.流量控制:TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端 发送接收端缓冲区能接纳的数据。

当接收方来不及处理发送方的数据,能提示发送方降低速率,防止包丢失。TCP使用流量控制协议是可变大小的滑动窗口协议(TCP利用滑动窗口实现流量控制)

6.拥塞控制:当网络拥塞时,减少数据的发送

7.ARQ协议:为了实现可靠传输,它的基本原理就是每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。

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

 

二、TCP的三次握手和四次挥手

三次握手

 

 

 

1、客户端、服务端首先都处于CLOSED状态。服务端打开某个服务后会主动监听某个端口,处于LISTEN状态

2、客户端   请求服务器会随机初始化序号,将此序号置于TCP首部的【序号】字段中,同时把SYN标志位置置为1

表示SYN报文。接着把一个SYN报文发送给服务端,向服务端发起连接,该报文不包含应用层数据,之后客户端处于SYN-SEND状态

3、服务端收到客户端的SYN报文后,首先服务端也随机初始化自己的序号(server_isn),将此序号填入TCP首部的【序号中】其次把TCP首部的【确认应答号】字段填入

client_isn+1,接着置SYN=1,ACK=1。最后把该报文发送给客户端,该报文也不包含应用层数据,之后服务端处于SYN-RECEIVED。

4、客户端收到服务端报文后,还要向服务端回应最后一个应答报文,首先硬蛋报文TCP首部ACK标志位1,其次确认应答号server_isn+1,最后把报文发送给服务端,这次报文可以

携带客户到服务端的数据,之后处于ESTABLISHED状态

5、服务端收到应答报文后,也进入了ESTABLISHED状态。

 

四次握手

 

1、客户端打算关闭连接,此时发送一个TCP首部FIN标志位被置为1的报文,也即FIN报文,之后客户端进FIN_WAIT_1状态

2、服务端收到该报文,就向客户端发送ACK应答报文,接着进入CLOSED_WAIT状态。

3、客户端收到服务端ACK应答报文后,之后进入FIN_WAIT_2状态

4、等待服务端处理完数据后,也向客户端发送FIN报文,之后服务端进入LAST_ACK状态。

5、客户端收到服务端的FIN报文后,回一个ACK应答报文进入TIME_WAIT状态

6、服务端收到ACK应答报文后,进入CLOSED状态,至此关闭服务端

7、客户端在经过2MSL一段时间后,自动进入CLOSED状态,至此客户端关闭连接。

 

 

追问:为什么不能是两次握手,或者四次握手的原因:

两次:无法防止历史连接的建立,会造成双方自愿的浪费,也无法可靠的同步双方序列号。

四次:三次握手理论上可以建立更少的连接,四次握手更多会增大开销,浪费计算机资源。

 

为什么TIME_WAIT等待的时间是2MSL?

MSL:报文最大生存时间,它是任何报文在网络上的存在的最长时间,超过这个时间报文会被丢弃。

TIME_WAIT等待2MSL 网络中可能存在来自发送方的数据包,当这些发送方的数据报备接收方处理后又会在向对方发送响应,所以一来一回是2MSL。 2倍的MSL时间

 

2MSL的时间客户端接受到FIN后发送ACK开始计时,如果TIME-WAIT时间内,因为客户端ACK没有传输到服务端,服务端会又发送FIN报文,客户端接受到了重发的FIN报文,那么2MSL时间重新计时。

LINUX中一般2MSL为60秒,一个MSL未30秒。

 

追问:为什么需要TIME_WAIT

防止相同的【四元组】的【旧】数据被收到;

保证【被动关闭连接】的一方能被正确的关闭,即保证最后的ACK能被被动关闭放收到,从而帮助其远程关闭。

 

追问:为什么要四次挥手

因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。

但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。

只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送,故需要四次挥手。

 

追问:TIME_WAIT过多的危害

1、内存资源占用过多 浪费

2、端口的占用,一个TCP连接至少消耗一个端口。

 

拥塞控制的算法:

1、慢启动

2、拥塞避免

3、拥塞发生

4、快速恢复

 

标签:面试题,ACK,报文,UDP,TCP,发送,服务端,客户端
来源: https://www.cnblogs.com/Alei777/p/16143905.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有