tcp协议抓包详解

article/2025/9/26 1:26:03

三次握手

握手的目标

 抓包

序列号client 和server 是不一样的,也没从0开始

网络报文中报文可能会延迟,会重发,丢失。 为了不影响其他链接,所以是不同的而且是随机的

 

三次握手中的性能优化与安全问题

超时时间与缓冲队列

fast open降低时延

第一次建立连接请求还需要3次,但是多了个cookie

但第二次请求的时候,带着cookie和请求在syn中一起发送给server

linux 打开tcp fast open

如何应对syn攻击

tcp_syncookies

tcp_defer_accept

当server收到ack确认后放到accept队列中,这时候内核是否激活应用程序呢?

这个参数就是控制这个的,可以控制等数据来临时再激活应用程序,提升效率

MSS

 

重传与确认

PAR

提升并发能力的PAR改进版

PAWS

使用timestamp解决这个问题

RTO重传定时器的计算

应略大于RTT

如何测量RTT

因为重传会有几种情况,导致RTT计算比较困难

RTT测量的第2种方法

RTO应当设多大

RTO应该更平滑

追踪RTT方差

linux系统使用这种方式计算RTO

TCP滑动窗口

发送窗口的快照如下图

收到ack确认,同时窗口大小没动,就移动5个字节

 

接收窗口

约等于对端发送窗口的接收窗口

为什么是约等于:

实际上滑动窗口并不是一成不变的,如果接收窗口的应用程序接收数据很快,接收窗口可以很快空出来,需要通过tcp报文的windows size传递,是有时延的

滑动窗口示例:MSS不产生影响,窗口不变

客户端消息的发送

服务器端消息的发送

操作系统缓冲区和滑动窗口的关系

t缓冲区影响接收窗口的大小,而系统内存的改变会影响缓冲区的大小

应用层没有及时读取缓存

应用程序没有及时从缓冲区读取数据,导致缓冲区可接收数据变少,导致窗口收缩

接收窗口逐渐关闭

收缩窗口导致丢包

但操作系统一般不会发生这种情况

一般都会先收缩窗口再减少缓冲区大小

窗口关闭后,定时探测窗口大小

飞行中报文的适合数量

linux下调整接收窗口与应用缓存

linux下对tcp缓冲区的调整方式

如何减少小报文提高网络效率

SWS 糊涂窗口综合症

SWS避免算法

tcp 延迟确认

linux上更为激进的Nagle: TCP_CORK

需要结合sendfile零拷贝技术使用

 

全局思考:拥塞控制

慢启动

通告窗口是对方接收窗口

慢启动的初始窗口

拥塞避免

先慢启动,达到阈值后进入拥塞避免,线性方式增加,如果发生了丢包会重新接入慢启动阶段 并且阈值也会变为之前的一半。  

快速重传与快速恢复

当丢包并不是很严重时,可以进入快速重传与恢复

失序数据段

什么是失序数据段

pkt1丢失了

快速重传

当收到3个重复失序ACK段时,立刻基于快速重传机制重发报文段

超时不会启动快速重传

快速重传下一定要进入慢启动吗?

快速恢复

SACK与选择性重传算法

当报文5丢失后,接收方会重复发ack5,表示我还需要报文5,但是发送端把报文6,7,8也发了,收到的是ack5。 

发送方想知道6,7,8到底有没有传过去呢?

仅重传丢失段保守乐观

重传所有段-积极悲观

怎么解决上面2种方式可能带来的问题呢?

SACK :tcp selective acknowledgment

简单来说会发送一个SACK来告知收到了

测量驱动的拥塞控制算法

大管道向小管道传输数据引发拥堵

BBR 

google2016年,linux4.9内核引入,QUIC使用

Google BBR拥塞控制算法原理

关闭连接过程优化

防止数据丢失,与应用层交互

两端同时关闭

tcp状态机

RST复位报文直接关闭连接,绕开四次握手

http://blog.leanote.com/post/jerrychao/TCP%E9%80%9A%E8%BF%87RST%E6%8A%A5%E6%96%87%E6%9D%A5%E5%85%B3%E9%97%AD%E8%BF%9E%E6%8E%A5

tcp的keepalive,检验和带外数据

长时间没有任何数据的连接可能关掉,2小时没有收发任何数据后开启keepalive功能,会发送多个探测包,如果收到了ack,认为是活跃的连接,会从2小时从新开始计时。反之则间隔75s再发一个,最多发送9个报文后,还没收到ack,就关闭该连接。

