当前位置: 首页 > news >正文

TCP/IP协议二十问

TCP/IP协议二十问

1. 什么是TCP网络分层?

TCP网络分层一般分为五层:

  1. 应用层(HTTP):组装数据包
  2. 传输层(TCP):增加TCP头部,包含端口号等信息
  3. 网络互联层(IP):增加IP头部,包含IP地址等信息
  4. 网络访问层(ARP):增加以太网头部,包含MAC地址等信息
  5. 物理层

分层的好处

  • 各层独立:限制了依赖关系的范围,各层之间使用标准化的接口,各层不需要知道上下层是如何工作的,增加或者修改一个应用层协议不会影响传输层协议;
  • 灵活性:比如路由器不需要应用层和传输层,分层以后路由器就可以只用加载更少的几个协议层
  • 易于测试和维护:提高了可测试性,可以独立的测试特定层,某一层有了更好的实现可以整体替换掉;
  • 能促进标准化:各层职能清晰,方便标准化;

2. TCP的三次握手?为什么不是两次或者四次?

  1. 客户端向服务端发送SYN,seq = x;
  2. 服务端向客户端发送SYN,seq = y, ACK = x+1;
  3. 客户端向服务端发送ACK = y+1;

两次不行

  1. 如果只做两次无法确定服务端的接收能力;
  2. 两次握手后建立连接,有可能导致由于时延产生的多次连接建立,导致资源浪费;

四次不行

三次足够,没必要资源浪费;

3. TCP的四次挥手?为什么不能是三次?

  1. 客户端向服务端发送FIN,seq = x+2,ACK = y+1;
  2. 服务端向客户端发送ACK = x+3;
  3. 服务端发送完剩余数据后,再向客户端发送FIN,seq = y+1;
  4. 客户端向服务端发送ACK = y+2;

三次不行

导致服务端的ACK和FIN将延迟发送,如果延迟时间过长,客户端将再次重发断开请求,导致资源浪费。

4. 为什么SYN/FIN不包含数据却要消耗一个序列号?

凡是需要对端确认的,一定消耗TCP报文的序列号;

5. 什么是半连接队列?什么是SYN Flood攻击?

客户端大量伪造IP发送SYN包,服务端回复的ACK+SYN去到了一个【未知】的IP地址,势必会造成服务端大量的连接处于SYN_RCVD状态,而服务器的半连接队列大小也是有限的,如果半连接队列满,也会出现无法处理正常请求的情况。

6. TCP快速打开的原理?

TCP快速打开(TCP Fast Open,TFO)
TFO是在原来TCP协议上的扩展协议,它的主要原理就在发送第一个SYN包的时候就开始传数据了,不过他要求当前客户端之前已经完成过【正常】的三次握手。

快速打开分为两个阶段:请求 Fast Open Cookie 和 真正开始 TCP Fast Open

TCP Fast Open 的优势

可以利用握手去除一个往返的RTT
可以防止SYN-Flood攻击之类的

7. TCP报文中的时间戳有什么用?

TCP Timestamps Option由四部分构成:
类别、长度、发送方时间戳、回显时间戳

  1. 用于计算RTT
  2. 防止序列号的回绕问题,即使使用的序列号相同,也可以通过时间戳来对不同的包进行区分。

8. TCP的超时重传时间是如何计算的?

超时重传时间:Retransmission TimeOut, 简称RTO

经典解决方法

适用于RTT较小的情况,SRTT,smoothed round trip time。
利用最新一次的RTT对SRTT时间进行更新,
SRTT = α × SRTT + (1-α)× RTT

9. TCP流量控制?

把发送的数据放到发送缓冲区,把接收的数据放到接收缓冲区。通过实际接收缓冲区的大小,控制发送端的发送。
接收端会告知客户端自己接收窗口,也就是接收缓冲区中空闲的部分。

发送端的数据包的状态:

  • 已发送且已确认
  • 已发送未确认的
  • 未发送但接收端可以接受的(接收端有空间接受)
  • 未发送且不可以发送(接收端没空间接收)

发送端速度较慢:存在大量待发送的字节;
发送端速度较快:存在大量待确认的字节;

