加入收藏 | 设为首页 | 会员中心 | 我要投稿 西安站长网 (https://www.029zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

聊点TCP干货

发布时间:2019-05-29 17:40:34 所属栏目:教程 来源:美码师
导读:副标题#e# 我们在平时的开发中,或多或少都会涉猎到网络传输这块。 这篇文章,主要是整理一下 TCP 的一些知识要点,作为一名开发者来说,尽管有那么多的基础设施(框架、组件)帮我们屏蔽了这些细节。但我仍然认为了解它的一些基本原理必有些裨益,尤其是当你

在建立TCP连接时,需要经过三次交互,也成为三次握手(HandShake)。

  • 客户端发起连接请求,发送 SYN包(SYN=i)到服务器,并进入到SYN-SEND状态,等待服务器确认
  • 服务器收到SYN包后,必须确认客户的 SYN(ack=i+1),同时自己也发送一个SYN包(SYN=k),即SYN+ACK包,此时服务器进入SYN-RECV状态
  • 客户端收到服务器的SYN+ACK包,向服务器发送确认报ACK(ack=k+1),此后客户端和服务器进入ESTABLISHED状态,双方可以开始传送数据。

在谈论三次握手的时候,有几个问题是需要关注的:

问题1. 为什么是三次握手

这个问题在技术面试时屡试不爽,原话是能不能两次,或者是四次握手呢?

答案就是,TCP 是可靠的传输,在建立连接时就应该经过两端的确认过程,如上面的流程,

只有在三次握手的情况下,客户端和服务端都经过了一次真正(SYN+ACK)的确认过程。这样的连接便认为是可信的。

此外,如果仅仅只是两次握手,一旦网络不稳定造成 SYN 包重传则会直接导致重复建立连接,浪费资源。

问题2. 什么是syn flood攻击

syn flood 是一种经典的 ddos攻击手段,这里面用到了TCP 三次握手存在的漏洞。

在上面的图中,可以看到当服务端接收到 SYN 后进入 SYN-RECV 状态,此时的连接称为半连接,同时会被服务端写入一个 半连接队列。

想象一下,如果攻击者在短时间内不断的向服务端发送大量的 SYN 包而不响应,那么服务器的 半连接队列很快会被写满,从而导致无法工作。

实现 syn flood 的手段,可以通过伪造源 IP 的方式,这样服务器的响应就永远到达不了客户端(握手无法完成);

当然,通过设定客户端防火墙规则也可以达到同样的目的。

对 syn flood 实现拦截是比较困难的,可以通过启用 syn_cookies 的方式实现缓解,但这通常不是最佳方案。

最好的办法是通过专业的防火墙来解决,基本上所有的云计算大T 都具备这个能力。

问题3. 半连接队列和全连接队列如何调优

这里提到了一个"半连接队列"(syns queue),与其对应的还有一个 "全连接队列"(accept queue)

前者用于暂存未建立完全的连接,后者是连接在成功建立后进入的一个队列。

半连接队列默认大小可以通过内核参数调整:

  1. echo 4096 >  /proc/sys/net/ipv4/tcp_max_syn_backlog 

黑板:tcpmaxsynbacklog 在 syncookies 开启时是无效的,这两个选项存在冲突

对于全连接队列,如果服务器未能及时通过 accept 调用将其中的连接取走,会导致队列溢出(连接失效)

全连接队列的大小的内核调优方式:

  1. echo  4096 >  /proc/ sys/net/core/somaxconn 

那么,是不是只有内核调优这种方法能影响这两个参数呢?答案是否定的。

(编辑:西安站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章
    热点阅读