[转帖]全连接队列和半连接队列

连接,队列 · 浏览次数 : 0

小编点评

**半连接队列 syn-cookie打开的情况下服务器接收到第一次握手的消息后,不会立刻将相关信息放进半连接队列,而是根据对面发过来的报文计算自己的SYN初始序列号。** * 客户端IP、客户端端口号、服务端IP、服务端端口号:这4个部分计算一个哈希值一个缓慢增长的时间戳t客户端发来的SYN序列号客户端发来的MSS协商值 * 利用这4个部分计算一个序列号,作为服务端的初始序列号,发送给客户端。 * 从客户端收到第三次握手的信息,先提取它的ACK序列号,然后减1,就应该是服务端计算出来的初始序列号。 * 如果IP地址和端口号的四元数是匹配的,客户端第一次握手的SYN序列号和MSS都是匹配的,而时间戳t的差值在接收范围内,那么就直接将这个连接的信息放进全连接队列中。 * 在这种情况下,半连接队列不会发生溢出,相当于容量是无限大的。

正文

半连接队列

syn-cookie打开的情况下

服务器接收到第一次握手的消息后,不会立刻将相关信息放进半连接队列,而是根据对面发过来的报文计算自己的SYN初始序列号。

利用下面几个部分:

  • 客户端IP、客户端端口号、服务端IP、服务端端口号,这4个部分计算一个哈希值
  • 一个缓慢增长的时间戳t
  • 客户端发来的SYN序列号
  • 客户端发来的MSS协商值

利用这4个部分计算一个序列号,作为服务端的初始序列号,发送给客户端。

从客户端收到第三次握手的信息,先提取它的ACK序列号,然后减1,就应该是服务端计算出来的初始序列号。然后解码出上面提到的4个部分,如果IP地址和端口号的四元数是匹配的,客户端第一次握手的SYN序列号和MSS都是匹配的,而时间戳t的差值在接收范围内,那么就直接将这个连接的信息放进全连接队列中。

在这种情况下,半连接队列不会发生溢出,相当于容量是无限大的。

syn-cookie没有打开

半连接队列的容量的计算方法是max(64, /proc/sys/net/ipv4/tcp_max_syn_backlog)

SYN_RECV状态

被放置在半连接队列中的连接处于SYN_RECV状态。

全连接队列

ESTABLISHED状态

处于全连接队列中的连接属于ESTABLISHED状态。

listen函数

listen函数用来建立半连接队列和全连接队列。

#include<sys/socket.h>
int listen(int sockfd, int backlog);

    listen函数的第二个参数确定了半连接队列和全连接队列的长度的和。

    accpet函数

    对于服务器,没有任何api控制三次握手。在listen建立好两个队列后,往半连接队列插入、从半连接队列取出放进全连接队列,这些操作都是内核自动完成的。

    accept函数的功能仅仅是从全连接队列中取出一个已经完成三次握手的连接

    队列溢出

    如果两个队列中的任意一个发生了溢出,就会直接向客户端返回一个rst。

    与[转帖]全连接队列和半连接队列相似的内容:

    [转帖]全连接队列和半连接队列

    半连接队列 syn-cookie打开的情况下 服务器接收到第一次握手的消息后,不会立刻将相关信息放进半连接队列,而是根据对面发过来的报文计算自己的SYN初始序列号。 利用下面几个部分: 客户端IP、客户端端口号、服务端IP、服务端端口号,这4个部分计算一个哈希值一个缓慢增长的时间戳t客户端发来的SY

    [转帖]全连接和半连接

    https://www.jianshu.com/p/6a0fcb1008d6 参考 关于TCP 半连接队列和全连接队列 深入浅出TCP中的SYN-Cookies ss命令和Recv-Q和Send-Q状态 本文主要摘抄自关于TCP 半连接队列和全连接队列 1. TCP的全连接和半连接队列 当服务端调用

    [转帖]TCP半连接队列和全连接队列

    TCP半连接队列和全连接队列 文章很长,建议收藏起来慢慢读! 总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 :《尼恩Java面试宝典》持续更新+ 史上最全 + 面试必备 2000页+ 面试必备 + 大厂必备 +涨薪必备免费赠送 经典图书:《Java高并发核心编程(卷1)》 面试必备 + 大

    [转帖]TCP 半连接队列和全连接队列满了会发生什么?又该如何应对?

    https://www.jianshu.com/p/072ed535b1dc 原文地址:TCP 半连接队列和全连接队列满了会发生什么? 一个端口上面的tcp连接创建,基本都只用一个线程处理。如果大并发连接请求过来,处理不了,那么会放入“待处理队列”。为什么不用多线程呢?因为创建连接基本都是内存操作,

    [转帖]linux tcp 半连接队列和全连接队列

    TCP建立连接的“三次握手”过程 上图就是tcp建联的三次握手过程。 Server端需要先调用bind()方法,绑定ip和端口号,再调用listen()方法,然后就可以等待来自Client连接了Client 调用connect()后,就会发送SYN包到Server,此时Client端处理SYN_SE

    [转帖]针对容器的nginx优化

    针对容器的nginx优化 本篇文章介绍了 Nginx 在容器内使用遇到的CPU核数获取问题以及对应的解决方法。 回顾上篇文章:TCP 半连接队列和全连接队列 背景 容器技术越来越普遍,很多公司已经将容器技术作为基础架构的一部分,容器中可以运行任何软件,包括 Web Server、Applicatio

    [转帖]TCP的全连接与半连接队列

    TCP的全连接与半连接队列 总结 TCP 全连接队列的最大值: 取决于 somaxconn 和 backlog 之间的最小值, 也就是 min(somaxconn, backlog) TCP 半连接队列的最大值: min(min(somaxconn,backlog),tcp_max_syn_back

    [转帖]TCP三次握手详解,滑动窗口,拥塞窗口,网络包路由过程,全连接队列,半连接队列

    众所周知,网络分层有传统的OSI七层模型和后来的基于TCP/IP的四层模型: 那么在一次网络的传输过程中具体的流程是怎么样的,我们先从一个数据包的传输说起(以TCP为例): TCP协议根据上层应用提供的信息生成TCP报文 TCP报文在交由下面的IP层(网络层)进行处理,委托IP模块将TCP报文封装成

    [转帖]TCP的blacklog之全连接队列与半连接队列的深入研究

    文章目录 Linux内核探测工具systemtap的安装与使用backlog、半连接队列、全连接队列是什么半连接队列、全连接队列基本概念 linux 内核是如何计算半连接队列、全连接队列的半连接队列的大小的计算模拟半连接队列占满全连接队列(Accept Queue) SYN+ACK重传次数全连接队列

    [转帖]性能分析之TCP全连接队列占满问题分析及优化过程(转载)

    https://cloud.tencent.com/developer/article/1420726 前言 在对一个挡板系统进行测试时,遇到一个由于TCP全连接队列被占满而影响系统性能的问题,这里记录下如何进行分析及解决的。 理解下TCP建立连接过程与队列 从图中明显可以看出建立 TCP 连接的时