计网笔记(四)
文章目录
提示:以下是本篇文章正文内容,下面案例可供参考
一、如果已经建立了连接,但是客户端突然出现故障了怎么办?
在服务器端,有一个定时器,客户端每次向服务器发送消息时会重置该定时器。若超过2小时未收到客户端消息,服务器会每隔75s向客户端发送探测报文,若接连发送10个都未收到客户端的响应,则认为客户端出现故障,关闭连接。
二、什么是SYN洪泛攻击?
- SYN洪泛攻击就是利用TCP协议的特性(三次握手)。
- 攻击者发送TCP的 SYN,SYN是TCP三次握手中第一个数据包,而当服务器返回ACK后,该攻击者就不对其进行再确认,那这个TCP连接就处于挂起状态,也就是半连接状态,服务器收不到再确认的话,还会重复发送ACK给攻击者。
- 这样更加会浪费服务器资源。攻击者就对服务器发送大量的这种TCP连接,由于每一个连接都无法完成三次握手,所以就在服务器上,这些TCP连接会因为挂起状态而消耗CPU和内存,最后服务器可能死机。
三、序号(ISN)为什么要随机?
增加安全性,为了避免被第三方猜测到,从而被第三方伪造的RST报文Reset。
四、三次握手的第一次可以携带数据吗?为何?
不可以,三次握手还没有完成。而且这样会放大SYN FLOOD(SYN洪泛)攻击。
如果攻击者伪造了成千上万的握手报文,携带了1K+ 字节的数据,而接收方会开辟大量的缓存来容纳这些巨大数据,内存会很容易耗尽,从而拒绝服务。
五、TCP如何实现可靠传输
- 校验:伪首部是为了增加TCP校验和的检错能力:通过伪首部的目的IP地址来检查TCP报文是否收错了、通过伪首部的传输层协议号来检查传输层协议是否选对了。需要注意的是,伪首部实际上是不存在的,只是用来验证TCP报文是否出错。
- 序号:之前我们提到TCP是面向字节流的,比如第一个字节就是序号1,第二个字节就是序号2。 而在TCP报文格式介绍的时候,有一个序号字段,这个指的是一个报文段第一个字节的序号。报文段就是你每个数据包。有了序号,就能保证数据是有序的传入应用层。
- 确认:发送方在收到接收方的确认包之后,才继续发送剩下的数据。
- 重传:TCP的发送方在规定的时间内没有收到确认就要重传已发送的报文段(超时重传)。重传时间是动态改变的,依据的是RTTS(加权平均往返时间)。
六、OSI七层模型各层的功能
七、TCP拥塞控制方法
cwnd
就是能连续发送的报文个数
主要有四种算法:慢开始、拥塞避免、快重传、快恢复。
1、慢开始和拥塞避免
基于窗口的拥塞控制,在发送方维护一个拥塞窗口(cwnd),大小等于发送窗口,通过出现了超时来判断网络出现拥塞。慢开始的思路是一开始发送方发送一个字节,在收到接收方的确认,然后发送的字节数量增大一倍(也就是按照指数增长的速率),从小到大逐步增大cwnd,直到cwnd 达到慢开始门限(ssthresh),停止慢开始算法,使用拥塞避免算法,拥塞避免算法思路是增长速率变为线性增长,也就是每经过一个往返时间RTT就把发送方的cwnd加1,所以综上:
当cwnd < ssthresh ,使用慢开始算法;
当cwnd = ssthresh,可以使用慢开始算法,也可以使用拥塞算法;
当cwnd > ssthresh,使用拥塞算法;
2、快重传和快恢复
通过上面两个算法可以使得网络传输速率一直增大,直到出现超时,这时候需要将cwnd
重新调整到1个字节开始,使用慢开始算法,同时需要将慢开始门限ssthresh
调整为cwnd
(超时点)的一半,继续执行慢开始、拥塞避免算法。如果收到3-ACK
(发送方一连接收到3个对同一个报文段的重复确认),这种可能的情况是,并不是发生了拥塞,可能是报文丢失,所以发送方不执行慢开始算法,直接使用快重传算法,立即发送缺失的报文段。同时执行快恢复算法,将门限值(ssthresh
)和窗口大小(cwnd
)调整为此时cwnd
的一半,并执行拥塞避免算法。
参考博文:
[1]: https://blog.csdn.net/qq_41431406/article/details/97926927
[2]: https://www.jianshu.com/p/143ac8684fd6
[3]: https://juejin.cn/post/6844904004711874567#comment
八、三次握手过程中可以携带数据吗?
其实第三次握手的时候,是可以携带数据的。但是,第一次、第二次握手不可以携带数据
为什么这样呢?大家可以想一个问题,假如第一次握手可以携带数据的话,如果有人要恶意攻击服务器,那他每次都在第一次握手中的 SYN 报文中放入大量的数据。因为攻击者根本就不理服务器的接收、发送能力是否正常,然后疯狂着重复发 SYN 报文的话,这会让服务器花费很多时间、内存空间来接收这些报文。
也就是说,第一次握手不可以放数据,其中一个简单的原因就是会让服务器更加容易受到攻击了。而对于第三次的话,此时客户端已经处于 ESTABLISHED 状态。对于客户端来说,他已经建立起连接了,并且也已经知道服务器的接收、发送能力是正常的了,所以能携带数据也没啥毛病。