三次握手:
第一步:A向B发送一个SYN报文表示希望建立连接
第二步:B收到A发过来的数据包后,通过SYN得知这是一个建立连接的请求,于是发送ACK确认,由于TCP的全双工模式,故B向A还应该发送一个SYN报文,表示希望和A建立连接第三步:A收到B发送来的SYN报文后,A向B发送ACK表示A收到了B的SYN。
追问:
1、保证双方都具有接受和发送报文的能力
2、防止请求超时导致脏连接
因为报文生存时间可能会超过TCP请求超时时间,假如两次握手就可以建立连接,A的报文由于一些问题滞留在网络中,当报文超时但被释放连接后,此超时连接传输到B,B以为是A创建连接的新请求,然后确认连接。但是A知道这是超时连接的,所以直接丢弃了B的确认数据,导致只是B单方面建立了连接。并一直等待A发送数据,B的资源也就浪费了。
四次挥手:
第一步:A向B发送FIN和ACK报文表示希望断开连接
第二步:B收到A发送的请求后会发送ACK表示确认断开。
第三步:此时B处于半连接状态,B会发送FIN和ACK请求断开与A之间的连接
第四步:A收到B发送的断开请求会发送ACK表示确认断开
追问:
确保数据能够全部传输完成
四次才能保证所有的连接全部断
攻击原理:
B收到SYN报文后,会将相应的半连接记录添加到队列中,之后等待接收握手包,如果握手成功就会将此半连接记录从队列中删除;或者当B未收到A的确认包,会重新发送请求包,直到超时才会将此条记录从半连接队列删除。
服务器的TCP协议栈中存储的半连接记录是有限的,当服务器接收到S YN型的DOS攻击后,队列会很快充满,客户端在短时间内伪造大量的不存在的IP地址,向服务器不断发送SYN报文,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的SYN包将长时间占用未连接队列,正常的SYN请求被丢弃,目标系统运行缓慢严重者引起网络堵塞甚至系统瘫痪,服务器随后就不再接受新的网络连接,从而造成正常的客户端无法访问服务器的情况发生。
防御:
1、增大队列SYN最大半连接数,linux中最大连接数为256
2、减少半连接时的超时时间
3、过滤可疑地址
4、利用SYN cookie防御DOS攻击
滑动窗口:
用来告诉发送端可以发送数据的大小或者说是窗口标记了接收端缓冲区的大小。窗口指一次批量发送多少数据。
为何会出现滑动窗口:
在确认应答的策略中,每发送一次数据段都需要一个ACK确认应答,收到ACK后再发送下一个数据段,这样每次都需要确认,性能较差。采用滑动窗口的机制就会一次发送多条数据,提高传输性能
通过设置滑动窗口的大小,用ACK告知发送端自己缓存区的大小,从而使发送端以合适的速度发送,实现流量控制;
发送端根据网络拥塞情况确定的窗口值。发送端在真正确定发送窗口时,应该取“通知窗口”和“拥塞窗口”的最小值。
一问:
CDN是内容分发网络
CDN是在用户和服务器之间增加高速缓存层,通过接管DNS实现,将用户的请求引导到高速缓存服务器上获取源服务器的数据
一问:
DNS为域名系统,是因特网上作为域名和IP地址相互映射的分布式数据库
二问:
1.浏览器检查缓存中有没有这个域名对应的解析过的ip地址,如果有该解析过程将会结束。
2.检查本地的hosts文件是否有这个网址映射关系
3.如果hosts种没有这个域名映射,查找本地DNS解析器缓存,如果有直接返回
4.通过首选DNS服务器(本地域名服务器),以递归或循环的方式查询域名对应的IP地址并返回。(顶级域,二级域,三级域)
一问:
1、假设连接的时候是两次,那么A滞留在网络中的报文经过一段时间传输到B,B会确认此连接。B单方面建立了连接,A会丢弃B的确认数据报文。B会一直等待A发送数据,造成B资源的浪费。
二问:
1、确保数据能够全部传输完成
A发送FIN后,B有可能正在向A传输数据,所以不会马上关闭,当数据全部传输完成后再发送ACK表示确认断开。
UDP:
无连接的,即发送数据之前不需要建立连接不保证可靠的交付,同时不使用拥塞控制
U支持一对一、一对多、多对一、多对多的交互通信首部只有8字节
TCP:
面向连接的传输层协议提供可靠的交付能力仅支持一对一通信
支持全双工通信(允许数据在两个方向上同时传输)首部最低有20字节
问题:如何用UDP实现可好传输?
引入序列号保证数据的顺序、确认机制保证数据能到达对端、重传机制保证超时引起的数据丢弃。
关注公众号↑↑↑:IT运维大本营,获取《网工大礼包》