10. TCP的keep-alive原理?

定时发送探测包来探测连接的对端是否存活,但是keepalive默认设置的时间过长,7200s没有实际意义,一般在应用层做心跳机制。

什么是心跳机制?

  • 定时向服务端发送消息
  • 能响应服务端的消息

长链接业务场景

  • 游戏
  • -即时通讯
    在没有心跳包机制的情况下,网络若掉线,对方不可知;
    如果客户端掉线,服务端不知道,还维持链接,就是额外的无效系统开销。

为什么需要心跳包:

  • 在NAT、防火墙网络中装设备,保存信道记录;
  • 及时发现对方网络断开,以便及时采取措施;

如何实现心跳包

  • TCP层面的心跳包,只能够验证网络链接是否异常;
  • 应用层层面的心跳包,验证服务接口是否异常;

为什么不采用TCP层面?

应用层的连接如果成功,那么TCP所在的传输层必定成功。

11. TCP中的端口号

源端口:本地端口
目标端口:服务器端口

最大65536个,所以是0-65535

常见端口:

端口号服务
22SSH
80HTTP
443HTTPS
3306mysql
Redis6379
MongoDB27017

12. TCP场景问题1

AB两个主机之间建立了一个TCP连接,A主机发给B主机两个TCP报文,大小分别是500和300,第一个报文的序列号是200,那么B主机接收两个报文后,返回的确认号是多少?500+300+200 = 1000

13. TCP场景问题2

收到IP数据包解析后,如何知道应该投递到上层中的哪个协议(是TCP还是UDP)?

IP报文头中有协议字段,TCP6,UDP17

14. TCP场景问题3

TCP提供了一种字节流服务,而收发双方都不保持记录的边界,应用程序应该如何提供他们自己的记录标识呢?

应用程序使用自己约定的规则来标识消息的边界,比如有一些使用回车+换行(“\r\n”),比如Redis的通信协议;

15. telnet 的用法

检查远端端口是否打开,其语法如下:
telnet [ip] [port]

16. netstat的用法

主要用于查询网络情况
如: netstat -a -lu -lt

17. tcpdump

用于抓包,例如可以查看三次握手和四次挥手等

18. wireshark

19. TCP和UDP的区别?

TCP是一个面向连接的、可靠的、基于字节流的传输层协议;
UDP是一个面向无连接的传输层协议;

  • 面向连接:指的是客户端和服务端的连接,在通信前通过三次握手建立连接;

  • 可靠性:

    • TCP有状态:TCP会精准记录那些数据发送了,哪些数据已被接收,那些数据未被接收,并且保证数据包按序到达,不允许差错;
    • TCP可控制:如果遇到丢包或者网络不佳,TCP会根据具体情况自行调整,控制自己的发送速度或者重发。

20. QQ的网络协议设计?

  • 登录采用TCP协议和HTTP协议;
  • 好友之间发消息可以采用UDP;
  • 内网传文件可以采用P2P技术;
  1. 登录过程中,客户端client采用TCP协议向服务器发送消息;
  2. HTTP协议下载信息;
  3. 登录后通过TCP来保持在线状态;
  4. 和好友发消息客户端采用UDP协议,但是需要通过服务器转发,但是为了确保传输信息的可靠性,采用上层协议来保证可靠传输;
  5. 内网传输文件时采用P2P技术;

相关文章:

TCP/IP协议二十问

