更多请查看本人博客
TCP协议在各个公司的面试题目中出现频率颇高,在此特地收集了几个关于TCP常问到的问题,并整理了自己的立即。
1、TCP连接的建立与断开
通常说道TCP建立的三次握手以及断开连接的4次挥手,大家都会用下面两张图来说明(从别人博客上盗过来的)。
这两个过程可以理解为,在建立连接的时候:
客户端:你好,我要建立连接。服务器:好的,我知道了,请做好准备。客户端:好的。于是两方建立了连接。
在断开连接的时候:
客户端:你好,我要断开连接。服务器:好的,我知道了,你也关闭吧。服务器:我关了。客户端:好的。于是两边都关闭了连接。
但是实际中TCP的建立与连接会涉及到很多的状态转移。如下图所示为TCP状态转移图。
通过上面的状态转移图,我们可以知道,TCP的建立通常是客户端主动要求服务器端建立连接的。而断开连接分为客户端要求断开连接,以及两方同时主动断开连接。
如上图所示一个TCP有很多的状态,其中有一些状态是我们经常看见的,例如:
SYN_RCVD:表示服务的收到了客户端发起的SYN请求,会返回SYN并等待客户端响应,但是如果客户端对此不响应,服务端就会等待一段时间,这段时间会耗费服务器资源,因此黑客利用这个特点进行SYN FLOOD攻击。
established:表示双方的连接已经建立了
CLOSED_WAIT:表示服务器收到了客户端主动断开连接的请求
FIN_WAIT1:主动要求断开连接的一方在发出FIN之后进入等待
FIN_WAIT2:主动要求断开连接的一方在收到ACK之后进入等待
TIME_WAIT:主动要求断开连接的一方在收到FIN之后进入等待,这段时间一般较长,两个报文时间2MSL(max segment lifetime)
使用netstat -n可以查看TCP连接状态。
如果有大量的CLOSE_WAIT状态,说明有大量的被动断开连接,如果有大量的TIME_WAIT说明有大量的主动连接。爬虫服务器和Web服务器上会有大量的TIME_WAIT状态,因为爬虫需要经常断开连接,而http服务器通常也是主动断开连接。如果有大量的CLOSE_WAIT可能服务器就有问题了。
2、TCP滑动窗口
滑动窗口的提出是为了提高信道利用率的,假设发射一个字节的实践为Ta,该字节在网络上发送的时间为Td,那么信道利用率为ta/(ta+tb),如果不使用滑动窗口的话,信道利用率通常不到10%,如果网络状态不好甚至会到1/1000。滑动窗口允许同时发送多个数据包,会提高信道利用率。
3、流量控制
使用滑动窗口可以进行流量控制,窗口大小控制了流量的大小。通常窗口的大小是由接收端来控制的,其实流量控制的目的是为了协调发送端和接收端速度的。如果接收端的接受速度低于发送端的发送速度,接收端就会减小滑动窗口的大小。
4、拥塞控制
拥塞控制提出的目的是为了避免网络拥塞,从而导致死锁。拥塞控制看上去和流量控制的作用类似,其实有本质的区别。拥塞控制的目的是为了避免网络发生拥堵。拥塞控制算法包括慢启动、拥塞避免、快恢复等。其中慢启动是最常被问到的算法。慢启动的大概意思是,在发送端收到一个确认之后就对窗口大小加一。窗口初始大小为1,下次为2,然后是4...通常这个窗口会设置一个阈值,当到达阈值之后就会采用拥塞避免算法,拥塞避免算法比慢启动的变化速度要慢,窗口每次加一,而不是翻倍。