文章目录
- 零、三次握手与四次挥手
- 一、什么是TCP/IP协议?
- 二、什么是TCP协议
- 三、TCP和UDP的区别
- 四、TCP和UDP各自的特点和应用场景
- 五、为什么tcp的传输速率会比udp慢
- 六、介绍一下tcp的滑动窗口
- 七、tcp拥塞窗口的变化规律
- 八、为什么要有拥塞控制呀,不是有流量控制了吗?
- 九、什么是拥塞窗口?和发送窗口有什么关系呢?
- 十、那么怎么知道当前网络是否出现了拥塞呢?
- 十一、拥塞控制有哪些控制算法?
- 十二、什么是三次握手?
- 十三、为什么要三次握手,两次不行吗?
- 十四、什么是半连接队列?
- 十五、ISN(Initial Sequence Number)是固定的吗?
- 十六、三次握手过程中可以携带数据吗?
- 十七、SYN攻击是什么?
- 十八、为什么需要四次挥手
- 十九、为什么Time-WAIT 状态必须要等待2MSL时间?
零、三次握手与四次挥手
一、什么是TCP/IP协议?
指能够在多个不同网络间实现信息传输的协议簇。TCP/IP协议不仅仅指的是TCP 和IP两个协议,而是指一个由FTP、SMTP、TCP、UDP、IP等协议构成的协议簇, 只是因为在TCP/IP协议中TCP协议和IP协议最具代表性,所以被称为TCP/IP协议。
简单来说:互联网相关各类协议族的总称称为TCP/IP协议。
二、什么是TCP协议
传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。
三、TCP和UDP的区别
TCP | UDP | |
---|---|---|
可靠性 | 可靠 | 不可靠 |
连接性 | 面向连接 | 无连接 |
报文 | 面向字节流 | 面向数据报文 |
效率 | 可靠 | 不可靠 |
双工性 | 全双工 | 一对一、一对多、多对一、多对多 |
流量控制 | 滑动窗口 | 无 |
传输速度 | 慢 | 快 |
应用场景 | 对效率要求低,对准确性要求高或者要求有连接的场景 | 对效率要求高,对准确性要求低 |
四、TCP和UDP各自的特点和应用场景
TCP应用场景:文件传输(准确高要求高、但是速度可以相对慢)、接受邮件、远程登录,视频。
UDP应用场景:qq聊天、直播、网络语音电话、广播通信(广播、多播)。
五、为什么tcp的传输速率会比udp慢
因为UDP没有流控,没有握手,没有成功确认,一个数据包发过去就不管,从这个角度上说TCP是开销大一点
六、介绍一下tcp的滑动窗口
窗口机制实际上是一种流量控制的手段,它是一段缓冲区,在信息传递的过程中用户端和服务器端各自分配一块缓冲区来存储接收的数据,此时通讯的时候我们需要告诉对方我们的缓冲区的大小,不然对方发送数据的时候不知道你最大能接收的信息到底多大。
如果发送多组数据,则接收方的确认信息包含了自己剩下的缓冲区大小。
所以我们把剩下的缓冲区大小叫做窗口。
七、tcp拥塞窗口的变化规律
只要网络中没有出现拥塞,cwnd 就会增大;
但网络中出现了拥塞,cwnd 就减少
八、为什么要有拥塞控制呀,不是有流量控制了吗?
一般来说,计算机网络都处在一个共享的环境。因此也有可能会因为其他主机之间的通信使得网络拥堵。
在网络出现拥堵时,如果继续发送大量数据包,可能会导致数据包时延、丢失等,这时 TCP 就会重传数据,但是一重传就会导致网络的负担更重,于是会导致更大的延迟以及更多的丢包,这个情况就会进入恶性循环被不断地放大….
所以,TCP 不能忽略网络上发生的事,它被设计成一个无私的协议,当网络发送拥塞时,TCP 会自我牺牲,降低发送的数据量。
于是,就有了拥塞控制,控制的目的就是避免「发送方」的数据填满整个网络。
为了在「发送方」调节所要发送数据的量,定义了一个叫做「拥塞窗口」的概念。
九、什么是拥塞窗口?和发送窗口有什么关系呢?
拥塞窗口 cwnd是发送方维护的一个 的状态变量,它会根据网络的拥塞程度动态变化的。
我们在前面提到过发送窗口 swnd 和接收窗口 rwnd 是约等于的关系,那么由于入了拥塞窗口的概念后,此时发送窗口的值是swnd = min(cwnd, rwnd),也就是拥塞窗口和接收窗口中的最小值。
拥塞窗口 cwnd 变化的规则:
只要网络中没有出现拥塞,cwnd 就会增大;
但网络中出现了拥塞,cwnd 就减少;
十、那么怎么知道当前网络是否出现了拥塞呢?
其实只要「发送方」没有在规定时间内接收到 ACK 应答报文,也就是发生了超时重传,就会认为网络出现了用拥塞。
十一、拥塞控制有哪些控制算法?
慢启动
TCP 在刚建立连接完成后,首先是有个慢启动的过程,这个慢启动的意思就是一点一点的提高发送数据包的数量,如果一上来就发大量的数据,这不是给网络添堵吗?
当 cwnd < ssthresh 时,使用慢启动算法。
当 cwnd >= ssthresh 时,就会使用「拥塞避免算法」。
拥塞避免
当拥塞窗口 cwnd 「超过」慢启动门限 ssthresh 就会进入拥塞避免算法
所以,我们可以发现,拥塞避免算法就是将原本慢启动算法的指数增长变成了线性增长,还是增长阶段,但是增长速度缓慢了一些。
就这么一直增长着后,网络就会慢慢进入了拥塞的状况了,于是就会出现丢包现象,这时就需要对丢失的数据包进行重传。
当触发了重传机制,也就进入了「拥塞发生算法」。
拥塞发生
当网络出现拥塞,也就是会发生数据包重传,重传机制主要有两种:超时重传,快速重传。
快速恢复
快速重传和快速恢复算法一般同时使用
十二、什么是三次握手?
三次握手(Three-way Handshake)其实就是指建立一个TCP连接时,需要客户端和服务器总共发送3个包。进行三次握手的主要作用就是为了确认双方的接收能力和发送能力是否正常、指定自己的初始化序列号为后面的可靠性传送做准备。实质上其实就是连接服务器指定端口,建立TCP连接,并同步连接双方的序列号和确认号,交换TCP窗口大小信息。
十三、为什么要三次握手,两次不行吗?
第一次握手:客户端发送网络包,服务端收到了。
这样服务端就能得出结论:客户端的发送能力、服务端的接收能力是正常的。
第二次握手:服务端发包,客户端收到了。
这样客户端就能得出结论:服务端的接收、发送能力,客户端的接收、发送能力是正常的。不过此时服务器并不能确认客户端的接收能力是否正常。
第三次握手:客户端发包,服务端收到了。
这样服务端就能得出结论:客户端的接收、发送能力正常,服务器自己的发送、接收能力也正常。
因此,需要三次握手才能确认双方的接收与发送能力是否正常。
十四、什么是半连接队列?
服务器第一次收到客户端的 SYN 之后,就会处于 SYN_RCVD 状态,此时双方还没有完全建立其连接,服务器会把此种状态下请求连接放在一个队列里,我们把这种队列称之为半连接队列。
服务器在SYN_RCVD状态下把请求连接放在一个队列里。
十五、ISN(Initial Sequence Number)是固定的吗?
ISN(最初的序列号)
不是
三次握手的其中一个重要功能是客户端和服务端交换 ISN(Initial Sequence Number),以便让对方知道接下来接收数据的时候如何按序列号组装数据。如果 ISN 是固定的,攻击者很容易猜出后续的确认号,因此 ISN 是动态生成的。
十六、三次握手过程中可以携带数据吗?
第三次可以,前两次不可以。
第一次握手不可以放数据,其中一个简单的原因就是会让服务器更加容易受到攻击了。而对于第三次的话,此时客户端已经处于 ESTABLISHED 状态。对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数据也没啥毛病。
十七、SYN攻击是什么?
服务器端的资源分配是在二次握手时分配的,而客户端的资源是在完成三次握手时分配的,所以服务器容易受到SYN洪泛攻击。SYN攻击就是Client在短时间内伪造大量不存在的IP地址,并向Server不断地发送SYN包,Server则回复确认包,并等待Client确认,由于源地址不存在,因此Server需要不断重发直至超时,这些伪造的SYN包将长时间占用未连接队列,导致正常的SYN请求因为队列满而被丢弃,从而引起网络拥塞甚至系统瘫痪。SYN 攻击是一种典型的 DoS/DDoS 攻击。
常见的防御 SYN 攻击的方法有如下几种:
缩短超时(SYN Timeout)时间
增加最大半连接数
过滤网关防护
SYN cookies技术
十八、为什么需要四次挥手
因为当服务端收到客户端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当服务端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉客户端,“你发的FIN报文我收到了”。只有等到我服务端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四次挥手。
十九、为什么Time-WAIT 状态必须要等待2MSL时间?
2MSL(2倍的 maximum segment lifetime–2倍的最大报文段存活时间)
因为,A并不知道B是否接到自己的ACK,站在A的角度来看,A是这么想的:
情况一:如果B没有收到自己的ACK,会超时重传FIN那么A再次接到重传的FIN,会再次发送ACK
情况二:如果B收到自己的ACK,也不会再发任何消息,包括ACK无论是1还是2,A都需要等待,要取这两种情况等待时间的最大值,以应对最坏的情况发生,这个最坏情况是:
去向ACK消息最大存活时间(MSL) + 来向FIN消息的最大存活时间(MSL)=2MSL