TCP/IP协议二十问 1. 什么是TCP网络分层? TCP网络分层一般分为五层: 应用层(HTTP):组装数据包传输层(TCP):增加TCP头部,包含端口号等信息网络互联层(IP&am…...

常用Array数组操作方法

定义一个测试数组constplayers[{name:科比,num:24},{name:詹姆斯,num:23},{name:保罗,num:3},{name:威少,num:0},{name:杜兰特,num:35}]复制代码1、forEach参数代表含义item:遍历项index:遍历项的索引arr:数组本身Array.prototype.sx_forEach…...

【C++】set/multiset、map/multimap的使用

目录 一、关联式容器 二、set的介绍 1、接口count与容器multiset 2、接口lower_bound和upper_bound 三、map的介绍 1、接口insert 2、接口insert和operator[]和at 3、容器multimap 四、map和set相关OJ 1、前K个高频单词 2、两个数组的交集 一、关联式容器 vector、…...

vue3语法

vue3教程 //ps 这里是基本写法 一般项目不需要ref 因为需要一直return 这里是根据在不使用ts后缀 来在.vue里面写setup 如下图所示:setup setup是启动页面会自动执行的一个函数 项目里定义的所有变量,都要在setup当中 在setup定义的变量和方法,都需要r…...

对象之间的关系

目录1. 依赖2. 关联3. 聚合4. 组合Java的对象/类之间有四种关系:依赖、关联、组合、聚合。 1. 依赖 依赖(Dependency): 一个对象的功能依赖于另一个对象。 类比:人类生存依赖食物和空气 体现:被依赖者体…...

云原生时代顶流消息中间件Apache Pulsar部署实操-上

文章目录安装运行时Java版本推荐Locally Standalone集群启动验证部署分布式集群部署说明初始化集群元数据部署BookKeeper部署BrokerAdmin客户端和验证Tiered Storage(层级存储)概述支持分级存储何时使用工作原理安装 运行时Java版本推荐 Locally Standalone集群 启动 # 下载…...

Python实现基于openCV+百度智能云平台实现《1:N人脸考勤机》文章最后附带源码!

目录 一、 项目介绍 1.1 项目名称 1.2 项目简介 1.3 项目物料 1.4 技术栈 二、 项目架构 三、项目细节 3.1 环境搭建 3.2 利用opencv实现摄像头调取及相关图像的采集 3.3 利用aips上传图像和结果返回 3.4 结果优化和处理 3.5 可扩展性 3.6 遗留问题和…...

因为锁的问题,我们被扣了1万

前言 春节放假期间,一个项目上的积分接口被刷,而且不止一个人在刷,并且东西也被兑走,放假晚上被人叫起来排查问题,通过这个人的积分明细观察,基本一秒就能获取一次,远远超过了积分规则限定的次…...

【STM32笔记】低功耗模式下的RTC唤醒(非闹钟唤醒,而是采用RTC_WAKEUPTIMER)

【STM32笔记】低功耗模式下的RTC唤醒(非闹钟唤醒,而是采用RTC_WAKEUPTIMER) 前文: blog.csdn.net/weixin_53403301/article/details/128216064 【STM32笔记】HAL库低功耗模式配置(ADC唤醒无法使用、低功耗模式无法烧录…...

浏览器渲染中的相关概念

渲染 渲染流水线 构建 DOM 树 输入:HTML 文档;处理:HTML 解析器解析;输出:DOM 数据解构。 样式计算 输入:CSS 文本;处理:属性值标准化,每个节点具体样式&#xff08…...

【MySQL】数据类型

1、数据类型描述 类型类型举例整数类型TINYINT、SMALLINT、MEDIUMINT、INT(或INTEGER)、BIGINT浮点类型FLOAT、DOUBLE定点数类型DECIMAL位类型BIT日期时间类型YEAR、TIME、DATE、DATETIME、TIMESTAMP文本字符串类型CHAR、VARCHAR、TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT枚举类…...

L2-037 包装机

一种自动包装机的结构如图 1 所示。首先机器中有 N 条轨道,放置了一些物品。轨道下面有一个筐。当某条轨道的按钮被按下时,活塞向左推动,将轨道尽头的一件物品推落筐中。当 0 号按钮被按下时,机械手将抓取筐顶部的一件物品&#x…...

MySQL -查询日志、二进制日志、错误日志、慢查询日志

文章目录1.错误日志2.二进制日志3.查询日志4.慢查询日志1.错误日志 错误日志是 MySOL中最重要的日志之一,它记录了当 mvsald 启动和停止时,以及服务器在运行过程中发生任何严重错误时的相关信息当数据库出现任何故障导致无法正常使用时,建议…...

TCP实现可靠传输的实现

TCP实现可靠传输的实现 目录TCP实现可靠传输的实现ARQ协议停止等待协议(古老)连续ARQ协议累计重传(回退N帧的ARQ协议)缓存确认(选择重传ARQ协议)超时重传的时间选择TCP的流量控制零窗口探测报文段Nagle算法…...

2/14考试总结

时间安排 7:30–7:50 看题,T1可能是个数据结构之类的东西,T2是 dp ,T3 构造。 7:50–8:20 T3,仿照样例的构造,可以通过一部分测试点。 8:20–9:20 T1,发现题目实际上要求子树内各儿子的深度信息,可以 dsu ,对于不能暴…...

程序环境和预处理详解

文章目录一、程序环境1.1 - 翻译环境1.1.1 - 编译1.1.1.1 - 预编译(预处理)1.1.1.2 - 编译1.1.1.3 - 汇编1.1.2 - 链接1.2 - 执行环境二、预处理详解2.1 - 预定义符号2.2 - #define2.2.1 - #define 定义标识符2.2.1.1 - 语法2.2.1.2 - 建议2.2.2 - #defi…...

The Social-Engineer Toolkit(社会工程学工具包)互联网第一篇全模块讲解

一、工具介绍 Social-Engineer Toolkit 是一个专为社会工程设计的开源渗透测试框架,可以帮助或辅助你完成二维码攻击、可插拔介质攻击、鱼叉攻击和水坑攻击等。SET 本身提供了大量攻击选项,可让您快速进行信任型攻击,也是一款高度自定义工具…...

Windows11去掉不满足系统要求的提示水印

我的电脑是LEGION的拯救者R70002021,预装的是Windows 11 家庭中文版,没有折腾重装过系统,今天突然注意到右下角出现了这个提示:“不满足系统要求。转到’设置"了解详细信息”。 在进入设置 - 系统 面板中也提示不满足系统要…...

JavaScript 计时事件

JavaScript 计时事件 通过使用 JavaScript,我们有能力做到在一个设定的时间间隔之后来执行代码,而不是在函数被调用后立即执行。我们称之为计时事件。 在 JavaScript 中使用计时事件是很容易的,两个关键方法是: setInterval() - 间隔指定的…...

七大排序算法的多语言代码实现

文章目录 前言 一、排序算法 1.原理简述 2.分类与复杂度 二、实例代码 1.冒泡排序 C Python Java Golang Rust Dephi 2.选择排序 C Python Java Golang Rust Dephi 3.插入排序 C Python Java Golang Rust Dephi 4.希尔排序 ​编辑 C Python Java Gola…...

利用ngx_stream_return_module构建简易 TCP/UDP 响应网关

一、模块概述 ngx_stream_return_module 提供了一个极简的指令&#xff1a; return <value>;在收到客户端连接后&#xff0c;立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量&#xff08;如 $time_iso8601、$remote_addr 等&#xff09;&a…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

SQL慢可能是触发了ring buffer

简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...

MyBatis中关于缓存的理解

MyBatis缓存 MyBatis系统当中默认定义两级缓存&#xff1a;一级缓存、二级缓存 默认情况下&#xff0c;只有一级缓存开启&#xff08;sqlSession级别的缓存&#xff09;二级缓存需要手动开启配置&#xff0c;需要局域namespace级别的缓存 一级缓存&#xff08;本地缓存&#…...

机器学习的数学基础:线性模型

线性模型 线性模型的基本形式为&#xff1a; f ( x ) ω T x b f\left(\boldsymbol{x}\right)\boldsymbol{\omega}^\text{T}\boldsymbol{x}b f(x)ωTxb 回归问题 利用最小二乘法&#xff0c;得到 ω \boldsymbol{\omega} ω和 b b b的参数估计$ \boldsymbol{\hat{\omega}}…...

怎么开发一个网络协议模块(C语言框架)之(六) ——通用对象池总结(核心)

+---------------------------+ | operEntryTbl[] | ← 操作对象池 (对象数组) +---------------------------+ | 0 | 1 | 2 | ... | N-1 | +---------------------------+↓ 初始化时全部加入 +------------------------+ +-------------------------+ | …...