【计算机网络 - 基础问题】每日 3 题(五十)

✍个人博客:https://blog.csdn.net/Newin2020?type=blog

📣专栏地址:http://t.csdnimg.cn/fYaBd

📚专栏简介:在这个专栏中,我将会分享 C++ 面试中常见的面试题给大家~

❤️如果有收获的话,欢迎点赞👍收藏📁,您的支持就是我创作的最大动力💪

📝推荐参考地址:https://www.xiaolincoding.com/(这个大佬的专栏非常有用!)

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

答案:可以的。

accpet 系统调用并不参与 TCP 三次握手过程,它只是负责从 TCP 全连接队列取出一个已经建立连接的 socket,用户层通过 accpet 系统调用拿到了已经建立连接的 socket,就可以对该 socket 进行读写操作了。

所以可以得知:

  • 每一个 socket执行 listen时,内核都会自动创建一个半连接队列和全连接队列。
  • 第三次握手前,TCP 连接会放在半连接队列中,直到第三次握手到来,才会被放到全连接队列中。
  • accept 方法只是为了从全连接队列中拿出一条连接,本身跟三次握手几乎毫无关系。
  • 出于效率考虑,虽然都叫队列,但半连接队列其实被设计成了哈希表,而全连接队列本质是链表。
  • 全连接队列满了,再来第三次握手也会丢弃,此时如果 tcp_abort_on_overflow = 1,还会直接发 RST 给客户端。
  • 半连接队列满了,可能是因为受到了 SYN Flood 攻击,可以设置 tcp_syncookies,绕开半连接队列。
  • 客户端没有半连接队列和全连接队列,但有一个全局 hash,可以通过它实现自连接或 TCP 同时打开。

149. 如果监听队列中处于 ESTABLISHED 状态的连接对应的客户端出现网络异常(比如掉线),或者提前退出,那么服务器对这个连接执行的 accept 调用是否成功?

成功的。因为 accept 只是从连接好的全队列中取出一个连接进行建立,但并不关心连接出于何种状态,更不关心任何网络状况

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

答案:可以的。

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

相关推荐
小溪学编程3 小时前
C语言篇:语言结构
c语言·开发语言·算法
東隅已逝,桑榆非晚3 小时前
数据结构队列
数据结构·笔记·学习
老王爱玩车3 小时前
字符串和字符串函数
c语言·开发语言·数据结构·学习
白帽攻防录3 小时前
SRC 挖洞:V8 Turbofan 沙箱逃逸深度复盘,CVE-2026-6307 一根长矛怎么刺穿 Chrome 两道边界
网络·chrome·安全·网络安全·浏览器安全
mlidongfeng3 小时前
【学习笔记】【NV】GIN
开发语言·php
pt10433 小时前
CML网络仿真入门-3:Cisco Modeling Labs 网络工具功能详解
网络
欣欣之王来了3 小时前
5G网络基础:5G的核心特性,eMBB、uRLLC、mMTC的应用场景
网络·学习·计算机网络·安全·教程
大圣编蚕3 小时前
Spring AOP 失效排查:从原理到实战的完整指南
java·后端·spring
Omics Pro3 小时前
~30,000+引用!理论2005,R包2008,多组学集成AI增强
开发语言·数据库·人工智能·算法·机器学习·自然语言处理·r语言
AINative软件工程3 小时前
LLM 多租户 Prompt Isolation 工程实践:为 100 个租户定制 Prompt,但别让它们互相污染
后端·llm