TCP常见面试题详解

1. TCP与UDP区别?

TCP是一种面向连接的,可靠的的传输层通信协议。特点:面向连接,点对点(一对一)的通信,高可靠(流量控制与拥塞控制),效率低,占用系统资源多。

UDP是一种无连接的,不可靠的传输层通信协议。特点:不需要连接,传送方不管接收方有没有准备好,直接发送信息。可以广播发送信息(支持一对一,一对多和多对多),传输不可靠,有可能丢失信息,效率高,占用系统资源少。

 

2. TCP为何是三次握手,不是两次?

在谢希仁著《计算机网络》中讲“三次握手”的目的是“为了防止已失效的连接请求报文段突然又传送到了服务端,因而产生错误”。

谢希仁版《计算机网络》中的例子是这样的,“已失效的连接请求报文段”的产生在这样一种情况下:client发出的第一个连接请求报文段并没有丢失,而是在某个网络结点长时间的滞留了,以致延误到连接释放以后的某个时间才到达server。本来这是一个早已失效的报文段。但server收到此失效的连接请求报文段后,就误认为是client再次发出的一个新的连接请求。于是就向client发出确认报文段,同意建立连接。假设不采用“三次握手”,那么只要server发出确认,新的连接就建立了。由于现在client并没有发出建立连接的请求,因此不会理睬server的确认,也不会向server发送数据。但server却以为新的运输连接已经建立,并一直等待client发来数据。这样,server的很多资源就白白浪费掉了。采用“三次握手”的办法可以防止上述现象发生。例如刚才那种情况,client不会向server的确认发出确认。server由于收不到确认,就知道client并没有要求建立连接。”

但面试官不一定赞同上面的说法,于是有下面的解释:

TCP三次握手是为了实现可靠数据传输,TCP通信的双方都必须维护一个序列号,以标识发出去的数据包中,哪些是已经被对方收到,三次握手的过程即是通信双方相互告知序列号起始值,并确认对方已经收到了序列号起始值的必经步骤,如果只是两次握手,至多只有连接发起方的起始序列号能被确认,另一方的序列号能不能被确认。如果四次握手的话,则是如下步骤:

1.A 发送SYN 报文给B,这是第一次报文交互;

2. B发送ACK确认A的SYN报文,这是第二次报文交互;

3. B发送自己的SYN报文给A,这是第三次报文交互;

4. A需要ACK确认B的SYN报文,这是第四次报文交互。

可以看出,2,3步骤可以合并。

TCP作为一种可靠传输控制协议,核心思想是:既要保证数据可靠传输,又要提高传输的效率,而用三次恰恰可以满足以上两方面的需求!

 

3. 为什么连接的时候是三次握手,关闭的时候却是四次挥手?

 

 

 

当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。

 

4.为什么最后要等一个TIME_WAIT时间呢? TIME_WAIT状态要维持2MSL?

 

 

TIME_WAIT状态的主要目的有两个:

1.确保最后一个确认报文能够到达。如果没能到达,服务端就会会重发FIN请求释放连接。等待一段时间没有收到重发就说明服务的已经CLOSE了。如果有重发,则客户端再发送一次LAST ack信号。

2.TIME_WAIT状态持续2MSL的时间可以让一个TCP连接的两端发出的报文都从网络中消失,从而保证下一个tcp连接不会被上一个连接的报文所干扰。

具体来说就是:这2个MSL中的第一个MSL是为了等自己发出去的最后一个ACK从网络中消失,而第二MSL是为了等在对端收到ACK之前的一刹那可能重传的FIN报文从网络中消失。

posted @ 2021-08-12 15:46  love_____Yuu  阅读(538)  评论(0)    收藏  举报