面试经典问题-TCP连接经典问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hahachenchen789/article/details/83275544

1.为什么建立连接是三次握手,而关闭连接却是四次握手呢?

因为服务端的listen状态下的socket当收到SYN报文的连接请求后,它可以把ACK和SYN(ACK起应答作用,SYN同步作用)放在一个报文中发送。但关闭连接时,当收到对方的FIN报文时,仅仅表示对方想要断开连接,但未必你想,因为不会马上关闭socket,因此过段时间再发送FIN报文给对方表示断开连接。因此ACK和FIN是分开发送的。

 

 

2.为什么TIME_WAIT状态还需要等2MSL才能返回CLOSED状态?

(1)可靠的实现TCP全双工连接的终止

我们要假想网络是不可靠的,无法保证最后发送的ACK报文一定会被对方收到,因此对方可能会因为超时未收到ACK,因此这个TIME_WAIT状态的作用是用来重发可能丢失的ACK报文。

(2) 允许老的重复的分节在网络中消逝

假 设在12.106.32.254的1500端口和206.168.1.112.219的21端口之间有一个TCP连接。我们关闭这个链接,过一段时间后在 相同的IP地址和端口建立另一个连接。后一个链接成为前一个的化身。因为它们的IP地址和端口号都相同。

TCP必须防止来自某一个连接的老的重复分组在连 接已经终止后再现,从而被误解成属于同一链接的某一个某一个新的化身。为做到这一点,TCP将不给处于TIME_WAIT状态的链接发起新的化身。既然 TIME_WAIT状态的持续时间是MSL的2倍,这就足以让某个方向上的分组最多存活msl秒即被丢弃,另一个方向上的应答最多存活msl秒也被丢弃。 通过实施这个规则,我们就能保证每成功建立一个TCP连接时。来自该链接先前化身的重复分组都已经在网络中消逝了。

 

 

3.为什么不能用两次握手进行连接?

三次握手完成两个非常重要的功能,既要双方做好发送数据的准备工作,也要允许对方就初始序列号进行协商。

而改为两次的话,死锁是可能发生的,考虑A和B之间的通信,假设A给B发了一个连接请求分租,B收到了,并发送ACK,按照两次握手的协定,S认为连接已经成功建立,可以开始发送数据,但是A在B的应答分组在传输被丢失的情况下,不知道B是否准备好,不知道B建立什么样的序列号,那么A认为连接未建立成功,将忽略B发来的任何数据,只等待ACK,而在B发送的数据分组超时后,重复发送相同的分组,造成死锁。

 

 

4.在停止等待协议中如果不使用编号是否可行?为什么?

不可行,没有编号,无法确定是确认信息是哪个分组的确认信息。

 

5.在停止等待协议中,如果收到重复的报文段而不予理睬是否可行?

不可行,比如在确认丢失的情况下,A向B发送数据,B发回的确认信号丢失,那么A会重发该数据,这时候B收到了重复的数据,如果不予理睬,A会一直重发,因此B应该发送确认信号。

 

6.为什么在TCP首部要把TCP的端口号放在最开始的4个字节?

在ICMP的差错报文中,要包含IP首部后面的8个字节的内容,而这里面有TCP首部的源端口和目的端口,当TCP收到ICMP时需要用这两个端口来确定哪条连接出了问题。

猜你喜欢

转载自blog.csdn.net/hahachenchen789/article/details/83275544