1. 半连接队列、全连接队列基本概念

  1. 三次握手中,在第一步server收到client的syn后,把相关信息放到半连接队列中,同时回复syn+ack给client(第二步),同时开启一个定时器,如果超时还未收到 ACK 会进行 SYN+ACK 的重传,重传的次数由 tcp_synack_retries 值确定。在 CentOS 上这个值等于 5。;
  2. 第三步的时候server收到client的ack,如果这时全连接队列没满,那么从半连接队列拿出相关信息放入到全连接队列中,否则按tcp_abort_on_overflow指示的执行。

1.1 tcp_abort_on_overflow

  • tcp_abort_on_overflow 为 0 表示三次握手最后一步全连接队列满以后 server 会丢掉 client 发过来的 ACK,服务端随后会进行重传 SYN+ACK。
  • tcp_abort_on_overflow 为 1 表示全连接队列满以后服务端直接发送 RST 给客户端。

1.2 ss 命令

ss 命令可以查看全连接队列的大小和当前等待 accept 的连接个数,执行 ss -lnt 即可

ss -lnt | grep :9090
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port
LISTEN     51     50           *:9090                     *:*

Recv-Q 表示 accept 队列排队的连接个数,Send-Q 表示全连接队列(也就是 accept 队列)的总大小。

2. 半连接队列

2.1 半连接队列的长度

半连接队列的大小由3个值决定:

  • 用户层 listen 传入的backlog
  • 系统变量 net.ipv4.tcp_max_syn_backlog,默认值为 128
  • 系统变量 net.core.somaxconn,默认值为 128

2.2 半连接队列长度的计算过程

  1. 如果用户传入的 backlog 值大于系统变量 net.core.somaxconn 的值,用户设置的 backlog 不会生效,使用系统变量值,默认为 128。

  2. 将上一步计算的backlog值穿给nr_table_entries,sysctl_max_syn_backlog 为 net.ipv4.tcp_max_syn_backlog 的值

int reqsk_queue_alloc(struct request_sock_queue *queue,unsigned int nr_table_entries)
{nr_table_entries = min_t(u32, nr_table_entries, sysctl_max_syn_backlog);nr_table_entries = max_t(u32, nr_table_entries, 8);nr_table_entries = roundup_pow_of_two(nr_table_entries + 1);for (lopt->max_qlen_log = 3;(1 << lopt->max_qlen_log) < nr_table_entries;lopt->max_qlen_log++);
}
  • 在 nr_table_entries 与 sysctl_max_syn_backlog 两者中的较小值,赋值给 nr_table_entries(因为sysctl_max_syn_backlog默认是128,如果没有修改,产生的最大值就只能是128)
  • 在 nr_table_entries 和 8 取较大值,赋值给 nr_table_entries(最小只能是8)
  • nr_table_entries + 1 向上取求最接近的最大 2 的指数次幂(保证是2的幂次)
  • 通过 for 循环找不大于 nr_table_entries 最接近的 2 的对数值

3.全连接队列

全连接队列」包含了服务端所有完成了三次握手,但是还未被应用调用 accept 取走的连接队列。此时的 socket 处于 ESTABLISHED 状态。每次应用调用 accept() 函数会移除队列头的连接。如果队列为空,accept() 通常会阻塞。全连接队列也被称为 Accept 队列。

3.1 全连接队列的长度

全连接队列的大小由3个值决定:

  • 用户层 listen 传入的backlog
  • 系统变量 net.core.somaxconn,默认值为 128

3.2 全连接队列长度的计算过程

全连接队列的大小是 listen 传入的 backlog 和 somaxconn 中的较小值

