〓【球友会】分享IT计算机各类电子书,包括各类编程语言,人工智能,机器学习、深度学习以及各类大数据、算法等内容的电子书
IT行业面试题(2)
IT行业面试题(2)

IT行业面试题(2)

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

MSL(MaximumSegment Lifetime),TCP允许不同的实现可以设置不同的MSL值。第⼀,保证客户 端发送的最后⼀个ACK报⽂能够到达服务器,因为这个ACK报⽂可能丢失,站在服务器的⻆度看来,我 已经发送了FIN+ACK报⽂请求断开了,客户端还没有给我回应,应该是我发送的请求断开报⽂它没有收 到,于是服务器⼜会重新发送⼀次,⽽客户端就能在这个2MSL时间段内收到这个重传的报⽂,接着给 出回应报⽂,并且会重启2MSL计时器。第⼆,防⽌类似与“三次握⼿”中提到了的“已经失效的连接请求 报⽂段”出现在本连接中。客户端发送完最后⼀个确认报⽂后,在这个2MSL时间中,就可以使本连接持 续的时间内所产⽣的所有报⽂段都从⽹络中消失。这样新的连接中不会出现旧连接的请求报⽂。

建⽴连接的时候,服务器在LISTEN状态下,收到建⽴连接请求的SYN报⽂后,把ACK和SYN放在⼀个报 ⽂⾥发送给客户端。⽽关闭连接时,服务器收到对⽅的FIN报⽂时,仅仅表示对⽅不再发送数据了但是 还能接收数据,⽽⾃⼰也未必全部数据都发送给对⽅了,所以⼰⽅可以⽴即关闭,也可以发送⼀些数据 给对⽅后,再发送FIN报⽂给对⽅来表示同意现在关闭连接,因此,⼰⽅ACK和FIN⼀般都会分开发送, 从⽽导致多了⼀次。

答:3次握⼿完成两个重要的功能,既要双⽅做好发送数据的准备⼯作(双⽅都知道彼此已准备好),也要允许双⽅就初始序列号进⾏协商,这个序列号在握⼿过程中被发送和确认。现在把三次握⼿改成仅需要 两次握⼿,死锁是可能发⽣的。作为例⼦,考虑计算机S和C之间的通信,假定C给S发送⼀个连接请求分 组,S收到了这个分组,并发送了确认应答分组。按照两次握⼿的协定,S认为连接已经成功地建⽴了, 可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S是否已准备好, 不知道S建⽴什么样的序列号,C甚⾄怀疑S是否收到⾃⼰的连接请求分组。在这种情况下,C认为连接还 未建⽴成功,将忽略S发来的任何数据分组,只等待连接确认应答分组。⽽S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。

TCP还设有⼀个保活计时器,显然,客户端如果出现故障,服务器不能⼀直等下去,⽩⽩浪费资源。服 务器每收到⼀次客户端的请求后都会重新复位这个计时器,时间通常是设置为2⼩时,若两⼩时还没有 收到客户端的任何数据,服务器就会发送⼀个探测报⽂段,以后每隔75分钟发送⼀次。若⼀连发送10个 探测报⽂仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。

保证可靠的核⼼就是双⽅都需要确认⾃⼰发送和接受信息的功能正常,但因为⽹络环境的不稳定性,这⼀ 秒能收发下⼀秒可能⽹络核⼼就发⽣严重拥塞,所以世界上不存在完全可靠的通信协议.两次握⼿会怎样? 若建⽴连接只需两次握⼿,客户端并没有太⼤的变化,在获得服务端的应答后进⼊ESTABLISHED状态, 即确认⾃⼰的发送和接受信息的功能正常.但如果服务端在收到连接请求后就进⼊ESTABLISHED状态,不 能保证客户端能收到⾃⼰的信息,此时如果⽹络拥塞,客户端发送的连接请求迟迟到不了服务端,客户端 便超时重发请求,如果服务端正确接收并确认应答,双⽅便开始通信,通信结束后释放连接。此时,如 果那个失效的连接请求抵达了服务端,由于只有两次握⼿,服务端收到请求就会进⼊ESTABLISHED状 态,等待发送数据或主动发送数据。但此时的客户端早已进⼊CLOSED状态,服务端将会⼀直等待下去,这样浪费服务端连接资源。

TCP连接的释放⼀共需要四步,因此称为『四次挥⼿』.我们知道,TCP连接是双向的,因此在四次挥⼿中,前 两次挥⼿⽤于断开⼀个⽅向的连接,后两次挥⼿⽤于断开另⼀⽅向的连接。第⼀次挥⼿:若A认为数据发 送完成,则它需要向B发送连接释放请求.该请求只有报⽂头,头中携带的主要参数为:FIN=1,seq=u.此时,A将进⼊FIN-WAIT-1状态。

B收到连接释放请求后,会通知相应的应⽤程序,告诉它A向B这个⽅向的连接已经释放.此时B进⼊CLOSE-WAIT状态,并向A发送连接释放的应答,其报⽂头包含:ACK=1,seq=v,ack=u+1.

ACK=1:除TCP连接请求报⽂段以外,TCP通信过程中所有数据报的ACK都为1,表示应答.

2,ack=u+1表示希望收到从第u+1个字节开始的报⽂段,并且已经成功接收了前u个字节.A收到该应答,进 ⼊FIN-WAIT-2状态,等待B发送连接释放请求.

第⼆次挥⼿完成后,A到B⽅向的连接已经释放,B不会再接收数据,A也不会再发送数据。但B到A⽅向 的连接仍然存在,B可以继续向A发送数据。

A收到释放请求后,向B发送确认应答,此时A进⼊TIME-WAIT状态.该状态会持续2MSL时间,若该时间段内 没有B的重发请求的话,就进⼊CLOSED状态,撤销TCB.当B收到确认应答后,也便进⼊CLOSED状态,撤销 TCB。

⼀句话,主要防⽌已经失效的连接请求报⽂突然⼜传送到了服务器,从⽽产⽣错误。如果使⽤的是两次 握⼿建⽴连接,假设有这样⼀种场景,客户端发送了第⼀个请求连接并且没有丢失,只是因为在⽹络结 点中滞留的时间太⻓了,由于TCP的客户端迟迟没有收到确认报⽂,以为服务器没有收到,此时重新向 服务器发送这条报⽂,此后客户端和服务器经过两次握⼿完成连接,传输数据,然后关闭连接。此时此 前滞留的那⼀次请求连接,⽹络通畅了到达了服务器,这个报⽂本该是失效的,但是,两次握⼿的机制将会让客户端和服务器再次建⽴连接,这将导致不必要的错误和资源的浪费。如果采⽤的是三次握⼿, 就算是那⼀次失效的报⽂传送过来了,服务端接受到了那条失效报⽂并且回复了确认报⽂,但是客户端 不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。

答:在TCP/IP协议中,TCP协议提供可靠的连接服务,采⽤三次握⼿建⽴⼀个连接。第⼀次握⼿:建⽴ 连接时,客户端发送syn包(syn=j)到服务器,并进⼊SYN_SEND状态,等待服务器确认。第⼆次握⼿: 服务器收到syn包,必须确认客户的SYN(ack=j+1),同时⾃⼰也发送⼀个SYN包(syn=k),即 SYN+ACK包,此时服务器进⼊SYN_RECV状态。第三次握⼿:客户端收到服务器的SYN+ACK包,向服 务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进⼊ESTABLISHED状。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注