1.相关问题算法
问题1: 请详细描述三次握手和四次挥手的过程,并画出状态图缓存
问题2: 四次挥手中TIME_WAIT状态存在的目的是什么?网络
问题3: TCP是经过什么机制保障可靠性的?tcp
2.问题回答spa
问题1:指针
状态图以下blog
补充知识:TCP报文中共计6个标志位,每一个标志位占1个字节,即URG、ACK、PSH、RST、SYN、FIN等队列
三次握手详情进程
四次挥手详情(被动关闭)路由
补充1:
SYN攻击:在三次握手过程当中,Server发送SYN-ACK以后,收到Client的ACK以前的TCP链接称为半链接(half-open connect),此时Server处于SYN_RCVD状态,当收到ACK后,Server转入ESTABLISHED状态。SYN攻击就是Client在短期内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server回复确认包,并等待Client的确认,因为源地址是不存在的,所以,Server须要不断重发直至超时,这些伪造的SYN包将产时间占用未链接队列,致使正常的SYN请求由于队列满而被丢弃,从而引发网络堵塞甚至系统瘫痪。SYN攻击时一种典型的DDOS攻击,检测SYN攻击的方式很是简单,即当Server上有大量半链接状态且源IP地址是随机的,则能够判定遭到SYN攻击了,使用以下命令可让之现行:
#netstat -nap | grep SYN_RECV
补充2:
四次挥手的同时关闭情况:实际中还会出现同时发起主动关闭的状况,具体流程以下图
问题2:
在四次挥手中,第三次挥手结束后,Client端进入TIME_WAIT状态,客户端不会立刻进入closed状态,理由以下
问题3:
TCP传输的可靠性主要靠如下手段来保证传输
建议:滑动窗口与流量控制视状况是否说明
补充:滑动窗口与流量控制
1).滑动窗口:
“窗口”对应的是一段能够被发送者发送的字节序列,其连续的范围称之为“窗口”;
“滑动”则是指这段“容许发送的范围”是能够随着发送的过程而变化的,方式就是按顺序“滑动”。
案例以下:
TCP创建链接的初始,B会告诉A本身的接收窗口大小,好比为‘20’:
字节31-50为发送窗口
A发送11个字节后,发送窗口位置不变,B接收到了乱序的数据分组:
只有当A成功发送了数据,即发送的数据获得了B的确认以后,才会移动滑动窗口离开已发送的数据;同时B则确认连续的数据分组,对于乱序的分组则先接收下来,避免网络重复传递:
2).流量控制
流量控制方面主要有两个要点须要掌握。一是TCP利用滑动窗口实现流量控制的机制;二是如何考虑流量控制中的传输效率。
1. 流量控制
所谓流量控制,主要是接收方传递信息给发送方,使其不要发送数据太快,是一种端到端的控制。主要的方式就是返回的ACK中会包含本身的接收窗口的大小,而且利用大小来控制发送方的数据发送,案例如图:
这里面涉及到一种状况,若是B已经告诉A本身的缓冲区已满,因而A中止发送数据;等待一段时间后,B的缓冲区出现了富余,因而给A发送报文告诉A个人rwnd大小为400,可是这个报文不幸丢失了,因而就出现A等待B的通知||B等待A发送数据的死锁状态。为了处理这种问题,TCP引入了持续计时器(Persistence timer),当A收到对方的零窗口通知时,就启用该计时器,时间到则发送一个1字节的探测报文,对方会在此时回应自身的接收窗口大小,若是结果仍未0,则重设持续计时器,继续等待。
2. 传递效率
一个显而易见的问题是:单个发送字节单个确认,和窗口有一个空余即通知发送方发送一个字节,无疑增长了网络中的许多没必要要的报文(请想一想为了一个字节数据而添加的40字节头部吧!),因此咱们的原则是尽量一次多发送几个字节,或者窗口空余较多的时候通知发送方一次发送多个字节。对于前者咱们普遍使用Nagle算法,即:
对于后者咱们每每的作法是让接收方等待一段时间,或者接收方得到足够的空间容纳一个报文段或者等到接受缓存有一半空闲的时候,再通知发送方发送数据。
ok