3.3 全连接队列溢出的情况

  • 如上图,150166号包是三次握手中的第三步client发送ack给server,然后150167号包中client发送了一个长度为816的包给server。

  • 因为在这个时候client认为连接建立成功(因为已经完成三次握手了),但是server上这个连接实际没有ready(因为全连接队列已经满了),所以server直接丢掉client发来的ACK包,并且一段时间后,server认为自己第二次握手的syn+ack包丢包了,因此就重发syn+ack包(SYN+ACK重传的次数是由操作系统的一个文件决定的/proc/sys/net/ipv4/tcp_synack_retries

  • 一段时间后client又收到了syn+ack包,认为第三次握手的ack丢包了,然后重传这816个字节的ack包。一直到超时,client主动发fin包断开该连接。

重学TCP协议(9) 半连接队列、全连接队列相关推荐

  1. 半连接队列 全连接队列??

    参考链接 半连接队列 服务器接收到第一个SYN之后,处于SYN_RCVD状态,此时双方还没有建立连接, 这种状态下的请求连接会被放到一个队列里,也叫半连接队列 长度为 max(64, /proc/sy ...

  2. 重学TCP协议(12)SO_REUSEADDR、SO_REUSEPORT、SO_LINGER

    1. SO_REUSEADDR 假如服务端出现故障,主动断开连接以后,需要等 2 个 MSL 以后才最终释放这个连接,而服务重启以后要绑定同一个端口,默认情况下,操作系统的实现都会阻止新的监听套接字绑 ...

  3. 重学TCP协议(11)TFO(Tcp Fast Open)

    1. TFO 为了改善web应用相应时延,google发布了通过修改TCP协议利用三次握手时进行数据交换的TFO(TCP fast open,RFC 7413). TFO允许在TCP握手期间发送和接收 ...

  4. 重学TCP协议(4) 三次握手

    1. 三次握手 请求端(通常称为客户)发送一个 S Y N段指明客户打算连接的服务器的端口,以及初始序号.这个S Y N段为报文段1. 服务器发回包含服务器的初始序号的 S Y N报文段(报文段2)作 ...

  5. 重学TCP协议(3) 端口号及MTU、MSS

    1. 端口相关的命令 1.1 查看端口是否打开 使用 nc 和 telnet 这两个命令可以非常方便的查看到对方端口是否打开或者网络是否可达.如果对端端口没有打开,使用 telnet 和 nc 命令会 ...

  6. 重学TCP协议(8) TCP的11种状态

    TCP的11种状态 为了逻辑更加清晰,假设主动打开连接和关闭连接皆为客户端,被动打开连接和关闭连接皆为服务端 客户端独有的:(1)SYN_SENT (2)FIN_WAIT1 (3)FIN_WAIT2 ...

  7. 重学TCP协议(10)SYN flood 攻击

    1.SYN flood 攻击 SYN Flood(半开放攻击)是一种拒绝服务(DDoS)攻击,其目的是通过消耗所有可用的服务器资源使服务器不可用于合法流量.通过重复发送初始连接请求(SYN)数据包,攻 ...

  8. 重学TCP协议(7) Timestamps 选项

    1.Timestamps 选项的组成部分 时间戳选项占10个字节= kind(1字节) + length(1字节) + info (8字节),其中kind=8,length=10,info由times ...

  9. 重学TCP协议(6) 四次挥手

    1. 四次挥手 客户端进程发出连接释放报文,并且停止发送数据.释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT ...

最新文章

  1. 数据库设计原则【转】
  2. 不知怎么优化MySQL?先搞懂原理再说吧!
  3. 任务和特权级保护(四)——《x86汇编语言:从实模式到保护模式》读书笔记35
  4. java调用ole ie_ActiveX (.ocx)的写法,及在IE里调用
  5. 作者:刘昂(1990-),男,中国科学院计算机网络信息中心工程师
  6. Mysql的两种存储引擎以及区别
  7. asscess 一条记录更新数据_一条MySQL更新语句是怎么执行的?
  8. 点钞机语音怎么打开_我有这些语音识别指令,你都知道吗?
  9. 【数学建模】基于matlab计划生育政策调整对人口数量、结构及其影响的研究【含Matlab源码 749期】
  10. css 多行文本的溢出显示省略号(移动端)
  11. 自己读Go程序设计语言的一些总结(更新ing...)
  12. [其他] ATI HD6630M 显卡在Win10下终于有救了(DEll 14R N4120)
  13. Java判断上海自来水来自海上_JavaAPI
  14. 三种方式让 Android WebView 支持文件下载
  15. 期货CTP接口C++源码与C#应用程序的对接
  16. jdk1.6升级jdk1.8踩出的神坑
  17. 机器视觉光源概述(选型参考)
  18. 西安交通大学计算机基础期末考试,《大学计算机基础试题与答案》-西安交通大学.doc...
  19. 自闭症和注意缺陷多动障碍默认模式网络的周期性动态改变
  20. PL2303HX在Windows 10下面不装安装驱动的解决办法(Code:10)

热门文章

  1. Enum、Stream
  2. 海量数据处理 (一)
  3. c++客户端发送加锁_MySQL语句加锁分析详解
  4. 使用thinkPHP做注册程序的实例
  5. wxpython实现界面跳转
  6. 基于JavaConfig配置的Spring MVC的构建
  7. 多线程之间的通信(等待唤醒机制、Lock 及其它线程的方法)
  8. PHP 小数点保留两位【转】
  9. java 回调函数很好懂
  10. Oracle 安装 网络配置 警告