违反分层原则的校验和

16位2字节的校验和字段,不光对数据校验也对头部检验,实际上也对ip头部的一部分进行校验,从这个层面来说已经违反分层原则了,对ip的头部,源ip地址,目的ip地址还有协议等信息进行校验。

那为什么要对ip头部校验呢?

如果我们发现tpc segement 其实不是发给自己的,那就可以更快发现这个问题。

校验和默认是累加和,如果不够放的可以放到option

应用调整tcp发送数据的时间

psh可以调整应用发送的时机,psh=1 ,如果收到这个报文后,请缓冲区尽快把缓冲内的数据交给应用进程处理,而不是等到多少字节后再让进程处理。

紧急处理数据

紧急标志位,通常也会被叫做带外数据位,其实并不是带外数据位。在telnet中输入很多字符,字符在网络中可能拥塞,这时ctrl-c,退出了,可能会把URG=1,内核会优先处理这些数据。

 

面向字节流的TCP连接如何多路复用

多路复用

在一个信道上传输多路信号或数据流的过程和技术

一旦没有数据就立马返回不等待

epoll+非阻塞socket

epoll为什么高效

红黑树存放所有连接

当读写事件触发,把对应的连接放到链表中

每次只返回就绪的连接

 

非阻塞+epoll+同步编程=协程

上面是一个openresty的例子,当connect阻塞时(三次握手),里面的实现是发现需要等待,就切换到其他tcp连接的处理中了,等到有ack来时,激活这段代码,继续往下面执行。

 

OSI模型下的七层LB与四层LB

 

UDP负载均衡的理论依据

以五元组来做负载均衡

 

 

 


http://chatgpt.dhexx.cn/article/Xn8C9C8b.shtml

相关文章

快速穷举TCP连接欺骗攻击-利用SYN Cookies

TCP 利用 32比特的 Seq/Ack 序列号来确认每一个连接的可靠性. 此外, 这些32位的序列号还能保证服务器不会被会话劫持,伪造一个服务器发出的初始序列号(ISN) 是个难以实现的技术. 因为暴力破解的话需要穷举这个32比特的序列号,在一个千兆比特级别的网卡上…

php7中的构造函数

2019独角兽企业重金招聘Python工程师标准>>> 在用php7进行开发的时候,遇到了: Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; index has a deprecated constructor 这个提示…

PHP之析构函数

