【计算机网络】【面试】:TCP传输层部分

1、TCP与UDP区别

UDP和TCP都是属于传输层的。

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

②TCP提供可靠的传输。也就是说通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,不保证可靠交付。

③TCP是面向字节流的,TCP把数据看做一连串无结构的字节流;UDP是面向报文的,UDP没有拥塞控制,因此网络出现拥塞不会使源主机发送频率降低。

④每一条TCP是点对点的;而UDP支持一对一,一对多,多对一和多对多的交互通信。

⑤TCP首部开销为20字节;UDP首部开销小,只有8字节。

⑥TCP通信信道是全双工的可靠信道;UDP是不可靠信道。

2、TCP与UDP使用场景?

UDP一般用于即时通信,比如:QQ语音,QQ视频。

TCP一般用于文件传输,发送和接收邮件,远程登录等场景。

3、TCP怎么保证可靠传输的?

①应用数据被分割成TCP认为最适合发送的数据块

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

③校验和:TCP将保持首部和数据的校验和端到端的校验和检测数据在传输过程中的变化。如果收到检验和有差错的话,TCP将丢弃这个报文段且不确认接受此报文段。

④TCP接收端会丢失重复的数据

⑤流量控制:TCP连接的每一方都有固定大小的缓冲空间,TCP的接收端只允许发送端发送接收端缓冲区能接纳的数据。当接收方来不及处理发送方的数据时,能提示发送方降低发送的频率,防止包丢失。TCP使用滑动窗口协议实现流量的控制。

⑥拥塞控制:当网络拥塞时候,减少数据的发送。

⑦ARQ协议自动重传请求,每发完一个分组就停止发送,等待对方确认。在收到确认后再发下一个分组。

⑧超时重传:当TCP发送一个段后,会启动一个定时器,等待目的段接收这个报文段。如果不能及时收到一个确认,则重新发送这个报文段。

这个题还可以加一个滑动窗口。

4、TCP三次握手过程和参数状态变迁

TCP是面向连接的协议,所以使用TCP之前必须先建立连接,而建立连接是需要三次握手来完成的。

控制位:

ACK:为1的话,表示确认应答的字段有效。

RST:为1的话,表示TCP连接中出现异常必须强制断开。

SYN:为1的话,希望建立连接,并对序列号初始值设定。

FIN:为1的话,表示不再有数据进行发送,希望断开连接。

①一开始,客户端和服务端处于CLOSED状态,先是服务端主动监听某个端口,处于LISTEN状态。

②第一个报文:客户端发送SYN报文到服务端。客户端会随机初始化序号,并设置TCP首部字段,把SYN标志位设置为1,并把第一个SYN报文发送给服务端,向服务端发起连接,之后客户端处于SYN-SENT状态。

③第二个报文:服务端收到客户端SYN报文后,服务器首先初始自己的序号,将序号填入TCP的首部的序号字段中,把TCP的确认应答号填入client_isn + 1,接着把ACK和SYN标志位设置为1。最后把报文发送给客户端,之后服务端处于SYN-RECEIVED的状态。

④第三个报文:客户端收到服务端的报文后,还要向服务端回应最后一个应答报文,首先该应答报文的TCP首部ACK标志位为1,其次确认应答号填入server_isn + 1,最后把报文发送给服务端,这次报文可以携带客户端到服务端的数据,之后客户端处于ESTABLISHED状态。服务端收到客户端的应答报文后,也进入了ESTABLISHED状态。

从上面可以看出第三次捂手是可以携带数据的,前两次握手是不可以携带数据的。

三次握手一旦创建完成,双方都处于ESTABLISHED状态,此时连接创建完成,客户端和服务端就可以互相发送数据了。

5、为什么是三次握手?不是两次?四次?

①因为三次握手可以保证客户端和服务端具有接受和发送数据的能力。

②三次握手能阻止重复历史连接的初始化

能防止使用旧的数据包,比如:一个旧的SYN+ACK报文比最新的SYN报文早到达了服务端;那么服务端就会返回客户端一个ACK+SYN报文给客户端,客户端收到后,可以根据自己的上下文,判断这是一个历史连接,那么客户端就会发送RST报文给服务端,终止这次连接。

③三次握手可以同步双方的初始化序列号

TCP协议的通信双方,都必须维护一个序列号,序列号是可靠传输的关键因素。接受方可以取出重复的数据,接收方可以根据数据包的序列号按序接收,可以标识发送出去的数据包,哪些是已经被对方接收到的。

以当客户端发送携带「初始序列号」的 SYN 报⽂的时 候,需要服务端回⼀个 ACK 应答报⽂,表示客户端的 SYN 报⽂已被服务端成功接收,那当服务端发送「初始序 列号」给客户端的时候,依然也要得到客户端的应答回应,这样⼀来⼀回,才能确保双⽅的初始序列号能被可靠的 同步。

④三次握手可以避免资源浪费

