关于TCP面试可能会问的问题

讲讲TCP协议

tcp是在OSI模型传输层中的可靠传输协议,通过三次握手建立连接,发送端对数据进行分组,然后通过套接字发送到缓存中,进行发送。接收端将报文段接收到接收缓存中,然后再读取数据。接收方通过滑动窗口通知发送方控制吞吐量。遇到数据包丢失了就会通过选择重传来重新获得数据包,数据传输完后进行四次挥手关闭连接。

讲讲为什么需要三次握手?四次分手?

首先握手为什么需要三次?3次握手的作用是让“收发双方都明确自己和对方的收发能力是正常的”。
第一次握手,客户端向服务器发送请求,服务器正确接收,那么服务器就知道了客户端的发送功能正常,自己的接收功能正常。
第二次握手,服务器向客户端发送请求,客户端正确接收,此时客户端知道了自己的收发功能都是正常的,服务器的收发功能也是正常的。但此时服务器还不知道自己的发送功能和客户端的接收功能如何。
第三次握手,客户端返回消息,服务器就知道了自己的收发和客户端的收发功能都是完好的了。
关于为什么要发送第三次,书上是这么说的:防止已经失效的连接请求报文段突然传送到服务器产生错误。(客户端发送了两次连接请求,第一次在路上耽误了,结果第二次的连接请求成功,发送完数据结束了。第一个连接到达,服务器又开启连接。有了第三次握手,服务器收到失效连接后再也收不到第三次握手就知道这是失效连接了)

补充:知乎上的大神说,防止失效连接只是表象,真正的原因是tcp建立连接需要同步通信双方数据原点的序列号,也就是双方开始发送字节的起始编号,客户端第三次握手是为了让服务器知道客户端已经接受了同步信号。具体分析搜索知乎问题:TCP 为什么是三次握手,而不是两次或四次?

个人见解,上述原因可能都是三次握手的原因,三次握手满足了多个需求,就是这么妙的设计?

为什么分手需要4次呢?客户端向服务器发送一个fin段,服务器返回一个ack段,此时客户端->服务器方向上的连接关闭了,但是服务器还能向客户端发送数据,发送结束后服务器发送一个fin段,客户端返回一个ack,等待2个MSL(最长报文段寿命)后关闭。
为什么客户端要等待2MSL再关闭,主要有两个原因:第一是确保客户端最后一个ack可以到达服务端,如果在途中丢失了,服务器会重发fin,这最大需要2MSL;第二是防止三次握手所说的“失效连接请求报文”,等待2个MSL后,本连接所有的请求都会消失。

具体说说TCP协议的传输过程吧

相关资料:
《计算机网络:自顶向下方法》
《计算机网络 第六版》 谢仁希

“三次握手,四次挥手”你真的懂吗?
讲的不错的计算机网络视频:计算机网络

你可能感兴趣的:(关于TCP面试可能会问的问题)