4.19 & 20

服务端没有 listen,客户端发起连接建立,会发生什么?        

服务端如果只 bind 了 IP 地址和端口,而没有调用 listen 的话,然后客户端对服务端发起了连接建立,服务端会回 RST 报文。

没有 listen,能建立 TCP 连接吗?

是可以的,客户端是可以自己连自己的形成连接(TCP自连接),也可以两个客户端同时向对方发出请求建立连接(TCP同时打开),这两个情况都有个共同点,就是没有服务端参与,也就是没有listen,就能建立连接。

执行 listen 方法时,会创建半连接队列和全连接队列,三次握手的过程中会在这两个队列中暂存连接信息。客户端没有执行listen,因为半连接队列和全连接队列都是在执行 listen 方法时,内核自动创建的,所以客户端没有半连接队列。

但内核还有个全局 hash 表,可以用于存放 sock 连接的信息。

在 TCP 自连接的情况中,客户端在 connect 方法时,最后会将自己的连接信息放入到这个全局 hash 表中,然后将信息发出,消息在经过回环地址重新回到 TCP 传输层的时候,就会根据 IP + 端口信息,再一次从这个全局 hash 中取出信息。于是握手包一来一回,最后成功建立连接

没有 accept,能建立 TCP 连接吗?

 

 一般情况下,如果启动服务器,会发现最后程序会阻塞在accept()里。

客户端比较简单,创建好socket之后,直接就发起connect方法。

此时回到服务端,会发现之前一直阻塞的accept方法,返回结果了

就算不执行accept()方法,三次握手照常进行,并顺利建立连接。在服务端执行accept()前,如果客户端发送消息给服务端,服务端是能够正常回复ack确认包的。

 建立连接的过程中根本不需要accept()参与, 执行accept()只是为了从全连接队列里取出一条连接。

为什么半连接队列要设计成哈希表,全连接队列是链表?

全连接里队列,本质是个链表,因为也是线性结构,里面放的都是将要取走的连接,服务端取走连接不需要顺序,直接从队列头取就可以了复杂度为O(1)。

半连接队列,里面都是不完整的连接,等待着第三次握手的到来。那么现在有一个第三次握手来了,则需要从队列里把相应IP端口的连接取出,设计成哈希,时间复杂度就变On。

怎么观察两个队列的大小

#查看全连接队列

ss -lnt

查看半连接队列

SYN_RECV状态的连接 使用

netstat -nt 

cookies方案为什么不直接取代半连接队列?

  • 服务端并不会保存连接信息,所以如果传输过程中数据包丢了,也不会重发第二次握手的信息。
  • 编码解码cookies,都是比较耗CPU的,

        过构造大量ACK包去消耗服务端资源的攻击,叫ACK攻击,受到攻击的服务器可能会因为CPU资源耗尽导致没能响应正经请求。

 

Linux 内核版本 `4.19.0.91.77.135.uelc20.x86_64` 是一个基于 Linux Kernel 4.19 分支的定制版本,通常用于特定的 Linux 发行版或企业级系统。该版本的命名结构表明它可能属于 Ubuntu Extended Lifecycle Support (UELS) 或 Canonical 提供的长期支持内核分支,适用于某些关键业务场景或嵌入式部署环境[^1]。 ### 版本结构解析 该内核版本 `4.19.0.91.77.135.uelc20.x86_64` 可以拆解为多个部分进行理解: - **4.19**:主版本号,表示这是 Linux Kernel 4.19 分支,该分支是 Linux 社区维护的长期支持(LTS)版本之一,支持周期通常为数年,适用于生产环境[^1]。 - **0.91**:次版本号和修订号,表示该内核的具体修订版本,通常由上游社区或发行版维护者进行更新和补丁集成。 - **77.135**:构建编号,表示该内核在特定发行版中的构建次数或补丁应用次数。 - **uelc20**:表明该内核可能属于 Ubuntu Extended Lifecycle (UEL) 或 UELC(Ubuntu Extended Lifecycle Support for Cloud)项目的一部分,适用于需要更长生命周期支持的部署场景。 - **x86_64**:架构标识,表示该内核为 64 位 x86 架构编译。 ### 获取该内核信息的方式 可以通过以下命令查看当前运行的内核版本: ```bash uname -r ``` 输出示例: ``` 4.19.0.91.77.135.uelc20.x86_64 ``` 此外,查看详细的内核构建信息可以使用: ```bash uname -a ``` 该命令将输出包括内核版本、主机名、操作系统类型、内核构建时间等信息。 ### 该内核的适用场景 由于该内核版本具有 `.uelc20` 后缀,推测其可能属于专为云环境或企业级部署定制的内核版本,具有更长的支持周期和安全性更新保障。这类内核常见于使用 Ubuntu 20.04 LTS 的服务器环境中,尤其是在需要额外安全补丁和稳定性保障的企业场景中[^1]。 ### 内核更新与维护 对于此类内核,建议定期通过发行版的官方仓库进行更新,以确保获得最新的安全修复和性能优化。例如,在基于 Ubuntu 的系统中,可以使用以下命令更新系统并升级内核: ```bash sudo apt update sudo apt upgrade ``` 若需手动安装特定版本的内核,应参考发行版的官方文档以确保兼容性和稳定性。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值