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

TCP详解——各标志位

目录

标志位 

拥塞控制


标志位 

TCP有六位标志位,分别代表不同的含义

URG:表示紧急指针是否有效,URG的存在是为了让某些数据可以被接收方优先处理,这种数据被称为带外数据(Out-Of-Band Data),而与之相对的就是普通的带内数据

带外数据不遵循普通数据的队列顺序,也不受滑动窗口的限制,不像普通数据必须得等待接收到连续的一段数据,带外数据可以插队

URG为1时,紧急指针就指向了紧急数据,紧急数据很多时候都只有一个字节,用来传递某些信息

比如在下载任务中,如果下载到一半向取消,发送的报文就会带有URG标志位,会让服务器优先处理取消请求

Linux中要读取紧急数据,可使用recv接口

#include <sys/types.h>
#include <sys/socket.h>ssize_t recv(int sockfd, void *buf, size_t len, int flags);

将其中的flags标志位设为MSG_OOB,就会读取紧急数据 

ACK:确认号是否有效,指的是下一次应该收到的序列号

PSH:提⽰接收端应⽤程序⽴刻从TCP缓冲区把数据读⾛

TCP 协议中,发送方和接收方通常会使用缓冲区临时存储数据(例如发送方积累一定量数据后再打包发送,接收方缓冲数据后批量提交给应用),以减少网络交互次数、提高传输效率。但在某些场景下(如实时通信、交互式操作),需要数据 “即时处理”,此时 PSH 标志位就会发挥作用:

发送方设置PSH=1,告诉接收方 “本报文中的数据是紧急需要处理的,不需要等待后续数据填充缓冲区,请立即交给应用层”。

接收方收到PSH=1的报文,会立即将当前接收缓冲区中所有已接收的数据(包括本报文的数据)传递给应用程序,而不是等待缓冲区满或超时。

RST:对⽅要求重新建⽴连接; 我们把携带RST标识的称为复位报⽂段

有时服务器会崩溃,操作系统就会向已经建立连接的客户端发送RST包,客户端就能知道连接已经断开,就可以采取应对措施;或者有时三次握手客户端发出的最后一个SYN包没有被服务器接收到,而客户端认为连接已经建立,开始发送数据,服务端却并没有建立连接完成,这时服务器会向客户端发送RST包

SYN: 请求建⽴连接; 我们把携带SYN标识的称为同步报⽂段

FIN: 通知对⽅, 本端要关闭了, 我们称携带FIN标识的为结束报⽂段

拥塞控制

发送数据并不能一开始就发送大量的数据,很可能网络正处于严重的堵塞,此时无异于雪上加霜,为此,TCP引入了慢启动机制,先发送少量数据探明网络整体拥堵情况,再根据具体拥塞情况来调整发送速率

此时也可以意识到,之前对于滑动窗口大小的讨论还不够全面,只考虑了对端的接收情况而没有考虑网络情况

此处引⼊⼀个概念称为拥塞窗⼝,可以认为在一定程度上,发送的数据段数量高于这个值就会引发网络拥塞,拥塞窗口是一个整型变量
发送开始的时候, 定义拥塞窗⼝⼤⼩为1
每次收到⼀个ACK应答, 拥塞窗⼝加1
每次发送数据包的时候, 将拥塞窗⼝和接收端主机反馈的窗⼝⼤⼩做⽐较, 取较⼩的值作为实际发
送的窗⼝,所以拥塞窗口会控制发送窗口的大小,初始是1,只发送一个数据段,收到应答后变为2,这里假设接收端的接收能力强,一直大于拥塞窗口大小,接着会发送两个数据段,在一个RTT(往返时间)内,会收到两个ACK应答,那么拥塞窗口加2,变为了4

从上面可以看出,拥塞窗口会按照指数级别增长,也就是通过这个指数增长,实现了慢启动

而拥塞窗口并不能无限制增大,此处引入慢增长的阈值,拥塞窗口超过这个阈值,就会不再按照指数增长,而是改成线性增长

这个阈值实现方案不同系统可能不同,但初始都是一个比较大的值

上图阈值初始是16,到达16后就是线性增长,然后在拥塞窗口大小为24时,网络拥塞导致了超时重传,将阈值减小,这就导致了超时重传后发送的速度进一步变慢了

所以,一直维护拥塞窗口的大小(尤其是增大)是有意义的,尽管它变大到一定值不再对发送窗口的大小产生影响,但是持续增大他,可以使下次超时重传的阈值更大,使发送速度更加贴合网络的情况

关于阈值具体该怎么变化,可能有不同的算法实现,但是基本思想是一致的

http://www.lryc.cn/news/585915.html

相关文章:

  • QML与C++相互调用函数并获得返回值
  • 浅谈 Pydantic v2 的 RootModel 与联合类型——构建多请求结构的统一入口模型
  • Linux中的git命令
  • Kimi K2万亿参数开源模型原理介绍
  • 猿人学js逆向比赛第一届第二十题
  • Linux进程的生命周期:状态定义、转换与特殊场景
  • 杭州乐湾科技有限公司的背景、产品体系与技术能力的全方位深度分析
  • linux_线程概念
  • 车载操作系统 --- Linux实时化与硬实时RTOS综述
  • windows电脑远程win系统服务器上的wsl2
  • 部署Harbor私有仓库
  • 服务器怎么跑Python项目?
  • vite如何生成gzip,并在服务器上如何设置开启
  • 自动化证书续签工具针对VPS服务器HTTPS服务的维护实践
  • Python技巧记录
  • 浅谈npm,cnpm,pnpm,npx,nvm,yarn之间的区别
  • 【云端深度学习训练与部署平台】AutoDL连接VSCode运行深度学习项目的全流程
  • Go语言中的Options模式
  • Mac M芯片安装RocketMQ服务
  • tp8.0\jwt接口安全验证
  • 深入解析 LinkedList
  • 在 Android 库模块(AAR)中,BuildConfig 默认不会自动生成 VERSION_CODE 和 VERSION_NAME 字段
  • 手机识别数据集,2628张原始图片,支持yolo,coco json,pasical voc xml等格式的标注
  • 搭建云手机教程
  • 深大计算机游戏开发实验三
  • Apache HTTP Server 从安装到配置
  • 实习内容总结
  • javaEE——synchronized关键字
  • docker 443错误 lookup docker.mirrors.ustc.edu.cn: no such host
  • Vue Vue-route (5)