如果只有「两次握⼿」,当客户端的 SYN 请求连接在⽹络中阻塞,客户端没有接收到 ACK 报⽂,就会重新发送 SYN ,由于没有第三次握⼿,服务器不清楚客户端是否收到了⾃⼰发送的建⽴连接的 ACK 确认信号,所以每收 到⼀个 SYN 就只能先主动建⽴⼀个连接,如果客户端的 SYN 阻塞了,重复发送多次 SYN 报⽂,那么服务器在收到请求后就会建⽴多个冗余的⽆效链接, 造成不必要的资源浪费。

如果是两次握手连接,就不能判断当前连接是否是历史连接,三次握手则可以在客户端准备发送第三次的报文的时候,判断是否为历史连接:如果是历史连接(序列号过期或者超时),则第三次握手发送的报文RST报文,终止连接。如果不是历史连接,则发送的第三次报文是ACK报文,通信双方就会建立连接。

四次握手也能保证可靠的传输数据和同步双方的序列号,但是四次握手可以合成三次握手,将ACK报文和SYN报文合并成一个报文ACK+SYN报文进行发送。

两次握手只能保证客户端和服务端一方的初始化序列号能被对方进行接收,不能保证双方的序列号都能被确认接收。

小结:

TCP 建⽴连接时,通过三次握⼿能防⽌历史连接的建⽴,能减少双⽅不必要的资源开销,能帮助双⽅同步初始化序 列号。序列号能够保证数据包不重复、不丢弃和按序传输。 不使⽤「两次握⼿」和「四次握⼿」的原因: 「两次握⼿」:⽆法防⽌历史连接的建⽴,会造成双⽅资源的浪费,也⽆法可靠的同步双⽅序列号; 「四次握⼿」:三次握⼿就已经理论上最少可靠连接建⽴,所以不需要使⽤更多的通信次数。

6、TCP 四次挥手过程和状态变迁

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

②服务端收到该报文后,向客户端发送一个ACK应答报文,接着服务端进入CLOSED_WAIT状态。

③客户端收到服务端的ACK应答报文后,之后进入FIN_WAIT状态。

④等待服务端处理完数据后,也向客户端发送 FIN 报⽂,之后服务端进⼊ LAST_ACK 状态。

⑤客户端收到服务端的 FIN 报⽂后,回⼀个 ACK 应答报⽂,之后进⼊ TIME_WAIT 状态

⑥服务器收到了 ACK 应答报⽂后,就进⼊了 CLOSED 状态,⾄此服务端已经完成连接的关闭。

⑦客户端在经过 2MSL ⼀段时间后,⾃动进⼊ CLOSED 状态,⾄此客户端也完成连接的关闭。

7、为什么要挥手四次?

①关闭连接时,客户端向服务端发送 FIN 时,仅仅表示客户端不再发送数据了但是还能接收数据。

②服务器收到客户端的 FIN 报⽂时,先回⼀个 ACK 应答报⽂,⽽服务端可能还有数据需要处理和发送,等服 务端不再发送数据时,才发送 FIN 报⽂给客户端来表示同意现在关闭连接。

服务端通常需要等待完成数据的发送和处理,所以服务端的 ACK 和 FIN ⼀般都会分开发送, 从⽽⽐三次握⼿导致多了⼀次。

8、为什么需要TIME_WAIT状态

①防⽌具有相同「四元组」的「旧」数据包被收到;

比如:当服务端发送数据包的时候,网络延迟,这时有相同端口的TCP连接被复用后,被延迟的数据包抵达了客户端,那么客户端是有可能接收这个过期的报文,这就会产生数据错乱等严重问题。所以TCP再挥手的时候会有一个2MSL的时间,足以让两个方向上的旧数据包都丢弃,再出现的数据包一定是新的。

②保证被动关闭连接的一方能被正确的关闭,保证最后的ACK能被被动关闭方接收,从而帮助其正常关闭。

等待⾜够的时间以确保最后的 ACK 能让被动关闭⽅接收,从⽽帮助其正常关闭。

假如四次挥手中的最后一个ACK包如果在网络中丢失了,此时客户端的TIME_WAIT过短或者没有,则就直接进入CLOSED状态了,那么服务器则会一直处于LASK_ACK状态。当客户端发起建立连接的

当TIME_WAIT等待时间足够长的时候就会遇到以下两种情况:

服务端正常收到四次挥⼿的最后⼀个 ACK 报⽂,则服务端正常关闭连接。

服务端没有收到四次挥⼿的最后⼀个 ACK 报⽂时,重新发送:则会发 FIN 关闭连接报⽂并等待新的 ACK 报⽂。

9、TIME_WAIT过多有什么危害?

①内存资源的占用

②对端口资源的占用,一个TCP连接至少消耗一个本地端口。

客户端发起的一方TIME_WAIT状态过多,沾满了端口资源,就无法创建新的连接。

当创建很多连接的时候,服务端出现大量的TIME_WAIT的时候,系统资源占满时,会导致处理不过来连接。

 

持续更新中。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值