随着面向对象编程的普遍展开,面向对象展现了其中很多有趣的问题。相信很多初学者学习php面向对象时会接触两个函数,构造函数与析构函数。构造函数似乎用的更多,析构函数用的较少(相对初学者有限编程经验而言,笔者也是如…

PHP构造函数(方法)的使用

什么是构造方法(函数)? 构造(函数)方法是类中的一个特殊方法。当使用 new 操作符创建一个类的实例时,构造方法将会自动调用,其名称必须是 __construct()。 在一个类中只能声明一个构…

构造函数

构造函数在类体里的声明形式: 类名(形参一,形参二,…);//也可以没有形参 构造函数的定义形式: 假设数据成员为x1,x2,…x,类外定义构造函数时通常有3种形式&am…

php类中的构造函数与析构函数

1.php类中的构造函数a.构造函数的定义及创建 构造函数的英文是constructor,通常是和析构函数配合使用的。 所谓构造函数,就是在我们这个类运行之初需要初始的东东,执行类中所有方法之前,无需首先执行的方法。看个例子,…

PHP笔记-PHP中构造函数要注意的地方

背景 这里记录下PHP中构造函数的注意点。 这里和C/C、Java不一样&#xff0c;比较灵活&#xff0c;估计是有隐式调用&#xff0c;在此不研究了&#xff0c;记录下注意的地方。 演示 如下项目&#xff1a; Base.php <?phpclass Base{public function __construct(){ech…

php构造方法(函数)基础

什么是构造函数呢?在回答这个问题之前&#xff0c;我们来看一个需求&#xff1a;我们在创建人类的对象时&#xff0c;是先把一个对象创建好后&#xff0c;再给他的年龄和姓名属性赋值&#xff0c;如果现在我要求&#xff0c;在创建人类的对象时&#xff0c;就指定这个对象的年…

ffmpeg编译安装

ffmpeg编译安装 前言一、下载ffmpeg二、编译安装2.1 Linux编译ffmpeg2.2 Windows编译ffmpeg 总结 前言 Fmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。采用LGPL或GPL许可证。它提供了录制、转换以及流化音视频的完整解决方案。它…

在Windows上安装FFmpeg程序

原文地址:http://helloway.blog.51cto.com/7666282/1642247 FFmpeg是一套可以用来记录、转换数字音频、视频&#xff0c;并能将其转化为流的开源计算机程序。它提供了录制、转换以及流化音视频的完整解决方案。它包含了非常先进的音频/视频编解码库libavcodec。 该程序只有命令…

【最新】windows电脑FFmpeg安装教程手把手详解

【最新】FFmpeg安装教程手把手详解 写在前面一、下载&解压二、配置环境变量1、配置系统环境变量 三、验证额外补充 写在前面 本文以 Windows 64 位操作系统为例演示 一、下载&解压 打开 FFmpeg 官网&#xff0c;选择下载。 选择 Windows 平台&#xff0c;下面有两…

FFmpeg 安装与使用

官方介绍&#xff08;可忽略&#xff09; FFmpeg是处理多媒体内容&#xff08;如音频、视频、字幕和相关元数据&#xff09;的库和工具的集合。它功能非常强大&#xff0c;包括视频裁剪、视频格式转换、视频截图、视频添加水印等。 它包含可供应用程序使用的libavcodec、libavu…

ffmpeg安装教程及配置环境

1.下载ffmpeg安装包 官网如下&#xff1a;https://ffmpeg.org/download.html 记住这个目录&#xff1a;E:\ffmpeg-4.4-essentials_build\bin 4. 5.打开 winR&#xff0c;cmd命令下检验 输入ffmpeg 此时安装&#xff0c;以及配置成功

Mac版 下载安装FFmpeg

​​​​​​​​​​​​​​本篇是在mac版下安装FFmpeg的&#xff0c;如果你的电脑为windows版的话&#xff0c;请移步到这篇文章ffmpeg下载安装教程及介绍_水w的博客-CSDN博客 目录 安装FFmpeg 方式一&#xff1a;官网下载安装 方式二&#xff1a;使用Homebrew安装FFmpeg…

Windows安装ffmpeg

目录&#xff1a; 一、官网下载ffmpeg安装包1、打开官网下载&#xff08;用迅雷下载会比谷歌浏览器下载快一点&#xff09;2、解压到想要安装的文件夹 二、添加环境变量1、打开安装目录下的bin文件夹&#xff0c;复制路径2、打开环境变量页面 三、测试 一、官网下载ffmpeg安装包…

2.ffmpeg安装(Ubuntu20.04 )

Ubuntu20.04安装ffmpeg 1.下载源码包2.解压安装依赖库 3.编译3.1 安装 yasm3.2 配置3.3 编译安装 4.添加环境变量4.1 修改环境变量4.2 在文件中添以下内容。4.3 设置生效 5.验证是否成功5.1 无法打开共享库文件5.2 测试是否配置成功 注意 1.下载源码包 进入官网 https://ffmpe…

ffmpeg的安装和使用教程

ffmpeg的安装和使用教程 1.进入ffmpeg官网&#xff0c;下载相应的安装包,windows和mas以及linux&#xff0c;32位和64位版本! 2.将下载好的压缩包进行解压 3.进入bin目录&#xff0c;复制好bin目录的路径 4.右击此电脑&#xff08;win7就是计算机&#xff09;&#xff0c;选择…

ffmpeg的安装与使用

一、ffmpeg的简介 FFmpeg是一个自由软件&#xff0c;可以运行音频和视频多种格式的录影、转换、流功能&#xff0c;包含了libavcodec——这是一个用于多个项目中音频和视频的解码器库&#xff0c;以及libavformat——一个音频与视频格式转换库。 主要参数 -i——设置输入档名…

三、FFmpeg安装

1. FFmpeg介绍 FFmpeg是一个完整的、跨平台的解决方案&#xff0c;用于记录、转换和流化音/视频。 FFmpeg 采用 LGPL 或 GPL 许可证&#xff0c;提供了录制、转换及流化音/视频的完整解决方案。其包含了非常先进的音&#xff0f;视频编解码库 libavcodec。 FFmpeg 是在 Linux …

windows ffmpeg安装部署

目录 安装包下载 解压安装包 配置环境变量 总结 安装包下载 作为音视频处理重要软件ffmpeg&#xff0c;是一定要装好的。 windows安装包下在链接&#xff1a;资源包地址 解压安装包 下载安装包后解压到需要的目录。 配置环境变量 找到控制面板 -> 点击系统 -> 点击…