【面试经验】怎样给别人阐述三次握手四次挥手,以及相关问题。

        关于建立TCP连接,以及相关的问题我相信网上有很多的教程,那么怎样才能理解的(或者给别人阐述的)更好呢?就是要深入一点了解TCP协议。

         首先了解(最好背过)TCP协议格式,从网上随便找了两张图。

TCP协议报头格式:

【面试经验】怎样给别人阐述三次握手四次挥手,以及相关问题。_第1张图片

三次握手:

【面试经验】怎样给别人阐述三次握手四次挥手,以及相关问题。_第2张图片

四次挥手:

【面试经验】怎样给别人阐述三次握手四次挥手,以及相关问题。_第3张图片

 

问:讲述一下TCP连接建立过程?

答:

          首先是客户端向服务器发送一个tcp报文,这个报文是请求报文,(这时候可以扩展一下) 因为tcp报文里面有6个标志位ack确认帧 :urg紧急指针(表示当前这个报文很重要,会插队发送,紧急指针占了16位)psh(push 因为数据接收是先放入缓存,只有当缓存存够一定量的时候才会将接收的数据推向内存,这个的作用就是使缓冲区中的数据被推入内存) syn(请求连接) fin(结束连接)  rst(复位,异常中断的时候,下一次连接的时候,表示之前的连接断开了需要重新握手),这个请求连接的报文中标志位syn位  置1,同时生成一个随机seq序号(32位,4字节),然后客户端进入 syn_sent状态,服务器端本来是lisen状态,变成了syn_rcvd状态,向客户端返回了(ack确认-》还有seq+1 确认这个请求 ,同时还有一个syn),客户端 接受到后给服务器返回一个ack确认,这时候他俩就建立连接完成了。

问:为啥建立连接不是两次握手?

答:

          这主要是为了防止已失效的请求连接报文忽然又传送到了,从而产生错误。假定A向B发送一个连接请求,由于一些原因,导致A发出的连接请求在一个网络节点逗留了比较多的时间。此时A会将此连接请求作为无效处理 又重新向B发起了一次新的连接请求,B正常收到此连接请求后建立了连接,数据传输完成后释放了连接。如果此时A发出的第一次请求又到达了B,B会以为A又发起了一次连接请求,如果是两次握手:此时连接就建立了,B会一直等待A发送数据,从而白白浪费B的资源,比如syn洪水攻击。 如果是三次握手:由于A没有发起连接请求,也就不会理会B的连接响应,B没有收到A的确认连接,就会关闭掉本次连接。

问:如果已经建立了连接,但是客户端突然出现故障了怎么办?

答:

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

问:为何断开连接要等待2倍的MSL?

答:

          因为网络有不确定因素所以有可能最后一个ACK丢失。所以TIME_WAIT状态就是用来重发可能丢失的ACK报文,也就是2MSL(Maximum Segment Lifetime  MSL指一个片段在网络中最大的存活时间,2MSL就是一个发送和一个回复所需的最大时间)的由来。   如果客户端ACK丢失,导致服务器没有收到ACK,那么服务端将不断重复发送FIN片段。所以客户端不能立即关闭,它必须确认服务端已经接收到了该ACK。客户端会在发送出确认ACK之后进入到TIME_WAIT状态,它会设置一个计时器,等待2MSL的时间。如果在该时间内再次收到FIN,那么Client会重发ACK并再次等待2MSL。如果直到2MSL,客户端都没有再次收到FIN,那么客户端推断ACK已经被成功接收,则结束TCP连接。

你可能感兴趣的:(计算机网络相关)