关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回新闻公共列表

太牛了,居然把TCP三次握手四次挥手讲的这么详细

发布时间:2021-05-25 15:47:56

  TCP的三次握手和四次握手可以说是老生常谈的经典问题,通常是各大企业常见的面试考试,具有一定的区分度。看似简单的面试问题。如果你的回答不符合面试官期望的水平,你可能会直接变得凉爽。

  这篇文章围绕三次握手和四次握手相关的一系列核心问题,分享如何更准确地回答和应对一般的面试问题,今后面对更苛刻的面试官时,你可以随心所欲地和他扯皮

20210503135922146.png

  优雅地回答三次握手

  三次握手:在服务器端创建新套接字,绑定地址信息后,开始接收,进入LISTEN状态。客户端创建新的套接字绑定地址信息后,调用connect,发送连接请求SYN,然后进入SYN_SENT状态,等待服务器确认。服务器端收到连接请求后,连接将放置在内核等待队列中,SYN和确认消息段ACK将发送到客户端,进入SYN_RECD状态。客户端收到SYN  ACK消息后,向服务器发送确认消息段ACK,进入“已建立”状态,开始读取和写入数据。服务器端收到客户端的确认信息后,进入ESTABLISHED状态后,即可读取和写入数据。

20210503115020503.png

  为什么握手是三次,而不是两次或四次?

  a:两次不安全,不需要四次。Tcp通信确认双方均具有数据发送和接收功能,收到ACK响应后,认为对方具有数据发送和接收功能,因此双方应发送SYN,确认对方是否具有通信能力。第一次握手是客户端发送SYN,服务器端接收,服务器端显示客户端的传输能力和服务器端的接收能力都正常。第二次握手在服务器端发送SYN  ACK,客户端接收,客户端正常发送接收功能,服务器端正常发送接收功能,但此时服务器无法确认客户端的接收功能是否正常。第三个握手客户端发送ACK,服务器接收从服务器端接收客户端传输的能力正常,服务器端接收自身传输的能力也正常。(威廉莎士比亚,《北方执行报》(Northern  Exposure),握手)。

  可以用三次握手携带数据吗?

  答:第一次、第二次握手不能携带数据,第三次握手可以携带数据。假设第一次可以携带数据。如果有人恶意攻击服务器,每次都会在第一次握手的SYN消息中放入大量数据,并反复发送大量SYN消息,此时服务器会花费大量的内存空间缓冲这些报纸,服务器会更容易受到攻击

  Tcp三次握手失败,服务器端如何处理?

  答:握手失败有两个原因。第一个是,如果服务器端没有收到SYN,什么都不做。二是服务器端响应SYN  ACK后很久没有收到ACK响应,超时后会发送RST重置连接消息,以释放资源。ISN是什么意思?意义是什么?ISN是固定的吗?ISN为什么会动态随机

  答:ISN全称是Initial  Sequence  Number,是TCP发送者的字节数据编号原点,并告诉您开始传输数据的初始化序列号。如果ISN是固定的,攻击者很容易推测顺序确认号码,为了安全起见,不会让第三方推测并发送伪造的RST消息,因此ISN是动态生成的。

  什么是半连接队列

  答:服务器第一次收到客户端的SYN时,状态为SYN_RECD。这时双方还没有完全连接。服务器将处于这种状态的请求连接放置在一个队列中。这称为半连接队列。当然,完成三次握手后,连接将被置于整个连接队列中,如果队列已满,则会发生数据包丢失的整个连接队列。

  优雅地挥手四次

  挥手四次:客户端主动调用close时,将结束消息段FIN报发送到服务器端,同时进入FIN_WAIT1状态。服务器收到退出消息段FIN报纸,服务器返回确认消息段ACK,进入CLOSE_WAIT状态。此时,如果服务器端有要传输的数据,客户端仍然需要接收。客户端在服务器收到关闭消息段的确认后,将进入FIN_WAIT2状态,开始等待服务器的关闭消息段。服务器端数据传输完成后,服务器实际调用close关闭连接时,结束消息段FIN数据包将发送到客户端,服务器进入LAST_ACK状态,等待最后一个ACK获取。客户端接收服务器发送的结束消息段,进入TIME_WAIT,确认消息段ACK发送。服务器收到确认退出消息段的ACK后,进入CLOSED状态,断开了连接。客户端必须等待2MSL才能进入CLOSED状态

  为什么握手要三次,握手要四次?

  答:实际上,在进行TCP握手时,接收端将SYN数据包和ACK确认数据包合并为一个数据包进行传输,从而减少了数据包传输。对于四次浪潮,由于TCP是全双工通信,活动终结器发送FIN请求并不意味着完全断开连接,活动终结器只能意味着不再发送数据。如果收件人需要发送数据,则服务器端不能立即终止到客户端的数据通道,因此不能合并发送服务器端的FIN数据包和客户端的ACK数据包。只能确认ACK。当服务器不需要发送数据时,不需要发送FIN数据包,所以只要挥手四次,就需要四次数据包交互。TIME_WAIT状态起到什么作用,活动终结器为什么不直接进入CLOSED状态释放资源?

  A:活动终结器进入CLOSED状态后,如果手动终结器发送FIN数据包后未收到ACK确认,则超时后会重新发送FIN数据包。如果客户端没有TIME_WAIT状态,而是直接进入CLOSED状态并释放资源,则下次启动新客户端时,您可以使用与旧客户端相同的地址信息。有两个危险。第一个是,如果新启动的新客户端绑定地址成功,将收到重新传递的FIN数据包,影响新连接。第二个是,如果新客户端向同一个服务器端发送了SYN连接请求,但当前服务器处于LAST_ACK状态,需要接收ACK而不是SYN,则会发送RST重新配置请求。

  为什么TIME_WAIT状态要经过2MSL才能进入CLOASE状态?

  答:MSL是指网络上消息的最大生存时间。客户端向服务器端发送FIN确认包ACK后,此ACK数据包可能无法到达,如果服务器端没有收到ACK数据包,则会再次发送FIN数据包。因此,客户端发送ACK后需要留出2MSL时间(ACK到达服务器服务器,一次发送一个FIN重发数据包)。等待服务器端遗漏确认是否收到ACK数据包。也就是说,如果客户端等待2MSL时间也不能收到服务器端重新发送FIN数据包,则服务器可以确认是否收到客户端发送的ACK数据包。

  为什么一台主机上会出现很多TIME_WAIT?我该怎么处理?

  A: TIME_WAIT出现活动终止符,一台主机出现大量TIME_WAIT,证明在此主机上启动了大量活动终止连接。在一些爬行动物服务器上很常见。此时,必须调整TIME_WAIT的等待时间或打开套接字地址重用选项

  为什么一台主机上出现很多CLOSE_WAIT?我该怎么处理?

  A: close_WAIT是手动关闭者收到FIN请求并收到回复后的状态,等待父程序进一步处理,如果close_WAIT很多,则手动关闭者主机程序忘记最后一次断开连接后,可以调用close来释放资源。这是BUG。只需添加相应的“关闭”(close)即可解决问题

  Tcp连接管理的激活机制

  A:在TCP通信中,如果两端没有长时间的数据交换,服务器端会以一定的间隔向客户端发送活着的探测数据报,请求响应。如果连续多次没有收到响应,则认为连接已断开。长时间默认值为7200s,每个时间段的默认值为75s,连续多响应无默认值为9次。此数据可以在套接字、接口:Setsockopt中修改



/template/Home/Qiggg/PC/Static